diff --git a/application/nicewebpage.class.inc.php b/application/nicewebpage.class.inc.php
index e1c0d8bf3..dc43c7879 100644
--- a/application/nicewebpage.class.inc.php
+++ b/application/nicewebpage.class.inc.php
@@ -38,7 +38,14 @@ class NiceWebPage extends WebPage
parent::__construct($s_title, $bPrintable);
$this->m_aReadyScripts = array();
$this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery-3.3.1.min.js');
- $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery-migrate-3.0.1.min.js'); // Needed since many other plugins still rely on oldies like $.browser
+ if(utils::IsDevelopmentEnvironment()) // Needed since many other plugins still rely on oldies like $.browser
+ {
+ $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery-migrate-3.0.1.dev.js');
+ }
+ else
+ {
+ $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery-migrate-3.0.1.prod.min.js');
+ }
$this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/ui-lightness/jquery-ui-1.11.4.custom.css');
$this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery-ui-1.11.4.custom.min.js');
$this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/utils.js');
diff --git a/application/utils.inc.php b/application/utils.inc.php
index aeb96f09f..026da66f5 100644
--- a/application/utils.inc.php
+++ b/application/utils.inc.php
@@ -1970,4 +1970,14 @@ class utils
$aHugeClasses = MetaModel::GetConfig()->Get('high_cardinality_classes');
return in_array($sClass, $aHugeClasses);
}
+
+ /**
+ * Check if iTop is in a development environment (VCS vs build number)
+ *
+ * @return bool
+ */
+ public static function IsDevelopmentEnvironment()
+ {
+ return ITOP_REVISION === 'svn';
+ }
}
diff --git a/datamodels/2.x/itop-portal-base/portal/src/helpers/applicationhelper.class.inc.php b/datamodels/2.x/itop-portal-base/portal/src/helpers/applicationhelper.class.inc.php
index 8a5e3acbe..bf5bf7cbc 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/helpers/applicationhelper.class.inc.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/helpers/applicationhelper.class.inc.php
@@ -39,6 +39,7 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Twig_Environment;
use Twig_SimpleFilter;
+use Twig_SimpleFunction;
use UserRights;
use utils;
@@ -269,6 +270,13 @@ class ApplicationHelper
return $sUrl;
}));
+
+ // Function to check our current environment
+ // Usage in twig : {% if is_development_environment() %}
+ $oTwigEnv->addFunction(new Twig_SimpleFunction('is_development_environment', function()
+ {
+ return utils::IsDevelopmentEnvironment();
+ }));
}
/**
diff --git a/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig
index 157cc510c..29b9fb232 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig
+++ b/datamodels/2.x/itop-portal-base/portal/src/views/layout.html.twig
@@ -81,7 +81,11 @@
{% block pPageScripts %}
-
+ {% if is_development_environment() %}
+
+ {% else %}
+
+ {% endif %}
diff --git a/js/exclude.txt b/js/exclude.txt
index e64ecdbb1..20d7d9910 100644
--- a/js/exclude.txt
+++ b/js/exclude.txt
@@ -3,5 +3,4 @@
# since they are used solely for debugging. The minified version is normally used instead.
#
jquery.layout.js
-jquery-migrate-1.2.1.js
jquery.ba-bbq.js
diff --git a/js/jquery-migrate-3.0.1.dev.js b/js/jquery-migrate-3.0.1.dev.js
new file mode 100644
index 000000000..dc053b573
--- /dev/null
+++ b/js/jquery-migrate-3.0.1.dev.js
@@ -0,0 +1,626 @@
+/*!
+ * jQuery Migrate - v3.0.1 - 2017-09-26
+ * Copyright jQuery Foundation and other contributors
+ */
+;( function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+
+ // AMD. Register as an anonymous module.
+ define( [ "jquery" ], window, factory );
+ } else if ( typeof module === "object" && module.exports ) {
+
+ // Node/CommonJS
+ // eslint-disable-next-line no-undef
+ module.exports = factory( require( "jquery" ), window );
+ } else {
+
+ // Browser globals
+ factory( jQuery, window );
+ }
+} )( function( jQuery, window ) {
+ "use strict";
+
+
+ jQuery.migrateVersion = "3.0.1";
+
+ /* exported migrateWarn, migrateWarnFunc, migrateWarnProp */
+
+ ( function() {
+
+ var rbadVersions = /^[12]\./;
+
+ // Support: IE9 only
+ // IE9 only creates console object when dev tools are first opened
+ // IE9 console is a host object, callable but doesn't have .apply()
+ if ( !window.console || !window.console.log ) {
+ return;
+ }
+
+ // Need jQuery 3.0.0+ and no older Migrate loaded
+ if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) {
+ window.console.log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
+ }
+ if ( jQuery.migrateWarnings ) {
+ window.console.log( "JQMIGRATE: Migrate plugin loaded multiple times" );
+ }
+
+ // Show a message on the console so devs know we're active
+ window.console.log( "JQMIGRATE: Migrate is installed" +
+ ( jQuery.migrateMute ? "" : " with logging active" ) +
+ ", version " + jQuery.migrateVersion );
+
+ } )();
+
+ var warnedAbout = {};
+
+// List of warnings already given; public read only
+ jQuery.migrateWarnings = [];
+
+// Set to false to disable traces that appear with warnings
+ if ( jQuery.migrateTrace === undefined ) {
+ jQuery.migrateTrace = true;
+ }
+
+// Forget any warnings we've already given; public
+ jQuery.migrateReset = function() {
+ warnedAbout = {};
+ jQuery.migrateWarnings.length = 0;
+ };
+
+ function migrateWarn( msg ) {
+ var console = window.console;
+ if ( !warnedAbout[ msg ] ) {
+ warnedAbout[ msg ] = true;
+ jQuery.migrateWarnings.push( msg );
+ if ( console && console.warn && !jQuery.migrateMute ) {
+ console.warn( "JQMIGRATE: " + msg );
+ if ( jQuery.migrateTrace && console.trace ) {
+ console.trace();
+ }
+ }
+ }
+ }
+
+ function migrateWarnProp( obj, prop, value, msg ) {
+ Object.defineProperty( obj, prop, {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ migrateWarn( msg );
+ return value;
+ },
+ set: function( newValue ) {
+ migrateWarn( msg );
+ value = newValue;
+ }
+ } );
+ }
+
+ function migrateWarnFunc( obj, prop, newFunc, msg ) {
+ obj[ prop ] = function() {
+ migrateWarn( msg );
+ return newFunc.apply( this, arguments );
+ };
+ }
+
+ if ( window.document.compatMode === "BackCompat" ) {
+
+ // JQuery has never supported or tested Quirks Mode
+ migrateWarn( "jQuery is not compatible with Quirks Mode" );
+ }
+
+
+ var oldInit = jQuery.fn.init,
+ oldIsNumeric = jQuery.isNumeric,
+ oldFind = jQuery.find,
+ rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
+ rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
+
+ jQuery.fn.init = function( arg1 ) {
+ var args = Array.prototype.slice.call( arguments );
+
+ if ( typeof arg1 === "string" && arg1 === "#" ) {
+
+ // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
+ migrateWarn( "jQuery( '#' ) is not a valid selector" );
+ args[ 0 ] = [];
+ }
+
+ return oldInit.apply( this, args );
+ };
+ jQuery.fn.init.prototype = jQuery.fn;
+
+ jQuery.find = function( selector ) {
+ var args = Array.prototype.slice.call( arguments );
+
+ // Support: PhantomJS 1.x
+ // String#match fails to match when used with a //g RegExp, only on some strings
+ if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
+
+ // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
+ // First see if qS thinks it's a valid selector, if so avoid a false positive
+ try {
+ window.document.querySelector( selector );
+ } catch ( err1 ) {
+
+ // Didn't *look* valid to qSA, warn and try quoting what we think is the value
+ selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
+ return "[" + attr + op + "\"" + value + "\"]";
+ } );
+
+ // If the regexp *may* have created an invalid selector, don't update it
+ // Note that there may be false alarms if selector uses jQuery extensions
+ try {
+ window.document.querySelector( selector );
+ migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
+ args[ 0 ] = selector;
+ } catch ( err2 ) {
+ migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
+ }
+ }
+ }
+
+ return oldFind.apply( this, args );
+ };
+
+// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
+ var findProp;
+ for ( findProp in oldFind ) {
+ if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
+ jQuery.find[ findProp ] = oldFind[ findProp ];
+ }
+ }
+
+// The number of elements contained in the matched element set
+ jQuery.fn.size = function() {
+ migrateWarn( "jQuery.fn.size() is deprecated and removed; use the .length property" );
+ return this.length;
+ };
+
+ jQuery.parseJSON = function() {
+ migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" );
+ return JSON.parse.apply( null, arguments );
+ };
+
+ jQuery.isNumeric = function( val ) {
+
+ // The jQuery 2.2.3 implementation of isNumeric
+ function isNumeric2( obj ) {
+ var realStringObj = obj && obj.toString();
+ return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+ }
+
+ var newValue = oldIsNumeric( val ),
+ oldValue = isNumeric2( val );
+
+ if ( newValue !== oldValue ) {
+ migrateWarn( "jQuery.isNumeric() should not be called on constructed objects" );
+ }
+
+ return oldValue;
+ };
+
+ migrateWarnFunc( jQuery, "holdReady", jQuery.holdReady,
+ "jQuery.holdReady is deprecated" );
+
+ migrateWarnFunc( jQuery, "unique", jQuery.uniqueSort,
+ "jQuery.unique is deprecated; use jQuery.uniqueSort" );
+
+// Now jQuery.expr.pseudos is the standard incantation
+ migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
+ "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
+ migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
+ "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
+
+
+ var oldAjax = jQuery.ajax;
+
+ jQuery.ajax = function( ) {
+ var jQXHR = oldAjax.apply( this, arguments );
+
+ // Be sure we got a jQXHR (e.g., not sync)
+ if ( jQXHR.promise ) {
+ migrateWarnFunc( jQXHR, "success", jQXHR.done,
+ "jQXHR.success is deprecated and removed" );
+ migrateWarnFunc( jQXHR, "error", jQXHR.fail,
+ "jQXHR.error is deprecated and removed" );
+ migrateWarnFunc( jQXHR, "complete", jQXHR.always,
+ "jQXHR.complete is deprecated and removed" );
+ }
+
+ return jQXHR;
+ };
+
+
+ var oldRemoveAttr = jQuery.fn.removeAttr,
+ oldToggleClass = jQuery.fn.toggleClass,
+ rmatchNonSpace = /\S+/g;
+
+ jQuery.fn.removeAttr = function( name ) {
+ var self = this;
+
+ jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) {
+ if ( jQuery.expr.match.bool.test( attr ) ) {
+ migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
+ self.prop( attr, false );
+ }
+ } );
+
+ return oldRemoveAttr.apply( this, arguments );
+ };
+
+ jQuery.fn.toggleClass = function( state ) {
+
+ // Only deprecating no-args or single boolean arg
+ if ( state !== undefined && typeof state !== "boolean" ) {
+ return oldToggleClass.apply( this, arguments );
+ }
+
+ migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
+
+ // Toggle entire class name of each element
+ return this.each( function() {
+ var className = this.getAttribute && this.getAttribute( "class" ) || "";
+
+ if ( className ) {
+ jQuery.data( this, "__className__", className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ if ( this.setAttribute ) {
+ this.setAttribute( "class",
+ className || state === false ?
+ "" :
+ jQuery.data( this, "__className__" ) || ""
+ );
+ }
+ } );
+ };
+
+
+ var internalSwapCall = false;
+
+// If this version of jQuery has .swap(), don't false-alarm on internal uses
+ if ( jQuery.swap ) {
+ jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
+ var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
+
+ if ( oldHook ) {
+ jQuery.cssHooks[ name ].get = function() {
+ var ret;
+
+ internalSwapCall = true;
+ ret = oldHook.apply( this, arguments );
+ internalSwapCall = false;
+ return ret;
+ };
+ }
+ } );
+ }
+
+ jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ if ( !internalSwapCall ) {
+ migrateWarn( "jQuery.swap() is undocumented and deprecated" );
+ }
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+ };
+
+ var oldData = jQuery.data;
+
+ jQuery.data = function( elem, name, value ) {
+ var curData;
+
+ // Name can be an object, and each entry in the object is meant to be set as data
+ if ( name && typeof name === "object" && arguments.length === 2 ) {
+ curData = jQuery.hasData( elem ) && oldData.call( this, elem );
+ var sameKeys = {};
+ for ( var key in name ) {
+ if ( key !== jQuery.camelCase( key ) ) {
+ migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key );
+ curData[ key ] = name[ key ];
+ } else {
+ sameKeys[ key ] = name[ key ];
+ }
+ }
+
+ oldData.call( this, elem, sameKeys );
+
+ return name;
+ }
+
+ // If the name is transformed, look for the un-transformed name in the data object
+ if ( name && typeof name === "string" && name !== jQuery.camelCase( name ) ) {
+ curData = jQuery.hasData( elem ) && oldData.call( this, elem );
+ if ( curData && name in curData ) {
+ migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
+ if ( arguments.length > 2 ) {
+ curData[ name ] = value;
+ }
+ return curData[ name ];
+ }
+ }
+
+ return oldData.apply( this, arguments );
+ };
+
+ var oldTweenRun = jQuery.Tween.prototype.run;
+ var linearEasing = function( pct ) {
+ return pct;
+ };
+
+ jQuery.Tween.prototype.run = function( ) {
+ if ( jQuery.easing[ this.easing ].length > 1 ) {
+ migrateWarn(
+ "'jQuery.easing." + this.easing.toString() + "' should use only one argument"
+ );
+
+ jQuery.easing[ this.easing ] = linearEasing;
+ }
+
+ oldTweenRun.apply( this, arguments );
+ };
+
+ jQuery.fx.interval = jQuery.fx.interval || 13;
+
+// Support: IE9, Android <=4.4
+// Avoid false positives on browsers that lack rAF
+ if ( window.requestAnimationFrame ) {
+ migrateWarnProp( jQuery.fx, "interval", jQuery.fx.interval,
+ "jQuery.fx.interval is deprecated" );
+ }
+
+ var oldLoad = jQuery.fn.load,
+ oldEventAdd = jQuery.event.add,
+ originalFix = jQuery.event.fix;
+
+ jQuery.event.props = [];
+ jQuery.event.fixHooks = {};
+
+ migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat,
+ "jQuery.event.props.concat() is deprecated and removed" );
+
+ jQuery.event.fix = function( originalEvent ) {
+ var event,
+ type = originalEvent.type,
+ fixHook = this.fixHooks[ type ],
+ props = jQuery.event.props;
+
+ if ( props.length ) {
+ migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() );
+ while ( props.length ) {
+ jQuery.event.addProp( props.pop() );
+ }
+ }
+
+ if ( fixHook && !fixHook._migrated_ ) {
+ fixHook._migrated_ = true;
+ migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type );
+ if ( ( props = fixHook.props ) && props.length ) {
+ while ( props.length ) {
+ jQuery.event.addProp( props.pop() );
+ }
+ }
+ }
+
+ event = originalFix.call( this, originalEvent );
+
+ return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ };
+
+ jQuery.event.add = function( elem, types ) {
+
+ // This misses the multiple-types case but that seems awfully rare
+ if ( elem === window && types === "load" && window.document.readyState === "complete" ) {
+ migrateWarn( "jQuery(window).on('load'...) called after load event occurred" );
+ }
+ return oldEventAdd.apply( this, arguments );
+ };
+
+ jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
+
+ jQuery.fn[ name ] = function() {
+ var args = Array.prototype.slice.call( arguments, 0 );
+
+ // If this is an ajax load() the first arg should be the string URL;
+ // technically this could also be the "Anything" arg of the event .load()
+ // which just goes to show why this dumb signature has been deprecated!
+ // jQuery custom builds that exclude the Ajax module justifiably die here.
+ if ( name === "load" && typeof args[ 0 ] === "string" ) {
+ return oldLoad.apply( this, args );
+ }
+
+ migrateWarn( "jQuery.fn." + name + "() is deprecated" );
+
+ args.splice( 0, 0, name );
+ if ( arguments.length ) {
+ return this.on.apply( this, args );
+ }
+
+ // Use .triggerHandler here because:
+ // - load and unload events don't need to bubble, only applied to window or image
+ // - error event should not bubble to window, although it does pre-1.7
+ // See http://bugs.jquery.com/ticket/11820
+ this.triggerHandler.apply( this, args );
+ return this;
+ };
+
+ } );
+
+ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+ function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ migrateWarn( "jQuery.fn." + name + "() event shorthand is deprecated" );
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+ } );
+
+// Trigger "ready" event only once, on document ready
+ jQuery( function() {
+ jQuery( window.document ).triggerHandler( "ready" );
+ } );
+
+ jQuery.event.special.ready = {
+ setup: function() {
+ if ( this === window.document ) {
+ migrateWarn( "'ready' event is deprecated" );
+ }
+ }
+ };
+
+ jQuery.fn.extend( {
+
+ bind: function( types, data, fn ) {
+ migrateWarn( "jQuery.fn.bind() is deprecated" );
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ migrateWarn( "jQuery.fn.unbind() is deprecated" );
+ return this.off( types, null, fn );
+ },
+ delegate: function( selector, types, data, fn ) {
+ migrateWarn( "jQuery.fn.delegate() is deprecated" );
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ migrateWarn( "jQuery.fn.undelegate() is deprecated" );
+ return arguments.length === 1 ?
+ this.off( selector, "**" ) :
+ this.off( types, selector || "**", fn );
+ },
+ hover: function( fnOver, fnOut ) {
+ migrateWarn( "jQuery.fn.hover() is deprecated" );
+ return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver );
+ }
+ } );
+
+
+ var oldOffset = jQuery.fn.offset;
+
+ jQuery.fn.offset = function() {
+ var docElem,
+ elem = this[ 0 ],
+ origin = { top: 0, left: 0 };
+
+ if ( !elem || !elem.nodeType ) {
+ migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
+ return origin;
+ }
+
+ docElem = ( elem.ownerDocument || window.document ).documentElement;
+ if ( !jQuery.contains( docElem, elem ) ) {
+ migrateWarn( "jQuery.fn.offset() requires an element connected to a document" );
+ return origin;
+ }
+
+ return oldOffset.apply( this, arguments );
+ };
+
+
+ var oldParam = jQuery.param;
+
+ jQuery.param = function( data, traditional ) {
+ var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+
+ if ( traditional === undefined && ajaxTraditional ) {
+
+ migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
+ traditional = ajaxTraditional;
+ }
+
+ return oldParam.call( this, data, traditional );
+ };
+
+ var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+ jQuery.fn.andSelf = function() {
+ migrateWarn( "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" );
+ return oldSelf.apply( this, arguments );
+ };
+
+
+ var oldDeferred = jQuery.Deferred,
+ tuples = [
+
+ // Action, add listener, callbacks, .then handlers, final state
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ) ]
+ ];
+
+ jQuery.Deferred = function( func ) {
+ var deferred = oldDeferred(),
+ promise = deferred.promise();
+
+ deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ migrateWarn( "deferred.pipe() is deprecated" );
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+ // Deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this === promise ? newDefer.promise() : this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+
+ };
+
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ return deferred;
+ };
+
+// Preserve handler of uncaught exceptions in promise chains
+ jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
+
+ return jQuery;
+} );
diff --git a/js/jquery-migrate-3.0.1.min.js b/js/jquery-migrate-3.0.1.min.js
deleted file mode 100644
index 2819e42ff..000000000
--- a/js/jquery-migrate-3.0.1.min.js
+++ /dev/null
@@ -1,626 +0,0 @@
-/*!
- * jQuery Migrate - v3.0.1 - 2017-09-26
- * Copyright jQuery Foundation and other contributors
- */
-;( function( factory ) {
- if ( typeof define === "function" && define.amd ) {
-
- // AMD. Register as an anonymous module.
- define( [ "jquery" ], window, factory );
- } else if ( typeof module === "object" && module.exports ) {
-
- // Node/CommonJS
- // eslint-disable-next-line no-undef
- module.exports = factory( require( "jquery" ), window );
- } else {
-
- // Browser globals
- factory( jQuery, window );
- }
-} )( function( jQuery, window ) {
- "use strict";
-
-
- jQuery.migrateVersion = "3.0.1";
-
- /* exported migrateWarn, migrateWarnFunc, migrateWarnProp */
-
- ( function() {
-
- var rbadVersions = /^[12]\./;
-
- // Support: IE9 only
- // IE9 only creates console object when dev tools are first opened
- // IE9 console is a host object, callable but doesn't have .apply()
- if ( !window.console || !window.console.log ) {
- return;
- }
-
- // Need jQuery 3.0.0+ and no older Migrate loaded
- if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) {
- window.console.log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
- }
- if ( jQuery.migrateWarnings ) {
- window.console.log( "JQMIGRATE: Migrate plugin loaded multiple times" );
- }
-
- // Show a message on the console so devs know we're active
- window.console.log( "JQMIGRATE: Migrate is installed" +
- ( jQuery.migrateMute ? "" : " with logging active" ) +
- ", version " + jQuery.migrateVersion );
-
- } )();
-
- var warnedAbout = {};
-
-// List of warnings already given; public read only
- jQuery.migrateWarnings = [];
-
-// Set to false to disable traces that appear with warnings
- if ( jQuery.migrateTrace === undefined ) {
- jQuery.migrateTrace = true;
- }
-
-// Forget any warnings we've already given; public
- jQuery.migrateReset = function() {
- warnedAbout = {};
- jQuery.migrateWarnings.length = 0;
- };
-
- function migrateWarn( msg ) {
- var console = window.console;
- if ( !warnedAbout[ msg ] ) {
- warnedAbout[ msg ] = true;
- jQuery.migrateWarnings.push( msg );
- if ( console && console.warn && !jQuery.migrateMute ) {
- console.warn( "JQMIGRATE: " + msg );
- if ( jQuery.migrateTrace && console.trace ) {
- console.trace();
- }
- }
- }
- }
-
- function migrateWarnProp( obj, prop, value, msg ) {
- Object.defineProperty( obj, prop, {
- configurable: true,
- enumerable: true,
- get: function() {
- migrateWarn( msg );
- return value;
- },
- set: function( newValue ) {
- migrateWarn( msg );
- value = newValue;
- }
- } );
- }
-
- function migrateWarnFunc( obj, prop, newFunc, msg ) {
- obj[ prop ] = function() {
- migrateWarn( msg );
- return newFunc.apply( this, arguments );
- };
- }
-
- if ( window.document.compatMode === "BackCompat" ) {
-
- // JQuery has never supported or tested Quirks Mode
- migrateWarn( "jQuery is not compatible with Quirks Mode" );
- }
-
-
- var oldInit = jQuery.fn.init,
- oldIsNumeric = jQuery.isNumeric,
- oldFind = jQuery.find,
- rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
- rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
-
- jQuery.fn.init = function( arg1 ) {
- var args = Array.prototype.slice.call( arguments );
-
- if ( typeof arg1 === "string" && arg1 === "#" ) {
-
- // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
- migrateWarn( "jQuery( '#' ) is not a valid selector" );
- args[ 0 ] = [];
- }
-
- return oldInit.apply( this, args );
- };
- jQuery.fn.init.prototype = jQuery.fn;
-
- jQuery.find = function( selector ) {
- var args = Array.prototype.slice.call( arguments );
-
- // Support: PhantomJS 1.x
- // String#match fails to match when used with a //g RegExp, only on some strings
- if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
-
- // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
- // First see if qS thinks it's a valid selector, if so avoid a false positive
- try {
- window.document.querySelector( selector );
- } catch ( err1 ) {
-
- // Didn't *look* valid to qSA, warn and try quoting what we think is the value
- selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
- return "[" + attr + op + "\"" + value + "\"]";
- } );
-
- // If the regexp *may* have created an invalid selector, don't update it
- // Note that there may be false alarms if selector uses jQuery extensions
- try {
- window.document.querySelector( selector );
- migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
- args[ 0 ] = selector;
- } catch ( err2 ) {
- migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
- }
- }
- }
-
- return oldFind.apply( this, args );
- };
-
-// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
- var findProp;
- for ( findProp in oldFind ) {
- if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
- jQuery.find[ findProp ] = oldFind[ findProp ];
- }
- }
-
-// The number of elements contained in the matched element set
- jQuery.fn.size = function() {
- migrateWarn( "jQuery.fn.size() is deprecated and removed; use the .length property" );
- return this.length;
- };
-
- jQuery.parseJSON = function() {
- migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" );
- return JSON.parse.apply( null, arguments );
- };
-
- jQuery.isNumeric = function( val ) {
-
- // The jQuery 2.2.3 implementation of isNumeric
- function isNumeric2( obj ) {
- var realStringObj = obj && obj.toString();
- return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
- }
-
- var newValue = oldIsNumeric( val ),
- oldValue = isNumeric2( val );
-
- if ( newValue !== oldValue ) {
- migrateWarn( "jQuery.isNumeric() should not be called on constructed objects" );
- }
-
- return oldValue;
- };
-
- migrateWarnFunc( jQuery, "holdReady", jQuery.holdReady,
- "jQuery.holdReady is deprecated" );
-
- migrateWarnFunc( jQuery, "unique", jQuery.uniqueSort,
- "jQuery.unique is deprecated; use jQuery.uniqueSort" );
-
-// Now jQuery.expr.pseudos is the standard incantation
- migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
- "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
- migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
- "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
-
-
- var oldAjax = jQuery.ajax;
-
- jQuery.ajax = function( ) {
- var jQXHR = oldAjax.apply( this, arguments );
-
- // Be sure we got a jQXHR (e.g., not sync)
- if ( jQXHR.promise ) {
- migrateWarnFunc( jQXHR, "success", jQXHR.done,
- "jQXHR.success is deprecated and removed" );
- migrateWarnFunc( jQXHR, "error", jQXHR.fail,
- "jQXHR.error is deprecated and removed" );
- migrateWarnFunc( jQXHR, "complete", jQXHR.always,
- "jQXHR.complete is deprecated and removed" );
- }
-
- return jQXHR;
- };
-
-
- var oldRemoveAttr = jQuery.fn.removeAttr,
- oldToggleClass = jQuery.fn.toggleClass,
- rmatchNonSpace = /\S+/g;
-
- jQuery.fn.removeAttr = function( name ) {
- var self = this;
-
- jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) {
- if ( jQuery.expr.match.bool.test( attr ) ) {
- migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
- self.prop( attr, false );
- }
- } );
-
- return oldRemoveAttr.apply( this, arguments );
- };
-
- jQuery.fn.toggleClass = function( state ) {
-
- // Only deprecating no-args or single boolean arg
- if ( state !== undefined && typeof state !== "boolean" ) {
- return oldToggleClass.apply( this, arguments );
- }
-
- migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
-
- // Toggle entire class name of each element
- return this.each( function() {
- var className = this.getAttribute && this.getAttribute( "class" ) || "";
-
- if ( className ) {
- jQuery.data( this, "__className__", className );
- }
-
- // If the element has a class name or if we're passed `false`,
- // then remove the whole classname (if there was one, the above saved it).
- // Otherwise bring back whatever was previously saved (if anything),
- // falling back to the empty string if nothing was stored.
- if ( this.setAttribute ) {
- this.setAttribute( "class",
- className || state === false ?
- "" :
- jQuery.data( this, "__className__" ) || ""
- );
- }
- } );
- };
-
-
- var internalSwapCall = false;
-
-// If this version of jQuery has .swap(), don't false-alarm on internal uses
- if ( jQuery.swap ) {
- jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
- var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
-
- if ( oldHook ) {
- jQuery.cssHooks[ name ].get = function() {
- var ret;
-
- internalSwapCall = true;
- ret = oldHook.apply( this, arguments );
- internalSwapCall = false;
- return ret;
- };
- }
- } );
- }
-
- jQuery.swap = function( elem, options, callback, args ) {
- var ret, name,
- old = {};
-
- if ( !internalSwapCall ) {
- migrateWarn( "jQuery.swap() is undocumented and deprecated" );
- }
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.apply( elem, args || [] );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
- };
-
- var oldData = jQuery.data;
-
- jQuery.data = function( elem, name, value ) {
- var curData;
-
- // Name can be an object, and each entry in the object is meant to be set as data
- if ( name && typeof name === "object" && arguments.length === 2 ) {
- curData = jQuery.hasData( elem ) && oldData.call( this, elem );
- var sameKeys = {};
- for ( var key in name ) {
- if ( key !== jQuery.camelCase( key ) ) {
- migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key );
- curData[ key ] = name[ key ];
- } else {
- sameKeys[ key ] = name[ key ];
- }
- }
-
- oldData.call( this, elem, sameKeys );
-
- return name;
- }
-
- // If the name is transformed, look for the un-transformed name in the data object
- if ( name && typeof name === "string" && name !== jQuery.camelCase( name ) ) {
- curData = jQuery.hasData( elem ) && oldData.call( this, elem );
- if ( curData && name in curData ) {
- migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
- if ( arguments.length > 2 ) {
- curData[ name ] = value;
- }
- return curData[ name ];
- }
- }
-
- return oldData.apply( this, arguments );
- };
-
- var oldTweenRun = jQuery.Tween.prototype.run;
- var linearEasing = function( pct ) {
- return pct;
- };
-
- jQuery.Tween.prototype.run = function( ) {
- if ( jQuery.easing[ this.easing ].length > 1 ) {
- migrateWarn(
- "'jQuery.easing." + this.easing.toString() + "' should use only one argument"
- );
-
- jQuery.easing[ this.easing ] = linearEasing;
- }
-
- oldTweenRun.apply( this, arguments );
- };
-
- jQuery.fx.interval = jQuery.fx.interval || 13;
-
-// Support: IE9, Android <=4.4
-// Avoid false positives on browsers that lack rAF
- if ( window.requestAnimationFrame ) {
- migrateWarnProp( jQuery.fx, "interval", jQuery.fx.interval,
- "jQuery.fx.interval is deprecated" );
- }
-
- var oldLoad = jQuery.fn.load,
- oldEventAdd = jQuery.event.add,
- originalFix = jQuery.event.fix;
-
- jQuery.event.props = [];
- jQuery.event.fixHooks = {};
-
- migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat,
- "jQuery.event.props.concat() is deprecated and removed" );
-
- jQuery.event.fix = function( originalEvent ) {
- var event,
- type = originalEvent.type,
- fixHook = this.fixHooks[ type ],
- props = jQuery.event.props;
-
- if ( props.length ) {
- migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() );
- while ( props.length ) {
- jQuery.event.addProp( props.pop() );
- }
- }
-
- if ( fixHook && !fixHook._migrated_ ) {
- fixHook._migrated_ = true;
- migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type );
- if ( ( props = fixHook.props ) && props.length ) {
- while ( props.length ) {
- jQuery.event.addProp( props.pop() );
- }
- }
- }
-
- event = originalFix.call( this, originalEvent );
-
- return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
- };
-
- jQuery.event.add = function( elem, types ) {
-
- // This misses the multiple-types case but that seems awfully rare
- if ( elem === window && types === "load" && window.document.readyState === "complete" ) {
- migrateWarn( "jQuery(window).on('load'...) called after load event occurred" );
- }
- return oldEventAdd.apply( this, arguments );
- };
-
- jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
-
- jQuery.fn[ name ] = function() {
- var args = Array.prototype.slice.call( arguments, 0 );
-
- // If this is an ajax load() the first arg should be the string URL;
- // technically this could also be the "Anything" arg of the event .load()
- // which just goes to show why this dumb signature has been deprecated!
- // jQuery custom builds that exclude the Ajax module justifiably die here.
- if ( name === "load" && typeof args[ 0 ] === "string" ) {
- return oldLoad.apply( this, args );
- }
-
- migrateWarn( "jQuery.fn." + name + "() is deprecated" );
-
- args.splice( 0, 0, name );
- if ( arguments.length ) {
- return this.on.apply( this, args );
- }
-
- // Use .triggerHandler here because:
- // - load and unload events don't need to bubble, only applied to window or image
- // - error event should not bubble to window, although it does pre-1.7
- // See http://bugs.jquery.com/ticket/11820
- this.triggerHandler.apply( this, args );
- return this;
- };
-
- } );
-
- jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
- function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- migrateWarn( "jQuery.fn." + name + "() event shorthand is deprecated" );
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
- } );
-
-// Trigger "ready" event only once, on document ready
- jQuery( function() {
- jQuery( window.document ).triggerHandler( "ready" );
- } );
-
- jQuery.event.special.ready = {
- setup: function() {
- if ( this === window.document ) {
- migrateWarn( "'ready' event is deprecated" );
- }
- }
- };
-
- jQuery.fn.extend( {
-
- bind: function( types, data, fn ) {
- migrateWarn( "jQuery.fn.bind() is deprecated" );
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- migrateWarn( "jQuery.fn.unbind() is deprecated" );
- return this.off( types, null, fn );
- },
- delegate: function( selector, types, data, fn ) {
- migrateWarn( "jQuery.fn.delegate() is deprecated" );
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- migrateWarn( "jQuery.fn.undelegate() is deprecated" );
- return arguments.length === 1 ?
- this.off( selector, "**" ) :
- this.off( types, selector || "**", fn );
- },
- hover: function( fnOver, fnOut ) {
- migrateWarn( "jQuery.fn.hover() is deprecated" );
- return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver );
- }
- } );
-
-
- var oldOffset = jQuery.fn.offset;
-
- jQuery.fn.offset = function() {
- var docElem,
- elem = this[ 0 ],
- origin = { top: 0, left: 0 };
-
- if ( !elem || !elem.nodeType ) {
- migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
- return origin;
- }
-
- docElem = ( elem.ownerDocument || window.document ).documentElement;
- if ( !jQuery.contains( docElem, elem ) ) {
- migrateWarn( "jQuery.fn.offset() requires an element connected to a document" );
- return origin;
- }
-
- return oldOffset.apply( this, arguments );
- };
-
-
- var oldParam = jQuery.param;
-
- jQuery.param = function( data, traditional ) {
- var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-
- if ( traditional === undefined && ajaxTraditional ) {
-
- migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
- traditional = ajaxTraditional;
- }
-
- return oldParam.call( this, data, traditional );
- };
-
- var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
-
- jQuery.fn.andSelf = function() {
- migrateWarn( "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" );
- return oldSelf.apply( this, arguments );
- };
-
-
- var oldDeferred = jQuery.Deferred,
- tuples = [
-
- // Action, add listener, callbacks, .then handlers, final state
- [ "resolve", "done", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), "resolved" ],
- [ "reject", "fail", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), "rejected" ],
- [ "notify", "progress", jQuery.Callbacks( "memory" ),
- jQuery.Callbacks( "memory" ) ]
- ];
-
- jQuery.Deferred = function( func ) {
- var deferred = oldDeferred(),
- promise = deferred.promise();
-
- deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
-
- migrateWarn( "deferred.pipe() is deprecated" );
-
- return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
- var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-
- // Deferred.done(function() { bind to newDefer or newDefer.resolve })
- // deferred.fail(function() { bind to newDefer or newDefer.reject })
- // deferred.progress(function() { bind to newDefer or newDefer.notify })
- deferred[ tuple[ 1 ] ]( function() {
- var returned = fn && fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise()
- .done( newDefer.resolve )
- .fail( newDefer.reject )
- .progress( newDefer.notify );
- } else {
- newDefer[ tuple[ 0 ] + "With" ](
- this === promise ? newDefer.promise() : this,
- fn ? [ returned ] : arguments
- );
- }
- } );
- } );
- fns = null;
- } ).promise();
-
- };
-
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- return deferred;
- };
-
-// Preserve handler of uncaught exceptions in promise chains
- jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
-
- return jQuery;
-} );
\ No newline at end of file
diff --git a/js/jquery-migrate-3.0.1.prod.min.js b/js/jquery-migrate-3.0.1.prod.min.js
new file mode 100644
index 000000000..0102a9d0f
--- /dev/null
+++ b/js/jquery-migrate-3.0.1.prod.min.js
@@ -0,0 +1,215 @@
+/*! jQuery Migrate v3.0.1 | (c) jQuery Foundation and other contributors | jquery.org/license */
+
+void 0 === jQuery.migrateMute && (jQuery.migrateMute = !0), function(e) {
+ "function" == typeof define && define.amd ? define([ "jquery" ], window, e) : "object" == typeof module && module.exports ? module.exports = e(require("jquery"), window) : e(jQuery, window);
+}(function(e, t) {
+ "use strict";
+ function r(r) {
+ var n = t.console;
+ o[r] || (o[r] = !0, e.migrateWarnings.push(r), n && n.warn && !e.migrateMute && (n.warn("JQMIGRATE: " + r),
+ e.migrateTrace && n.trace && n.trace()));
+ }
+ function n(e, t, n, a) {
+ Object.defineProperty(e, t, {
+ configurable: !0,
+ enumerable: !0,
+ get: function() {
+ return r(a), n;
+ },
+ set: function(e) {
+ r(a), n = e;
+ }
+ });
+ }
+ function a(e, t, n, a) {
+ e[t] = function() {
+ return r(a), n.apply(this, arguments);
+ };
+ }
+ e.migrateVersion = "3.0.1", function() {
+ var r = /^[12]\./;
+ t.console && t.console.log && (e && !r.test(e.fn.jquery) || t.console.log("JQMIGRATE: jQuery 3.0.0+ REQUIRED"),
+ e.migrateWarnings && t.console.log("JQMIGRATE: Migrate plugin loaded multiple times"),
+ t.console.log("JQMIGRATE: Migrate is installed" + (e.migrateMute ? "" : " with logging active") + ", version " + e.migrateVersion));
+ }();
+ var o = {};
+ e.migrateWarnings = [], void 0 === e.migrateTrace && (e.migrateTrace = !0), e.migrateReset = function() {
+ o = {}, e.migrateWarnings.length = 0;
+ }, "BackCompat" === t.document.compatMode && r("jQuery is not compatible with Quirks Mode");
+ var i = e.fn.init, s = e.isNumeric, u = e.find, c = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/, l = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
+ e.fn.init = function(e) {
+ var t = Array.prototype.slice.call(arguments);
+ return "string" == typeof e && "#" === e && (r("jQuery( '#' ) is not a valid selector"),
+ t[0] = []), i.apply(this, t);
+ }, e.fn.init.prototype = e.fn, e.find = function(e) {
+ var n = Array.prototype.slice.call(arguments);
+ if ("string" == typeof e && c.test(e)) try {
+ t.document.querySelector(e);
+ } catch (a) {
+ e = e.replace(l, function(e, t, r, n) {
+ return "[" + t + r + '"' + n + '"]';
+ });
+ try {
+ t.document.querySelector(e), r("Attribute selector with '#' must be quoted: " + n[0]),
+ n[0] = e;
+ } catch (e) {
+ r("Attribute selector with '#' was not fixed: " + n[0]);
+ }
+ }
+ return u.apply(this, n);
+ };
+ var d;
+ for (d in u) Object.prototype.hasOwnProperty.call(u, d) && (e.find[d] = u[d]);
+ e.fn.size = function() {
+ return r("jQuery.fn.size() is deprecated and removed; use the .length property"),
+ this.length;
+ }, e.parseJSON = function() {
+ return r("jQuery.parseJSON is deprecated; use JSON.parse"), JSON.parse.apply(null, arguments);
+ }, e.isNumeric = function(t) {
+ var n = s(t), a = function(t) {
+ var r = t && t.toString();
+ return !e.isArray(t) && r - parseFloat(r) + 1 >= 0;
+ }(t);
+ return n !== a && r("jQuery.isNumeric() should not be called on constructed objects"),
+ a;
+ }, a(e, "holdReady", e.holdReady, "jQuery.holdReady is deprecated"), a(e, "unique", e.uniqueSort, "jQuery.unique is deprecated; use jQuery.uniqueSort"),
+ n(e.expr, "filters", e.expr.pseudos, "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos"),
+ n(e.expr, ":", e.expr.pseudos, "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos");
+ var p = e.ajax;
+ e.ajax = function() {
+ var e = p.apply(this, arguments);
+ return e.promise && (a(e, "success", e.done, "jQXHR.success is deprecated and removed"),
+ a(e, "error", e.fail, "jQXHR.error is deprecated and removed"), a(e, "complete", e.always, "jQXHR.complete is deprecated and removed")),
+ e;
+ };
+ var f = e.fn.removeAttr, y = e.fn.toggleClass, m = /\S+/g;
+ e.fn.removeAttr = function(t) {
+ var n = this;
+ return e.each(t.match(m), function(t, a) {
+ e.expr.match.bool.test(a) && (r("jQuery.fn.removeAttr no longer sets boolean properties: " + a),
+ n.prop(a, !1));
+ }), f.apply(this, arguments);
+ }, e.fn.toggleClass = function(t) {
+ return void 0 !== t && "boolean" != typeof t ? y.apply(this, arguments) : (r("jQuery.fn.toggleClass( boolean ) is deprecated"),
+ this.each(function() {
+ var r = this.getAttribute && this.getAttribute("class") || "";
+ r && e.data(this, "__className__", r), this.setAttribute && this.setAttribute("class", r || !1 === t ? "" : e.data(this, "__className__") || "");
+ }));
+ };
+ var h = !1;
+ e.swap && e.each([ "height", "width", "reliableMarginRight" ], function(t, r) {
+ var n = e.cssHooks[r] && e.cssHooks[r].get;
+ n && (e.cssHooks[r].get = function() {
+ var e;
+ return h = !0, e = n.apply(this, arguments), h = !1, e;
+ });
+ }), e.swap = function(e, t, n, a) {
+ var o, i, s = {};
+ h || r("jQuery.swap() is undocumented and deprecated");
+ for (i in t) s[i] = e.style[i], e.style[i] = t[i];
+ o = n.apply(e, a || []);
+ for (i in t) e.style[i] = s[i];
+ return o;
+ };
+ var g = e.data;
+ e.data = function(t, n, a) {
+ var o;
+ if (n && "object" == typeof n && 2 === arguments.length) {
+ o = e.hasData(t) && g.call(this, t);
+ var i = {};
+ for (var s in n) s !== e.camelCase(s) ? (r("jQuery.data() always sets/gets camelCased names: " + s),
+ o[s] = n[s]) : i[s] = n[s];
+ return g.call(this, t, i), n;
+ }
+ return n && "string" == typeof n && n !== e.camelCase(n) && (o = e.hasData(t) && g.call(this, t)) && n in o ? (r("jQuery.data() always sets/gets camelCased names: " + n),
+ arguments.length > 2 && (o[n] = a), o[n]) : g.apply(this, arguments);
+ };
+ var v = e.Tween.prototype.run, j = function(e) {
+ return e;
+ };
+ e.Tween.prototype.run = function() {
+ e.easing[this.easing].length > 1 && (r("'jQuery.easing." + this.easing.toString() + "' should use only one argument"),
+ e.easing[this.easing] = j), v.apply(this, arguments);
+ }, e.fx.interval = e.fx.interval || 13, t.requestAnimationFrame && n(e.fx, "interval", e.fx.interval, "jQuery.fx.interval is deprecated");
+ var Q = e.fn.load, b = e.event.add, w = e.event.fix;
+ e.event.props = [], e.event.fixHooks = {}, n(e.event.props, "concat", e.event.props.concat, "jQuery.event.props.concat() is deprecated and removed"),
+ e.event.fix = function(t) {
+ var n, a = t.type, o = this.fixHooks[a], i = e.event.props;
+ if (i.length) for (r("jQuery.event.props are deprecated and removed: " + i.join()); i.length; ) e.event.addProp(i.pop());
+ if (o && !o._migrated_ && (o._migrated_ = !0, r("jQuery.event.fixHooks are deprecated and removed: " + a),
+ (i = o.props) && i.length)) for (;i.length; ) e.event.addProp(i.pop());
+ return n = w.call(this, t), o && o.filter ? o.filter(n, t) : n;
+ }, e.event.add = function(e, n) {
+ return e === t && "load" === n && "complete" === t.document.readyState && r("jQuery(window).on('load'...) called after load event occurred"),
+ b.apply(this, arguments);
+ }, e.each([ "load", "unload", "error" ], function(t, n) {
+ e.fn[n] = function() {
+ var e = Array.prototype.slice.call(arguments, 0);
+ return "load" === n && "string" == typeof e[0] ? Q.apply(this, e) : (r("jQuery.fn." + n + "() is deprecated"),
+ e.splice(0, 0, n), arguments.length ? this.on.apply(this, e) : (this.triggerHandler.apply(this, e),
+ this));
+ };
+ }), e.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "), function(t, n) {
+ e.fn[n] = function(e, t) {
+ return r("jQuery.fn." + n + "() event shorthand is deprecated"), arguments.length > 0 ? this.on(n, null, e, t) : this.trigger(n);
+ };
+ }), e(function() {
+ e(t.document).triggerHandler("ready");
+ }), e.event.special.ready = {
+ setup: function() {
+ this === t.document && r("'ready' event is deprecated");
+ }
+ }, e.fn.extend({
+ bind: function(e, t, n) {
+ return r("jQuery.fn.bind() is deprecated"), this.on(e, null, t, n);
+ },
+ unbind: function(e, t) {
+ return r("jQuery.fn.unbind() is deprecated"), this.off(e, null, t);
+ },
+ delegate: function(e, t, n, a) {
+ return r("jQuery.fn.delegate() is deprecated"), this.on(t, e, n, a);
+ },
+ undelegate: function(e, t, n) {
+ return r("jQuery.fn.undelegate() is deprecated"), 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", n);
+ },
+ hover: function(e, t) {
+ return r("jQuery.fn.hover() is deprecated"), this.on("mouseenter", e).on("mouseleave", t || e);
+ }
+ });
+ var x = e.fn.offset;
+ e.fn.offset = function() {
+ var n, a = this[0], o = {
+ top: 0,
+ left: 0
+ };
+ return a && a.nodeType ? (n = (a.ownerDocument || t.document).documentElement, e.contains(n, a) ? x.apply(this, arguments) : (r("jQuery.fn.offset() requires an element connected to a document"),
+ o)) : (r("jQuery.fn.offset() requires a valid DOM element"), o);
+ };
+ var k = e.param;
+ e.param = function(t, n) {
+ var a = e.ajaxSettings && e.ajaxSettings.traditional;
+ return void 0 === n && a && (r("jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),
+ n = a), k.call(this, t, n);
+ };
+ var A = e.fn.andSelf || e.fn.addBack;
+ e.fn.andSelf = function() {
+ return r("jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),
+ A.apply(this, arguments);
+ };
+ var S = e.Deferred, q = [ [ "resolve", "done", e.Callbacks("once memory"), e.Callbacks("once memory"), "resolved" ], [ "reject", "fail", e.Callbacks("once memory"), e.Callbacks("once memory"), "rejected" ], [ "notify", "progress", e.Callbacks("memory"), e.Callbacks("memory") ] ];
+ return e.Deferred = function(t) {
+ var n = S(), a = n.promise();
+ return n.pipe = a.pipe = function() {
+ var t = arguments;
+ return r("deferred.pipe() is deprecated"), e.Deferred(function(r) {
+ e.each(q, function(o, i) {
+ var s = e.isFunction(t[o]) && t[o];
+ n[i[1]](function() {
+ var t = s && s.apply(this, arguments);
+ t && e.isFunction(t.promise) ? t.promise().done(r.resolve).fail(r.reject).progress(r.notify) : r[i[0] + "With"](this === a ? r.promise() : this, s ? [ t ] : arguments);
+ });
+ }), t = null;
+ }).promise();
+ }, t && t.call(n, n), n;
+ }, e.Deferred.exceptionHook = S.exceptionHook, e;
+});
\ No newline at end of file