PageSourceSearch

https://vlaardingendoen.nl/assets/js/bundle.js?v=4.1

js vlaardingendoen.nl collected 2026-10-08 10:24:00 UTC 2,281,616 bytes, 48,680 lines download raw bytes

1/******/ (function() { // webpackBootstrap
2    /******/ 	var __webpack_modules__ = ({
3
4        
vendor: 243,474 bytes, lines 4-5646
4/***/ "./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js":
5        /*!******************************************************************!*\
6  !*** ./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js ***!
7  \******************************************************************/
8        /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
9
10            /* provided dependency */ var jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
11// ==================================================
12// fancyBox v3.5.7
13//
14// Licensed GPLv3 for open source use
15// or fancyBox Commercial License for commercial use
16//
17// http://fancyapps.com/fancybox/
18// Copyright 2019 fancyApps
19//
20// ==================================================
21            (function (window, document, $, undefined) {
22                "use strict";
23
24                window.console = window.console || {
25                    info: function (stuff) {}
26                };
27
28                // If there's no jQuery, fancyBox can't work
29                // =========================================
30
31                if (!$) {
32                    return;
33                }
34
35                // Check if fancyBox is already initialized
36                // ========================================
37
38                if ($.fn.fancybox) {
39                    console.info("fancyBox already initialized");
40
41                    return;
42                }
43
44                // Private default settings
45                // ========================
46
47                var defaults = {
48                    // Close existing modals
49                    // Set this to false if you do not need to stack multiple instances
50                    closeExisting: false,
51
52                    // Enable infinite gallery navigation
53                    loop: false,
54
55                    // Horizontal space between slides
56                    gutter: 50,
57
58                    // Enable keyboard navigation
59                    keyboard: true,
60
61                    // Should allow caption to overlap the content
62                    preventCaptionOverlap: true,
63
64                    // Should display navigation arrows at the screen edges
65                    arrows: true,
66
67                    // Should display counter at the top left corner
68                    infobar: true,
69
70                    // Should display close button (using `btnTpl.smallBtn` template) over the content
71                    // Can be true, false, "auto"
72                    // If "auto" - will be automatically enabled for "html", "inline" or "ajax" items
73                    smallBtn: "auto",
74
75                    // Should display toolbar (buttons at the top)
76                    // Can be true, false, "auto"
77                    // If "auto" - will be automatically hidden if "smallBtn" is enabled
78                    toolbar: "auto",
79
80                    // What buttons should appear in the top right corner.
81                    // Buttons will be created using templates from `btnTpl` option
82                    // and they will be placed into toolbar (class="fancybox-toolbar"` element)
83                    buttons: [
84                        "zoom",
85                        //"share",
86                        "slideShow",
87                        //"fullScreen",
88                        //"download",
89                        "thumbs",
90                        "close"
91                    ],
92
93                    // Detect "idle" time in seconds
94                    idleTime: 3,
95
96                    // Disable right-click and use simple image protection for images
97                    protect: false,
98
99                    // Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc
100                    modal: false,
101
102                    image: {
103                        // Wait for images to load before displaying
104                        //   true  - wait for image to load and then display;
105                        //   false - display thumbnail and load the full-sized image over top,
106                        //           requires predefined image dimensions (`data-width` and `data-height` attributes)
107                        preload: false
108                    },
109
110                    ajax: {
111                        // Object containing settings for ajax request
112                        settings: {
113                            // This helps to indicate that request comes from the modal
114                            // Feel free to change naming
115                            data: {
116                                fancybox: true
117                            }
118                        }
119                    },
120
121                    iframe: {
122                        // Iframe template
123                        tpl: '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" allowfullscreen="allowfullscreen" allow="autoplay; fullscreen" src=""></iframe>',
124
125                        // Preload iframe before displaying it
126                        // This allows to calculate iframe content width and height
127                        // (note: Due to "Same Origin Policy", you can't get cross domain data).
128                        preload: true,
129
130                        // Custom CSS styling for iframe wrapping element
131                        // You can use this to set custom iframe dimensions
132                        css: {},
133
134                        // Iframe tag attributes
135                        attr: {
136                            scrolling: "auto"
137                        }
138                    },
139
140                    // For HTML5 video only
141                    video: {
142                        tpl: '<video class="fancybox-video" controls controlsList="nodownload" poster="{{poster}}">' +
143                            '<source src="{{src}}" type="{{format}}" />' +
144                            'Sorry, your browser doesn\'t support embedded videos, <a href="{{src}}">download</a> and watch with your favorite video player!' +
145                            "</video>",
146                        format: "", // custom video format
147                        autoStart: true
148                    },
149
150                    // Default content type if cannot be detected automatically
151                    defaultType: "image",
152
153                    // Open/close animation type
154                    // Possible values:
155                    //   false            - disable
156                    //   "zoom"           - zoom images from/to thumbnail
157                    //   "fade"
158                    //   "zoom-in-out"
159                    //
160                    animationEffect: "zoom",
161
162                    // Duration in ms for open/close animation
163                    animationDuration: 366,
164
165                    // Should image change opacity while zooming
166                    // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios
167                    zoomOpacity: "auto",
168
169                    // Transition effect between slides
170                    //
171                    // Possible values:
172                    //   false            - disable
173                    //   "fade'
174                    //   "slide'
175                    //   "circular'
176                    //   "tube'
177                    //   "zoom-in-out'
178                    //   "rotate'
179                    //
180                    transitionEffect: "fade",
181
182                    // Duration in ms for transition animation
183                    transitionDuration: 366,
184
185                    // Custom CSS class for slide element
186                    slideClass: "",
187
188                    // Custom CSS class for layout
189                    baseClass: "",
190
191                    // Base template for layout
192                    baseTpl: '<div class="fancybox-container" role="dialog" tabindex="-1">' +
193                        '<div class="fancybox-bg"></div>' +
194                        '<div class="fancybox-inner">' +
195                        '<div class="fancybox-infobar"><span data-fancybox-index></span>&nbsp;/&nbsp;<span data-fancybox-count></span></div>' +
196                        '<div class="fancybox-toolbar">{{buttons}}</div>' +
197                        '<div class="fancybox-navigation">{{arrows}}</div>' +
198                        '<div class="fancybox-stage"></div>' +
199                        '<div class="fancybox-caption"><div class="fancybox-caption__body"></div></div>' +
200                        "</div>" +
201                        "</div>",
202
203                    // Loading indicator template
204                    spinnerTpl: '<div class="fancybox-loading"></div>',
205
206                    // Error message template
207                    errorTpl: '<div class="fancybox-error"><p>{{ERROR}}</p></div>',
208
209                    btnTpl: {
210                        download: '<a download data-fancybox-download class="fancybox-button fancybox-button--download" title="{{DOWNLOAD}}" href="javascript:;">' +
211                            '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.62 17.09V19H5.38v-1.91zm-2.97-6.96L17 11.45l-5 4.87-5-4.87 1.36-1.32 2.68 2.64V5h1.92v7.77z"/></svg>' +
212                            "</a>",
213
214                        zoom: '<button data-fancybox-zoom class="fancybox-button fancybox-button--zoom" title="{{ZOOM}}">' +
215                            '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.7 17.3l-3-3a5.9 5.9 0 0 0-.6-7.6 5.9 5.9 0 0 0-8.4 0 5.9 5.9 0 0 0 0 8.4 5.9 5.9 0 0 0 7.7.7l3 3a1 1 0 0 0 1.3 0c.4-.5.4-1 0-1.5zM8.1 13.8a4 4 0 0 1 0-5.7 4 4 0 0 1 5.7 0 4 4 0 0 1 0 5.7 4 4 0 0 1-5.7 0z"/></svg>' +
216                            "</button>",
217
218                        close: '<button data-fancybox-close class="fancybox-button fancybox-button--close" title="{{CLOSE}}">' +
219                            '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 10.6L6.6 5.2 5.2 6.6l5.4 5.4-5.4 5.4 1.4 1.4 5.4-5.4 5.4 5.4 1.4-1.4-5.4-5.4 5.4-5.4-1.4-1.4-5.4 5.4z"/></svg>' +
220                            "</button>",
221
222                        // Arrows
223                        arrowLeft: '<button data-fancybox-prev class="fancybox-button fancybox-button--arrow_left" title="{{PREV}}">' +
224                            '<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.28 15.7l-1.34 1.37L5 12l4.94-5.07 1.34 1.38-2.68 2.72H19v1.94H8.6z"/></svg></div>' +
225                            "</button>",
226
227                        arrowRight: '<button data-fancybox-next class="fancybox-button fancybox-button--arrow_right" title="{{NEXT}}">' +
228                            '<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 12.97l-2.68 2.72 1.34 1.38L19 12l-4.94-5.07-1.34 1.38 2.68 2.72H5v1.94z"/></svg></div>' +
229                            "</button>",
230
231                        // This small close button will be appended to your html/inline/ajax content by default,
232                        // if "smallBtn" option is not set to false
233                        smallBtn: '<button type="button" data-fancybox-close class="fancybox-button fancybox-close-small" title="{{CLOSE}}">' +
234                            '<svg xmlns="http://www.w3.org/2000/svg" version="1" viewBox="0 0 24 24"><path d="M13 12l5-5-1-1-5 5-5-5-1 1 5 5-5 5 1 1 5-5 5 5 1-1z"/></svg>' +
235                            "</button>"
236                    },
237
238                    // Container is injected into this element
239                    parentEl: "body",
240
241                    // Hide browser vertical scrollbars; use at your own risk
242                    hideScrollbar: true,
243
244                    // Focus handling
245                    // ==============
246
247                    // Try to focus on the first focusable element after opening
248                    autoFocus: true,
249
250                    // Put focus back to active element after closing
251                    backFocus: true,
252
253                    // Do not let user to focus on element outside modal content
254                    trapFocus: true,
255
256                    // Module specific options
257                    // =======================
258
259                    fullScreen: {
260                        autoStart: false
261                    },
262
263                    // Set `touch: false` to disable panning/swiping
264                    touch: {
265                        vertical: true, // Allow to drag content vertically
266                        momentum: true // Continue movement after releasing mouse/touch when panning
267                    },
268
269                    // Hash value when initializing manually,
270                    // set `false` to disable hash change
271                    hash: null,
272
273                    // Customize or add new media types
274                    // Example:
275                    /*
276      media : {
277        youtube : {
278          params : {
279            autoplay : 0
280          }
281        }
282      }
283    */
284                    media: {},
285
286                    slideShow: {
287                        autoStart: false,
288                        speed: 3000
289                    },
290
291                    thumbs: {
292                        autoStart: false, // Display thumbnails on opening
293                        hideOnClose: true, // Hide thumbnail grid when closing animation starts
294                        parentEl: ".fancybox-container", // Container is injected into this element
295                        axis: "y" // Vertical (y) or horizontal (x) scrolling
296                    },
297
298                    // Use mousewheel to navigate gallery
299                    // If 'auto' - enabled for images only
300                    wheel: "auto",
301
302                    // Callbacks
303                    //==========
304
305                    // See Documentation/API/Events for more information
306                    // Example:
307                    /*
308      afterShow: function( instance, current ) {
309        console.info( 'Clicked element:' );
310        console.info( current.opts.$orig );
311      }
312    */
313
314                    onInit: $.noop, // When instance has been initialized
315
316                    beforeLoad: $.noop, // Before the content of a slide is being loaded
317                    afterLoad: $.noop, // When the content of a slide is done loading
318
319                    beforeShow: $.noop, // Before open animation starts
320                    afterShow: $.noop, // When content is done loading and animating
321
322                    beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close.
323                    afterClose: $.noop, // After instance has been closed
324
325                    onActivate: $.noop, // When instance is brought to front
326                    onDeactivate: $.noop, // When other instance has been activated
327
328                    // Interaction
329                    // ===========
330
331                    // Use options below to customize taken action when user clicks or double clicks on the fancyBox area,
332                    // each option can be string or method that returns value.
333                    //
334                    // Possible values:
335                    //   "close"           - close instance
336                    //   "next"            - move to next gallery item
337                    //   "nextOrClose"     - move to next gallery item or close if gallery has only one item
338                    //   "toggleControls"  - show/hide controls
339                    //   "zoom"            - zoom image (if loaded)
340                    //   false             - do nothing
341
342                    // Clicked on the content
343                    clickContent: function (current, event) {
344                        return current.type === "image" ? "zoom" : false;
345                    },
346
347                    // Clicked on the slide
348                    clickSlide: "close",
349
350                    // Clicked on the background (backdrop) element;
351                    // if you have not changed the layout, then most likely you need to use `clickSlide` option
352                    clickOutside: "close",
353
354                    // Same as previous two, but for double click
355                    dblclickContent: false,
356                    dblclickSlide: false,
357                    dblclickOutside: false,
358
359                    // Custom options when mobile device is detected
360                    // =============================================
361
362                    mobile: {
363                        preventCaptionOverlap: false,
364                        idleTime: false,
365                        clickContent: function (current, event) {
366                            return current.type === "image" ? "toggleControls" : false;
367                        },
368                        clickSlide: function (current, event) {
369                            return current.type === "image" ? "toggleControls" : "close";
370                        },
371                        dblclickContent: function (current, event) {
372                            return current.type === "image" ? "zoom" : false;
373                        },
374                        dblclickSlide: function (current, event) {
375                            return current.type === "image" ? "zoom" : false;
376                        }
377                    },
378
379                    // Internationalization
380                    // ====================
381
382                    lang: "en",
383                    i18n: {
384                        en: {
385                            CLOSE: "Close",
386                            NEXT: "Next",
387                            PREV: "Previous",
388                            ERROR: "The requested content cannot be loaded. <br/> Please try again later.",
389                            PLAY_START: "Start slideshow",
390                            PLAY_STOP: "Pause slideshow",
391                            FULL_SCREEN: "Full screen",
392                            THUMBS: "Thumbnails",
393                            DOWNLOAD: "Download",
394                            SHARE: "Share",
395                            ZOOM: "Zoom"
396                        },
397                        de: {
398                            CLOSE: "Schlie&szlig;en",
399                            NEXT: "Weiter",
400                            PREV: "Zur&uuml;ck",
401                            ERROR: "Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es sp&auml;ter nochmal.",
402                            PLAY_START: "Diaschau starten",
403                            PLAY_STOP: "Diaschau beenden",
404                            FULL_SCREEN: "Vollbild",
405                            THUMBS: "Vorschaubilder",
406                            DOWNLOAD: "Herunterladen",
407                            SHARE: "Teilen",
408                            ZOOM: "Vergr&ouml;&szlig;ern"
409                        }
410                    }
411                };
412
413                // Few useful variables and methods
414                // ================================
415
416                var $W = $(window);
417                var $D = $(document);
418
419                var called = 0;
420
421                // Check if an object is a jQuery object and not a native JavaScript object
422                // ========================================================================
423                var isQuery = function (obj) {
424                    return obj && obj.hasOwnProperty && obj instanceof $;
425                };
426
427                // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame"
428                // ===============================================================================
429                var requestAFrame = (function () {
430                    return (
431                        window.requestAnimationFrame ||
432                        window.webkitRequestAnimationFrame ||
433                        window.mozRequestAnimationFrame ||
434                        window.oRequestAnimationFrame ||
435                        // if all else fails, use setTimeout
436                        function (callback) {
437                            return window.setTimeout(callback, 1000 / 60);
438                        }
439                    );
440                })();
441
442                var cancelAFrame = (function () {
443                    return (
444                        window.cancelAnimationFrame ||
445                        window.webkitCancelAnimationFrame ||
446                        window.mozCancelAnimationFrame ||
447                        window.oCancelAnimationFrame ||
448                        function (id) {
449                            window.clearTimeout(id);
450                        }
451                    );
452                })();
453
454                // Detect the supported transition-end event property name
455                // =======================================================
456                var transitionEnd = (function () {
457                    var el = document.createElement("fakeelement"),
458                        t;
459
460                    var transitions = {
461                        transition: "transitionend",
462                        OTransition: "oTransitionEnd",
463                        MozTransition: "transitionend",
464                        WebkitTransition: "webkitTransitionEnd"
465                    };
466
467                    for (t in transitions) {
468                        if (el.style[t] !== undefined) {
469                            return transitions[t];
470                        }
471                    }
472
473                    return "transitionend";
474                })();
475
476                // Force redraw on an element.
477                // This helps in cases where the browser doesn't redraw an updated element properly
478                // ================================================================================
479                var forceRedraw = function ($el) {
480                    return $el && $el.length && $el[0].offsetHeight;
481                };
482
483                // Exclude array (`buttons`) options from deep merging
484                // ===================================================
485                var mergeOpts = function (opts1, opts2) {
486                    var rez = $.extend(true, {}, opts1, opts2);
487
488                    $.each(opts2, function (key, value) {
489                        if ($.isArray(value)) {
490                            rez[key] = value;
491                        }
492                    });
493
494                    return rez;
495                };
496
497                // How much of an element is visible in viewport
498                // =============================================
499
500                var inViewport = function (elem) {
501                    var elemCenter, rez;
502
503                    if (!elem || elem.ownerDocument !== document) {
504                        return false;
505                    }
506
507                    $(".fancybox-container").css("pointer-events", "none");
508
509                    elemCenter = {
510                        x: elem.getBoundingClientRect().left + elem.offsetWidth / 2,
511                        y: elem.getBoundingClientRect().top + elem.offsetHeight / 2
512                    };
513
514                    rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem;
515
516                    $(".fancybox-container").css("pointer-events", "");
517
518                    return rez;
519                };
520
521                // Class definition
522                // ================
523
524                var FancyBox = function (content, opts, index) {
525                    var self = this;
526
527                    self.opts = mergeOpts({
528                        index: index
529                    }, $.fancybox.defaults);
530
531                    if ($.isPlainObject(opts)) {
532                        self.opts = mergeOpts(self.opts, opts);
533                    }
534
535                    if ($.fancybox.isMobile) {
536                        self.opts = mergeOpts(self.opts, self.opts.mobile);
537                    }
538
539                    self.id = self.opts.id || ++called;
540
541                    self.currIndex = parseInt(self.opts.index, 10) || 0;
542                    self.prevIndex = null;
543
544                    self.prevPos = null;
545                    self.currPos = 0;
546
547                    self.firstRun = true;
548
549                    // All group items
550                    self.group = [];
551
552                    // Existing slides (for current, next and previous gallery items)
553                    self.slides = {};
554
555                    // Create group elements
556                    self.addContent(content);
557
558                    if (!self.group.length) {
559                        return;
560                    }
561
562                    self.init();
563                };
564
565                $.extend(FancyBox.prototype, {
566                    // Create DOM structure
567                    // ====================
568
569                    init: function () {
570                        var self = this,
571                            firstItem = self.group[self.currIndex],
572                            firstItemOpts = firstItem.opts,
573                            $container,
574                            buttonStr;
575
576                        if (firstItemOpts.closeExisting) {
577                            $.fancybox.close(true);
578                        }
579
580                        // Hide scrollbars
581                        // ===============
582
583                        $("body").addClass("fancybox-active");
584
585                        if (
586                            !$.fancybox.getInstance() &&
587                            firstItemOpts.hideScrollbar !== false &&
588                            !$.fancybox.isMobile &&
589                            document.body.scrollHeight > window.innerHeight
590                        ) {
591                            $("head").append(
592                                '<style id="fancybox-style-noscroll" type="text/css">.compensate-for-scrollbar{margin-right:' +
593                                (window.innerWidth - document.documentElement.clientWidth) +
594                                "px;}</style>"
595                            );
596
597                            $("body").addClass("compensate-for-scrollbar");
598                        }
599
600                        // Build html markup and set references
601                        // ====================================
602
603                        // Build html code for buttons and insert into main template
604                        buttonStr = "";
605
606                        $.each(firstItemOpts.buttons, function (index, value) {
607                            buttonStr += firstItemOpts.btnTpl[value] || "";
608                        });
609
610                        // Create markup from base template, it will be initially hidden to
611                        // avoid unnecessary work like painting while initializing is not complete
612                        $container = $(
613                            self.translate(
614                                self,
615                                firstItemOpts.baseTpl
616                                    .replace("{{buttons}}", buttonStr)
617                                    .replace("{{arrows}}", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight)
618                            )
619                        )
620                            .attr("id", "fancybox-container-" + self.id)
621                            .addClass(firstItemOpts.baseClass)
622                            .data("FancyBox", self)
623                            .appendTo(firstItemOpts.parentEl);
624
625                        // Create object holding references to jQuery wrapped nodes
626                        self.$refs = {
627                            container: $container
628                        };
629
630                        ["bg", "inner", "infobar", "toolbar", "stage", "caption", "navigation"].forEach(function (item) {
631                            self.$refs[item] = $container.find(".fancybox-" + item);
632                        });
633
634                        self.trigger("onInit");
635
636                        // Enable events, deactive previous instances
637                        self.activate();
638
639                        // Build slides, load and reveal content
640                        self.jumpTo(self.currIndex);
641                    },
642
643                    // Simple i18n support - replaces object keys found in template
644                    // with corresponding values
645                    // ============================================================
646
647                    translate: function (obj, str) {
648                        var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en;
649
650                        return str.replace(/\{\{(\w+)\}\}/g, function (match, n) {
651                            return arr[n] === undefined ? match : arr[n];
652                        });
653                    },
654
655                    // Populate current group with fresh content
656                    // Check if each object has valid type and content
657                    // ===============================================
658
659                    addContent: function (content) {
660                        var self = this,
661                            items = $.makeArray(content),
662                            thumbs;
663
664                        $.each(items, function (i, item) {
665                            var obj = {},
666                                opts = {},
667                                $item,
668                                type,
669                                found,
670                                src,
671                                srcParts;
672
673                            // Step 1 - Make sure we have an object
674                            // ====================================
675
676                            if ($.isPlainObject(item)) {
677                                // We probably have manual usage here, something like
678                                // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] )
679
680                                obj = item;
681                                opts = item.opts || item;
682                            } else if ($.type(item) === "object" && $(item).length) {
683                                // Here we probably have jQuery collection returned by some selector
684                                $item = $(item);
685
686                                // Support attributes like `data-options='{"touch" : false}'` and `data-touch='false'`
687                                opts = $item.data() || {};
688                                opts = $.extend(true, {}, opts, opts.options);
689
690                                // Here we store clicked element
691                                opts.$orig = $item;
692
693                                obj.src = self.opts.src || opts.src || $item.attr("href");
694
695                                // Assume that simple syntax is used, for example:
696                                //   `$.fancybox.open( $("#test"), {} );`
697                                if (!obj.type && !obj.src) {
698                                    obj.type = "inline";
699                                    obj.src = item;
700                                }
701                            } else {
702                                // Assume we have a simple html code, for example:
703                                //   $.fancybox.open( '<div><h1>Hi!</h1></div>' );
704                                obj = {
705                                    type: "html",
706                                    src: item + ""
707                                };
708                            }
709
710                            // Each gallery object has full collection of options
711                            obj.opts = $.extend(true, {}, self.opts, opts);
712
713                            // Do not merge buttons array
714                            if ($.isArray(opts.buttons)) {
715                                obj.opts.buttons = opts.buttons;
716                            }
717
718                            if ($.fancybox.isMobile && obj.opts.mobile) {
719                                obj.opts = mergeOpts(obj.opts, obj.opts.mobile);
720                            }
721
722                            // Step 2 - Make sure we have content type, if not - try to guess
723                            // ==============================================================
724
725                            type = obj.type || obj.opts.type;
726                            src = obj.src || "";
727
728                            if (!type && src) {
729                                if ((found = src.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))) {
730                                    type = "video";
731
732                                    if (!obj.opts.video.format) {
733                                        obj.opts.video.format = "video/" + (found[1] === "ogv" ? "ogg" : found[1]);
734                                    }
735                                } else if (src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)) {
736                                    type = "image";
737                                } else if (src.match(/\.(pdf)((\?|#).*)?$/i)) {
738                                    type = "iframe";
739                                    obj = $.extend(true, obj, {
740                                        contentType: "pdf",
741                                        opts: {
742                                            iframe: {
743                                                preload: false
744                                            }
745                                        }
746                                    });
747                                } else if (src.charAt(0) === "#") {
748                                    type = "inline";
749                                }
750                            }
751
752                            if (type) {
753                                obj.type = type;
754                            } else {
755                                self.trigger("objectNeedsType", obj);
756                            }
757
758                            if (!obj.contentType) {
759                                obj.contentType = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1 ? "html" : obj.type;
760                            }
761
762                            // Step 3 - Some adjustments
763                            // =========================
764
765                            obj.index = self.group.length;
766
767                            if (obj.opts.smallBtn == "auto") {
768                                obj.opts.smallBtn = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1;
769                            }
770
771                            if (obj.opts.toolbar === "auto") {
772                                obj.opts.toolbar = !obj.opts.smallBtn;
773                            }
774
775                            // Find thumbnail image, check if exists and if is in the viewport
776                            obj.$thumb = obj.opts.$thumb || null;
777
778                            if (obj.opts.$trigger && obj.index === self.opts.index) {
779                                obj.$thumb = obj.opts.$trigger.find("img:first");
780
781                                if (obj.$thumb.length) {
782                                    obj.opts.$orig = obj.opts.$trigger;
783                                }
784                            }
785
786                            if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) {
787                                obj.$thumb = obj.opts.$orig.find("img:first");
788                            }
789
790                            if (obj.$thumb && !obj.$thumb.length) {
791                                obj.$thumb = null;
792                            }
793
794                            obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null);
795
796                            // "caption" is a "special" option, it can be used to customize caption per gallery item
797                            if ($.type(obj.opts.caption) === "function") {
798                                obj.opts.caption = obj.opts.caption.apply(item, [self, obj]);
799                            }
800
801                            if ($.type(self.opts.caption) === "function") {
802                                obj.opts.caption = self.opts.caption.apply(item, [self, obj]);
803                            }
804
805                            // Make sure we have caption as a string or jQuery object
806                            if (!(obj.opts.caption instanceof $)) {
807                                obj.opts.caption = obj.opts.caption === undefined ? "" : obj.opts.caption + "";
808                            }
809
810                            // Check if url contains "filter" used to filter the content
811                            // Example: "ajax.html #something"
812                            if (obj.type === "ajax") {
813                                srcParts = src.split(/\s+/, 2);
814
815                                if (srcParts.length > 1) {
816                                    obj.src = srcParts.shift();
817
818                                    obj.opts.filter = srcParts.shift();
819                                }
820                            }
821
822                            // Hide all buttons and disable interactivity for modal items
823                            if (obj.opts.modal) {
824                                obj.opts = $.extend(true, obj.opts, {
825                                    trapFocus: true,
826                                    // Remove buttons
827                                    infobar: 0,
828                                    toolbar: 0,
829
830                                    smallBtn: 0,
831
832                                    // Disable keyboard navigation
833                                    keyboard: 0,
834
835                                    // Disable some modules
836                                    slideShow: 0,
837                                    fullScreen: 0,
838                                    thumbs: 0,
839                                    touch: 0,
840
841                                    // Disable click event handlers
842                                    clickContent: false,
843                                    clickSlide: false,
844                                    clickOutside: false,
845                                    dblclickContent: false,
846                                    dblclickSlide: false,
847                                    dblclickOutside: false
848                                });
849                            }
850
851                            // Step 4 - Add processed object to group
852                            // ======================================
853
854                            self.group.push(obj);
855                        });
856
857                        // Update controls if gallery is already opened
858                        if (Object.keys(self.slides).length) {
859                            self.updateControls();
860
861                            // Update thumbnails, if needed
862                            thumbs = self.Thumbs;
863
864                            if (thumbs && thumbs.isActive) {
865                                thumbs.create();
866
867                                thumbs.focus();
868                            }
869                        }
870                    },
871
872                    // Attach an event handler functions for:
873                    //   - navigation buttons
874                    //   - browser scrolling, resizing;
875                    //   - focusing
876                    //   - keyboard
877                    //   - detecting inactivity
878                    // ======================================
879
880                    addEvents: function () {
881                        var self = this;
882
883                        self.removeEvents();
884
885                        // Make navigation elements clickable
886                        // ==================================
887
888                        self.$refs.container
889                            .on("click.fb-close", "[data-fancybox-close]", function (e) {
890                                e.stopPropagation();
891                                e.preventDefault();
892
893                                self.close(e);
894                            })
895                            .on("touchstart.fb-prev click.fb-prev", "[data-fancybox-prev]", function (e) {
896                                e.stopPropagation();
897                                e.preventDefault();
898
899                                self.previous();
900                            })
901                            .on("touchstart.fb-next click.fb-next", "[data-fancybox-next]", function (e) {
902                                e.stopPropagation();
903                                e.preventDefault();
904
905                                self.next();
906                            })
907                            .on("click.fb", "[data-fancybox-zoom]", function (e) {
908                                // Click handler for zoom button
909                                self[self.isScaledDown() ? "scaleToActual" : "scaleToFit"]();
910                            });
911
912                        // Handle page scrolling and browser resizing
913                        // ==========================================
914
915                        $W.on("orientationchange.fb resize.fb", function (e) {
916                            if (e && e.originalEvent && e.originalEvent.type === "resize") {
917                                if (self.requestId) {
918                                    cancelAFrame(self.requestId);
919                                }
920
921                                self.requestId = requestAFrame(function () {
922                                    self.update(e);
923                                });
924                            } else {
925                                if (self.current && self.current.type === "iframe") {
926                                    self.$refs.stage.hide();
927                                }
928
929                                setTimeout(
930                                    function () {
931                                        self.$refs.stage.show();
932
933                                        self.update(e);
934                                    },
935                                    $.fancybox.isMobile ? 600 : 250
936                                );
937                            }
938                        });
939
940                        $D.on("keydown.fb", function (e) {
941                            var instance = $.fancybox ? $.fancybox.getInstance() : null,
942                                current = instance.current,
943                                keycode = e.keyCode || e.which;
944
945                            // Trap keyboard focus inside of the modal
946                            // =======================================
947
948                            if (keycode == 9) {
949                                if (current.opts.trapFocus) {
950                                    self.focus(e);
951                                }
952
953                                return;
954                            }
955
956                            // Enable keyboard navigation
957                            // ==========================
958
959                            if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is("input,textarea,video,audio,select")) {
960                                return;
961                            }
962
963                            // Backspace and Esc keys
964                            if (keycode === 8 || keycode === 27) {
965                                e.preventDefault();
966
967                                self.close(e);
968
969                                return;
970                            }
971
972                            // Left arrow and Up arrow
973                            if (keycode === 37 || keycode === 38) {
974                                e.preventDefault();
975
976                                self.previous();
977
978                                return;
979                            }
980
981                            // Righ arrow and Down arrow
982                            if (keycode === 39 || keycode === 40) {
983                                e.preventDefault();
984
985                                self.next();
986
987                                return;
988                            }
989
990                            self.trigger("afterKeydown", e, keycode);
991                        });
992
993                        // Hide controls after some inactivity period
994                        if (self.group[self.currIndex].opts.idleTime) {
995                            self.idleSecondsCounter = 0;
996
997                            $D.on(
998                                "mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",
999                                function (e) {
1000                                    self.idleSecondsCounter = 0;
1001
1002                                    if (self.isIdle) {
1003                                        self.showControls();
1004                                    }
1005
1006                                    self.isIdle = false;
1007                                }
1008                            );
1009
1010                            self.idleInterval = window.setInterval(function () {
1011                                self.idleSecondsCounter++;
1012
1013                                if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) {
1014                                    self.isIdle = true;
1015                                    self.idleSecondsCounter = 0;
1016
1017                                    self.hideControls();
1018                                }
1019                            }, 1000);
1020                        }
1021                    },
1022
1023                    // Remove events added by the core
1024                    // ===============================
1025
1026                    removeEvents: function () {
1027                        var self = this;
1028
1029                        $W.off("orientationchange.fb resize.fb");
1030                        $D.off("keydown.fb .fb-idle");
1031
1032                        this.$refs.container.off(".fb-close .fb-prev .fb-next");
1033
1034                        if (self.idleInterval) {
1035                            window.clearInterval(self.idleInterval);
1036
1037                            self.idleInterval = null;
1038                        }
1039                    },
1040
1041                    // Change to previous gallery item
1042                    // ===============================
1043
1044                    previous: function (duration) {
1045                        return this.jumpTo(this.currPos - 1, duration);
1046                    },
1047
1048                    // Change to next gallery item
1049                    // ===========================
1050
1051                    next: function (duration) {
1052                        return this.jumpTo(this.currPos + 1, duration);
1053                    },
1054
1055                    // Switch to selected gallery item
1056                    // ===============================
1057
1058                    jumpTo: function (pos, duration) {
1059                        var self = this,
1060                            groupLen = self.group.length,
1061                            firstRun,
1062                            isMoved,
1063                            loop,
1064                            current,
1065                            previous,
1066                            slidePos,
1067                            stagePos,
1068                            prop,
1069                            diff;
1070
1071                        if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) {
1072                            return;
1073                        }
1074
1075                        // Should loop?
1076                        pos = parseInt(pos, 10);
1077                        loop = self.current ? self.current.opts.loop : self.opts.loop;
1078
1079                        if (!loop && (pos < 0 || pos >= groupLen)) {
1080                            return false;
1081                        }
1082
1083                        // Check if opening for the first time; this helps to speed things up
1084                        firstRun = self.firstRun = !Object.keys(self.slides).length;
1085
1086                        // Create slides
1087                        previous = self.current;
1088
1089                        self.prevIndex = self.currIndex;
1090                        self.prevPos = self.currPos;
1091
1092                        current = self.createSlide(pos);
1093
1094                        if (groupLen > 1) {
1095                            if (loop || current.index < groupLen - 1) {
1096                                self.createSlide(pos + 1);
1097                            }
1098
1099                            if (loop || current.index > 0) {
1100                                self.createSlide(pos - 1);
1101                            }
1102                        }
1103
1104                        self.current = current;
1105                        self.currIndex = current.index;
1106                        self.currPos = current.pos;
1107
1108                        self.trigger("beforeShow", firstRun);
1109
1110                        self.updateControls();
1111
1112                        // Validate duration length
1113                        current.forcedDuration = undefined;
1114
1115                        if ($.isNumeric(duration)) {
1116                            current.forcedDuration = duration;
1117                        } else {
1118                            duration = current.opts[firstRun ? "animationDuration" : "transitionDuration"];
1119                        }
1120
1121                        duration = parseInt(duration, 10);
1122
1123                        // Check if user has swiped the slides or if still animating
1124                        isMoved = self.isMoved(current);
1125
1126                        // Make sure current slide is visible
1127                        current.$slide.addClass("fancybox-slide--current");
1128
1129                        // Fresh start - reveal container, current slide and start loading content
1130                        if (firstRun) {
1131                            if (current.opts.animationEffect && duration) {
1132                                self.$refs.container.css("transition-duration", duration + "ms");
1133                            }
1134
1135                            self.$refs.container.addClass("fancybox-is-open").trigger("focus");
1136
1137                            // Attempt to load content into slide
1138                            // This will later call `afterLoad` -> `revealContent`
1139                            self.loadSlide(current);
1140
1141                            self.preload("image");
1142
1143                            return;
1144                        }
1145
1146                        // Get actual slide/stage positions (before cleaning up)
1147                        slidePos = $.fancybox.getTranslate(previous.$slide);
1148                        stagePos = $.fancybox.getTranslate(self.$refs.stage);
1149
1150                        // Clean up all slides
1151                        $.each(self.slides, function (index, slide) {
1152                            $.fancybox.stop(slide.$slide, true);
1153                        });
1154
1155                        if (previous.pos !== current.pos) {
1156                            previous.isComplete = false;
1157                        }
1158
1159                        previous.$slide.removeClass("fancybox-slide--complete fancybox-slide--current");
1160
1161                        // If slides are out of place, then animate them to correct position
1162                        if (isMoved) {
1163                            // Calculate horizontal swipe distance
1164                            diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter);
1165
1166                            $.each(self.slides, function (index, slide) {
1167                                slide.$slide.removeClass("fancybox-animated").removeClass(function (index, className) {
1168                                    return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" ");
1169                                });
1170
1171                                // Make sure that each slide is in equal distance
1172                                // This is mostly needed for freshly added slides, because they are not yet positioned
1173                                var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter;
1174
1175                                $.fancybox.setTranslate(slide.$slide, {
1176                                    top: 0,
1177                                    left: leftPos - stagePos.left + diff
1178                                });
1179
1180                                if (slide.pos !== current.pos) {
1181                                    slide.$slide.addClass("fancybox-slide--" + (slide.pos > current.pos ? "next" : "previous"));
1182                                }
1183
1184                                // Redraw to make sure that transition will start
1185                                forceRedraw(slide.$slide);
1186
1187                                // Animate the slide
1188                                $.fancybox.animate(
1189                                    slide.$slide, {
1190                                        top: 0,
1191                                        left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter
1192                                    },
1193                                    duration,
1194                                    function () {
1195                                        slide.$slide
1196                                            .css({
1197                                                transform: "",
1198                                                opacity: ""
1199                                            })
1200                                            .removeClass("fancybox-slide--next fancybox-slide--previous");
1201
1202                                        if (slide.pos === self.currPos) {
1203                                            self.complete();
1204                                        }
1205                                    }
1206                                );
1207                            });
1208                        } else if (duration && current.opts.transitionEffect) {
1209                            // Set transition effect for previously active slide
1210                            prop = "fancybox-animated fancybox-fx-" + current.opts.transitionEffect;
1211
1212                            previous.$slide.addClass("fancybox-slide--" + (previous.pos > current.pos ? "next" : "previous"));
1213
1214                            $.fancybox.animate(
1215                                previous.$slide,
1216                                prop,
1217                                duration,
1218                                function () {
1219                                    previous.$slide.removeClass(prop).removeClass("fancybox-slide--next fancybox-slide--previous");
1220                                },
1221                                false
1222                            );
1223                        }
1224
1225                        if (current.isLoaded) {
1226                            self.revealContent(current);
1227                        } else {
1228                            self.loadSlide(current);
1229                        }
1230
1231                        self.preload("image");
1232                    },
1233
1234                    // Create new "slide" element
1235                    // These are gallery items  that are actually added to DOM
1236                    // =======================================================
1237
1238                    createSlide: function (pos) {
1239                        var self = this,
1240                            $slide,
1241                            index;
1242
1243                        index = pos % self.group.length;
1244                        index = index < 0 ? self.group.length + index : index;
1245
1246                        if (!self.slides[pos] && self.group[index]) {
1247                            $slide = $('<div class="fancybox-slide"></div>').appendTo(self.$refs.stage);
1248
1249                            self.slides[pos] = $.extend(true, {}, self.group[index], {
1250                                pos: pos,
1251                                $slide: $slide,
1252                                isLoaded: false
1253                            });
1254
1255                            self.updateSlide(self.slides[pos]);
1256                        }
1257
1258                        return self.slides[pos];
1259                    },
1260
1261                    // Scale image to the actual size of the image;
1262                    // x and y values should be relative to the slide
1263                    // ==============================================
1264
1265                    scaleToActual: function (x, y, duration) {
1266                        var self = this,
1267                            current = self.current,
1268                            $content = current.$content,
1269                            canvasWidth = $.fancybox.getTranslate(current.$slide).width,
1270                            canvasHeight = $.fancybox.getTranslate(current.$slide).height,
1271                            newImgWidth = current.width,
1272                            newImgHeight = current.height,
1273                            imgPos,
1274                            posX,
1275                            posY,
1276                            scaleX,
1277                            scaleY;
1278
1279                        if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) {
1280                            return;
1281                        }
1282
1283                        self.isAnimating = true;
1284
1285                        $.fancybox.stop($content);
1286
1287                        x = x === undefined ? canvasWidth * 0.5 : x;
1288                        y = y === undefined ? canvasHeight * 0.5 : y;
1289
1290                        imgPos = $.fancybox.getTranslate($content);
1291
1292                        imgPos.top -= $.fancybox.getTranslate(current.$slide).top;
1293                        imgPos.left -= $.fancybox.getTranslate(current.$slide).left;
1294
1295                        scaleX = newImgWidth / imgPos.width;
1296                        scaleY = newImgHeight / imgPos.height;
1297
1298                        // Get center position for original image
1299                        posX = canvasWidth * 0.5 - newImgWidth * 0.5;
1300                        posY = canvasHeight * 0.5 - newImgHeight * 0.5;
1301
1302                        // Make sure image does not move away from edges
1303                        if (newImgWidth > canvasWidth) {
1304                            posX = imgPos.left * scaleX - (x * scaleX - x);
1305
1306                            if (posX > 0) {
1307                                posX = 0;
1308                            }
1309
1310                            if (posX < canvasWidth - newImgWidth) {
1311                                posX = canvasWidth - newImgWidth;
1312                            }
1313                        }
1314
1315                        if (newImgHeight > canvasHeight) {
1316                            posY = imgPos.top * scaleY - (y * scaleY - y);
1317
1318                            if (posY > 0) {
1319                                posY = 0;
1320                            }
1321
1322                            if (posY < canvasHeight - newImgHeight) {
1323                                posY = canvasHeight - newImgHeight;
1324                            }
1325                        }
1326
1327                        self.updateCursor(newImgWidth, newImgHeight);
1328
1329                        $.fancybox.animate(
1330                            $content, {
1331                                top: posY,
1332                                left: posX,
1333                                scaleX: scaleX,
1334                                scaleY: scaleY
1335                            },
1336                            duration || 366,
1337                            function () {
1338                                self.isAnimating = false;
1339                            }
1340                        );
1341
1342                        // Stop slideshow
1343                        if (self.SlideShow && self.SlideShow.isActive) {
1344                            self.SlideShow.stop();
1345                        }
1346                    },
1347
1348                    // Scale image to fit inside parent element
1349                    // ========================================
1350
1351                    scaleToFit: function (duration) {
1352                        var self = this,
1353                            current = self.current,
1354                            $content = current.$content,
1355                            end;
1356
1357                        if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) {
1358                            return;
1359                        }
1360
1361                        self.isAnimating = true;
1362
1363                        $.fancybox.stop($content);
1364
1365                        end = self.getFitPos(current);
1366
1367                        self.updateCursor(end.width, end.height);
1368
1369                        $.fancybox.animate(
1370                            $content, {
1371                                top: end.top,
1372                                left: end.left,
1373                                scaleX: end.width / $content.width(),
1374                                scaleY: end.height / $content.height()
1375                            },
1376                            duration || 366,
1377                            function () {
1378                                self.isAnimating = false;
1379                            }
1380                        );
1381                    },
1382
1383                    // Calculate image size to fit inside viewport
1384                    // ===========================================
1385
1386                    getFitPos: function (slide) {
1387                        var self = this,
1388                            $content = slide.$content,
1389                            $slide = slide.$slide,
1390                            width = slide.width || slide.opts.width,
1391                            height = slide.height || slide.opts.height,
1392                            maxWidth,
1393                            maxHeight,
1394                            minRatio,
1395                            aspectRatio,
1396                            rez = {};
1397
1398                        if (!slide.isLoaded || !$content || !$content.length) {
1399                            return false;
1400                        }
1401
1402                        maxWidth = $.fancybox.getTranslate(self.$refs.stage).width;
1403                        maxHeight = $.fancybox.getTranslate(self.$refs.stage).height;
1404
1405                        maxWidth -=
1406                            parseFloat($slide.css("paddingLeft")) +
1407                            parseFloat($slide.css("paddingRight")) +
1408                            parseFloat($content.css("marginLeft")) +
1409                            parseFloat($content.css("marginRight"));
1410
1411                        maxHeight -=
1412                            parseFloat($slide.css("paddingTop")) +
1413                            parseFloat($slide.css("paddingBottom")) +
1414                            parseFloat($content.css("marginTop")) +
1415                            parseFloat($content.css("marginBottom"));
1416
1417                        if (!width || !height) {
1418                            width = maxWidth;
1419                            height = maxHeight;
1420                        }
1421
1422                        minRatio = Math.min(1, maxWidth / width, maxHeight / height);
1423
1424                        width = minRatio * width;
1425                        height = minRatio * height;
1426
1427                        // Adjust width/height to precisely fit into container
1428                        if (width > maxWidth - 0.5) {
1429                            width = maxWidth;
1430                        }
1431
1432                        if (height > maxHeight - 0.5) {
1433                            height = maxHeight;
1434                        }
1435
1436                        if (slide.type === "image") {
1437                            rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css("paddingTop"));
1438                            rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css("paddingLeft"));
1439                        } else if (slide.contentType === "video") {
1440                            // Force aspect ratio for the video
1441                            // "I say the whole world must learn of our peaceful ways… by force!"
1442                            aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9;
1443
1444                            if (height > width / aspectRatio) {
1445                                height = width / aspectRatio;
1446                            } else if (width > height * aspectRatio) {
1447                                width = height * aspectRatio;
1448                            }
1449                        }
1450
1451                        rez.width = width;
1452                        rez.height = height;
1453
1454                        return rez;
1455                    },
1456
1457                    // Update content size and position for all slides
1458                    // ==============================================
1459
1460                    update: function (e) {
1461                        var self = this;
1462
1463                        $.each(self.slides, function (key, slide) {
1464                            self.updateSlide(slide, e);
1465                        });
1466                    },
1467
1468                    // Update slide content position and size
1469                    // ======================================
1470
1471                    updateSlide: function (slide, e) {
1472                        var self = this,
1473                            $content = slide && slide.$content,
1474                            width = slide.width || slide.opts.width,
1475                            height = slide.height || slide.opts.height,
1476                            $slide = slide.$slide;
1477
1478                        // First, prevent caption overlap, if needed
1479                        self.adjustCaption(slide);
1480
1481                        // Then resize content to fit inside the slide
1482                        if ($content && (width || height || slide.contentType === "video") && !slide.hasError) {
1483                            $.fancybox.stop($content);
1484
1485                            $.fancybox.setTranslate($content, self.getFitPos(slide));
1486
1487                            if (slide.pos === self.currPos) {
1488                                self.isAnimating = false;
1489
1490                                self.updateCursor();
1491                            }
1492                        }
1493
1494                        // Then some adjustments
1495                        self.adjustLayout(slide);
1496
1497                        if ($slide.length) {
1498                            $slide.trigger("refresh");
1499
1500                            if (slide.pos === self.currPos) {
1501                                self.$refs.toolbar
1502                                    .add(self.$refs.navigation.find(".fancybox-button--arrow_right"))
1503                                    .toggleClass("compensate-for-scrollbar", $slide.get(0).scrollHeight > $slide.get(0).clientHeight);
1504                            }
1505                        }
1506
1507                        self.trigger("onUpdate", slide, e);
1508                    },
1509
1510                    // Horizontally center slide
1511                    // =========================
1512
1513                    centerSlide: function (duration) {
1514                        var self = this,
1515                            current = self.current,
1516                            $slide = current.$slide;
1517
1518                        if (self.isClosing || !current) {
1519                            return;
1520                        }
1521
1522                        $slide.siblings().css({
1523                            transform: "",
1524                            opacity: ""
1525                        });
1526
1527                        $slide
1528                            .parent()
1529                            .children()
1530                            .removeClass("fancybox-slide--previous fancybox-slide--next");
1531
1532                        $.fancybox.animate(
1533                            $slide, {
1534                                top: 0,
1535                                left: 0,
1536                                opacity: 1
1537                            },
1538                            duration === undefined ? 0 : duration,
1539                            function () {
1540                                // Clean up
1541                                $slide.css({
1542                                    transform: "",
1543                                    opacity: ""
1544                                });
1545
1546                                if (!current.isComplete) {
1547                                    self.complete();
1548                                }
1549                            },
1550                            false
1551                        );
1552                    },
1553
1554                    // Check if current slide is moved (swiped)
1555                    // ========================================
1556
1557                    isMoved: function (slide) {
1558                        var current = slide || this.current,
1559                            slidePos,
1560                            stagePos;
1561
1562                        if (!current) {
1563                            return false;
1564                        }
1565
1566                        stagePos = $.fancybox.getTranslate(this.$refs.stage);
1567                        slidePos = $.fancybox.getTranslate(current.$slide);
1568
1569                        return (
1570                            !current.$slide.hasClass("fancybox-animated") &&
1571                            (Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5)
1572                        );
1573                    },
1574
1575                    // Update cursor style depending if content can be zoomed
1576                    // ======================================================
1577
1578                    updateCursor: function (nextWidth, nextHeight) {
1579                        var self = this,
1580                            current = self.current,
1581                            $container = self.$refs.container,
1582                            canPan,
1583                            isZoomable;
1584
1585                        if (!current || self.isClosing || !self.Guestures) {
1586                            return;
1587                        }
1588
1589                        $container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan");
1590
1591                        canPan = self.canPan(nextWidth, nextHeight);
1592
1593                        isZoomable = canPan ? true : self.isZoomable();
1594
1595                        $container.toggleClass("fancybox-is-zoomable", isZoomable);
1596
1597                        $("[data-fancybox-zoom]").prop("disabled", !isZoomable);
1598
1599                        if (canPan) {
1600                            $container.addClass("fancybox-can-pan");
1601                        } else if (
1602                            isZoomable &&
1603                            (current.opts.clickContent === "zoom" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == "zoom"))
1604                        ) {
1605                            $container.addClass("fancybox-can-zoomIn");
1606                        } else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== "video") {
1607                            $container.addClass("fancybox-can-swipe");
1608                        }
1609                    },
1610
1611                    // Check if current slide is zoomable
1612                    // ==================================
1613
1614                    isZoomable: function () {
1615                        var self = this,
1616                            current = self.current,
1617                            fitPos;
1618
1619                        // Assume that slide is zoomable if:
1620                        //   - image is still loading
1621                        //   - actual size of the image is smaller than available area
1622                        if (current && !self.isClosing && current.type === "image" && !current.hasError) {
1623                            if (!current.isLoaded) {
1624                                return true;
1625                            }
1626
1627                            fitPos = self.getFitPos(current);
1628
1629                            if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) {
1630                                return true;
1631                            }
1632                        }
1633
1634                        return false;
1635                    },
1636
1637                    // Check if current image dimensions are smaller than actual
1638                    // =========================================================
1639
1640                    isScaledDown: function (nextWidth, nextHeight) {
1641                        var self = this,
1642                            rez = false,
1643                            current = self.current,
1644                            $content = current.$content;
1645
1646                        if (nextWidth !== undefined && nextHeight !== undefined) {
1647                            rez = nextWidth < current.width && nextHeight < current.height;
1648                        } else if ($content) {
1649                            rez = $.fancybox.getTranslate($content);
1650                            rez = rez.width < current.width && rez.height < current.height;
1651                        }
1652
1653                        return rez;
1654                    },
1655
1656                    // Check if image dimensions exceed parent element
1657                    // ===============================================
1658
1659                    canPan: function (nextWidth, nextHeight) {
1660                        var self = this,
1661                            current = self.current,
1662                            pos = null,
1663                            rez = false;
1664
1665                        if (current.type === "image" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) {
1666                            rez = self.getFitPos(current);
1667
1668                            if (nextWidth !== undefined && nextHeight !== undefined) {
1669                                pos = {
1670                                    width: nextWidth,
1671                                    height: nextHeight
1672                                };
1673                            } else if (current.isComplete) {
1674                                pos = $.fancybox.getTranslate(current.$content);
1675                            }
1676
1677                            if (pos && rez) {
1678                                rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5;
1679                            }
1680                        }
1681
1682                        return rez;
1683                    },
1684
1685                    // Load content into the slide
1686                    // ===========================
1687
1688                    loadSlide: function (slide) {
1689                        var self = this,
1690                            type,
1691                            $slide,
1692                            ajaxLoad;
1693
1694                        if (slide.isLoading || slide.isLoaded) {
1695                            return;
1696                        }
1697
1698                        slide.isLoading = true;
1699
1700                        if (self.trigger("beforeLoad", slide) === false) {
1701                            slide.isLoading = false;
1702
1703                            return false;
1704                        }
1705
1706                        type = slide.type;
1707                        $slide = slide.$slide;
1708
1709                        $slide
1710                            .off("refresh")
1711                            .trigger("onReset")
1712                            .addClass(slide.opts.slideClass);
1713
1714                        // Create content depending on the type
1715                        switch (type) {
1716                            case "image":
1717                                self.setImage(slide);
1718
1719                                break;
1720
1721                            case "iframe":
1722                                self.setIframe(slide);
1723
1724                                break;
1725
1726                            case "html":
1727                                self.setContent(slide, slide.src || slide.content);
1728
1729                                break;
1730
1731                            case "video":
1732                                self.setContent(
1733                                    slide,
1734                                    slide.opts.video.tpl
1735                                        .replace(/\{\{src\}\}/gi, slide.src)
1736                                        .replace("{{format}}", slide.opts.videoFormat || slide.opts.video.format || "")
1737                                        .replace("{{poster}}", slide.thumb || "")
1738                                );
1739
1740                                break;
1741
1742                            case "inline":
1743                                if ($(slide.src).length) {
1744                                    self.setContent(slide, $(slide.src));
1745                                } else {
1746                                    self.setError(slide);
1747                                }
1748
1749                                break;
1750
1751                            case "ajax":
1752                                self.showLoading(slide);
1753
1754                                ajaxLoad = $.ajax(
1755                                    $.extend({}, slide.opts.ajax.settings, {
1756                                        url: slide.src,
1757                                        success: function (data, textStatus) {
1758                                            if (textStatus === "success") {
1759                                                self.setContent(slide, data);
1760                                            }
1761                                        },
1762                                        error: function (jqXHR, textStatus) {
1763                                            if (jqXHR && textStatus !== "abort") {
1764                                                self.setError(slide);
1765                                            }
1766                                        }
1767                                    })
1768                                );
1769
1770                                $slide.one("onReset", function () {
1771                                    ajaxLoad.abort();
1772                                });
1773
1774                                break;
1775
1776                            default:
1777                                self.setError(slide);
1778
1779                                break;
1780                        }
1781
1782                        return true;
1783                    },
1784
1785                    // Use thumbnail image, if possible
1786                    // ================================
1787
1788                    setImage: function (slide) {
1789                        var self = this,
1790                            ghost;
1791
1792                        // Check if need to show loading icon
1793                        setTimeout(function () {
1794                            var $img = slide.$image;
1795
1796                            if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) {
1797                                self.showLoading(slide);
1798                            }
1799                        }, 50);
1800
1801                        //Check if image has srcset
1802                        self.checkSrcset(slide);
1803
1804                        // This will be wrapper containing both ghost and actual image
1805                        slide.$content = $('<div class="fancybox-content"></div>')
1806                            .addClass("fancybox-is-hidden")
1807                            .appendTo(slide.$slide.addClass("fancybox-slide--image"));
1808
1809                        // If we have a thumbnail, we can display it while actual image is loading
1810                        // Users will not stare at black screen and actual image will appear gradually
1811                        if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) {
1812                            slide.width = slide.opts.width;
1813                            slide.height = slide.opts.height;
1814
1815                            ghost = document.createElement("img");
1816
1817                            ghost.onerror = function () {
1818                                $(this).remove();
1819
1820                                slide.$ghost = null;
1821                            };
1822
1823                            ghost.onload = function () {
1824                                self.afterLoad(slide);
1825                            };
1826
1827                            slide.$ghost = $(ghost)
1828                                .addClass("fancybox-image")
1829                                .appendTo(slide.$content)
1830                                .attr("src", slide.thumb);
1831                        }
1832
1833                        // Start loading actual image
1834                        self.setBigImage(slide);
1835                    },
1836
1837                    // Check if image has srcset and get the source
1838                    // ============================================
1839                    checkSrcset: function (slide) {
1840                        var srcset = slide.opts.srcset || slide.opts.image.srcset,
1841                            found,
1842                            temp,
1843                            pxRatio,
1844                            windowWidth;
1845
1846                        // If we have "srcset", then we need to find first matching "src" value.
1847                        // This is necessary, because when you set an src attribute, the browser will preload the image
1848                        // before any javascript or even CSS is applied.
1849                        if (srcset) {
1850                            pxRatio = window.devicePixelRatio || 1;
1851                            windowWidth = window.innerWidth * pxRatio;
1852
1853                            temp = srcset.split(",").map(function (el) {
1854                                var ret = {};
1855
1856                                el.trim()
1857                                    .split(/\s+/)
1858                                    .forEach(function (el, i) {
1859                                        var value = parseInt(el.substring(0, el.length - 1), 10);
1860
1861                                        if (i === 0) {
1862                                            return (ret.url = el);
1863                                        }
1864
1865                                        if (value) {
1866                                            ret.value = value;
1867                                            ret.postfix = el[el.length - 1];
1868                                        }
1869                                    });
1870
1871                                return ret;
1872                            });
1873
1874                            // Sort by value
1875                            temp.sort(function (a, b) {
1876                                return a.value - b.value;
1877                            });
1878
1879                            // Ok, now we have an array of all srcset values
1880                            for (var j = 0; j < temp.length; j++) {
1881                                var el = temp[j];
1882
1883                                if ((el.postfix === "w" && el.value >= windowWidth) || (el.postfix === "x" && el.value >= pxRatio)) {
1884                                    found = el;
1885                                    break;
1886                                }
1887                            }
1888
1889                            // If not found, take the last one
1890                            if (!found && temp.length) {
1891                                found = temp[temp.length - 1];
1892                            }
1893
1894                            if (found) {
1895                                slide.src = found.url;
1896
1897                                // If we have default width/height values, we can calculate height for matching source
1898                                if (slide.width && slide.height && found.postfix == "w") {
1899                                    slide.height = (slide.width / slide.height) * found.value;
1900                                    slide.width = found.value;
1901                                }
1902
1903                                slide.opts.srcset = srcset;
1904                            }
1905                        }
1906                    },
1907
1908                    // Create full-size image
1909                    // ======================
1910
1911                    setBigImage: function (slide) {
1912                        var self = this,
1913                            img = document.createElement("img"),
1914                            $img = $(img);
1915
1916                        slide.$image = $img
1917                            .one("error", function () {
1918                                self.setError(slide);
1919                            })
1920                            .one("load", function () {
1921                                var sizes;
1922
1923                                if (!slide.$ghost) {
1924                                    self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight);
1925
1926                                    self.afterLoad(slide);
1927                                }
1928
1929                                if (self.isClosing) {
1930                                    return;
1931                                }
1932
1933                                if (slide.opts.srcset) {
1934                                    sizes = slide.opts.sizes;
1935
1936                                    if (!sizes || sizes === "auto") {
1937                                        sizes =
1938                                            (slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? "100" : Math.round((slide.width / slide.height) * 100)) +
1939                                            "vw";
1940                                    }
1941
1942                                    $img.attr("sizes", sizes).attr("srcset", slide.opts.srcset);
1943                                }
1944
1945                                // Hide temporary image after some delay
1946                                if (slide.$ghost) {
1947                                    setTimeout(function () {
1948                                        if (slide.$ghost && !self.isClosing) {
1949                                            slide.$ghost.hide();
1950                                        }
1951                                    }, Math.min(300, Math.max(1000, slide.height / 1600)));
1952                                }
1953
1954                                self.hideLoading(slide);
1955                            })
1956                            .addClass("fancybox-image")
1957                            .attr("src", slide.src)
1958                            .appendTo(slide.$content);
1959
1960                        if ((img.complete || img.readyState == "complete") && $img.naturalWidth && $img.naturalHeight) {
1961                            $img.trigger("load");
1962                        } else if (img.error) {
1963                            $img.trigger("error");
1964                        }
1965                    },
1966
1967                    // Computes the slide size from image size and maxWidth/maxHeight
1968                    // ==============================================================
1969
1970                    resolveImageSlideSize: function (slide, imgWidth, imgHeight) {
1971                        var maxWidth = parseInt(slide.opts.width, 10),
1972                            maxHeight = parseInt(slide.opts.height, 10);
1973
1974                        // Sets the default values from the image
1975                        slide.width = imgWidth;
1976                        slide.height = imgHeight;
1977
1978                        if (maxWidth > 0) {
1979                            slide.width = maxWidth;
1980                            slide.height = Math.floor((maxWidth * imgHeight) / imgWidth);
1981                        }
1982
1983                        if (maxHeight > 0) {
1984                            slide.width = Math.floor((maxHeight * imgWidth) / imgHeight);
1985                            slide.height = maxHeight;
1986                        }
1987                    },
1988
1989                    // Create iframe wrapper, iframe and bindings
1990                    // ==========================================
1991
1992                    setIframe: function (slide) {
1993                        var self = this,
1994                            opts = slide.opts.iframe,
1995                            $slide = slide.$slide,
1996                            $iframe;
1997
1998                        slide.$content = $('<div class="fancybox-content' + (opts.preload ? " fancybox-is-hidden" : "") + '"></div>')
1999                            .css(opts.css)
2000                            .appendTo($slide);
2001
2002                        $slide.addClass("fancybox-slide--" + slide.contentType);
2003
2004                        slide.$iframe = $iframe = $(opts.tpl.replace(/\{rnd\}/g, new Date().getTime()))
2005                            .attr(opts.attr)
2006                            .appendTo(slide.$content);
2007
2008                        if (opts.preload) {
2009                            self.showLoading(slide);
2010
2011                            // Unfortunately, it is not always possible to determine if iframe is successfully loaded
2012                            // (due to browser security policy)
2013
2014                            $iframe.on("load.fb error.fb", function (e) {
2015                                this.isReady = 1;
2016
2017                                slide.$slide.trigger("refresh");
2018
2019                                self.afterLoad(slide);
2020                            });
2021
2022                            // Recalculate iframe content size
2023                            // ===============================
2024
2025                            $slide.on("refresh.fb", function () {
2026                                var $content = slide.$content,
2027                                    frameWidth = opts.css.width,
2028                                    frameHeight = opts.css.height,
2029                                    $contents,
2030                                    $body;
2031
2032                                if ($iframe[0].isReady !== 1) {
2033                                    return;
2034                                }
2035
2036                                try {
2037                                    $contents = $iframe.contents();
2038                                    $body = $contents.find("body");
2039                                } catch (ignore) {}
2040
2041                                // Calculate content dimensions, if it is accessible
2042                                if ($body && $body.length && $body.children().length) {
2043                                    // Avoid scrolling to top (if multiple instances)
2044                                    $slide.css("overflow", "visible");
2045
2046                                    $content.css({
2047                                        width: "100%",
2048                                        "max-width": "100%",
2049                                        height: "9999px"
2050                                    });
2051
2052                                    if (frameWidth === undefined) {
2053                                        frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true)));
2054                                    }
2055
2056                                    $content.css("width", frameWidth ? frameWidth : "").css("max-width", "");
2057
2058                                    if (frameHeight === undefined) {
2059                                        frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true)));
2060                                    }
2061
2062                                    $content.css("height", frameHeight ? frameHeight : "");
2063
2064                                    $slide.css("overflow", "auto");
2065                                }
2066
2067                                $content.removeClass("fancybox-is-hidden");
2068                            });
2069                        } else {
2070                            self.afterLoad(slide);
2071                        }
2072
2073                        $iframe.attr("src", slide.src);
2074
2075                        // Remove iframe if closing or changing gallery item
2076                        $slide.one("onReset", function () {
2077                            // This helps IE not to throw errors when closing
2078                            try {
2079                                $(this)
2080                                    .find("iframe")
2081                                    .hide()
2082                                    .unbind()
2083                                    .attr("src", "//about:blank");
2084                            } catch (ignore) {}
2085
2086                            $(this)
2087                                .off("refresh.fb")
2088                                .empty();
2089
2090                            slide.isLoaded = false;
2091                            slide.isRevealed = false;
2092                        });
2093                    },
2094
2095                    // Wrap and append content to the slide
2096                    // ======================================
2097
2098                    setContent: function (slide, content) {
2099                        var self = this;
2100
2101                        if (self.isClosing) {
2102                            return;
2103                        }
2104
2105                        self.hideLoading(slide);
2106
2107                        if (slide.$content) {
2108                            $.fancybox.stop(slide.$content);
2109                        }
2110
2111                        slide.$slide.empty();
2112
2113                        // If content is a jQuery object, then it will be moved to the slide.
2114                        // The placeholder is created so we will know where to put it back.
2115                        if (isQuery(content) && content.parent().length) {
2116                            // Make sure content is not already moved to fancyBox
2117                            if (content.hasClass("fancybox-content") || content.parent().hasClass("fancybox-content")) {
2118                                content.parents(".fancybox-slide").trigger("onReset");
2119                            }
2120
2121                            // Create temporary element marking original place of the content
2122                            slide.$placeholder = $("<div>")
2123                                .hide()
2124                                .insertAfter(content);
2125
2126                            // Make sure content is visible
2127                            content.css("display", "inline-block");
2128                        } else if (!slide.hasError) {
2129                            // If content is just a plain text, try to convert it to html
2130                            if ($.type(content) === "string") {
2131                                content = $("<div>")
2132                                    .append($.trim(content))
2133                                    .contents();
2134                            }
2135
2136                            // If "filter" option is provided, then filter content
2137                            if (slide.opts.filter) {
2138                                content = $("<div>")
2139                                    .html(content)
2140                                    .find(slide.opts.filter);
2141                            }
2142                        }
2143
2144                        slide.$slide.one("onReset", function () {
2145                            // Pause all html5 video/audio
2146                            $(this)
2147                                .find("video,audio")
2148                                .trigger("pause");
2149
2150                            // Put content back
2151                            if (slide.$placeholder) {
2152                                slide.$placeholder.after(content.removeClass("fancybox-content").hide()).remove();
2153
2154                                slide.$placeholder = null;
2155                            }
2156
2157                            // Remove custom close button
2158                            if (slide.$smallBtn) {
2159                                slide.$smallBtn.remove();
2160
2161                                slide.$smallBtn = null;
2162                            }
2163
2164                            // Remove content and mark slide as not loaded
2165                            if (!slide.hasError) {
2166                                $(this).empty();
2167
2168                                slide.isLoaded = false;
2169                                slide.isRevealed = false;
2170                            }
2171                        });
2172
2173                        $(content).appendTo(slide.$slide);
2174
2175                        if ($(content).is("video,audio")) {
2176                            $(content).addClass("fancybox-video");
2177
2178                            $(content).wrap("<div></div>");
2179
2180                            slide.contentType = "video";
2181
2182                            slide.opts.width = slide.opts.width || $(content).attr("width");
2183                            slide.opts.height = slide.opts.height || $(content).attr("height");
2184                        }
2185
2186                        slide.$content = slide.$slide
2187                            .children()
2188                            .filter("div,form,main,video,audio,article,.fancybox-content")
2189                            .first();
2190
2191                        slide.$content.siblings().hide();
2192
2193                        // Re-check if there is a valid content
2194                        // (in some cases, ajax response can contain various elements or plain text)
2195                        if (!slide.$content.length) {
2196                            slide.$content = slide.$slide
2197                                .wrapInner("<div></div>")
2198                                .children()
2199                                .first();
2200                        }
2201
2202                        slide.$content.addClass("fancybox-content");
2203
2204                        slide.$slide.addClass("fancybox-slide--" + slide.contentType);
2205
2206                        self.afterLoad(slide);
2207                    },
2208
2209                    // Display error message
2210                    // =====================
2211
2212                    setError: function (slide) {
2213                        slide.hasError = true;
2214
2215                        slide.$slide
2216                            .trigger("onReset")
2217                            .removeClass("fancybox-slide--" + slide.contentType)
2218                            .addClass("fancybox-slide--error");
2219
2220                        slide.contentType = "html";
2221
2222                        this.setContent(slide, this.translate(slide, slide.opts.errorTpl));
2223
2224                        if (slide.pos === this.currPos) {
2225                            this.isAnimating = false;
2226                        }
2227                    },
2228
2229                    // Show loading icon inside the slide
2230                    // ==================================
2231
2232                    showLoading: function (slide) {
2233                        var self = this;
2234
2235                        slide = slide || self.current;
2236
2237                        if (slide && !slide.$spinner) {
2238                            slide.$spinner = $(self.translate(self, self.opts.spinnerTpl))
2239                                .appendTo(slide.$slide)
2240                                .hide()
2241                                .fadeIn("fast");
2242                        }
2243                    },
2244
2245                    // Remove loading icon from the slide
2246                    // ==================================
2247
2248                    hideLoading: function (slide) {
2249                        var self = this;
2250
2251                        slide = slide || self.current;
2252
2253                        if (slide && slide.$spinner) {
2254                            slide.$spinner.stop().remove();
2255
2256                            delete slide.$spinner;
2257                        }
2258                    },
2259
2260                    // Adjustments after slide content has been loaded
2261                    // ===============================================
2262
2263                    afterLoad: function (slide) {
2264                        var self = this;
2265
2266                        if (self.isClosing) {
2267                            return;
2268                        }
2269
2270                        slide.isLoading = false;
2271                        slide.isLoaded = true;
2272
2273                        self.trigger("afterLoad", slide);
2274
2275                        self.hideLoading(slide);
2276
2277                        // Add small close button
2278                        if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) {
2279                            slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content);
2280                        }
2281
2282                        // Disable right click
2283                        if (slide.opts.protect && slide.$content && !slide.hasError) {
2284                            slide.$content.on("contextmenu.fb", function (e) {
2285                                if (e.button == 2) {
2286                                    e.preventDefault();
2287                                }
2288
2289                                return true;
2290                            });
2291
2292                            // Add fake element on top of the image
2293                            // This makes a bit harder for user to select image
2294                            if (slide.type === "image") {
2295                                $('<div class="fancybox-spaceball"></div>').appendTo(slide.$content);
2296                            }
2297                        }
2298
2299                        self.adjustCaption(slide);
2300
2301                        self.adjustLayout(slide);
2302
2303                        if (slide.pos === self.currPos) {
2304                            self.updateCursor();
2305                        }
2306
2307                        self.revealContent(slide);
2308                    },
2309
2310                    // Prevent caption overlap,
2311                    // fix css inconsistency across browsers
2312                    // =====================================
2313
2314                    adjustCaption: function (slide) {
2315                        var self = this,
2316                            current = slide || self.current,
2317                            caption = current.opts.caption,
2318                            preventOverlap = current.opts.preventCaptionOverlap,
2319                            $caption = self.$refs.caption,
2320                            $clone,
2321                            captionH = false;
2322
2323                        $caption.toggleClass("fancybox-caption--separate", preventOverlap);
2324
2325                        if (preventOverlap && caption && caption.length) {
2326                            if (current.pos !== self.currPos) {
2327                                $clone = $caption.clone().appendTo($caption.parent());
2328
2329                                $clone
2330                                    .children()
2331                                    .eq(0)
2332                                    .empty()
2333                                    .html(caption);
2334
2335                                captionH = $clone.outerHeight(true);
2336
2337                                $clone.empty().remove();
2338                            } else if (self.$caption) {
2339                                captionH = self.$caption.outerHeight(true);
2340                            }
2341
2342                            current.$slide.css("padding-bottom", captionH || "");
2343                        }
2344                    },
2345
2346                    // Simple hack to fix inconsistency across browsers, described here (affects Edge, too):
2347                    // https://bugzilla.mozilla.org/show_bug.cgi?id=748518
2348                    // ====================================================================================
2349
2350                    adjustLayout: function (slide) {
2351                        var self = this,
2352                            current = slide || self.current,
2353                            scrollHeight,
2354                            marginBottom,
2355                            inlinePadding,
2356                            actualPadding;
2357
2358                        if (current.isLoaded && current.opts.disableLayoutFix !== true) {
2359                            current.$content.css("margin-bottom", "");
2360
2361                            // If we would always set margin-bottom for the content,
2362                            // then it would potentially break vertical align
2363                            if (current.$content.outerHeight() > current.$slide.height() + 0.5) {
2364                                inlinePadding = current.$slide[0].style["padding-bottom"];
2365                                actualPadding = current.$slide.css("padding-bottom");
2366
2367                                if (parseFloat(actualPadding) > 0) {
2368                                    scrollHeight = current.$slide[0].scrollHeight;
2369
2370                                    current.$slide.css("padding-bottom", 0);
2371
2372                                    if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) {
2373                                        marginBottom = actualPadding;
2374                                    }
2375
2376                                    current.$slide.css("padding-bottom", inlinePadding);
2377                                }
2378                            }
2379
2380                            current.$content.css("margin-bottom", marginBottom);
2381                        }
2382                    },
2383
2384                    // Make content visible
2385                    // This method is called right after content has been loaded or
2386                    // user navigates gallery and transition should start
2387                    // ============================================================
2388
2389                    revealContent: function (slide) {
2390                        var self = this,
2391                            $slide = slide.$slide,
2392                            end = false,
2393                            start = false,
2394                            isMoved = self.isMoved(slide),
2395                            isRevealed = slide.isRevealed,
2396                            effect,
2397                            effectClassName,
2398                            duration,
2399                            opacity;
2400
2401                        slide.isRevealed = true;
2402
2403                        effect = slide.opts[self.firstRun ? "animationEffect" : "transitionEffect"];
2404                        duration = slide.opts[self.firstRun ? "animationDuration" : "transitionDuration"];
2405
2406                        duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10);
2407
2408                        if (isMoved || slide.pos !== self.currPos || !duration) {
2409                            effect = false;
2410                        }
2411
2412                        // Check if can zoom
2413                        if (effect === "zoom") {
2414                            if (slide.pos === self.currPos && duration && slide.type === "image" && !slide.hasError && (start = self.getThumbPos(slide))) {
2415                                end = self.getFitPos(slide);
2416                            } else {
2417                                effect = "fade";
2418                            }
2419                        }
2420
2421                        // Zoom animation
2422                        // ==============
2423                        if (effect === "zoom") {
2424                            self.isAnimating = true;
2425
2426                            end.scaleX = end.width / start.width;
2427                            end.scaleY = end.height / start.height;
2428
2429                            // Check if we need to animate opacity
2430                            opacity = slide.opts.zoomOpacity;
2431
2432                            if (opacity == "auto") {
2433                                opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1;
2434                            }
2435
2436                            if (opacity) {
2437                                start.opacity = 0.1;
2438                                end.opacity = 1;
2439                            }
2440
2441                            // Draw image at start position
2442                            $.fancybox.setTranslate(slide.$content.removeClass("fancybox-is-hidden"), start);
2443
2444                            forceRedraw(slide.$content);
2445
2446                            // Start animation
2447                            $.fancybox.animate(slide.$content, end, duration, function () {
2448                                self.isAnimating = false;
2449
2450                                self.complete();
2451                            });
2452
2453                            return;
2454                        }
2455
2456                        self.updateSlide(slide);
2457
2458                        // Simply show content if no effect
2459                        // ================================
2460                        if (!effect) {
2461                            slide.$content.removeClass("fancybox-is-hidden");
2462
2463                            if (!isRevealed && isMoved && slide.type === "image" && !slide.hasError) {
2464                                slide.$content.hide().fadeIn("fast");
2465                            }
2466
2467                            if (slide.pos === self.currPos) {
2468                                self.complete();
2469                            }
2470
2471                            return;
2472                        }
2473
2474                        // Prepare for CSS transiton
2475                        // =========================
2476                        $.fancybox.stop($slide);
2477
2478                        //effectClassName = "fancybox-animated fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-fx-" + effect;
2479                        effectClassName = "fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-animated fancybox-fx-" + effect;
2480
2481                        $slide.addClass(effectClassName).removeClass("fancybox-slide--current"); //.addClass(effectClassName);
2482
2483                        slide.$content.removeClass("fancybox-is-hidden");
2484
2485                        // Force reflow
2486                        forceRedraw($slide);
2487
2488                        if (slide.type !== "image") {
2489                            slide.$content.hide().show(0);
2490                        }
2491
2492                        $.fancybox.animate(
2493                            $slide,
2494                            "fancybox-slide--current",
2495                            duration,
2496                            function () {
2497                                $slide.removeClass(effectClassName).css({
2498                                    transform: "",
2499                                    opacity: ""
2500                                });
2501
2502                                if (slide.pos === self.currPos) {
2503                                    self.complete();
2504                                }
2505                            },
2506                            true
2507                        );
2508                    },
2509
2510                    // Check if we can and have to zoom from thumbnail
2511                    //================================================
2512
2513                    getThumbPos: function (slide) {
2514                        var rez = false,
2515                            $thumb = slide.$thumb,
2516                            thumbPos,
2517                            btw,
2518                            brw,
2519                            bbw,
2520                            blw;
2521
2522                        if (!$thumb || !inViewport($thumb[0])) {
2523                            return false;
2524                        }
2525
2526                        thumbPos = $.fancybox.getTranslate($thumb);
2527
2528                        btw = parseFloat($thumb.css("border-top-width") || 0);
2529                        brw = parseFloat($thumb.css("border-right-width") || 0);
2530                        bbw = parseFloat($thumb.css("border-bottom-width") || 0);
2531                        blw = parseFloat($thumb.css("border-left-width") || 0);
2532
2533                        rez = {
2534                            top: thumbPos.top + btw,
2535                            left: thumbPos.left + blw,
2536                            width: thumbPos.width - brw - blw,
2537                            height: thumbPos.height - btw - bbw,
2538                            scaleX: 1,
2539                            scaleY: 1
2540                        };
2541
2542                        return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false;
2543                    },
2544
2545                    // Final adjustments after current gallery item is moved to position
2546                    // and it`s content is loaded
2547                    // ==================================================================
2548
2549                    complete: function () {
2550                        var self = this,
2551                            current = self.current,
2552                            slides = {},
2553                            $el;
2554
2555                        if (self.isMoved() || !current.isLoaded) {
2556                            return;
2557                        }
2558
2559                        if (!current.isComplete) {
2560                            current.isComplete = true;
2561
2562                            current.$slide.siblings().trigger("onReset");
2563
2564                            self.preload("inline");
2565
2566                            // Trigger any CSS transiton inside the slide
2567                            forceRedraw(current.$slide);
2568
2569                            current.$slide.addClass("fancybox-slide--complete");
2570
2571                            // Remove unnecessary slides
2572                            $.each(self.slides, function (key, slide) {
2573                                if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) {
2574                                    slides[slide.pos] = slide;
2575                                } else if (slide) {
2576                                    $.fancybox.stop(slide.$slide);
2577
2578                                    slide.$slide.off().remove();
2579                                }
2580                            });
2581
2582                            self.slides = slides;
2583                        }
2584
2585                        self.isAnimating = false;
2586
2587                        self.updateCursor();
2588
2589                        self.trigger("afterShow");
2590
2591                        // Autoplay first html5 video/audio
2592                        if (!!current.opts.video.autoStart) {
2593                            current.$slide
2594                                .find("video,audio")
2595                                .filter(":visible:first")
2596                                .trigger("play")
2597                                .one("ended", function () {
2598                                    if (Document.exitFullscreen) {
2599                                        Document.exitFullscreen();
2600                                    } else if (this.webkitExitFullscreen) {
2601                                        this.webkitExitFullscreen();
2602                                    }
2603
2604                                    self.next();
2605                                });
2606                        }
2607
2608                        // Try to focus on the first focusable element
2609                        if (current.opts.autoFocus && current.contentType === "html") {
2610                            // Look for the first input with autofocus attribute
2611                            $el = current.$content.find("input[autofocus]:enabled:visible:first");
2612
2613                            if ($el.length) {
2614                                $el.trigger("focus");
2615                            } else {
2616                                self.focus(null, true);
2617                            }
2618                        }
2619
2620                        // Avoid jumping
2621                        current.$slide.scrollTop(0).scrollLeft(0);
2622                    },
2623
2624                    // Preload next and previous slides
2625                    // ================================
2626
2627                    preload: function (type) {
2628                        var self = this,
2629                            prev,
2630                            next;
2631
2632                        if (self.group.length < 2) {
2633                            return;
2634                        }
2635
2636                        next = self.slides[self.currPos + 1];
2637                        prev = self.slides[self.currPos - 1];
2638
2639                        if (prev && prev.type === type) {
2640                            self.loadSlide(prev);
2641                        }
2642
2643                        if (next && next.type === type) {
2644                            self.loadSlide(next);
2645                        }
2646                    },
2647
2648                    // Try to find and focus on the first focusable element
2649                    // ====================================================
2650
2651                    focus: function (e, firstRun) {
2652                        var self = this,
2653                            focusableStr = [
2654                                "a[href]",
2655                                "area[href]",
2656                                'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',
2657                                "select:not([disabled]):not([aria-hidden])",
2658                                "textarea:not([disabled]):not([aria-hidden])",
2659                                "button:not([disabled]):not([aria-hidden])",
2660                                "iframe",
2661                                "object",
2662                                "embed",
2663                                "video",
2664                                "audio",
2665                                "[contenteditable]",
2666                                '[tabindex]:not([tabindex^="-"])'
2667                            ].join(","),
2668                            focusableItems,
2669                            focusedItemIndex;
2670
2671                        if (self.isClosing) {
2672                            return;
2673                        }
2674
2675                        if (e || !self.current || !self.current.isComplete) {
2676                            // Focus on any element inside fancybox
2677                            focusableItems = self.$refs.container.find("*:visible");
2678                        } else {
2679                            // Focus inside current slide
2680                            focusableItems = self.current.$slide.find("*:visible" + (firstRun ? ":not(.fancybox-close-small)" : ""));
2681                        }
2682
2683                        focusableItems = focusableItems.filter(focusableStr).filter(function () {
2684                            return $(this).css("visibility") !== "hidden" && !$(this).hasClass("disabled");
2685                        });
2686
2687                        if (focusableItems.length) {
2688                            focusedItemIndex = focusableItems.index(document.activeElement);
2689
2690                            if (e && e.shiftKey) {
2691                                // Back tab
2692                                if (focusedItemIndex < 0 || focusedItemIndex == 0) {
2693                                    e.preventDefault();
2694
2695                                    focusableItems.eq(focusableItems.length - 1).trigger("focus");
2696                                }
2697                            } else {
2698                                // Outside or Forward tab
2699                                if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) {
2700                                    if (e) {
2701                                        e.preventDefault();
2702                                    }
2703
2704                                    focusableItems.eq(0).trigger("focus");
2705                                }
2706                            }
2707                        } else {
2708                            self.$refs.container.trigger("focus");
2709                        }
2710                    },
2711
2712                    // Activates current instance - brings container to the front and enables keyboard,
2713                    // notifies other instances about deactivating
2714                    // =================================================================================
2715
2716                    activate: function () {
2717                        var self = this;
2718
2719                        // Deactivate all instances
2720                        $(".fancybox-container").each(function () {
2721                            var instance = $(this).data("FancyBox");
2722
2723                            // Skip self and closing instances
2724                            if (instance && instance.id !== self.id && !instance.isClosing) {
2725                                instance.trigger("onDeactivate");
2726
2727                                instance.removeEvents();
2728
2729                                instance.isVisible = false;
2730                            }
2731                        });
2732
2733                        self.isVisible = true;
2734
2735                        if (self.current || self.isIdle) {
2736                            self.update();
2737
2738                            self.updateControls();
2739                        }
2740
2741                        self.trigger("onActivate");
2742
2743                        self.addEvents();
2744                    },
2745
2746                    // Start closing procedure
2747                    // This will start "zoom-out" animation if needed and clean everything up afterwards
2748                    // =================================================================================
2749
2750                    close: function (e, d) {
2751                        var self = this,
2752                            current = self.current,
2753                            effect,
2754                            duration,
2755                            $content,
2756                            domRect,
2757                            opacity,
2758                            start,
2759                            end;
2760
2761                        var done = function () {
2762                            self.cleanUp(e);
2763                        };
2764
2765                        if (self.isClosing) {
2766                            return false;
2767                        }
2768
2769                        self.isClosing = true;
2770
2771                        // If beforeClose callback prevents closing, make sure content is centered
2772                        if (self.trigger("beforeClose", e) === false) {
2773                            self.isClosing = false;
2774
2775                            requestAFrame(function () {
2776                                self.update();
2777                            });
2778
2779                            return false;
2780                        }
2781
2782                        // Remove all events
2783                        // If there are multiple instances, they will be set again by "activate" method
2784                        self.removeEvents();
2785
2786                        $content = current.$content;
2787                        effect = current.opts.animationEffect;
2788                        duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0;
2789
2790                        current.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated");
2791
2792                        if (e !== true) {
2793                            $.fancybox.stop(current.$slide);
2794                        } else {
2795                            effect = false;
2796                        }
2797
2798                        // Remove other slides
2799                        current.$slide
2800                            .siblings()
2801                            .trigger("onReset")
2802                            .remove();
2803
2804                        // Trigger animations
2805                        if (duration) {
2806                            self.$refs.container
2807                                .removeClass("fancybox-is-open")
2808                                .addClass("fancybox-is-closing")
2809                                .css("transition-duration", duration + "ms");
2810                        }
2811
2812                        // Clean up
2813                        self.hideLoading(current);
2814
2815                        self.hideControls(true);
2816
2817                        self.updateCursor();
2818
2819                        // Check if possible to zoom-out
2820                        if (
2821                            effect === "zoom" &&
2822                            !($content && duration && current.type === "image" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current)))
2823                        ) {
2824                            effect = "fade";
2825                        }
2826
2827                        if (effect === "zoom") {
2828                            $.fancybox.stop($content);
2829
2830                            domRect = $.fancybox.getTranslate($content);
2831
2832                            start = {
2833                                top: domRect.top,
2834                                left: domRect.left,
2835                                scaleX: domRect.width / end.width,
2836                                scaleY: domRect.height / end.height,
2837                                width: end.width,
2838                                height: end.height
2839                            };
2840
2841                            // Check if we need to animate opacity
2842                            opacity = current.opts.zoomOpacity;
2843
2844                            if (opacity == "auto") {
2845                                opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1;
2846                            }
2847
2848                            if (opacity) {
2849                                end.opacity = 0;
2850                            }
2851
2852                            $.fancybox.setTranslate($content, start);
2853
2854                            forceRedraw($content);
2855
2856                            $.fancybox.animate($content, end, duration, done);
2857
2858                            return true;
2859                        }
2860
2861                        if (effect && duration) {
2862                            $.fancybox.animate(
2863                                current.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"),
2864                                "fancybox-animated fancybox-fx-" + effect,
2865                                duration,
2866                                done
2867                            );
2868                        } else {
2869                            // If skip animation
2870                            if (e === true) {
2871                                setTimeout(done, duration);
2872                            } else {
2873                                done();
2874                            }
2875                        }
2876
2877                        return true;
2878                    },
2879
2880                    // Final adjustments after removing the instance
2881                    // =============================================
2882
2883                    cleanUp: function (e) {
2884                        var self = this,
2885                            instance,
2886                            $focus = self.current.opts.$orig,
2887                            x,
2888                            y;
2889
2890                        self.current.$slide.trigger("onReset");
2891
2892                        self.$refs.container.empty().remove();
2893
2894                        self.trigger("afterClose", e);
2895
2896                        // Place back focus
2897                        if (!!self.current.opts.backFocus) {
2898                            if (!$focus || !$focus.length || !$focus.is(":visible")) {
2899                                $focus = self.$trigger;
2900                            }
2901
2902                            if ($focus && $focus.length) {
2903                                x = window.scrollX;
2904                                y = window.scrollY;
2905
2906                                $focus.trigger("focus");
2907
2908                                $("html, body")
2909                                    .scrollTop(y)
2910                                    .scrollLeft(x);
2911                            }
2912                        }
2913
2914                        self.current = null;
2915
2916                        // Check if there are other instances
2917                        instance = $.fancybox.getInstance();
2918
2919                        if (instance) {
2920                            instance.activate();
2921                        } else {
2922                            $("body").removeClass("fancybox-active compensate-for-scrollbar");
2923
2924                            $("#fancybox-style-noscroll").remove();
2925                        }
2926                    },
2927
2928                    // Call callback and trigger an event
2929                    // ==================================
2930
2931                    trigger: function (name, slide) {
2932                        var args = Array.prototype.slice.call(arguments, 1),
2933                            self = this,
2934                            obj = slide && slide.opts ? slide : self.current,
2935                            rez;
2936
2937                        if (obj) {
2938                            args.unshift(obj);
2939                        } else {
2940                            obj = self;
2941                        }
2942
2943                        args.unshift(self);
2944
2945                        if ($.isFunction(obj.opts[name])) {
2946                            rez = obj.opts[name].apply(obj, args);
2947                        }
2948
2949                        if (rez === false) {
2950                            return rez;
2951                        }
2952
2953                        if (name === "afterClose" || !self.$refs) {
2954                            $D.trigger(name + ".fb", args);
2955                        } else {
2956                            self.$refs.container.trigger(name + ".fb", args);
2957                        }
2958                    },
2959
2960                    // Update infobar values, navigation button states and reveal caption
2961                    // ==================================================================
2962
2963                    updateControls: function () {
2964                        var self = this,
2965                            current = self.current,
2966                            index = current.index,
2967                            $container = self.$refs.container,
2968                            $caption = self.$refs.caption,
2969                            caption = current.opts.caption;
2970
2971                        // Recalculate content dimensions
2972                        current.$slide.trigger("refresh");
2973
2974                        // Set caption
2975                        if (caption && caption.length) {
2976                            self.$caption = $caption;
2977
2978                            $caption
2979                                .children()
2980                                .eq(0)
2981                                .html(caption);
2982                        } else {
2983                            self.$caption = null;
2984                        }
2985
2986                        if (!self.hasHiddenControls && !self.isIdle) {
2987                            self.showControls();
2988                        }
2989
2990                        // Update info and navigation elements
2991                        $container.find("[data-fancybox-count]").html(self.group.length);
2992                        $container.find("[data-fancybox-index]").html(index + 1);
2993
2994                        $container.find("[data-fancybox-prev]").prop("disabled", !current.opts.loop && index <= 0);
2995                        $container.find("[data-fancybox-next]").prop("disabled", !current.opts.loop && index >= self.group.length - 1);
2996
2997                        if (current.type === "image") {
2998                            // Re-enable buttons; update download button source
2999                            $container
3000                                .find("[data-fancybox-zoom]")
3001                                .show()
3002                                .end()
3003                                .find("[data-fancybox-download]")
3004                                .attr("href", current.opts.image.src || current.src)
3005                                .show();
3006                        } else if (current.opts.toolbar) {
3007                            $container.find("[data-fancybox-download],[data-fancybox-zoom]").hide();
3008                        }
3009
3010                        // Make sure focus is not on disabled button/element
3011                        if ($(document.activeElement).is(":hidden,[disabled]")) {
3012                            self.$refs.container.trigger("focus");
3013                        }
3014                    },
3015
3016                    // Hide toolbar and caption
3017                    // ========================
3018
3019                    hideControls: function (andCaption) {
3020                        var self = this,
3021                            arr = ["infobar", "toolbar", "nav"];
3022
3023                        if (andCaption || !self.current.opts.preventCaptionOverlap) {
3024                            arr.push("caption");
3025                        }
3026
3027                        this.$refs.container.removeClass(
3028                            arr
3029                                .map(function (i) {
3030                                    return "fancybox-show-" + i;
3031                                })
3032                                .join(" ")
3033                        );
3034
3035                        this.hasHiddenControls = true;
3036                    },
3037
3038                    showControls: function () {
3039                        var self = this,
3040                            opts = self.current ? self.current.opts : self.opts,
3041                            $container = self.$refs.container;
3042
3043                        self.hasHiddenControls = false;
3044                        self.idleSecondsCounter = 0;
3045
3046                        $container
3047                            .toggleClass("fancybox-show-toolbar", !!(opts.toolbar && opts.buttons))
3048                            .toggleClass("fancybox-show-infobar", !!(opts.infobar && self.group.length > 1))
3049                            .toggleClass("fancybox-show-caption", !!self.$caption)
3050                            .toggleClass("fancybox-show-nav", !!(opts.arrows && self.group.length > 1))
3051                            .toggleClass("fancybox-is-modal", !!opts.modal);
3052                    },
3053
3054                    // Toggle toolbar and caption
3055                    // ==========================
3056
3057                    toggleControls: function () {
3058                        if (this.hasHiddenControls) {
3059                            this.showControls();
3060                        } else {
3061                            this.hideControls();
3062                        }
3063                    }
3064                });
3065
3066                $.fancybox = {
3067                    version: "3.5.7",
3068                    defaults: defaults,
3069
3070                    // Get current instance and execute a command.
3071                    //
3072                    // Examples of usage:
3073                    //
3074                    //   $instance = $.fancybox.getInstance();
3075                    //   $.fancybox.getInstance().jumpTo( 1 );
3076                    //   $.fancybox.getInstance( 'jumpTo', 1 );
3077                    //   $.fancybox.getInstance( function() {
3078                    //       console.info( this.currIndex );
3079                    //   });
3080                    // ======================================================
3081
3082                    getInstance: function (command) {
3083                        var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),
3084                            args = Array.prototype.slice.call(arguments, 1);
3085
3086                        if (instance instanceof FancyBox) {
3087                            if ($.type(command) === "string") {
3088                                instance[command].apply(instance, args);
3089                            } else if ($.type(command) === "function") {
3090                                command.apply(instance, args);
3091                            }
3092
3093                            return instance;
3094                        }
3095
3096                        return false;
3097                    },
3098
3099                    // Create new instance
3100                    // ===================
3101
3102                    open: function (items, opts, index) {
3103                        return new FancyBox(items, opts, index);
3104                    },
3105
3106                    // Close current or all instances
3107                    // ==============================
3108
3109                    close: function (all) {
3110                        var instance = this.getInstance();
3111
3112                        if (instance) {
3113                            instance.close();
3114
3115                            // Try to find and close next instance
3116                            if (all === true) {
3117                                this.close(all);
3118                            }
3119                        }
3120                    },
3121
3122                    // Close all instances and unbind all events
3123                    // =========================================
3124
3125                    destroy: function () {
3126                        this.close(true);
3127
3128                        $D.add("body").off("click.fb-start", "**");
3129                    },
3130
3131                    // Try to detect mobile devices
3132                    // ============================
3133
3134                    isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
3135
3136                    // Detect if 'translate3d' support is available
3137                    // ============================================
3138
3139                    use3d: (function () {
3140                        var div = document.createElement("div");
3141
3142                        return (
3143                            window.getComputedStyle &&
3144                            window.getComputedStyle(div) &&
3145                            window.getComputedStyle(div).getPropertyValue("transform") &&
3146                            !(document.documentMode && document.documentMode < 11)
3147                        );
3148                    })(),
3149
3150                    // Helper function to get current visual state of an element
3151                    // returns array[ top, left, horizontal-scale, vertical-scale, opacity ]
3152                    // =====================================================================
3153
3154                    getTranslate: function ($el) {
3155                        var domRect;
3156
3157                        if (!$el || !$el.length) {
3158                            return false;
3159                        }
3160
3161                        domRect = $el[0].getBoundingClientRect();
3162
3163                        return {
3164                            top: domRect.top || 0,
3165                            left: domRect.left || 0,
3166                            width: domRect.width,
3167                            height: domRect.height,
3168                            opacity: parseFloat($el.css("opacity"))
3169                        };
3170                    },
3171
3172                    // Shortcut for setting "translate3d" properties for element
3173                    // Can set be used to set opacity, too
3174                    // ========================================================
3175
3176                    setTranslate: function ($el, props) {
3177                        var str = "",
3178                            css = {};
3179
3180                        if (!$el || !props) {
3181                            return;
3182                        }
3183
3184                        if (props.left !== undefined || props.top !== undefined) {
3185                            str =
3186                                (props.left === undefined ? $el.position().left : props.left) +
3187                                "px, " +
3188                                (props.top === undefined ? $el.position().top : props.top) +
3189                                "px";
3190
3191                            if (this.use3d) {
3192                                str = "translate3d(" + str + ", 0px)";
3193                            } else {
3194                                str = "translate(" + str + ")";
3195                            }
3196                        }
3197
3198                        if (props.scaleX !== undefined && props.scaleY !== undefined) {
3199                            str += " scale(" + props.scaleX + ", " + props.scaleY + ")";
3200                        } else if (props.scaleX !== undefined) {
3201                            str += " scaleX(" + props.scaleX + ")";
3202                        }
3203
3204                        if (str.length) {
3205                            css.transform = str;
3206                        }
3207
3208                        if (props.opacity !== undefined) {
3209                            css.opacity = props.opacity;
3210                        }
3211
3212                        if (props.width !== undefined) {
3213                            css.width = props.width;
3214                        }
3215
3216                        if (props.height !== undefined) {
3217                            css.height = props.height;
3218                        }
3219
3220                        return $el.css(css);
3221                    },
3222
3223                    // Simple CSS transition handler
3224                    // =============================
3225
3226                    animate: function ($el, to, duration, callback, leaveAnimationName) {
3227                        var self = this,
3228                            from;
3229
3230                        if ($.isFunction(duration)) {
3231                            callback = duration;
3232                            duration = null;
3233                        }
3234
3235                        self.stop($el);
3236
3237                        from = self.getTranslate($el);
3238
3239                        $el.on(transitionEnd, function (e) {
3240                            // Skip events from child elements and z-index change
3241                            if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == "z-index")) {
3242                                return;
3243                            }
3244
3245                            self.stop($el);
3246
3247                            if ($.isNumeric(duration)) {
3248                                $el.css("transition-duration", "");
3249                            }
3250
3251                            if ($.isPlainObject(to)) {
3252                                if (to.scaleX !== undefined && to.scaleY !== undefined) {
3253                                    self.setTranslate($el, {
3254                                        top: to.top,
3255                                        left: to.left,
3256                                        width: from.width * to.scaleX,
3257                                        height: from.height * to.scaleY,
3258                                        scaleX: 1,
3259                                        scaleY: 1
3260                                    });
3261                                }
3262                            } else if (leaveAnimationName !== true) {
3263                                $el.removeClass(to);
3264                            }
3265
3266                            if ($.isFunction(callback)) {
3267                                callback(e);
3268                            }
3269                        });
3270
3271                        if ($.isNumeric(duration)) {
3272                            $el.css("transition-duration", duration + "ms");
3273                        }
3274
3275                        // Start animation by changing CSS properties or class name
3276                        if ($.isPlainObject(to)) {
3277                            if (to.scaleX !== undefined && to.scaleY !== undefined) {
3278                                delete to.width;
3279                                delete to.height;
3280
3281                                if ($el.parent().hasClass("fancybox-slide--image")) {
3282                                    $el.parent().addClass("fancybox-is-scaling");
3283                                }
3284                            }
3285
3286                            $.fancybox.setTranslate($el, to);
3287                        } else {
3288                            $el.addClass(to);
3289                        }
3290
3291                        // Make sure that `transitionend` callback gets fired
3292                        $el.data(
3293                            "timer",
3294                            setTimeout(function () {
3295                                $el.trigger(transitionEnd);
3296                            }, duration + 33)
3297                        );
3298                    },
3299
3300                    stop: function ($el, callCallback) {
3301                        if ($el && $el.length) {
3302                            clearTimeout($el.data("timer"));
3303
3304                            if (callCallback) {
3305                                $el.trigger(transitionEnd);
3306                            }
3307
3308                            $el.off(transitionEnd).css("transition-duration", "");
3309
3310                            $el.parent().removeClass("fancybox-is-scaling");
3311                        }
3312                    }
3313                };
3314
3315                // Default click handler for "fancyboxed" links
3316                // ============================================
3317
3318                function _run(e, opts) {
3319                    var items = [],
3320                        index = 0,
3321                        $target,
3322                        value,
3323                        instance;
3324
3325                    // Avoid opening multiple times
3326                    if (e && e.isDefaultPrevented()) {
3327                        return;
3328                    }
3329
3330                    e.preventDefault();
3331
3332                    opts = opts || {};
3333
3334                    if (e && e.data) {
3335                        opts = mergeOpts(e.data.options, opts);
3336                    }
3337
3338                    $target = opts.$target || $(e.currentTarget).trigger("blur");
3339                    instance = $.fancybox.getInstance();
3340
3341                    if (instance && instance.$trigger && instance.$trigger.is($target)) {
3342                        return;
3343                    }
3344
3345                    if (opts.selector) {
3346                        items = $(opts.selector);
3347                    } else {
3348                        // Get all related items and find index for clicked one
3349                        value = $target.attr("data-fancybox") || "";
3350
3351                        if (value) {
3352                            items = e.data ? e.data.items : [];
3353                            items = items.length ? items.filter('[data-fancybox="' + value + '"]') : $('[data-fancybox="' + value + '"]');
3354                        } else {
3355                            items = [$target];
3356                        }
3357                    }
3358
3359                    index = $(items).index($target);
3360
3361                    // Sometimes current item can not be found
3362                    if (index < 0) {
3363                        index = 0;
3364                    }
3365
3366                    instance = $.fancybox.open(items, opts, index);
3367
3368                    // Save last active element
3369                    instance.$trigger = $target;
3370                }
3371
3372                // Create a jQuery plugin
3373                // ======================
3374
3375                $.fn.fancybox = function (options) {
3376                    var selector;
3377
3378                    options = options || {};
3379                    selector = options.selector || false;
3380
3381                    if (selector) {
3382                        // Use body element instead of document so it executes first
3383                        $("body")
3384                            .off("click.fb-start", selector)
3385                            .on("click.fb-start", selector, {
3386                                options: options
3387                            }, _run);
3388                    } else {
3389                        this.off("click.fb-start").on(
3390                            "click.fb-start", {
3391                                items: this,
3392                                options: options
3393                            },
3394                            _run
3395                        );
3396                    }
3397
3398                    return this;
3399                };
3400
3401                // Self initializing plugin for all elements having `data-fancybox` attribute
3402                // ==========================================================================
3403
3404                $D.on("click.fb-start", "[data-fancybox]", _run);
3405
3406                // Enable "trigger elements"
3407                // =========================
3408
3409                $D.on("click.fb-start", "[data-fancybox-trigger]", function (e) {
3410                    $('[data-fancybox="' + $(this).attr("data-fancybox-trigger") + '"]')
3411                        .eq($(this).attr("data-fancybox-index") || 0)
3412                        .trigger("click.fb-start", {
3413                            $trigger: $(this)
3414                        });
3415                });
3416
3417                // Track focus event for better accessibility styling
3418                // ==================================================
3419                (function () {
3420                    var buttonStr = ".fancybox-button",
3421                        focusStr = "fancybox-focus",
3422                        $pressed = null;
3423
3424                    $D.on("mousedown mouseup focus blur", buttonStr, function (e) {
3425                        switch (e.type) {
3426                            case "mousedown":
3427                                $pressed = $(this);
3428                                break;
3429                            case "mouseup":
3430                                $pressed = null;
3431                                break;
3432                            case "focusin":
3433                                $(buttonStr).removeClass(focusStr);
3434
3435                                if (!$(this).is($pressed) && !$(this).is("[disabled]")) {
3436                                    $(this).addClass(focusStr);
3437                                }
3438                                break;
3439                            case "focusout":
3440                                $(buttonStr).removeClass(focusStr);
3441                                break;
3442                        }
3443                    });
3444                })();
3445            })(window, document, jQuery);
3446// ==========================================================================
3447//
3448// Media
3449// Adds additional media type support
3450//
3451// ==========================================================================
3452            (function ($) {
3453                "use strict";
3454
3455                // Object containing properties for each media type
3456                var defaults = {
3457                    youtube: {
3458                        matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,
3459                        params: {
3460                            autoplay: 1,
3461                            autohide: 1,
3462                            fs: 1,
3463                            rel: 0,
3464                            hd: 1,
3465                            wmode: "transparent",
3466                            enablejsapi: 1,
3467                            html5: 1
3468                        },
3469                        paramPlace: 8,
3470                        type: "iframe",
3471                        url: "https://www.youtube-nocookie.com/embed/$4",
3472                        thumb: "https://img.youtube.com/vi/$4/hqdefault.jpg"
3473                    },
3474
3475                    vimeo: {
3476                        matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,
3477                        params: {
3478                            autoplay: 1,
3479                            hd: 1,
3480                            show_title: 1,
3481                            show_byline: 1,
3482                            show_portrait: 0,
3483                            fullscreen: 1
3484                        },
3485                        paramPlace: 3,
3486                        type: "iframe",
3487                        url: "//player.vimeo.com/video/$2"
3488                    },
3489
3490                    instagram: {
3491                        matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
3492                        type: "image",
3493                        url: "//$1/p/$2/media/?size=l"
3494                    },
3495
3496                    // Examples:
3497                    // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
3498                    // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z
3499                    // https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en
3500                    // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572
3501                    gmap_place: {
3502                        matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,
3503                        type: "iframe",
3504                        url: function (rez) {
3505                            return (
3506                                "//maps.google." +
3507                                rez[2] +
3508                                "/?ll=" +
3509                                (rez[9] ? rez[9] + "&z=" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\//, "&") : "") : rez[12] + "").replace(/\?/, "&") +
3510                                "&output=" +
3511                                (rez[12] && rez[12].indexOf("layer=c") > 0 ? "svembed" : "embed")
3512                            );
3513                        }
3514                    },
3515
3516                    // Examples:
3517                    // https://www.google.com/maps/search/Empire+State+Building/
3518                    // https://www.google.com/maps/search/?api=1&query=centurylink+field
3519                    // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393
3520                    gmap_search: {
3521                        matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,
3522                        type: "iframe",
3523                        url: function (rez) {
3524                            return "//maps.google." + rez[2] + "/maps?q=" + rez[5].replace("query=", "q=").replace("api=1", "") + "&output=embed";
3525                        }
3526                    }
3527                };
3528
3529                // Formats matching url to final form
3530                var format = function (url, rez, params) {
3531                    if (!url) {
3532                        return;
3533                    }
3534
3535                    params = params || "";
3536
3537                    if ($.type(params) === "object") {
3538                        params = $.param(params, true);
3539                    }
3540
3541                    $.each(rez, function (key, value) {
3542                        url = url.replace("$" + key, value || "");
3543                    });
3544
3545                    if (params.length) {
3546                        url += (url.indexOf("?") > 0 ? "&" : "?") + params;
3547                    }
3548
3549                    return url;
3550                };
3551
3552                $(document).on("objectNeedsType.fb", function (e, instance, item) {
3553                    var url = item.src || "",
3554                        type = false,
3555                        media,
3556                        thumb,
3557                        rez,
3558                        params,
3559                        urlParams,
3560                        paramObj,
3561                        provider;
3562
3563                    media = $.extend(true, {}, defaults, item.opts.media);
3564
3565                    // Look for any matching media type
3566                    $.each(media, function (providerName, providerOpts) {
3567                        rez = url.match(providerOpts.matcher);
3568
3569                        if (!rez) {
3570                            return;
3571                        }
3572
3573                        type = providerOpts.type;
3574                        provider = providerName;
3575                        paramObj = {};
3576
3577                        if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) {
3578                            urlParams = rez[providerOpts.paramPlace];
3579
3580                            if (urlParams[0] == "?") {
3581                                urlParams = urlParams.substring(1);
3582                            }
3583
3584                            urlParams = urlParams.split("&");
3585
3586                            for (var m = 0; m < urlParams.length; ++m) {
3587                                var p = urlParams[m].split("=", 2);
3588
3589                                if (p.length == 2) {
3590                                    paramObj[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
3591                                }
3592                            }
3593                        }
3594
3595                        params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj);
3596
3597                        url =
3598                            $.type(providerOpts.url) === "function" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params);
3599
3600                        thumb =
3601                            $.type(providerOpts.thumb) === "function" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez);
3602
3603                        if (providerName === "youtube") {
3604                            url = url.replace(/&t=((\d+)m)?(\d+)s/, function (match, p1, m, s) {
3605                                return "&start=" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10));
3606                            });
3607                        } else if (providerName === "vimeo") {
3608                            url = url.replace("&%23", "#");
3609                        }
3610
3611                        return false;
3612                    });
3613
3614                    // If it is found, then change content type and update the url
3615
3616                    if (type) {
3617                        if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) {
3618                            item.opts.thumb = thumb;
3619                        }
3620
3621                        if (type === "iframe") {
3622                            item.opts = $.extend(true, item.opts, {
3623                                iframe: {
3624                                    preload: false,
3625                                    attr: {
3626                                        scrolling: "no"
3627                                    }
3628                                }
3629                            });
3630                        }
3631
3632                        $.extend(item, {
3633                            type: type,
3634                            src: url,
3635                            origSrc: item.src,
3636                            contentSource: provider,
3637                            contentType: type === "image" ? "image" : provider == "gmap_place" || provider == "gmap_search" ? "map" : "video"
3638                        });
3639                    } else if (url) {
3640                        item.type = item.opts.defaultType;
3641                    }
3642                });
3643
3644                // Load YouTube/Video API on request to detect when video finished playing
3645                var VideoAPILoader = {
3646                    youtube: {
3647                        src: "https://www.youtube.com/iframe_api",
3648                        class: "YT",
3649                        loading: false,
3650                        loaded: false
3651                    },
3652
3653                    vimeo: {
3654                        src: "https://player.vimeo.com/api/player.js",
3655                        class: "Vimeo",
3656                        loading: false,
3657                        loaded: false
3658                    },
3659
3660                    load: function (vendor) {
3661                        var _this = this,
3662                            script;
3663
3664                        if (this[vendor].loaded) {
3665                            setTimeout(function () {
3666                                _this.done(vendor);
3667                            });
3668                            return;
3669                        }
3670
3671                        if (this[vendor].loading) {
3672                            return;
3673                        }
3674
3675                        this[vendor].loading = true;
3676
3677                        script = document.createElement("script");
3678                        script.type = "text/javascript";
3679                        script.src = this[vendor].src;
3680
3681                        if (vendor === "youtube") {
3682                            window.onYouTubeIframeAPIReady = function () {
3683                                _this[vendor].loaded = true;
3684                                _this.done(vendor);
3685                            };
3686                        } else {
3687                            script.onload = function () {
3688                                _this[vendor].loaded = true;
3689                                _this.done(vendor);
3690                            };
3691                        }
3692
3693                        document.body.appendChild(script);
3694                    },
3695                    done: function (vendor) {
3696                        var instance, $el, player;
3697
3698                        if (vendor === "youtube") {
3699                            delete window.onYouTubeIframeAPIReady;
3700                        }
3701
3702                        instance = $.fancybox.getInstance();
3703
3704                        if (instance) {
3705                            $el = instance.current.$content.find("iframe");
3706
3707                            if (vendor === "youtube" && YT !== undefined && YT) {
3708                                player = new YT.Player($el.attr("id"), {
3709                                    events: {
3710                                        onStateChange: function (e) {
3711                                            if (e.data == 0) {
3712                                                instance.next();
3713                                            }
3714                                        }
3715                                    }
3716                                });
3717                            } else if (vendor === "vimeo" && Vimeo !== undefined && Vimeo) {
3718                                player = new Vimeo.Player($el);
3719
3720                                player.on("ended", function () {
3721                                    instance.next();
3722                                });
3723                            }
3724                        }
3725                    }
3726                };
3727
3728                $(document).on({
3729                    "afterShow.fb": function (e, instance, current) {
3730                        if (instance.group.length > 1 && (current.contentSource === "youtube" || current.contentSource === "vimeo")) {
3731                            VideoAPILoader.load(current.contentSource);
3732                        }
3733                    }
3734                });
3735            })(jQuery);
3736// ==========================================================================
3737//
3738// Guestures
3739// Adds touch guestures, handles click and tap events
3740//
3741// ==========================================================================
3742            (function (window, document, $) {
3743                "use strict";
3744
3745                var requestAFrame = (function () {
3746                    return (
3747                        window.requestAnimationFrame ||
3748                        window.webkitRequestAnimationFrame ||
3749                        window.mozRequestAnimationFrame ||
3750                        window.oRequestAnimationFrame ||
3751                        // if all else fails, use setTimeout
3752                        function (callback) {
3753                            return window.setTimeout(callback, 1000 / 60);
3754                        }
3755                    );
3756                })();
3757
3758                var cancelAFrame = (function () {
3759                    return (
3760                        window.cancelAnimationFrame ||
3761                        window.webkitCancelAnimationFrame ||
3762                        window.mozCancelAnimationFrame ||
3763                        window.oCancelAnimationFrame ||
3764                        function (id) {
3765                            window.clearTimeout(id);
3766                        }
3767                    );
3768                })();
3769
3770                var getPointerXY = function (e) {
3771                    var result = [];
3772
3773                    e = e.originalEvent || e || window.e;
3774                    e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e];
3775
3776                    for (var key in e) {
3777                        if (e[key].pageX) {
3778                            result.push({
3779                                x: e[key].pageX,
3780                                y: e[key].pageY
3781                            });
3782                        } else if (e[key].clientX) {
3783                            result.push({
3784                                x: e[key].clientX,
3785                                y: e[key].clientY
3786                            });
3787                        }
3788                    }
3789
3790                    return result;
3791                };
3792
3793                var distance = function (point2, point1, what) {
3794                    if (!point1 || !point2) {
3795                        return 0;
3796                    }
3797
3798                    if (what === "x") {
3799                        return point2.x - point1.x;
3800                    } else if (what === "y") {
3801                        return point2.y - point1.y;
3802                    }
3803
3804                    return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));
3805                };
3806
3807                var isClickable = function ($el) {
3808                    if (
3809                        $el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe') ||
3810                        $.isFunction($el.get(0).onclick) ||
3811                        $el.data("selectable")
3812                    ) {
3813                        return true;
3814                    }
3815
3816                    // Check for attributes like data-fancybox-next or data-fancybox-close
3817                    for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) {
3818                        if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") {
3819                            return true;
3820                        }
3821                    }
3822
3823                    return false;
3824                };
3825
3826                var hasScrollbars = function (el) {
3827                    var overflowY = window.getComputedStyle(el)["overflow-y"],
3828                        overflowX = window.getComputedStyle(el)["overflow-x"],
3829                        vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight,
3830                        horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth;
3831
3832                    return vertical || horizontal;
3833                };
3834
3835                var isScrollable = function ($el) {
3836                    var rez = false;
3837
3838                    while (true) {
3839                        rez = hasScrollbars($el.get(0));
3840
3841                        if (rez) {
3842                            break;
3843                        }
3844
3845                        $el = $el.parent();
3846
3847                        if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) {
3848                            break;
3849                        }
3850                    }
3851
3852                    return rez;
3853                };
3854
3855                var Guestures = function (instance) {
3856                    var self = this;
3857
3858                    self.instance = instance;
3859
3860                    self.$bg = instance.$refs.bg;
3861                    self.$stage = instance.$refs.stage;
3862                    self.$container = instance.$refs.container;
3863
3864                    self.destroy();
3865
3866                    self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart"));
3867                };
3868
3869                Guestures.prototype.destroy = function () {
3870                    var self = this;
3871
3872                    self.$container.off(".fb.touch");
3873
3874                    $(document).off(".fb.touch");
3875
3876                    if (self.requestId) {
3877                        cancelAFrame(self.requestId);
3878                        self.requestId = null;
3879                    }
3880
3881                    if (self.tapped) {
3882                        clearTimeout(self.tapped);
3883                        self.tapped = null;
3884                    }
3885                };
3886
3887                Guestures.prototype.ontouchstart = function (e) {
3888                    var self = this,
3889                        $target = $(e.target),
3890                        instance = self.instance,
3891                        current = instance.current,
3892                        $slide = current.$slide,
3893                        $content = current.$content,
3894                        isTouchDevice = e.type == "touchstart";
3895
3896                    // Do not respond to both (touch and mouse) events
3897                    if (isTouchDevice) {
3898                        self.$container.off("mousedown.fb.touch");
3899                    }
3900
3901                    // Ignore right click
3902                    if (e.originalEvent && e.originalEvent.button == 2) {
3903                        return;
3904                    }
3905
3906                    // Ignore taping on links, buttons, input elements
3907                    if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) {
3908                        return;
3909                    }
3910                    // Ignore clicks on the scrollbar
3911                    if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) {
3912                        return;
3913                    }
3914
3915                    // Ignore clicks while zooming or closing
3916                    if (!current || instance.isAnimating || current.$slide.hasClass("fancybox-animated")) {
3917                        e.stopPropagation();
3918                        e.preventDefault();
3919
3920                        return;
3921                    }
3922
3923                    self.realPoints = self.startPoints = getPointerXY(e);
3924
3925                    if (!self.startPoints.length) {
3926                        return;
3927                    }
3928
3929                    // Allow other scripts to catch touch event if "touch" is set to false
3930                    if (current.touch) {
3931                        e.stopPropagation();
3932                    }
3933
3934                    self.startEvent = e;
3935
3936                    self.canTap = true;
3937                    self.$target = $target;
3938                    self.$content = $content;
3939                    self.opts = current.opts.touch;
3940
3941                    self.isPanning = false;
3942                    self.isSwiping = false;
3943                    self.isZooming = false;
3944                    self.isScrolling = false;
3945                    self.canPan = instance.canPan();
3946
3947                    self.startTime = new Date().getTime();
3948                    self.distanceX = self.distanceY = self.distance = 0;
3949
3950                    self.canvasWidth = Math.round($slide[0].clientWidth);
3951                    self.canvasHeight = Math.round($slide[0].clientHeight);
3952
3953                    self.contentLastPos = null;
3954                    self.contentStartPos = $.fancybox.getTranslate(self.$content) || {
3955                        top: 0,
3956                        left: 0
3957                    };
3958                    self.sliderStartPos = $.fancybox.getTranslate($slide);
3959
3960                    // Since position will be absolute, but we need to make it relative to the stage
3961                    self.stagePos = $.fancybox.getTranslate(instance.$refs.stage);
3962
3963                    self.sliderStartPos.top -= self.stagePos.top;
3964                    self.sliderStartPos.left -= self.stagePos.left;
3965
3966                    self.contentStartPos.top -= self.stagePos.top;
3967                    self.contentStartPos.left -= self.stagePos.left;
3968
3969                    $(document)
3970                        .off(".fb.touch")
3971                        .on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend"))
3972                        .on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove"));
3973
3974                    if ($.fancybox.isMobile) {
3975                        document.addEventListener("scroll", self.onscroll, true);
3976                    }
3977
3978                    // Skip if clicked outside the sliding area
3979                    if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) {
3980                        if ($target.is(".fancybox-image")) {
3981                            e.preventDefault();
3982                        }
3983
3984                        if (!($.fancybox.isMobile && $target.parents(".fancybox-caption").length)) {
3985                            return;
3986                        }
3987                    }
3988
3989                    self.isScrollable = isScrollable($target) || isScrollable($target.parent());
3990
3991                    // Check if element is scrollable and try to prevent default behavior (scrolling)
3992                    if (!($.fancybox.isMobile && self.isScrollable)) {
3993                        e.preventDefault();
3994                    }
3995
3996                    // One finger or mouse click - swipe or pan an image
3997                    if (self.startPoints.length === 1 || current.hasError) {
3998                        if (self.canPan) {
3999                            $.fancybox.stop(self.$content);
4000
4001                            self.isPanning = true;
4002                        } else {
4003                            self.isSwiping = true;
4004                        }
4005
4006                        self.$container.addClass("fancybox-is-grabbing");
4007                    }
4008
4009                    // Two fingers - zoom image
4010                    if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) {
4011                        self.canTap = false;
4012                        self.isSwiping = false;
4013                        self.isPanning = false;
4014
4015                        self.isZooming = true;
4016
4017                        $.fancybox.stop(self.$content);
4018
4019                        self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft();
4020                        self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop();
4021
4022                        self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width;
4023                        self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height;
4024
4025                        self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]);
4026                    }
4027                };
4028
4029                Guestures.prototype.onscroll = function (e) {
4030                    var self = this;
4031
4032                    self.isScrolling = true;
4033
4034                    document.removeEventListener("scroll", self.onscroll, true);
4035                };
4036
4037                Guestures.prototype.ontouchmove = function (e) {
4038                    var self = this;
4039
4040                    // Make sure user has not released over iframe or disabled element
4041                    if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) {
4042                        self.ontouchend(e);
4043                        return;
4044                    }
4045
4046                    if (self.isScrolling) {
4047                        self.canTap = false;
4048                        return;
4049                    }
4050
4051                    self.newPoints = getPointerXY(e);
4052
4053                    if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) {
4054                        return;
4055                    }
4056
4057                    if (!(self.isSwiping && self.isSwiping === true)) {
4058                        e.preventDefault();
4059                    }
4060
4061                    self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x");
4062                    self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y");
4063
4064                    self.distance = distance(self.newPoints[0], self.startPoints[0]);
4065
4066                    // Skip false ontouchmove events (Chrome)
4067                    if (self.distance > 0) {
4068                        if (self.isSwiping) {
4069                            self.onSwipe(e);
4070                        } else if (self.isPanning) {
4071                            self.onPan();
4072                        } else if (self.isZooming) {
4073                            self.onZoom();
4074                        }
4075                    }
4076                };
4077
4078                Guestures.prototype.onSwipe = function (e) {
4079                    var self = this,
4080                        instance = self.instance,
4081                        swiping = self.isSwiping,
4082                        left = self.sliderStartPos.left || 0,
4083                        angle;
4084
4085                    // If direction is not yet determined
4086                    if (swiping === true) {
4087                        // We need at least 10px distance to correctly calculate an angle
4088                        if (Math.abs(self.distance) > 10) {
4089                            self.canTap = false;
4090
4091                            if (instance.group.length < 2 && self.opts.vertical) {
4092                                self.isSwiping = "y";
4093                            } else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) {
4094                                self.isSwiping = "x";
4095                            } else {
4096                                angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI);
4097
4098                                self.isSwiping = angle > 45 && angle < 135 ? "y" : "x";
4099                            }
4100
4101                            if (self.isSwiping === "y" && $.fancybox.isMobile && self.isScrollable) {
4102                                self.isScrolling = true;
4103
4104                                return;
4105                            }
4106
4107                            instance.isDragging = self.isSwiping;
4108
4109                            // Reset points to avoid jumping, because we dropped first swipes to calculate the angle
4110                            self.startPoints = self.newPoints;
4111
4112                            $.each(instance.slides, function (index, slide) {
4113                                var slidePos, stagePos;
4114
4115                                $.fancybox.stop(slide.$slide);
4116
4117                                slidePos = $.fancybox.getTranslate(slide.$slide);
4118                                stagePos = $.fancybox.getTranslate(instance.$refs.stage);
4119
4120                                slide.$slide
4121                                    .css({
4122                                        transform: "",
4123                                        opacity: "",
4124                                        "transition-duration": ""
4125                                    })
4126                                    .removeClass("fancybox-animated")
4127                                    .removeClass(function (index, className) {
4128                                        return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" ");
4129                                    });
4130
4131                                if (slide.pos === instance.current.pos) {
4132                                    self.sliderStartPos.top = slidePos.top - stagePos.top;
4133                                    self.sliderStartPos.left = slidePos.left - stagePos.left;
4134                                }
4135
4136                                $.fancybox.setTranslate(slide.$slide, {
4137                                    top: slidePos.top - stagePos.top,
4138                                    left: slidePos.left - stagePos.left
4139                                });
4140                            });
4141
4142                            // Stop slideshow
4143                            if (instance.SlideShow && instance.SlideShow.isActive) {
4144                                instance.SlideShow.stop();
4145                            }
4146                        }
4147
4148                        return;
4149                    }
4150
4151                    // Sticky edges
4152                    if (swiping == "x") {
4153                        if (
4154                            self.distanceX > 0 &&
4155                            (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop))
4156                        ) {
4157                            left = left + Math.pow(self.distanceX, 0.8);
4158                        } else if (
4159                            self.distanceX < 0 &&
4160                            (self.instance.group.length < 2 ||
4161                                (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop))
4162                        ) {
4163                            left = left - Math.pow(-self.distanceX, 0.8);
4164                        } else {
4165                            left = left + self.distanceX;
4166                        }
4167                    }
4168
4169                    self.sliderLastPos = {
4170                        top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY,
4171                        left: left
4172                    };
4173
4174                    if (self.requestId) {
4175                        cancelAFrame(self.requestId);
4176
4177                        self.requestId = null;
4178                    }
4179
4180                    self.requestId = requestAFrame(function () {
4181                        if (self.sliderLastPos) {
4182                            $.each(self.instance.slides, function (index, slide) {
4183                                var pos = slide.pos - self.instance.currPos;
4184
4185                                $.fancybox.setTranslate(slide.$slide, {
4186                                    top: self.sliderLastPos.top,
4187                                    left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter
4188                                });
4189                            });
4190
4191                            self.$container.addClass("fancybox-is-sliding");
4192                        }
4193                    });
4194                };
4195
4196                Guestures.prototype.onPan = function () {
4197                    var self = this;
4198
4199                    // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit)
4200                    if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) {
4201                        self.startPoints = self.newPoints;
4202                        return;
4203                    }
4204
4205                    self.canTap = false;
4206
4207                    self.contentLastPos = self.limitMovement();
4208
4209                    if (self.requestId) {
4210                        cancelAFrame(self.requestId);
4211                    }
4212
4213                    self.requestId = requestAFrame(function () {
4214                        $.fancybox.setTranslate(self.$content, self.contentLastPos);
4215                    });
4216                };
4217
4218                // Make panning sticky to the edges
4219                Guestures.prototype.limitMovement = function () {
4220                    var self = this;
4221
4222                    var canvasWidth = self.canvasWidth;
4223                    var canvasHeight = self.canvasHeight;
4224
4225                    var distanceX = self.distanceX;
4226                    var distanceY = self.distanceY;
4227
4228                    var contentStartPos = self.contentStartPos;
4229
4230                    var currentOffsetX = contentStartPos.left;
4231                    var currentOffsetY = contentStartPos.top;
4232
4233                    var currentWidth = contentStartPos.width;
4234                    var currentHeight = contentStartPos.height;
4235
4236                    var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY;
4237
4238                    if (currentWidth > canvasWidth) {
4239                        newOffsetX = currentOffsetX + distanceX;
4240                    } else {
4241                        newOffsetX = currentOffsetX;
4242                    }
4243
4244                    newOffsetY = currentOffsetY + distanceY;
4245
4246                    // Slow down proportionally to traveled distance
4247                    minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5);
4248                    minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5);
4249
4250                    maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5);
4251                    maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5);
4252
4253                    //   ->
4254                    if (distanceX > 0 && newOffsetX > minTranslateX) {
4255                        newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0;
4256                    }
4257
4258                    //    <-
4259                    if (distanceX < 0 && newOffsetX < maxTranslateX) {
4260                        newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0;
4261                    }
4262
4263                    //   \/
4264                    if (distanceY > 0 && newOffsetY > minTranslateY) {
4265                        newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0;
4266                    }
4267
4268                    //   /\
4269                    if (distanceY < 0 && newOffsetY < maxTranslateY) {
4270                        newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0;
4271                    }
4272
4273                    return {
4274                        top: newOffsetY,
4275                        left: newOffsetX
4276                    };
4277                };
4278
4279                Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) {
4280                    var self = this;
4281
4282                    var canvasWidth = self.canvasWidth;
4283                    var canvasHeight = self.canvasHeight;
4284
4285                    if (newWidth > canvasWidth) {
4286                        newOffsetX = newOffsetX > 0 ? 0 : newOffsetX;
4287                        newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX;
4288                    } else {
4289                        // Center horizontally
4290                        newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2);
4291                    }
4292
4293                    if (newHeight > canvasHeight) {
4294                        newOffsetY = newOffsetY > 0 ? 0 : newOffsetY;
4295                        newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY;
4296                    } else {
4297                        // Center vertically
4298                        newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2);
4299                    }
4300
4301                    return {
4302                        top: newOffsetY,
4303                        left: newOffsetX
4304                    };
4305                };
4306
4307                Guestures.prototype.onZoom = function () {
4308                    var self = this;
4309
4310                    // Calculate current distance between points to get pinch ratio and new width and height
4311                    var contentStartPos = self.contentStartPos;
4312
4313                    var currentWidth = contentStartPos.width;
4314                    var currentHeight = contentStartPos.height;
4315
4316                    var currentOffsetX = contentStartPos.left;
4317                    var currentOffsetY = contentStartPos.top;
4318
4319                    var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]);
4320
4321                    var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers;
4322
4323                    var newWidth = Math.floor(currentWidth * pinchRatio);
4324                    var newHeight = Math.floor(currentHeight * pinchRatio);
4325
4326                    // This is the translation due to pinch-zooming
4327                    var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX;
4328                    var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY;
4329
4330                    // Point between the two touches
4331                    var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft();
4332                    var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop();
4333
4334                    // And this is the translation due to translation of the centerpoint
4335                    // between the two fingers
4336                    var translateFromTranslatingX = centerPointEndX - self.centerPointStartX;
4337                    var translateFromTranslatingY = centerPointEndY - self.centerPointStartY;
4338
4339                    // The new offset is the old/current one plus the total translation
4340                    var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX);
4341                    var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY);
4342
4343                    var newPos = {
4344                        top: newOffsetY,
4345                        left: newOffsetX,
4346                        scaleX: pinchRatio,
4347                        scaleY: pinchRatio
4348                    };
4349
4350                    self.canTap = false;
4351
4352                    self.newWidth = newWidth;
4353                    self.newHeight = newHeight;
4354
4355                    self.contentLastPos = newPos;
4356
4357                    if (self.requestId) {
4358                        cancelAFrame(self.requestId);
4359                    }
4360
4361                    self.requestId = requestAFrame(function () {
4362                        $.fancybox.setTranslate(self.$content, self.contentLastPos);
4363                    });
4364                };
4365
4366                Guestures.prototype.ontouchend = function (e) {
4367                    var self = this;
4368
4369                    var swiping = self.isSwiping;
4370                    var panning = self.isPanning;
4371                    var zooming = self.isZooming;
4372                    var scrolling = self.isScrolling;
4373
4374                    self.endPoints = getPointerXY(e);
4375                    self.dMs = Math.max(new Date().getTime() - self.startTime, 1);
4376
4377                    self.$container.removeClass("fancybox-is-grabbing");
4378
4379                    $(document).off(".fb.touch");
4380
4381                    document.removeEventListener("scroll", self.onscroll, true);
4382
4383                    if (self.requestId) {
4384                        cancelAFrame(self.requestId);
4385
4386                        self.requestId = null;
4387                    }
4388
4389                    self.isSwiping = false;
4390                    self.isPanning = false;
4391                    self.isZooming = false;
4392                    self.isScrolling = false;
4393
4394                    self.instance.isDragging = false;
4395
4396                    if (self.canTap) {
4397                        return self.onTap(e);
4398                    }
4399
4400                    self.speed = 100;
4401
4402                    // Speed in px/ms
4403                    self.velocityX = (self.distanceX / self.dMs) * 0.5;
4404                    self.velocityY = (self.distanceY / self.dMs) * 0.5;
4405
4406                    if (panning) {
4407                        self.endPanning();
4408                    } else if (zooming) {
4409                        self.endZooming();
4410                    } else {
4411                        self.endSwiping(swiping, scrolling);
4412                    }
4413
4414                    return;
4415                };
4416
4417                Guestures.prototype.endSwiping = function (swiping, scrolling) {
4418                    var self = this,
4419                        ret = false,
4420                        len = self.instance.group.length,
4421                        distanceX = Math.abs(self.distanceX),
4422                        canAdvance = swiping == "x" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50),
4423                        speedX = 300;
4424
4425                    self.sliderLastPos = null;
4426
4427                    // Close if swiped vertically / navigate if horizontally
4428                    if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) {
4429                        // Continue vertical movement
4430                        $.fancybox.animate(
4431                            self.instance.current.$slide, {
4432                                top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150,
4433                                opacity: 0
4434                            },
4435                            200
4436                        );
4437                        ret = self.instance.close(true, 250);
4438                    } else if (canAdvance && self.distanceX > 0) {
4439                        ret = self.instance.previous(speedX);
4440                    } else if (canAdvance && self.distanceX < 0) {
4441                        ret = self.instance.next(speedX);
4442                    }
4443
4444                    if (ret === false && (swiping == "x" || swiping == "y")) {
4445                        self.instance.centerSlide(200);
4446                    }
4447
4448                    self.$container.removeClass("fancybox-is-sliding");
4449                };
4450
4451                // Limit panning from edges
4452                // ========================
4453                Guestures.prototype.endPanning = function () {
4454                    var self = this,
4455                        newOffsetX,
4456                        newOffsetY,
4457                        newPos;
4458
4459                    if (!self.contentLastPos) {
4460                        return;
4461                    }
4462
4463                    if (self.opts.momentum === false || self.dMs > 350) {
4464                        newOffsetX = self.contentLastPos.left;
4465                        newOffsetY = self.contentLastPos.top;
4466                    } else {
4467                        // Continue movement
4468                        newOffsetX = self.contentLastPos.left + self.velocityX * 500;
4469                        newOffsetY = self.contentLastPos.top + self.velocityY * 500;
4470                    }
4471
4472                    newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height);
4473
4474                    newPos.width = self.contentStartPos.width;
4475                    newPos.height = self.contentStartPos.height;
4476
4477                    $.fancybox.animate(self.$content, newPos, 366);
4478                };
4479
4480                Guestures.prototype.endZooming = function () {
4481                    var self = this;
4482
4483                    var current = self.instance.current;
4484
4485                    var newOffsetX, newOffsetY, newPos, reset;
4486
4487                    var newWidth = self.newWidth;
4488                    var newHeight = self.newHeight;
4489
4490                    if (!self.contentLastPos) {
4491                        return;
4492                    }
4493
4494                    newOffsetX = self.contentLastPos.left;
4495                    newOffsetY = self.contentLastPos.top;
4496
4497                    reset = {
4498                        top: newOffsetY,
4499                        left: newOffsetX,
4500                        width: newWidth,
4501                        height: newHeight,
4502                        scaleX: 1,
4503                        scaleY: 1
4504                    };
4505
4506                    // Reset scalex/scaleY values; this helps for perfomance and does not break animation
4507                    $.fancybox.setTranslate(self.$content, reset);
4508
4509                    if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) {
4510                        self.instance.scaleToFit(150);
4511                    } else if (newWidth > current.width || newHeight > current.height) {
4512                        self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150);
4513                    } else {
4514                        newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight);
4515
4516                        $.fancybox.animate(self.$content, newPos, 150);
4517                    }
4518                };
4519
4520                Guestures.prototype.onTap = function (e) {
4521                    var self = this;
4522                    var $target = $(e.target);
4523
4524                    var instance = self.instance;
4525                    var current = instance.current;
4526
4527                    var endPoints = (e && getPointerXY(e)) || self.startPoints;
4528
4529                    var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0;
4530                    var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0;
4531
4532                    var where;
4533
4534                    var process = function (prefix) {
4535                        var action = current.opts[prefix];
4536
4537                        if ($.isFunction(action)) {
4538                            action = action.apply(instance, [current, e]);
4539                        }
4540
4541                        if (!action) {
4542                            return;
4543                        }
4544
4545                        switch (action) {
4546                            case "close":
4547                                instance.close(self.startEvent);
4548
4549                                break;
4550
4551                            case "toggleControls":
4552                                instance.toggleControls();
4553
4554                                break;
4555
4556                            case "next":
4557                                instance.next();
4558
4559                                break;
4560
4561                            case "nextOrClose":
4562                                if (instance.group.length > 1) {
4563                                    instance.next();
4564                                } else {
4565                                    instance.close(self.startEvent);
4566                                }
4567
4568                                break;
4569
4570                            case "zoom":
4571                                if (current.type == "image" && (current.isLoaded || current.$ghost)) {
4572                                    if (instance.canPan()) {
4573                                        instance.scaleToFit();
4574                                    } else if (instance.isScaledDown()) {
4575                                        instance.scaleToActual(tapX, tapY);
4576                                    } else if (instance.group.length < 2) {
4577                                        instance.close(self.startEvent);
4578                                    }
4579                                }
4580
4581                                break;
4582                        }
4583                    };
4584
4585                    // Ignore right click
4586                    if (e.originalEvent && e.originalEvent.button == 2) {
4587                        return;
4588                    }
4589
4590                    // Skip if clicked on the scrollbar
4591                    if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) {
4592                        return;
4593                    }
4594
4595                    // Check where is clicked
4596                    if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) {
4597                        where = "Outside";
4598                    } else if ($target.is(".fancybox-slide")) {
4599                        where = "Slide";
4600                    } else if (
4601                        instance.current.$content &&
4602                        instance.current.$content
4603                            .find($target)
4604                            .addBack()
4605                            .filter($target).length
4606                    ) {
4607                        where = "Content";
4608                    } else {
4609                        return;
4610                    }
4611
4612                    // Check if this is a double tap
4613                    if (self.tapped) {
4614                        // Stop previously created single tap
4615                        clearTimeout(self.tapped);
4616                        self.tapped = null;
4617
4618                        // Skip if distance between taps is too big
4619                        if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) {
4620                            return this;
4621                        }
4622
4623                        // OK, now we assume that this is a double-tap
4624                        process("dblclick" + where);
4625                    } else {
4626                        // Single tap will be processed if user has not clicked second time within 300ms
4627                        // or there is no need to wait for double-tap
4628                        self.tapX = tapX;
4629                        self.tapY = tapY;
4630
4631                        if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) {
4632                            self.tapped = setTimeout(function () {
4633                                self.tapped = null;
4634
4635                                if (!instance.isAnimating) {
4636                                    process("click" + where);
4637                                }
4638                            }, 500);
4639                        } else {
4640                            process("click" + where);
4641                        }
4642                    }
4643
4644                    return this;
4645                };
4646
4647                $(document)
4648                    .on("onActivate.fb", function (e, instance) {
4649                        if (instance && !instance.Guestures) {
4650                            instance.Guestures = new Guestures(instance);
4651                        }
4652                    })
4653                    .on("beforeClose.fb", function (e, instance) {
4654                        if (instance && instance.Guestures) {
4655                            instance.Guestures.destroy();
4656                        }
4657                    });
4658            })(window, document, jQuery);
4659// ==========================================================================
4660//
4661// SlideShow
4662// Enables slideshow functionality
4663//
4664// Example of usage:
4665// $.fancybox.getInstance().SlideShow.start()
4666//
4667// ==========================================================================
4668            (function (document, $) {
4669                "use strict";
4670
4671                $.extend(true, $.fancybox.defaults, {
4672                    btnTpl: {
4673                        slideShow: '<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}">' +
4674                            '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.5 5.4v13.2l11-6.6z"/></svg>' +
4675                            '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.33 5.75h2.2v12.5h-2.2V5.75zm5.15 0h2.2v12.5h-2.2V5.75z"/></svg>' +
4676                            "</button>"
4677                    },
4678                    slideShow: {
4679                        autoStart: false,
4680                        speed: 3000,
4681                        progress: true
4682                    }
4683                });
4684
4685                var SlideShow = function (instance) {
4686                    this.instance = instance;
4687                    this.init();
4688                };
4689
4690                $.extend(SlideShow.prototype, {
4691                    timer: null,
4692                    isActive: false,
4693                    $button: null,
4694
4695                    init: function () {
4696                        var self = this,
4697                            instance = self.instance,
4698                            opts = instance.group[instance.currIndex].opts.slideShow;
4699
4700                        self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () {
4701                            self.toggle();
4702                        });
4703
4704                        if (instance.group.length < 2 || !opts) {
4705                            self.$button.hide();
4706                        } else if (opts.progress) {
4707                            self.$progress = $('<div class="fancybox-progress"></div>').appendTo(instance.$refs.inner);
4708                        }
4709                    },
4710
4711                    set: function (force) {
4712                        var self = this,
4713                            instance = self.instance,
4714                            current = instance.current;
4715
4716                        // Check if reached last element
4717                        if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) {
4718                            if (self.isActive && current.contentType !== "video") {
4719                                if (self.$progress) {
4720                                    $.fancybox.animate(self.$progress.show(), {
4721                                        scaleX: 1
4722                                    }, current.opts.slideShow.speed);
4723                                }
4724
4725                                self.timer = setTimeout(function () {
4726                                    if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) {
4727                                        instance.jumpTo(0);
4728                                    } else {
4729                                        instance.next();
4730                                    }
4731                                }, current.opts.slideShow.speed);
4732                            }
4733                        } else {
4734                            self.stop();
4735                            instance.idleSecondsCounter = 0;
4736                            instance.showControls();
4737                        }
4738                    },
4739
4740                    clear: function () {
4741                        var self = this;
4742
4743                        clearTimeout(self.timer);
4744
4745                        self.timer = null;
4746
4747                        if (self.$progress) {
4748                            self.$progress.removeAttr("style").hide();
4749                        }
4750                    },
4751
4752                    start: function () {
4753                        var self = this,
4754                            current = self.instance.current;
4755
4756                        if (current) {
4757                            self.$button
4758                                .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP)
4759                                .removeClass("fancybox-button--play")
4760                                .addClass("fancybox-button--pause");
4761
4762                            self.isActive = true;
4763
4764                            if (current.isComplete) {
4765                                self.set(true);
4766                            }
4767
4768                            self.instance.trigger("onSlideShowChange", true);
4769                        }
4770                    },
4771
4772                    stop: function () {
4773                        var self = this,
4774                            current = self.instance.current;
4775
4776                        self.clear();
4777
4778                        self.$button
4779                            .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START)
4780                            .removeClass("fancybox-button--pause")
4781                            .addClass("fancybox-button--play");
4782
4783                        self.isActive = false;
4784
4785                        self.instance.trigger("onSlideShowChange", false);
4786
4787                        if (self.$progress) {
4788                            self.$progress.removeAttr("style").hide();
4789                        }
4790                    },
4791
4792                    toggle: function () {
4793                        var self = this;
4794
4795                        if (self.isActive) {
4796                            self.stop();
4797                        } else {
4798                            self.start();
4799                        }
4800                    }
4801                });
4802
4803                $(document).on({
4804                    "onInit.fb": function (e, instance) {
4805                        if (instance && !instance.SlideShow) {
4806                            instance.SlideShow = new SlideShow(instance);
4807                        }
4808                    },
4809
4810                    "beforeShow.fb": function (e, instance, current, firstRun) {
4811                        var SlideShow = instance && instance.SlideShow;
4812
4813                        if (firstRun) {
4814                            if (SlideShow && current.opts.slideShow.autoStart) {
4815                                SlideShow.start();
4816                            }
4817                        } else if (SlideShow && SlideShow.isActive) {
4818                            SlideShow.clear();
4819                        }
4820                    },
4821
4822                    "afterShow.fb": function (e, instance, current) {
4823                        var SlideShow = instance && instance.SlideShow;
4824
4825                        if (SlideShow && SlideShow.isActive) {
4826                            SlideShow.set();
4827                        }
4828                    },
4829
4830                    "afterKeydown.fb": function (e, instance, current, keypress, keycode) {
4831                        var SlideShow = instance && instance.SlideShow;
4832
4833                        // "P" or Spacebar
4834                        if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) {
4835                            keypress.preventDefault();
4836
4837                            SlideShow.toggle();
4838                        }
4839                    },
4840
4841                    "beforeClose.fb onDeactivate.fb": function (e, instance) {
4842                        var SlideShow = instance && instance.SlideShow;
4843
4844                        if (SlideShow) {
4845                            SlideShow.stop();
4846                        }
4847                    }
4848                });
4849
4850                // Page Visibility API to pause slideshow when window is not active
4851                $(document).on("visibilitychange", function () {
4852                    var instance = $.fancybox.getInstance(),
4853                        SlideShow = instance && instance.SlideShow;
4854
4855                    if (SlideShow && SlideShow.isActive) {
4856                        if (document.hidden) {
4857                            SlideShow.clear();
4858                        } else {
4859                            SlideShow.set();
4860                        }
4861                    }
4862                });
4863            })(document, jQuery);
4864// ==========================================================================
4865//
4866// FullScreen
4867// Adds fullscreen functionality
4868//
4869// ==========================================================================
4870            (function (document, $) {
4871                "use strict";
4872
4873                // Collection of methods supported by user browser
4874                var fn = (function () {
4875                    var fnMap = [
4876                        ["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"],
4877                        // new WebKit
4878                        [
4879                            "webkitRequestFullscreen",
4880                            "webkitExitFullscreen",
4881                            "webkitFullscreenElement",
4882                            "webkitFullscreenEnabled",
4883                            "webkitfullscreenchange",
4884                            "webkitfullscreenerror"
4885                        ],
4886                        // old WebKit (Safari 5.1)
4887                        [
4888                            "webkitRequestFullScreen",
4889                            "webkitCancelFullScreen",
4890                            "webkitCurrentFullScreenElement",
4891                            "webkitCancelFullScreen",
4892                            "webkitfullscreenchange",
4893                            "webkitfullscreenerror"
4894                        ],
4895                        [
4896                            "mozRequestFullScreen",
4897                            "mozCancelFullScreen",
4898                            "mozFullScreenElement",
4899                            "mozFullScreenEnabled",
4900                            "mozfullscreenchange",
4901                            "mozfullscreenerror"
4902                        ],
4903                        ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"]
4904                    ];
4905
4906                    var ret = {};
4907
4908                    for (var i = 0; i < fnMap.length; i++) {
4909                        var val = fnMap[i];
4910
4911                        if (val && val[1] in document) {
4912                            for (var j = 0; j < val.length; j++) {
4913                                ret[fnMap[0][j]] = val[j];
4914                            }
4915
4916                            return ret;
4917                        }
4918                    }
4919
4920                    return false;
4921                })();
4922
4923                if (fn) {
4924                    var FullScreen = {
4925                        request: function (elem) {
4926                            elem = elem || document.documentElement;
4927
4928                            elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT);
4929                        },
4930                        exit: function () {
4931                            document[fn.exitFullscreen]();
4932                        },
4933                        toggle: function (elem) {
4934                            elem = elem || document.documentElement;
4935
4936                            if (this.isFullscreen()) {
4937                                this.exit();
4938                            } else {
4939                                this.request(elem);
4940                            }
4941                        },
4942                        isFullscreen: function () {
4943                            return Boolean(document[fn.fullscreenElement]);
4944                        },
4945                        enabled: function () {
4946                            return Boolean(document[fn.fullscreenEnabled]);
4947                        }
4948                    };
4949
4950                    $.extend(true, $.fancybox.defaults, {
4951                        btnTpl: {
4952                            fullScreen: '<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fsenter" title="{{FULL_SCREEN}}">' +
4953                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>' +
4954                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 16h3v3h2v-5H5zm3-8H5v2h5V5H8zm6 11h2v-3h3v-2h-5zm2-11V5h-2v5h5V8z"/></svg>' +
4955                                "</button>"
4956                        },
4957                        fullScreen: {
4958                            autoStart: false
4959                        }
4960                    });
4961
4962                    $(document).on(fn.fullscreenchange, function () {
4963                        var isFullscreen = FullScreen.isFullscreen(),
4964                            instance = $.fancybox.getInstance();
4965
4966                        if (instance) {
4967                            // If image is zooming, then force to stop and reposition properly
4968                            if (instance.current && instance.current.type === "image" && instance.isAnimating) {
4969                                instance.isAnimating = false;
4970
4971                                instance.update(true, true, 0);
4972
4973                                if (!instance.isComplete) {
4974                                    instance.complete();
4975                                }
4976                            }
4977
4978                            instance.trigger("onFullscreenChange", isFullscreen);
4979
4980                            instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen);
4981
4982                            instance.$refs.toolbar
4983                                .find("[data-fancybox-fullscreen]")
4984                                .toggleClass("fancybox-button--fsenter", !isFullscreen)
4985                                .toggleClass("fancybox-button--fsexit", isFullscreen);
4986                        }
4987                    });
4988                }
4989
4990                $(document).on({
4991                    "onInit.fb": function (e, instance) {
4992                        var $container;
4993
4994                        if (!fn) {
4995                            instance.$refs.toolbar.find("[data-fancybox-fullscreen]").remove();
4996
4997                            return;
4998                        }
4999
5000                        if (instance && instance.group[instance.currIndex].opts.fullScreen) {
5001                            $container = instance.$refs.container;
5002
5003                            $container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (e) {
5004                                e.stopPropagation();
5005                                e.preventDefault();
5006
5007                                FullScreen.toggle();
5008                            });
5009
5010                            if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) {
5011                                FullScreen.request();
5012                            }
5013
5014                            // Expose API
5015                            instance.FullScreen = FullScreen;
5016                        } else if (instance) {
5017                            instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide();
5018                        }
5019                    },
5020
5021                    "afterKeydown.fb": function (e, instance, current, keypress, keycode) {
5022                        // "F"
5023                        if (instance && instance.FullScreen && keycode === 70) {
5024                            keypress.preventDefault();
5025
5026                            instance.FullScreen.toggle();
5027                        }
5028                    },
5029
5030                    "beforeClose.fb": function (e, instance) {
5031                        if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) {
5032                            FullScreen.exit();
5033                        }
5034                    }
5035                });
5036            })(document, jQuery);
5037// ==========================================================================
5038//
5039// Thumbs
5040// Displays thumbnails in a grid
5041//
5042// ==========================================================================
5043            (function (document, $) {
5044                "use strict";
5045
5046                var CLASS = "fancybox-thumbs",
5047                    CLASS_ACTIVE = CLASS + "-active";
5048
5049                // Make sure there are default values
5050                $.fancybox.defaults = $.extend(
5051                    true, {
5052                        btnTpl: {
5053                            thumbs: '<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="{{THUMBS}}">' +
5054                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.59 14.59h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76H5.65V5.65z"/></svg>' +
5055                                "</button>"
5056                        },
5057                        thumbs: {
5058                            autoStart: false, // Display thumbnails on opening
5059                            hideOnClose: true, // Hide thumbnail grid when closing animation starts
5060                            parentEl: ".fancybox-container", // Container is injected into this element
5061                            axis: "y" // Vertical (y) or horizontal (x) scrolling
5062                        }
5063                    },
5064                    $.fancybox.defaults
5065                );
5066
5067                var FancyThumbs = function (instance) {
5068                    this.init(instance);
5069                };
5070
5071                $.extend(FancyThumbs.prototype, {
5072                    $button: null,
5073                    $grid: null,
5074                    $list: null,
5075                    isVisible: false,
5076                    isActive: false,
5077
5078                    init: function (instance) {
5079                        var self = this,
5080                            group = instance.group,
5081                            enabled = 0;
5082
5083                        self.instance = instance;
5084                        self.opts = group[instance.currIndex].opts.thumbs;
5085
5086                        instance.Thumbs = self;
5087
5088                        self.$button = instance.$refs.toolbar.find("[data-fancybox-thumbs]");
5089
5090                        // Enable thumbs if at least two group items have thumbnails
5091                        for (var i = 0, len = group.length; i < len; i++) {
5092                            if (group[i].thumb) {
5093                                enabled++;
5094                            }
5095
5096                            if (enabled > 1) {
5097                                break;
5098                            }
5099                        }
5100
5101                        if (enabled > 1 && !!self.opts) {
5102                            self.$button.removeAttr("style").on("click", function () {
5103                                self.toggle();
5104                            });
5105
5106                            self.isActive = true;
5107                        } else {
5108                            self.$button.hide();
5109                        }
5110                    },
5111
5112                    create: function () {
5113                        var self = this,
5114                            instance = self.instance,
5115                            parentEl = self.opts.parentEl,
5116                            list = [],
5117                            src;
5118
5119                        if (!self.$grid) {
5120                            // Create main element
5121                            self.$grid = $('<div class="' + CLASS + " " + CLASS + "-" + self.opts.axis + '"></div>').appendTo(
5122                                instance.$refs.container
5123                                    .find(parentEl)
5124                                    .addBack()
5125                                    .filter(parentEl)
5126                            );
5127
5128                            // Add "click" event that performs gallery navigation
5129                            self.$grid.on("click", "a", function () {
5130                                instance.jumpTo($(this).attr("data-index"));
5131                            });
5132                        }
5133
5134                        // Build the list
5135                        if (!self.$list) {
5136                            self.$list = $('<div class="' + CLASS + '__list">').appendTo(self.$grid);
5137                        }
5138
5139                        $.each(instance.group, function (i, item) {
5140                            src = item.thumb;
5141
5142                            if (!src && item.type === "image") {
5143                                src = item.src;
5144                            }
5145
5146                            list.push(
5147                                '<a href="javascript:;" tabindex="0" data-index="' +
5148                                i +
5149                                '"' +
5150                                (src && src.length ? ' style="background-image:url(' + src + ')"' : 'class="fancybox-thumbs-missing"') +
5151                                "></a>"
5152                            );
5153                        });
5154
5155                        self.$list[0].innerHTML = list.join("");
5156
5157                        if (self.opts.axis === "x") {
5158                            // Set fixed width for list element to enable horizontal scrolling
5159                            self.$list.width(
5160                                parseInt(self.$grid.css("padding-right"), 10) +
5161                                instance.group.length *
5162                                self.$list
5163                                    .children()
5164                                    .eq(0)
5165                                    .outerWidth(true)
5166                            );
5167                        }
5168                    },
5169
5170                    focus: function (duration) {
5171                        var self = this,
5172                            $list = self.$list,
5173                            $grid = self.$grid,
5174                            thumb,
5175                            thumbPos;
5176
5177                        if (!self.instance.current) {
5178                            return;
5179                        }
5180
5181                        thumb = $list
5182                            .children()
5183                            .removeClass(CLASS_ACTIVE)
5184                            .filter('[data-index="' + self.instance.current.index + '"]')
5185                            .addClass(CLASS_ACTIVE);
5186
5187                        thumbPos = thumb.position();
5188
5189                        // Check if need to scroll to make current thumb visible
5190                        if (self.opts.axis === "y" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) {
5191                            $list.stop().animate({
5192                                    scrollTop: $list.scrollTop() + thumbPos.top
5193                                },
5194                                duration
5195                            );
5196                        } else if (
5197                            self.opts.axis === "x" &&
5198                            (thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth()))
5199                        ) {
5200                            $list
5201                                .parent()
5202                                .stop()
5203                                .animate({
5204                                        scrollLeft: thumbPos.left
5205                                    },
5206                                    duration
5207                                );
5208                        }
5209                    },
5210
5211                    update: function () {
5212                        var that = this;
5213                        that.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible);
5214
5215                        if (that.isVisible) {
5216                            if (!that.$grid) {
5217                                that.create();
5218                            }
5219
5220                            that.instance.trigger("onThumbsShow");
5221
5222                            that.focus(0);
5223                        } else if (that.$grid) {
5224                            that.instance.trigger("onThumbsHide");
5225                        }
5226
5227                        // Update content position
5228                        that.instance.update();
5229                    },
5230
5231                    hide: function () {
5232                        this.isVisible = false;
5233                        this.update();
5234                    },
5235
5236                    show: function () {
5237                        this.isVisible = true;
5238                        this.update();
5239                    },
5240
5241                    toggle: function () {
5242                        this.isVisible = !this.isVisible;
5243                        this.update();
5244                    }
5245                });
5246
5247                $(document).on({
5248                    "onInit.fb": function (e, instance) {
5249                        var Thumbs;
5250
5251                        if (instance && !instance.Thumbs) {
5252                            Thumbs = new FancyThumbs(instance);
5253
5254                            if (Thumbs.isActive && Thumbs.opts.autoStart === true) {
5255                                Thumbs.show();
5256                            }
5257                        }
5258                    },
5259
5260                    "beforeShow.fb": function (e, instance, item, firstRun) {
5261                        var Thumbs = instance && instance.Thumbs;
5262
5263                        if (Thumbs && Thumbs.isVisible) {
5264                            Thumbs.focus(firstRun ? 0 : 250);
5265                        }
5266                    },
5267
5268                    "afterKeydown.fb": function (e, instance, current, keypress, keycode) {
5269                        var Thumbs = instance && instance.Thumbs;
5270
5271                        // "G"
5272                        if (Thumbs && Thumbs.isActive && keycode === 71) {
5273                            keypress.preventDefault();
5274
5275                            Thumbs.toggle();
5276                        }
5277                    },
5278
5279                    "beforeClose.fb": function (e, instance) {
5280                        var Thumbs = instance && instance.Thumbs;
5281
5282                        if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) {
5283                            Thumbs.$grid.hide();
5284                        }
5285                    }
5286                });
5287            })(document, jQuery);
5288//// ==========================================================================
5289//
5290// Share
5291// Displays simple form for sharing current url
5292//
5293// ==========================================================================
5294            (function (document, $) {
5295                "use strict";
5296
5297                $.extend(true, $.fancybox.defaults, {
5298                    btnTpl: {
5299                        share: '<button data-fancybox-share class="fancybox-button fancybox-button--share" title="{{SHARE}}">' +
5300                            '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2.55 19c1.4-8.4 9.1-9.8 11.9-9.8V5l7 7-7 6.3v-3.5c-2.8 0-10.5 2.1-11.9 4.2z"/></svg>' +
5301                            "</button>"
5302                    },
5303                    share: {
5304                        url: function (instance, item) {
5305                            return (
5306                                (!instance.currentHash && !(item.type === "inline" || item.type === "html") ? item.origSrc || item.src : false) || window.location
5307                            );
5308                        },
5309                        tpl: '<div class="fancybox-share">' +
5310                            "<h1>{{SHARE}}</h1>" +
5311                            "<p>" +
5312                            '<a class="fancybox-share__button fancybox-share__button--fb" href="https://www.facebook.com/sharer/sharer.php?u={{url}}">' +
5313                            '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m287 456v-299c0-21 6-35 35-35h38v-63c-7-1-29-3-55-3-54 0-91 33-91 94v306m143-254h-205v72h196" /></svg>' +
5314                            "<span>Facebook</span>" +
5315                            "</a>" +
5316                            '<a class="fancybox-share__button fancybox-share__button--tw" href="https://twitter.com/intent/tweet?url={{url}}&text={{descr}}">' +
5317                            '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z" /></svg>' +
5318                            "<span>Twitter</span>" +
5319                            "</a>" +
5320                            '<a class="fancybox-share__button fancybox-share__button--pt" href="https://www.pinterest.com/pin/create/button/?url={{url}}&description={{descr}}&media={{media}}">' +
5321                            '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m265 56c-109 0-164 78-164 144 0 39 15 74 47 87 5 2 10 0 12-5l4-19c2-6 1-8-3-13-9-11-15-25-15-45 0-58 43-110 113-110 62 0 96 38 96 88 0 67-30 122-73 122-24 0-42-19-36-44 6-29 20-60 20-81 0-19-10-35-31-35-25 0-44 26-44 60 0 21 7 36 7 36l-30 125c-8 37-1 83 0 87 0 3 4 4 5 2 2-3 32-39 42-75l16-64c8 16 31 29 56 29 74 0 124-67 124-157 0-69-58-132-146-132z" fill="#fff"/></svg>' +
5322                            "<span>Pinterest</span>" +
5323                            "</a>" +
5324                            "</p>" +
5325                            '<p><input class="fancybox-share__input" type="text" value="{{url_raw}}" onclick="select()" /></p>' +
5326                            "</div>"
5327                    }
5328                });
5329
5330                function escapeHtml(string) {
5331                    var entityMap = {
5332                        "&": "&amp;",
5333                        "<": "&lt;",
5334                        ">": "&gt;",
5335                        '"': "&quot;",
5336                        "'": "&#39;",
5337                        "/": "&#x2F;",
5338                        "`": "&#x60;",
5339                        "=": "&#x3D;"
5340                    };
5341
5342                    return String(string).replace(/[&<>"'`=\/]/g, function (s) {
5343                        return entityMap[s];
5344                    });
5345                }
5346
5347                $(document).on("click", "[data-fancybox-share]", function () {
5348                    var instance = $.fancybox.getInstance(),
5349                        current = instance.current || null,
5350                        url,
5351                        tpl;
5352
5353                    if (!current) {
5354                        return;
5355                    }
5356
5357                    if ($.type(current.opts.share.url) === "function") {
5358                        url = current.opts.share.url.apply(current, [instance, current]);
5359                    }
5360
5361                    tpl = current.opts.share.tpl
5362                        .replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "")
5363                        .replace(/\{\{url\}\}/g, encodeURIComponent(url))
5364                        .replace(/\{\{url_raw\}\}/g, escapeHtml(url))
5365                        .replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : "");
5366
5367                    $.fancybox.open({
5368                        src: instance.translate(instance, tpl),
5369                        type: "html",
5370                        opts: {
5371                            touch: false,
5372                            animationEffect: false,
5373                            afterLoad: function (shareInstance, shareCurrent) {
5374                                // Close self if parent instance is closing
5375                                instance.$refs.container.one("beforeClose.fb", function () {
5376                                    shareInstance.close(null, 0);
5377                                });
5378
5379                                // Opening links in a popup window
5380                                shareCurrent.$content.find(".fancybox-share__button").click(function () {
5381                                    window.open(this.href, "Share", "width=550, height=450");
5382                                    return false;
5383                                });
5384                            },
5385                            mobile: {
5386                                autoFocus: false
5387                            }
5388                        }
5389                    });
5390                });
5391            })(document, jQuery);
5392// ==========================================================================
5393//
5394// Hash
5395// Enables linking to each modal
5396//
5397// ==========================================================================
5398            (function (window, document, $) {
5399                "use strict";
5400
5401                // Simple $.escapeSelector polyfill (for jQuery prior v3)
5402                if (!$.escapeSelector) {
5403                    $.escapeSelector = function (sel) {
5404                        var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
5405                        var fcssescape = function (ch, asCodePoint) {
5406                            if (asCodePoint) {
5407                                // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
5408                                if (ch === "\0") {
5409                                    return "\uFFFD";
5410                                }
5411
5412                                // Control characters and (dependent upon position) numbers get escaped as code points
5413                                return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
5414                            }
5415
5416                            // Other potentially-special ASCII characters get backslash-escaped
5417                            return "\\" + ch;
5418                        };
5419
5420                        return (sel + "").replace(rcssescape, fcssescape);
5421                    };
5422                }
5423
5424                // Get info about gallery name and current index from url
5425                function parseUrl() {
5426                    var hash = window.location.hash.substr(1),
5427                        rez = hash.split("-"),
5428                        index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1,
5429                        gallery = rez.join("-");
5430
5431                    return {
5432                        hash: hash,
5433                        /* Index is starting from 1 */
5434                        index: index < 1 ? 1 : index,
5435                        gallery: gallery
5436                    };
5437                }
5438
5439                // Trigger click evnt on links to open new fancyBox instance
5440                function triggerFromUrl(url) {
5441                    if (url.gallery !== "") {
5442                        // If we can find element matching 'data-fancybox' atribute,
5443                        // then triggering click event should start fancyBox
5444                        $("[data-fancybox='" + $.escapeSelector(url.gallery) + "']")
5445                            .eq(url.index - 1)
5446                            .focus()
5447                            .trigger("click.fb-start");
5448                    }
5449                }
5450
5451                // Get gallery name from current instance
5452                function getGalleryID(instance) {
5453                    var opts, ret;
5454
5455                    if (!instance) {
5456                        return false;
5457                    }
5458
5459                    opts = instance.current ? instance.current.opts : instance.opts;
5460                    ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : "");
5461
5462                    return ret === "" ? false : ret;
5463                }
5464
5465                // Start when DOM becomes ready
5466                $(function () {
5467                    // Check if user has disabled this module
5468                    if ($.fancybox.defaults.hash === false) {
5469                        return;
5470                    }
5471
5472                    // Update hash when opening/closing fancyBox
5473                    $(document).on({
5474                        "onInit.fb": function (e, instance) {
5475                            var url, gallery;
5476
5477                            if (instance.group[instance.currIndex].opts.hash === false) {
5478                                return;
5479                            }
5480
5481                            url = parseUrl();
5482                            gallery = getGalleryID(instance);
5483
5484                            // Make sure gallery start index matches index from hash
5485                            if (gallery && url.gallery && gallery == url.gallery) {
5486                                instance.currIndex = url.index - 1;
5487                            }
5488                        },
5489
5490                        "beforeShow.fb": function (e, instance, current, firstRun) {
5491                            var gallery;
5492
5493                            if (!current || current.opts.hash === false) {
5494                                return;
5495                            }
5496
5497                            // Check if need to update window hash
5498                            gallery = getGalleryID(instance);
5499
5500                            if (!gallery) {
5501                                return;
5502                            }
5503
5504                            // Variable containing last hash value set by fancyBox
5505                            // It will be used to determine if fancyBox needs to close after hash change is detected
5506                            instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : "");
5507
5508                            // If current hash is the same (this instance most likely is opened by hashchange), then do nothing
5509                            if (window.location.hash === "#" + instance.currentHash) {
5510                                return;
5511                            }
5512
5513                            if (firstRun && !instance.origHash) {
5514                                instance.origHash = window.location.hash;
5515                            }
5516
5517                            if (instance.hashTimer) {
5518                                clearTimeout(instance.hashTimer);
5519                            }
5520
5521                            // Update hash
5522                            instance.hashTimer = setTimeout(function () {
5523                                if ("replaceState" in window.history) {
5524                                    window.history[firstRun ? "pushState" : "replaceState"]({},
5525                                        document.title,
5526                                        window.location.pathname + window.location.search + "#" + instance.currentHash
5527                                    );
5528
5529                                    if (firstRun) {
5530                                        instance.hasCreatedHistory = true;
5531                                    }
5532                                } else {
5533                                    window.location.hash = instance.currentHash;
5534                                }
5535
5536                                instance.hashTimer = null;
5537                            }, 300);
5538                        },
5539
5540                        "beforeClose.fb": function (e, instance, current) {
5541                            if (!current || current.opts.hash === false) {
5542                                return;
5543                            }
5544
5545                            clearTimeout(instance.hashTimer);
5546
5547                            // Goto previous history entry
5548                            if (instance.currentHash && instance.hasCreatedHistory) {
5549                                window.history.back();
5550                            } else if (instance.currentHash) {
5551                                if ("replaceState" in window.history) {
5552                                    window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || ""));
5553                                } else {
5554                                    window.location.hash = instance.origHash;
5555                                }
5556                            }
5557
5558                            instance.currentHash = null;
5559                        }
5560                    });
5561
5562                    // Check if need to start/close after url has changed
5563                    $(window).on("hashchange.fb", function () {
5564                        var url = parseUrl(),
5565                            fb = null;
5566
5567                        // Find last fancyBox instance that has "hash"
5568                        $.each(
5569                            $(".fancybox-container")
5570                                .get()
5571                                .reverse(),
5572                            function (index, value) {
5573                                var tmp = $(value).data("FancyBox");
5574
5575                                if (tmp && tmp.currentHash) {
5576                                    fb = tmp;
5577                                    return false;
5578                                }
5579                            }
5580                        );
5581
5582                        if (fb) {
5583                            // Now, compare hash values
5584                            if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) {
5585                                fb.currentHash = null;
5586
5587                                fb.close();
5588                            }
5589                        } else if (url.gallery !== "") {
5590                            triggerFromUrl(url);
5591                        }
5592                    });
5593
5594                    // Check current hash and trigger click event on matching element to start fancyBox, if needed
5595                    setTimeout(function () {
5596                        if (!$.fancybox.getInstance()) {
5597                            triggerFromUrl(parseUrl());
5598                        }
5599                    }, 50);
5600                });
5601            })(window, document, jQuery);
5602// ==========================================================================
5603//
5604// Wheel
5605// Basic mouse weheel support for gallery navigation
5606//
5607// ==========================================================================
5608            (function (document, $) {
5609                "use strict";
5610
5611                var prevTime = new Date().getTime();
5612
5613                $(document).on({
5614                    "onInit.fb": function (e, instance, current) {
5615                        instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) {
5616                            var current = instance.current,
5617                                currTime = new Date().getTime();
5618
5619                            if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) {
5620                                return;
5621                            }
5622
5623                            e.preventDefault();
5624                            e.stopPropagation();
5625
5626                            if (current.$slide.hasClass("fancybox-animated")) {
5627                                return;
5628                            }
5629
5630                            e = e.originalEvent || e;
5631
5632                            if (currTime - prevTime < 250) {
5633                                return;
5634                            }
5635
5636                            prevTime = currTime;
5637
5638                            instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"]();
5639                        });
5640                    }
5641                });
5642            })(document, jQuery);
5643
5644            /***/ }),
5645
5646        
vendor: 13,320 bytes, lines 5646-5870
5646/***/ "./node_modules/@popperjs/core/lib/createPopper.js":
5647        /*!*********************************************************!*\
5648  !*** ./node_modules/@popperjs/core/lib/createPopper.js ***!
5649  \*********************************************************/
5650        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5651
5652            "use strict";
5653            __webpack_require__.r(__webpack_exports__);
5654            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5655                /* harmony export */   createPopper: function() { return /* binding */ createPopper; },
5656                /* harmony export */   detectOverflow: function() { return /* reexport safe */ _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_8__["default"]; },
5657                /* harmony export */   popperGenerator: function() { return /* binding */ popperGenerator; }
5658                /* harmony export */ });
5659            /* harmony import */ var _dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dom-utils/getCompositeRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js");
5660            /* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js");
5661            /* harmony import */ var _dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dom-utils/listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js");
5662            /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js");
5663            /* harmony import */ var _utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/orderModifiers.js */ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js");
5664            /* harmony import */ var _utils_debounce_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/debounce.js */ "./node_modules/@popperjs/core/lib/utils/debounce.js");
5665            /* harmony import */ var _utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/mergeByName.js */ "./node_modules/@popperjs/core/lib/utils/mergeByName.js");
5666            /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
5667            /* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677            var DEFAULT_OPTIONS = {
5678                placement: 'bottom',
5679                modifiers: [],
5680                strategy: 'absolute'
5681            };
5682
5683            function areValidElements() {
5684                for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
5685                    args[_key] = arguments[_key];
5686                }
5687
5688                return !args.some(function (element) {
5689                    return !(element && typeof element.getBoundingClientRect === 'function');
5690                });
5691            }
5692
5693            function popperGenerator(generatorOptions) {
5694                if (generatorOptions === void 0) {
5695                    generatorOptions = {};
5696                }
5697
5698                var _generatorOptions = generatorOptions,
5699                    _generatorOptions$def = _generatorOptions.defaultModifiers,
5700                    defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,
5701                    _generatorOptions$def2 = _generatorOptions.defaultOptions,
5702                    defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
5703                return function createPopper(reference, popper, options) {
5704                    if (options === void 0) {
5705                        options = defaultOptions;
5706                    }
5707
5708                    var state = {
5709                        placement: 'bottom',
5710                        orderedModifiers: [],
5711                        options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
5712                        modifiersData: {},
5713                        elements: {
5714                            reference: reference,
5715                            popper: popper
5716                        },
5717                        attributes: {},
5718                        styles: {}
5719                    };
5720                    var effectCleanupFns = [];
5721                    var isDestroyed = false;
5722                    var instance = {
5723                        state: state,
5724                        setOptions: function setOptions(setOptionsAction) {
5725                            var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
5726                            cleanupModifierEffects();
5727                            state.options = Object.assign({}, defaultOptions, state.options, options);
5728                            state.scrollParents = {
5729                                reference: (0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isElement)(reference) ? (0,_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__["default"])(reference) : reference.contextElement ? (0,_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__["default"])(reference.contextElement) : [],
5730                                popper: (0,_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_1__["default"])(popper)
5731                            }; // Orders the modifiers based on their dependencies and `phase`
5732                            // properties
5733
5734                            var orderedModifiers = (0,_utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_3__["default"])([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers
5735
5736                            state.orderedModifiers = orderedModifiers.filter(function (m) {
5737                                return m.enabled;
5738                            });
5739                            runModifierEffects();
5740                            return instance.update();
5741                        },
5742                        // Sync update – it will always be executed, even if not necessary. This
5743                        // is useful for low frequency updates where sync behavior simplifies the
5744                        // logic.
5745                        // For high frequency updates (e.g. `resize` and `scroll` events), always
5746                        // prefer the async Popper#update method
5747                        forceUpdate: function forceUpdate() {
5748                            if (isDestroyed) {
5749                                return;
5750                            }
5751
5752                            var _state$elements = state.elements,
5753                                reference = _state$elements.reference,
5754                                popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements
5755                            // anymore
5756
5757                            if (!areValidElements(reference, popper)) {
5758                                return;
5759                            } // Store the reference and popper rects to be read by modifiers
5760
5761
5762                            state.rects = {
5763                                reference: (0,_dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_4__["default"])(reference, (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(popper), state.options.strategy === 'fixed'),
5764                                popper: (0,_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__["default"])(popper)
5765                            }; // Modifiers have the ability to reset the current update cycle. The
5766                            // most common use case for this is the `flip` modifier changing the
5767                            // placement, which then needs to re-run all the modifiers, because the
5768                            // logic was previously ran for the previous placement and is therefore
5769                            // stale/incorrect
5770
5771                            state.reset = false;
5772                            state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier
5773                            // is filled with the initial data specified by the modifier. This means
5774                            // it doesn't persist and is fresh on each update.
5775                            // To ensure persistent data, use `${name}#persistent`
5776
5777                            state.orderedModifiers.forEach(function (modifier) {
5778                                return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
5779                            });
5780
5781                            for (var index = 0; index < state.orderedModifiers.length; index++) {
5782                                if (state.reset === true) {
5783                                    state.reset = false;
5784                                    index = -1;
5785                                    continue;
5786                                }
5787
5788                                var _state$orderedModifie = state.orderedModifiers[index],
5789                                    fn = _state$orderedModifie.fn,
5790                                    _state$orderedModifie2 = _state$orderedModifie.options,
5791                                    _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,
5792                                    name = _state$orderedModifie.name;
5793
5794                                if (typeof fn === 'function') {
5795                                    state = fn({
5796                                        state: state,
5797                                        options: _options,
5798                                        name: name,
5799                                        instance: instance
5800                                    }) || state;
5801                                }
5802                            }
5803                        },
5804                        // Async and optimistically optimized update – it will not be executed if
5805                        // not necessary (debounced to run at most once-per-tick)
5806                        update: (0,_utils_debounce_js__WEBPACK_IMPORTED_MODULE_7__["default"])(function () {
5807                            return new Promise(function (resolve) {
5808                                instance.forceUpdate();
5809                                resolve(state);
5810                            });
5811                        }),
5812                        destroy: function destroy() {
5813                            cleanupModifierEffects();
5814                            isDestroyed = true;
5815                        }
5816                    };
5817
5818                    if (!areValidElements(reference, popper)) {
5819                        return instance;
5820                    }
5821
5822                    instance.setOptions(options).then(function (state) {
5823                        if (!isDestroyed && options.onFirstUpdate) {
5824                            options.onFirstUpdate(state);
5825                        }
5826                    }); // Modifiers have the ability to execute arbitrary code before the first
5827                    // update cycle runs. They will be executed in the same order as the update
5828                    // cycle. This is useful when a modifier adds some persistent data that
5829                    // other modifiers need to use, but the modifier is run after the dependent
5830                    // one.
5831
5832                    function runModifierEffects() {
5833                        state.orderedModifiers.forEach(function (_ref) {
5834                            var name = _ref.name,
5835                                _ref$options = _ref.options,
5836                                options = _ref$options === void 0 ? {} : _ref$options,
5837                                effect = _ref.effect;
5838
5839                            if (typeof effect === 'function') {
5840                                var cleanupFn = effect({
5841                                    state: state,
5842                                    name: name,
5843                                    instance: instance,
5844                                    options: options
5845                                });
5846
5847                                var noopFn = function noopFn() {};
5848
5849                                effectCleanupFns.push(cleanupFn || noopFn);
5850                            }
5851                        });
5852                    }
5853
5854                    function cleanupModifierEffects() {
5855                        effectCleanupFns.forEach(function (fn) {
5856                            return fn();
5857                        });
5858                        effectCleanupFns = [];
5859                    }
5860
5861                    return instance;
5862                };
5863            }
5864            var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules
5865
5866
5867
5868            /***/ }),
5869
5870        
vendor: 1,784 bytes, lines 5870-5908
5870/***/ "./node_modules/@popperjs/core/lib/dom-utils/contains.js":
5871        /*!***************************************************************!*\
5872  !*** ./node_modules/@popperjs/core/lib/dom-utils/contains.js ***!
5873  \***************************************************************/
5874        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5875
5876            "use strict";
5877            __webpack_require__.r(__webpack_exports__);
5878            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5879                /* harmony export */   "default": function() { return /* binding */ contains; }
5880                /* harmony export */ });
5881            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
5882
5883            function contains(parent, child) {
5884                var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method
5885
5886                if (parent.contains(child)) {
5887                    return true;
5888                } // then fallback to custom implementation with Shadow DOM support
5889                else if (rootNode && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isShadowRoot)(rootNode)) {
5890                    var next = child;
5891
5892                    do {
5893                        if (next && parent.isSameNode(next)) {
5894                            return true;
5895                        } // $FlowFixMe[prop-missing]: need a better way to handle this...
5896
5897
5898                        next = next.parentNode || next.host;
5899                    } while (next);
5900                } // Give up, the result is false
5901
5902
5903                return false;
5904            }
5905
5906            /***/ }),
5907
5908        
vendor: 3,446 bytes, lines 5908-5967
5908/***/ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js":
5909        /*!****************************************************************************!*\
5910  !*** ./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js ***!
5911  \****************************************************************************/
5912        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5913
5914            "use strict";
5915            __webpack_require__.r(__webpack_exports__);
5916            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5917                /* harmony export */   "default": function() { return /* binding */ getBoundingClientRect; }
5918                /* harmony export */ });
5919            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
5920            /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js");
5921            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
5922            /* harmony import */ var _isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isLayoutViewport.js */ "./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js");
5923
5924
5925
5926
5927            function getBoundingClientRect(element, includeScale, isFixedStrategy) {
5928                if (includeScale === void 0) {
5929                    includeScale = false;
5930                }
5931
5932                if (isFixedStrategy === void 0) {
5933                    isFixedStrategy = false;
5934                }
5935
5936                var clientRect = element.getBoundingClientRect();
5937                var scaleX = 1;
5938                var scaleY = 1;
5939
5940                if (includeScale && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element)) {
5941                    scaleX = element.offsetWidth > 0 ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_1__.round)(clientRect.width) / element.offsetWidth || 1 : 1;
5942                    scaleY = element.offsetHeight > 0 ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_1__.round)(clientRect.height) / element.offsetHeight || 1 : 1;
5943                }
5944
5945                var _ref = (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isElement)(element) ? (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element) : window,
5946                    visualViewport = _ref.visualViewport;
5947
5948                var addVisualOffsets = !(0,_isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_3__["default"])() && isFixedStrategy;
5949                var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
5950                var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
5951                var width = clientRect.width / scaleX;
5952                var height = clientRect.height / scaleY;
5953                return {
5954                    width: width,
5955                    height: height,
5956                    top: y,
5957                    right: x + width,
5958                    bottom: y + height,
5959                    left: x,
5960                    x: x,
5961                    y: y
5962                };
5963            }
5964
5965            /***/ }),
5966
5967        
vendor: 7,824 bytes, lines 5967-6065
5967/***/ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js":
5968        /*!**********************************************************************!*\
5969  !*** ./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js ***!
5970  \**********************************************************************/
5971        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5972
5973            "use strict";
5974            __webpack_require__.r(__webpack_exports__);
5975            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5976                /* harmony export */   "default": function() { return /* binding */ getClippingRect; }
5977                /* harmony export */ });
5978            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
5979            /* harmony import */ var _getViewportRect_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getViewportRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js");
5980            /* harmony import */ var _getDocumentRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getDocumentRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js");
5981            /* harmony import */ var _listScrollParents_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js");
5982            /* harmony import */ var _getOffsetParent_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js");
5983            /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
5984            /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js");
5985            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
5986            /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js");
5987            /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js");
5988            /* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js");
5989            /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js");
5990            /* harmony import */ var _utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js");
5991            /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js");
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007            function getInnerBoundingClientRect(element, strategy) {
6008                var rect = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, false, strategy === 'fixed');
6009                rect.top = rect.top + element.clientTop;
6010                rect.left = rect.left + element.clientLeft;
6011                rect.bottom = rect.top + element.clientHeight;
6012                rect.right = rect.left + element.clientWidth;
6013                rect.width = element.clientWidth;
6014                rect.height = element.clientHeight;
6015                rect.x = rect.left;
6016                rect.y = rect.top;
6017                return rect;
6018            }
6019
6020            function getClientRectFromMixedType(element, clippingParent, strategy) {
6021                return clippingParent === _enums_js__WEBPACK_IMPORTED_MODULE_1__.viewport ? (0,_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_getViewportRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, strategy)) : (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : (0,_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_getDocumentRect_js__WEBPACK_IMPORTED_MODULE_5__["default"])((0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element)));
6022            } // A "clipping parent" is an overflowable container with the characteristic of
6023// clipping (or hiding) overflowing elements with a position different from
6024// `initial`
6025
6026
6027            function getClippingParents(element) {
6028                var clippingParents = (0,_listScrollParents_js__WEBPACK_IMPORTED_MODULE_7__["default"])((0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_8__["default"])(element));
6029                var canEscapeClipping = ['absolute', 'fixed'].indexOf((0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"])(element).position) >= 0;
6030                var clipperElement = canEscapeClipping && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isHTMLElement)(element) ? (0,_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element) : element;
6031
6032                if (!(0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(clipperElement)) {
6033                    return [];
6034                } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414
6035
6036
6037                return clippingParents.filter(function (clippingParent) {
6038                    return (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(clippingParent) && (0,_contains_js__WEBPACK_IMPORTED_MODULE_11__["default"])(clippingParent, clipperElement) && (0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_12__["default"])(clippingParent) !== 'body';
6039                });
6040            } // Gets the maximum area that the element is visible in due to any number of
6041// clipping parents
6042
6043
6044            function getClippingRect(element, boundary, rootBoundary, strategy) {
6045                var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);
6046                var clippingParents = [].concat(mainClippingParents, [rootBoundary]);
6047                var firstClippingParent = clippingParents[0];
6048                var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {
6049                    var rect = getClientRectFromMixedType(element, clippingParent, strategy);
6050                    accRect.top = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.max)(rect.top, accRect.top);
6051                    accRect.right = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.min)(rect.right, accRect.right);
6052                    accRect.bottom = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.min)(rect.bottom, accRect.bottom);
6053                    accRect.left = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_13__.max)(rect.left, accRect.left);
6054                    return accRect;
6055                }, getClientRectFromMixedType(element, firstClippingParent, strategy));
6056                clippingRect.width = clippingRect.right - clippingRect.left;
6057                clippingRect.height = clippingRect.bottom - clippingRect.top;
6058                clippingRect.x = clippingRect.left;
6059                clippingRect.y = clippingRect.top;
6060                return clippingRect;
6061            }
6062
6063            /***/ }),
6064
6065        
vendor: 5,206 bytes, lines 6065-6145
6065/***/ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js":
6066        /*!***********************************************************************!*\
6067  !*** ./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js ***!
6068  \***********************************************************************/
6069        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6070
6071            "use strict";
6072            __webpack_require__.r(__webpack_exports__);
6073            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6074                /* harmony export */   "default": function() { return /* binding */ getCompositeRect; }
6075                /* harmony export */ });
6076            /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js");
6077            /* harmony import */ var _getNodeScroll_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getNodeScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js");
6078            /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js");
6079            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
6080            /* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js");
6081            /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
6082            /* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js");
6083            /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js");
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093            function isElementScaled(element) {
6094                var rect = element.getBoundingClientRect();
6095                var scaleX = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(rect.width) / element.offsetWidth || 1;
6096                var scaleY = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(rect.height) / element.offsetHeight || 1;
6097                return scaleX !== 1 || scaleY !== 1;
6098            } // Returns the composite rect of an element relative to its offsetParent.
6099// Composite means it takes into account transforms as well as layout.
6100
6101
6102            function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
6103                if (isFixed === void 0) {
6104                    isFixed = false;
6105                }
6106
6107                var isOffsetParentAnElement = (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(offsetParent);
6108                var offsetParentIsScaled = (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(offsetParent) && isElementScaled(offsetParent);
6109                var documentElement = (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(offsetParent);
6110                var rect = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])(elementOrVirtualElement, offsetParentIsScaled, isFixed);
6111                var scroll = {
6112                    scrollLeft: 0,
6113                    scrollTop: 0
6114                };
6115                var offsets = {
6116                    x: 0,
6117                    y: 0
6118                };
6119
6120                if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
6121                    if ((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078
6122                        (0,_isScrollParent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(documentElement)) {
6123                        scroll = (0,_getNodeScroll_js__WEBPACK_IMPORTED_MODULE_6__["default"])(offsetParent);
6124                    }
6125
6126                    if ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(offsetParent)) {
6127                        offsets = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])(offsetParent, true);
6128                        offsets.x += offsetParent.clientLeft;
6129                        offsets.y += offsetParent.clientTop;
6130                    } else if (documentElement) {
6131                        offsets.x = (0,_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_7__["default"])(documentElement);
6132                    }
6133                }
6134
6135                return {
6136                    x: rect.left + scroll.scrollLeft - offsets.x,
6137                    y: rect.top + scroll.scrollTop - offsets.y,
6138                    width: rect.width,
6139                    height: rect.height
6140                };
6141            }
6142
6143            /***/ }),
6144
6145        
vendor: 1,108 bytes, lines 6145-6164
6145/***/ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js":
6146        /*!***********************************************************************!*\
6147  !*** ./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js ***!
6148  \***********************************************************************/
6149        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6150
6151            "use strict";
6152            __webpack_require__.r(__webpack_exports__);
6153            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6154                /* harmony export */   "default": function() { return /* binding */ getComputedStyle; }
6155                /* harmony export */ });
6156            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
6157
6158            function getComputedStyle(element) {
6159                return (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element).getComputedStyle(element);
6160            }
6161
6162            /***/ }),
6163
6164        
vendor: 1,311 bytes, lines 6164-6185
6164/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js":
6165        /*!*************************************************************************!*\
6166  !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js ***!
6167  \*************************************************************************/
6168        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6169
6170            "use strict";
6171            __webpack_require__.r(__webpack_exports__);
6172            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6173                /* harmony export */   "default": function() { return /* binding */ getDocumentElement; }
6174                /* harmony export */ });
6175            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
6176
6177            function getDocumentElement(element) {
6178                // $FlowFixMe[incompatible-return]: assume body is always available
6179                return (((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isElement)(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]
6180                    element.document) || window.document).documentElement;
6181            }
6182
6183            /***/ }),
6184
6185        
vendor: 3,325 bytes, lines 6185-6233
6185/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js":
6186        /*!**********************************************************************!*\
6187  !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js ***!
6188  \**********************************************************************/
6189        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6190
6191            "use strict";
6192            __webpack_require__.r(__webpack_exports__);
6193            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6194                /* harmony export */   "default": function() { return /* binding */ getDocumentRect; }
6195                /* harmony export */ });
6196            /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
6197            /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js");
6198            /* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js");
6199            /* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js");
6200            /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js");
6201
6202
6203
6204
6205            // Gets the entire size of the scrollable document area, even extending outside
6206// of the `<html>` and `<body>` rect bounds if horizontally scrollable
6207
6208            function getDocumentRect(element) {
6209                var _element$ownerDocumen;
6210
6211                var html = (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
6212                var winScroll = (0,_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
6213                var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
6214                var width = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_2__.max)(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
6215                var height = (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_2__.max)(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
6216                var x = -winScroll.scrollLeft + (0,_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element);
6217                var y = -winScroll.scrollTop;
6218
6219                if ((0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"])(body || html).direction === 'rtl') {
6220                    x += (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_2__.max)(html.clientWidth, body ? body.clientWidth : 0) - width;
6221                }
6222
6223                return {
6224                    width: width,
6225                    height: height,
6226                    x: x,
6227                    y: y
6228                };
6229            }
6230
6231            /***/ }),
6232
6233        
vendor: 974 bytes, lines 6233-6253
6233/***/ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js":
6234        /*!***************************************************************************!*\
6235  !*** ./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js ***!
6236  \***************************************************************************/
6237        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6238
6239            "use strict";
6240            __webpack_require__.r(__webpack_exports__);
6241            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6242                /* harmony export */   "default": function() { return /* binding */ getHTMLElementScroll; }
6243                /* harmony export */ });
6244            function getHTMLElementScroll(element) {
6245                return {
6246                    scrollLeft: element.scrollLeft,
6247                    scrollTop: element.scrollTop
6248                };
6249            }
6250
6251            /***/ }),
6252
6253        
vendor: 1,957 bytes, lines 6253-6293
6253/***/ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js":
6254        /*!********************************************************************!*\
6255  !*** ./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js ***!
6256  \********************************************************************/
6257        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6258
6259            "use strict";
6260            __webpack_require__.r(__webpack_exports__);
6261            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6262                /* harmony export */   "default": function() { return /* binding */ getLayoutRect; }
6263                /* harmony export */ });
6264            /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js");
6265            // Returns the layout rect of an element relative to its offsetParent. Layout
6266// means it doesn't take into account transforms.
6267
6268            function getLayoutRect(element) {
6269                var clientRect = (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); // Use the clientRect sizes if it's not been transformed.
6270                // Fixes https://github.com/popperjs/popper-core/issues/1223
6271
6272                var width = element.offsetWidth;
6273                var height = element.offsetHeight;
6274
6275                if (Math.abs(clientRect.width - width) <= 1) {
6276                    width = clientRect.width;
6277                }
6278
6279                if (Math.abs(clientRect.height - height) <= 1) {
6280                    height = clientRect.height;
6281                }
6282
6283                return {
6284                    x: element.offsetLeft,
6285                    y: element.offsetTop,
6286                    width: width,
6287                    height: height
6288                };
6289            }
6290
6291            /***/ }),
6292
6293        
vendor: 855 bytes, lines 6293-6310
6293/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js":
6294        /*!******************************************************************!*\
6295  !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js ***!
6296  \******************************************************************/
6297        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6298
6299            "use strict";
6300            __webpack_require__.r(__webpack_exports__);
6301            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6302                /* harmony export */   "default": function() { return /* binding */ getNodeName; }
6303                /* harmony export */ });
6304            function getNodeName(element) {
6305                return element ? (element.nodeName || '').toLowerCase() : null;
6306            }
6307
6308            /***/ }),
6309
6310        
vendor: 1,994 bytes, lines 6310-6339
6310/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js":
6311        /*!********************************************************************!*\
6312  !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js ***!
6313  \********************************************************************/
6314        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6315
6316            "use strict";
6317            __webpack_require__.r(__webpack_exports__);
6318            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6319                /* harmony export */   "default": function() { return /* binding */ getNodeScroll; }
6320                /* harmony export */ });
6321            /* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js");
6322            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
6323            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
6324            /* harmony import */ var _getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getHTMLElementScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js");
6325
6326
6327
6328
6329            function getNodeScroll(node) {
6330                if (node === (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node) || !(0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(node)) {
6331                    return (0,_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__["default"])(node);
6332                } else {
6333                    return (0,_getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__["default"])(node);
6334                }
6335            }
6336
6337            /***/ }),
6338
6339        
vendor: 5,828 bytes, lines 6339-6429
6339/***/ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js":
6340        /*!**********************************************************************!*\
6341  !*** ./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js ***!
6342  \**********************************************************************/
6343        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6344
6345            "use strict";
6346            __webpack_require__.r(__webpack_exports__);
6347            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6348                /* harmony export */   "default": function() { return /* binding */ getOffsetParent; }
6349                /* harmony export */ });
6350            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
6351            /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js");
6352            /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js");
6353            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
6354            /* harmony import */ var _isTableElement_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isTableElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js");
6355            /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js");
6356            /* harmony import */ var _utils_userAgent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/userAgent.js */ "./node_modules/@popperjs/core/lib/utils/userAgent.js");
6357
6358
6359
6360
6361
6362
6363
6364
6365            function getTrueOffsetParent(element) {
6366                if (!(0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element) || // https://github.com/popperjs/popper-core/issues/837
6367                    (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element).position === 'fixed') {
6368                    return null;
6369                }
6370
6371                return element.offsetParent;
6372            } // `.offsetParent` reports `null` for fixed elements, while absolute elements
6373// return the containing block
6374
6375
6376            function getContainingBlock(element) {
6377                var isFirefox = /firefox/i.test((0,_utils_userAgent_js__WEBPACK_IMPORTED_MODULE_2__["default"])());
6378                var isIE = /Trident/i.test((0,_utils_userAgent_js__WEBPACK_IMPORTED_MODULE_2__["default"])());
6379
6380                if (isIE && (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element)) {
6381                    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport
6382                    var elementCss = (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
6383
6384                    if (elementCss.position === 'fixed') {
6385                        return null;
6386                    }
6387                }
6388
6389                var currentNode = (0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element);
6390
6391                if ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isShadowRoot)(currentNode)) {
6392                    currentNode = currentNode.host;
6393                }
6394
6395                while ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(currentNode) && ['html', 'body'].indexOf((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(currentNode)) < 0) {
6396                    var css = (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(currentNode); // This is non-exhaustive but covers the most common CSS properties that
6397                    // create a containing block.
6398                    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
6399
6400                    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {
6401                        return currentNode;
6402                    } else {
6403                        currentNode = currentNode.parentNode;
6404                    }
6405                }
6406
6407                return null;
6408            } // Gets the closest ancestor positioned element. Handles some edge cases,
6409// such as table ancestors and cross browser bugs.
6410
6411
6412            function getOffsetParent(element) {
6413                var window = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element);
6414                var offsetParent = getTrueOffsetParent(element);
6415
6416                while (offsetParent && (0,_isTableElement_js__WEBPACK_IMPORTED_MODULE_6__["default"])(offsetParent) && (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent).position === 'static') {
6417                    offsetParent = getTrueOffsetParent(offsetParent);
6418                }
6419
6420                if (offsetParent && ((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent) === 'html' || (0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent) === 'body' && (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent).position === 'static')) {
6421                    return window;
6422                }
6423
6424                return offsetParent || getContainingBlock(element) || window;
6425            }
6426
6427            /***/ }),
6428
6429        
vendor: 2,272 bytes, lines 6429-6465
6429/***/ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js":
6430        /*!********************************************************************!*\
6431  !*** ./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js ***!
6432  \********************************************************************/
6433        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6434
6435            "use strict";
6436            __webpack_require__.r(__webpack_exports__);
6437            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6438                /* harmony export */   "default": function() { return /* binding */ getParentNode; }
6439                /* harmony export */ });
6440            /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js");
6441            /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
6442            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
6443
6444
6445
6446            function getParentNode(element) {
6447                if ((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element) === 'html') {
6448                    return element;
6449                }
6450
6451                return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle
6452                    // $FlowFixMe[incompatible-return]
6453                    // $FlowFixMe[prop-missing]
6454                    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node
6455                    element.parentNode || ( // DOM Element detected
6456                        (0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isShadowRoot)(element) ? element.host : null) || // ShadowRoot detected
6457                    // $FlowFixMe[incompatible-call]: HTMLElement is a Node
6458                    (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element) // fallback
6459
6460                );
6461            }
6462
6463            /***/ }),
6464
6465        
vendor: 2,192 bytes, lines 6465-6499
6465/***/ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js":
6466        /*!**********************************************************************!*\
6467  !*** ./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js ***!
6468  \**********************************************************************/
6469        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6470
6471            "use strict";
6472            __webpack_require__.r(__webpack_exports__);
6473            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6474                /* harmony export */   "default": function() { return /* binding */ getScrollParent; }
6475                /* harmony export */ });
6476            /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js");
6477            /* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js");
6478            /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js");
6479            /* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
6480
6481
6482
6483
6484            function getScrollParent(node) {
6485                if (['html', 'body', '#document'].indexOf((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node)) >= 0) {
6486                    // $FlowFixMe[incompatible-return]: assume body is always available
6487                    return node.ownerDocument.body;
6488                }
6489
6490                if ((0,_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__.isHTMLElement)(node) && (0,_isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(node)) {
6491                    return node;
6492                }
6493
6494                return getScrollParent((0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_3__["default"])(node));
6495            }
6496
6497            /***/ }),
6498
6499        
vendor: 2,764 bytes, lines 6499-6548
6499/***/ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js":
6500        /*!**********************************************************************!*\
6501  !*** ./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js ***!
6502  \**********************************************************************/
6503        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6504
6505            "use strict";
6506            __webpack_require__.r(__webpack_exports__);
6507            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6508                /* harmony export */   "default": function() { return /* binding */ getViewportRect; }
6509                /* harmony export */ });
6510            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
6511            /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
6512            /* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js");
6513            /* harmony import */ var _isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isLayoutViewport.js */ "./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js");
6514
6515
6516
6517
6518            function getViewportRect(element, strategy) {
6519                var win = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
6520                var html = (0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
6521                var visualViewport = win.visualViewport;
6522                var width = html.clientWidth;
6523                var height = html.clientHeight;
6524                var x = 0;
6525                var y = 0;
6526
6527                if (visualViewport) {
6528                    width = visualViewport.width;
6529                    height = visualViewport.height;
6530                    var layoutViewport = (0,_isLayoutViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"])();
6531
6532                    if (layoutViewport || !layoutViewport && strategy === 'fixed') {
6533                        x = visualViewport.offsetLeft;
6534                        y = visualViewport.offsetTop;
6535                    }
6536                }
6537
6538                return {
6539                    width: width,
6540                    height: height,
6541                    x: x + (0,_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element),
6542                    y: y
6543                };
6544            }
6545
6546            /***/ }),
6547
6548        
vendor: 1,108 bytes, lines 6548-6574
6548/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js":
6549        /*!****************************************************************!*\
6550  !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindow.js ***!
6551  \****************************************************************/
6552        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6553
6554            "use strict";
6555            __webpack_require__.r(__webpack_exports__);
6556            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6557                /* harmony export */   "default": function() { return /* binding */ getWindow; }
6558                /* harmony export */ });
6559            function getWindow(node) {
6560                if (node == null) {
6561                    return window;
6562                }
6563
6564                if (node.toString() !== '[object Window]') {
6565                    var ownerDocument = node.ownerDocument;
6566                    return ownerDocument ? ownerDocument.defaultView || window : window;
6567                }
6568
6569                return node;
6570            }
6571
6572            /***/ }),
6573
6574        
vendor: 1,301 bytes, lines 6574-6599
6574/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js":
6575        /*!**********************************************************************!*\
6576  !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js ***!
6577  \**********************************************************************/
6578        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6579
6580            "use strict";
6581            __webpack_require__.r(__webpack_exports__);
6582            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6583                /* harmony export */   "default": function() { return /* binding */ getWindowScroll; }
6584                /* harmony export */ });
6585            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
6586
6587            function getWindowScroll(node) {
6588                var win = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node);
6589                var scrollLeft = win.pageXOffset;
6590                var scrollTop = win.pageYOffset;
6591                return {
6592                    scrollLeft: scrollLeft,
6593                    scrollTop: scrollTop
6594                };
6595            }
6596
6597            /***/ }),
6598
6599        
vendor: 2,209 bytes, lines 6599-6629
6599/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js":
6600        /*!**************************************************************************!*\
6601  !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js ***!
6602  \**************************************************************************/
6603        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6604
6605            "use strict";
6606            __webpack_require__.r(__webpack_exports__);
6607            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6608                /* harmony export */   "default": function() { return /* binding */ getWindowScrollBarX; }
6609                /* harmony export */ });
6610            /* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js");
6611            /* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
6612            /* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js");
6613
6614
6615
6616            function getWindowScrollBarX(element) {
6617                // If <html> has a CSS width greater than the viewport, then this will be
6618                // incorrect for RTL.
6619                // Popper 1 is broken in this case and never had a bug report so let's assume
6620                // it's not an issue. I don't think anyone ever specifies width on <html>
6621                // anyway.
6622                // Browsers where the left scrollbar doesn't cause an issue report `0` for
6623                // this (e.g. Edge 2019, IE11, Safari)
6624                return (0,_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)).left + (0,_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element).scrollLeft;
6625            }
6626
6627            /***/ }),
6628
6629        
vendor: 1,997 bytes, lines 6629-6669
6629/***/ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js":
6630        /*!*****************************************************************!*\
6631  !*** ./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js ***!
6632  \*****************************************************************/
6633        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6634
6635            "use strict";
6636            __webpack_require__.r(__webpack_exports__);
6637            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6638                /* harmony export */   isElement: function() { return /* binding */ isElement; },
6639                /* harmony export */   isHTMLElement: function() { return /* binding */ isHTMLElement; },
6640                /* harmony export */   isShadowRoot: function() { return /* binding */ isShadowRoot; }
6641                /* harmony export */ });
6642            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
6643
6644
6645            function isElement(node) {
6646                var OwnElement = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).Element;
6647                return node instanceof OwnElement || node instanceof Element;
6648            }
6649
6650            function isHTMLElement(node) {
6651                var OwnElement = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).HTMLElement;
6652                return node instanceof OwnElement || node instanceof HTMLElement;
6653            }
6654
6655            function isShadowRoot(node) {
6656                // IE 11 has no ShadowRoot
6657                if (typeof ShadowRoot === 'undefined') {
6658                    return false;
6659                }
6660
6661                var OwnElement = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).ShadowRoot;
6662                return node instanceof OwnElement || node instanceof ShadowRoot;
6663            }
6664
6665
6666
6667            /***/ }),
6668
6669        
vendor: 1,123 bytes, lines 6669-6688
6669/***/ "./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js":
6670        /*!***********************************************************************!*\
6671  !*** ./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js ***!
6672  \***********************************************************************/
6673        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6674
6675            "use strict";
6676            __webpack_require__.r(__webpack_exports__);
6677            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6678                /* harmony export */   "default": function() { return /* binding */ isLayoutViewport; }
6679                /* harmony export */ });
6680            /* harmony import */ var _utils_userAgent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/userAgent.js */ "./node_modules/@popperjs/core/lib/utils/userAgent.js");
6681
6682            function isLayoutViewport() {
6683                return !/^((?!chrome|android).)*safari/i.test((0,_utils_userAgent_js__WEBPACK_IMPORTED_MODULE_0__["default"])());
6684            }
6685
6686            /***/ }),
6687
6688        
vendor: 1,467 bytes, lines 6688-6713
6688/***/ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js":
6689        /*!*********************************************************************!*\
6690  !*** ./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js ***!
6691  \*********************************************************************/
6692        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6693
6694            "use strict";
6695            __webpack_require__.r(__webpack_exports__);
6696            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6697                /* harmony export */   "default": function() { return /* binding */ isScrollParent; }
6698                /* harmony export */ });
6699            /* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js");
6700
6701            function isScrollParent(element) {
6702                // Firefox wants us to check `-x` and `-y` variations as well
6703                var _getComputedStyle = (0,_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element),
6704                    overflow = _getComputedStyle.overflow,
6705                    overflowX = _getComputedStyle.overflowX,
6706                    overflowY = _getComputedStyle.overflowY;
6707
6708                return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
6709            }
6710
6711            /***/ }),
6712
6713        
vendor: 1,114 bytes, lines 6713-6732
6713/***/ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js":
6714        /*!*********************************************************************!*\
6715  !*** ./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js ***!
6716  \*********************************************************************/
6717        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6718
6719            "use strict";
6720            __webpack_require__.r(__webpack_exports__);
6721            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6722                /* harmony export */   "default": function() { return /* binding */ isTableElement; }
6723                /* harmony export */ });
6724            /* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js");
6725
6726            function isTableElement(element) {
6727                return ['table', 'td', 'th'].indexOf((0,_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) >= 0;
6728            }
6729
6730            /***/ }),
6731
6732        
vendor: 2,897 bytes, lines 6732-6776
6732/***/ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js":
6733        /*!************************************************************************!*\
6734  !*** ./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js ***!
6735  \************************************************************************/
6736        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6737
6738            "use strict";
6739            __webpack_require__.r(__webpack_exports__);
6740            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6741                /* harmony export */   "default": function() { return /* binding */ listScrollParents; }
6742                /* harmony export */ });
6743            /* harmony import */ var _getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js");
6744            /* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js");
6745            /* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
6746            /* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js");
6747
6748
6749
6750
6751            /*
6752given a DOM element, return the list of all scroll parents, up the list of ancesors
6753until we get to the top window object. This list is what we attach scroll listeners
6754to, because if any of these parent elements scroll, we'll need to re-calculate the
6755reference element's position.
6756*/
6757
6758            function listScrollParents(element, list) {
6759                var _element$ownerDocumen;
6760
6761                if (list === void 0) {
6762                    list = [];
6763                }
6764
6765                var scrollParent = (0,_getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element);
6766                var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
6767                var win = (0,_getWindow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scrollParent);
6768                var target = isBody ? [win].concat(win.visualViewport || [], (0,_isScrollParent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(scrollParent) ? scrollParent : []) : scrollParent;
6769                var updatedList = list.concat(target);
6770                return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
6771                    updatedList.concat(listScrollParents((0,_getParentNode_js__WEBPACK_IMPORTED_MODULE_3__["default"])(target)));
6772            }
6773
6774            /***/ }),
6775
6776        
vendor: 4,375 bytes, lines 6776-6844
6776/***/ "./node_modules/@popperjs/core/lib/enums.js":
6777        /*!**************************************************!*\
6778  !*** ./node_modules/@popperjs/core/lib/enums.js ***!
6779  \**************************************************/
6780        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6781
6782            "use strict";
6783            __webpack_require__.r(__webpack_exports__);
6784            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6785                /* harmony export */   afterMain: function() { return /* binding */ afterMain; },
6786                /* harmony export */   afterRead: function() { return /* binding */ afterRead; },
6787                /* harmony export */   afterWrite: function() { return /* binding */ afterWrite; },
6788                /* harmony export */   auto: function() { return /* binding */ auto; },
6789                /* harmony export */   basePlacements: function() { return /* binding */ basePlacements; },
6790                /* harmony export */   beforeMain: function() { return /* binding */ beforeMain; },
6791                /* harmony export */   beforeRead: function() { return /* binding */ beforeRead; },
6792                /* harmony export */   beforeWrite: function() { return /* binding */ beforeWrite; },
6793                /* harmony export */   bottom: function() { return /* binding */ bottom; },
6794                /* harmony export */   clippingParents: function() { return /* binding */ clippingParents; },
6795                /* harmony export */   end: function() { return /* binding */ end; },
6796                /* harmony export */   left: function() { return /* binding */ left; },
6797                /* harmony export */   main: function() { return /* binding */ main; },
6798                /* harmony export */   modifierPhases: function() { return /* binding */ modifierPhases; },
6799                /* harmony export */   placements: function() { return /* binding */ placements; },
6800                /* harmony export */   popper: function() { return /* binding */ popper; },
6801                /* harmony export */   read: function() { return /* binding */ read; },
6802                /* harmony export */   reference: function() { return /* binding */ reference; },
6803                /* harmony export */   right: function() { return /* binding */ right; },
6804                /* harmony export */   start: function() { return /* binding */ start; },
6805                /* harmony export */   top: function() { return /* binding */ top; },
6806                /* harmony export */   variationPlacements: function() { return /* binding */ variationPlacements; },
6807                /* harmony export */   viewport: function() { return /* binding */ viewport; },
6808                /* harmony export */   write: function() { return /* binding */ write; }
6809                /* harmony export */ });
6810            var top = 'top';
6811            var bottom = 'bottom';
6812            var right = 'right';
6813            var left = 'left';
6814            var auto = 'auto';
6815            var basePlacements = [top, bottom, right, left];
6816            var start = 'start';
6817            var end = 'end';
6818            var clippingParents = 'clippingParents';
6819            var viewport = 'viewport';
6820            var popper = 'popper';
6821            var reference = 'reference';
6822            var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
6823                return acc.concat([placement + "-" + start, placement + "-" + end]);
6824            }, []);
6825            var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
6826                return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
6827            }, []); // modifiers that need to read the DOM
6828
6829            var beforeRead = 'beforeRead';
6830            var read = 'read';
6831            var afterRead = 'afterRead'; // pure-logic modifiers
6832
6833            var beforeMain = 'beforeMain';
6834            var main = 'main';
6835            var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
6836
6837            var beforeWrite = 'beforeWrite';
6838            var write = 'write';
6839            var afterWrite = 'afterWrite';
6840            var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
6841
6842            /***/ }),
6843
6844        
vendor: 7,398 bytes, lines 6844-6909
6844/***/ "./node_modules/@popperjs/core/lib/index.js":
6845        /*!**************************************************!*\
6846  !*** ./node_modules/@popperjs/core/lib/index.js ***!
6847  \**************************************************/
6848        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6849
6850            "use strict";
6851            __webpack_require__.r(__webpack_exports__);
6852            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6853                /* harmony export */   afterMain: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.afterMain; },
6854                /* harmony export */   afterRead: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.afterRead; },
6855                /* harmony export */   afterWrite: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.afterWrite; },
6856                /* harmony export */   applyStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.applyStyles; },
6857                /* harmony export */   arrow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.arrow; },
6858                /* harmony export */   auto: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.auto; },
6859                /* harmony export */   basePlacements: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.basePlacements; },
6860                /* harmony export */   beforeMain: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.beforeMain; },
6861                /* harmony export */   beforeRead: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.beforeRead; },
6862                /* harmony export */   beforeWrite: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.beforeWrite; },
6863                /* harmony export */   bottom: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom; },
6864                /* harmony export */   clippingParents: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.clippingParents; },
6865                /* harmony export */   computeStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.computeStyles; },
6866                /* harmony export */   createPopper: function() { return /* reexport safe */ _popper_js__WEBPACK_IMPORTED_MODULE_4__.createPopper; },
6867                /* harmony export */   createPopperBase: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_2__.createPopper; },
6868                /* harmony export */   createPopperLite: function() { return /* reexport safe */ _popper_lite_js__WEBPACK_IMPORTED_MODULE_5__.createPopper; },
6869                /* harmony export */   detectOverflow: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_3__["default"]; },
6870                /* harmony export */   end: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.end; },
6871                /* harmony export */   eventListeners: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.eventListeners; },
6872                /* harmony export */   flip: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.flip; },
6873                /* harmony export */   hide: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.hide; },
6874                /* harmony export */   left: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.left; },
6875                /* harmony export */   main: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.main; },
6876                /* harmony export */   modifierPhases: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.modifierPhases; },
6877                /* harmony export */   offset: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.offset; },
6878                /* harmony export */   placements: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.placements; },
6879                /* harmony export */   popper: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper; },
6880                /* harmony export */   popperGenerator: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_2__.popperGenerator; },
6881                /* harmony export */   popperOffsets: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.popperOffsets; },
6882                /* harmony export */   preventOverflow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__.preventOverflow; },
6883                /* harmony export */   read: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.read; },
6884                /* harmony export */   reference: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.reference; },
6885                /* harmony export */   right: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.right; },
6886                /* harmony export */   start: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.start; },
6887                /* harmony export */   top: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.top; },
6888                /* harmony export */   variationPlacements: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.variationPlacements; },
6889                /* harmony export */   viewport: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.viewport; },
6890                /* harmony export */   write: function() { return /* reexport safe */ _enums_js__WEBPACK_IMPORTED_MODULE_0__.write; }
6891                /* harmony export */ });
6892            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
6893            /* harmony import */ var _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/index.js */ "./node_modules/@popperjs/core/lib/modifiers/index.js");
6894            /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js");
6895            /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
6896            /* harmony import */ var _popper_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./popper.js */ "./node_modules/@popperjs/core/lib/popper.js");
6897            /* harmony import */ var _popper_lite_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./popper-lite.js */ "./node_modules/@popperjs/core/lib/popper-lite.js");
6898
6899            // eslint-disable-next-line import/no-unused-modules
6900
6901            // eslint-disable-next-line import/no-unused-modules
6902
6903            // eslint-disable-next-line import/no-unused-modules
6904
6905
6906
6907            /***/ }),
6908
6909        
vendor: 4,719 bytes, lines 6909-7006
6909/***/ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js":
6910        /*!******************************************************************!*\
6911  !*** ./node_modules/@popperjs/core/lib/modifiers/applyStyles.js ***!
6912  \******************************************************************/
6913        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6914
6915            "use strict";
6916            __webpack_require__.r(__webpack_exports__);
6917            /* harmony import */ var _dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js");
6918            /* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
6919
6920            // This modifier takes the styles prepared by the `computeStyles` modifier
6921// and applies them to the HTMLElements such as popper and arrow
6922
6923            function applyStyles(_ref) {
6924                var state = _ref.state;
6925                Object.keys(state.elements).forEach(function (name) {
6926                    var style = state.styles[name] || {};
6927                    var attributes = state.attributes[name] || {};
6928                    var element = state.elements[name]; // arrow is optional + virtual elements
6929
6930                    if (!(0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element) || !(0,_dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) {
6931                        return;
6932                    } // Flow doesn't support to extend this property, but it's the most
6933                    // effective way to apply styles to an HTMLElement
6934                    // $FlowFixMe[cannot-write]
6935
6936
6937                    Object.assign(element.style, style);
6938                    Object.keys(attributes).forEach(function (name) {
6939                        var value = attributes[name];
6940
6941                        if (value === false) {
6942                            element.removeAttribute(name);
6943                        } else {
6944                            element.setAttribute(name, value === true ? '' : value);
6945                        }
6946                    });
6947                });
6948            }
6949
6950            function effect(_ref2) {
6951                var state = _ref2.state;
6952                var initialStyles = {
6953                    popper: {
6954                        position: state.options.strategy,
6955                        left: '0',
6956                        top: '0',
6957                        margin: '0'
6958                    },
6959                    arrow: {
6960                        position: 'absolute'
6961                    },
6962                    reference: {}
6963                };
6964                Object.assign(state.elements.popper.style, initialStyles.popper);
6965                state.styles = initialStyles;
6966
6967                if (state.elements.arrow) {
6968                    Object.assign(state.elements.arrow.style, initialStyles.arrow);
6969                }
6970
6971                return function () {
6972                    Object.keys(state.elements).forEach(function (name) {
6973                        var element = state.elements[name];
6974                        var attributes = state.attributes[name] || {};
6975                        var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
6976
6977                        var style = styleProperties.reduce(function (style, property) {
6978                            style[property] = '';
6979                            return style;
6980                        }, {}); // arrow is optional + virtual elements
6981
6982                        if (!(0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element) || !(0,_dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) {
6983                            return;
6984                        }
6985
6986                        Object.assign(element.style, style);
6987                        Object.keys(attributes).forEach(function (attribute) {
6988                            element.removeAttribute(attribute);
6989                        });
6990                    });
6991                };
6992            } // eslint-disable-next-line import/no-unused-modules
6993
6994
6995            /* harmony default export */ __webpack_exports__["default"] = ({
6996                name: 'applyStyles',
6997                enabled: true,
6998                phase: 'write',
6999                fn: applyStyles,
7000                effect: effect,
7001                requires: ['computeStyles']
7002            });
7003
7004            /***/ }),
7005
7006        
vendor: 6,924 bytes, lines 7006-7116
7006/***/ "./node_modules/@popperjs/core/lib/modifiers/arrow.js":
7007        /*!************************************************************!*\
7008  !*** ./node_modules/@popperjs/core/lib/modifiers/arrow.js ***!
7009  \************************************************************/
7010        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7011
7012            "use strict";
7013            __webpack_require__.r(__webpack_exports__);
7014            /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js");
7015            /* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js");
7016            /* harmony import */ var _dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../dom-utils/contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js");
7017            /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js");
7018            /* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js");
7019            /* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js");
7020            /* harmony import */ var _utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js");
7021            /* harmony import */ var _utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js");
7022            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
7023
7024
7025
7026
7027
7028
7029
7030
7031            // eslint-disable-next-line import/no-unused-modules
7032
7033            var toPaddingObject = function toPaddingObject(padding, state) {
7034                padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {
7035                    placement: state.placement
7036                })) : padding;
7037                return (0,_utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(typeof padding !== 'number' ? padding : (0,_utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_1__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_2__.basePlacements));
7038            };
7039
7040            function arrow(_ref) {
7041                var _state$modifiersData$;
7042
7043                var state = _ref.state,
7044                    name = _ref.name,
7045                    options = _ref.options;
7046                var arrowElement = state.elements.arrow;
7047                var popperOffsets = state.modifiersData.popperOffsets;
7048                var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(state.placement);
7049                var axis = (0,_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(basePlacement);
7050                var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_2__.left, _enums_js__WEBPACK_IMPORTED_MODULE_2__.right].indexOf(basePlacement) >= 0;
7051                var len = isVertical ? 'height' : 'width';
7052
7053                if (!arrowElement || !popperOffsets) {
7054                    return;
7055                }
7056
7057                var paddingObject = toPaddingObject(options.padding, state);
7058                var arrowRect = (0,_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__["default"])(arrowElement);
7059                var minProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_2__.top : _enums_js__WEBPACK_IMPORTED_MODULE_2__.left;
7060                var maxProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_2__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_2__.right;
7061                var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];
7062                var startDiff = popperOffsets[axis] - state.rects.reference[axis];
7063                var arrowOffsetParent = (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(arrowElement);
7064                var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
7065                var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is
7066                // outside of the popper bounds
7067
7068                var min = paddingObject[minProp];
7069                var max = clientSize - arrowRect[len] - paddingObject[maxProp];
7070                var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
7071                var offset = (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_7__.within)(min, center, max); // Prevents breaking syntax highlighting...
7072
7073                var axisProp = axis;
7074                state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);
7075            }
7076
7077            function effect(_ref2) {
7078                var state = _ref2.state,
7079                    options = _ref2.options;
7080                var _options$element = options.element,
7081                    arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;
7082
7083                if (arrowElement == null) {
7084                    return;
7085                } // CSS selector
7086
7087
7088                if (typeof arrowElement === 'string') {
7089                    arrowElement = state.elements.popper.querySelector(arrowElement);
7090
7091                    if (!arrowElement) {
7092                        return;
7093                    }
7094                }
7095
7096                if (!(0,_dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_8__["default"])(state.elements.popper, arrowElement)) {
7097                    return;
7098                }
7099
7100                state.elements.arrow = arrowElement;
7101            } // eslint-disable-next-line import/no-unused-modules
7102
7103
7104            /* harmony default export */ __webpack_exports__["default"] = ({
7105                name: 'arrow',
7106                enabled: true,
7107                phase: 'main',
7108                fn: arrow,
7109                effect: effect,
7110                requires: ['popperOffsets'],
7111                requiresIfExists: ['preventOverflow']
7112            });
7113
7114            /***/ }),
7115
7116        
vendor: 10,676 bytes, lines 7116-7307
7116/***/ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js":
7117        /*!********************************************************************!*\
7118  !*** ./node_modules/@popperjs/core/lib/modifiers/computeStyles.js ***!
7119  \********************************************************************/
7120        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7121
7122            "use strict";
7123            __webpack_require__.r(__webpack_exports__);
7124            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7125                /* harmony export */   mapToStyles: function() { return /* binding */ mapToStyles; }
7126                /* harmony export */ });
7127            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
7128            /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js");
7129            /* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
7130            /* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
7131            /* harmony import */ var _dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js");
7132            /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js");
7133            /* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js");
7134            /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js");
7135
7136
7137
7138
7139
7140
7141
7142            // eslint-disable-next-line import/no-unused-modules
7143
7144            var unsetSides = {
7145                top: 'auto',
7146                right: 'auto',
7147                bottom: 'auto',
7148                left: 'auto'
7149            }; // Round the offsets to the nearest suitable subpixel based on the DPR.
7150// Zooming can change the DPR, but it seems to report a value that will
7151// cleanly divide the values into the appropriate subpixels.
7152
7153            function roundOffsetsByDPR(_ref, win) {
7154                var x = _ref.x,
7155                    y = _ref.y;
7156                var dpr = win.devicePixelRatio || 1;
7157                return {
7158                    x: (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(x * dpr) / dpr || 0,
7159                    y: (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_0__.round)(y * dpr) / dpr || 0
7160                };
7161            }
7162
7163            function mapToStyles(_ref2) {
7164                var _Object$assign2;
7165
7166                var popper = _ref2.popper,
7167                    popperRect = _ref2.popperRect,
7168                    placement = _ref2.placement,
7169                    variation = _ref2.variation,
7170                    offsets = _ref2.offsets,
7171                    position = _ref2.position,
7172                    gpuAcceleration = _ref2.gpuAcceleration,
7173                    adaptive = _ref2.adaptive,
7174                    roundOffsets = _ref2.roundOffsets,
7175                    isFixed = _ref2.isFixed;
7176                var _offsets$x = offsets.x,
7177                    x = _offsets$x === void 0 ? 0 : _offsets$x,
7178                    _offsets$y = offsets.y,
7179                    y = _offsets$y === void 0 ? 0 : _offsets$y;
7180
7181                var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({
7182                    x: x,
7183                    y: y
7184                }) : {
7185                    x: x,
7186                    y: y
7187                };
7188
7189                x = _ref3.x;
7190                y = _ref3.y;
7191                var hasX = offsets.hasOwnProperty('x');
7192                var hasY = offsets.hasOwnProperty('y');
7193                var sideX = _enums_js__WEBPACK_IMPORTED_MODULE_1__.left;
7194                var sideY = _enums_js__WEBPACK_IMPORTED_MODULE_1__.top;
7195                var win = window;
7196
7197                if (adaptive) {
7198                    var offsetParent = (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(popper);
7199                    var heightProp = 'clientHeight';
7200                    var widthProp = 'clientWidth';
7201
7202                    if (offsetParent === (0,_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper)) {
7203                        offsetParent = (0,_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(popper);
7204
7205                        if ((0,_dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_5__["default"])(offsetParent).position !== 'static' && position === 'absolute') {
7206                            heightProp = 'scrollHeight';
7207                            widthProp = 'scrollWidth';
7208                        }
7209                    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it
7210
7211
7212                    offsetParent = offsetParent;
7213
7214                    if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.top || (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.left || placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.right) && variation === _enums_js__WEBPACK_IMPORTED_MODULE_1__.end) {
7215                        sideY = _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom;
7216                        var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]
7217                            offsetParent[heightProp];
7218                        y -= offsetY - popperRect.height;
7219                        y *= gpuAcceleration ? 1 : -1;
7220                    }
7221
7222                    if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.left || (placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.top || placement === _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom) && variation === _enums_js__WEBPACK_IMPORTED_MODULE_1__.end) {
7223                        sideX = _enums_js__WEBPACK_IMPORTED_MODULE_1__.right;
7224                        var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]
7225                            offsetParent[widthProp];
7226                        x -= offsetX - popperRect.width;
7227                        x *= gpuAcceleration ? 1 : -1;
7228                    }
7229                }
7230
7231                var commonStyles = Object.assign({
7232                    position: position
7233                }, adaptive && unsetSides);
7234
7235                var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
7236                    x: x,
7237                    y: y
7238                }, (0,_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper)) : {
7239                    x: x,
7240                    y: y
7241                };
7242
7243                x = _ref4.x;
7244                y = _ref4.y;
7245
7246                if (gpuAcceleration) {
7247                    var _Object$assign;
7248
7249                    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
7250                }
7251
7252                return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
7253            }
7254
7255            function computeStyles(_ref5) {
7256                var state = _ref5.state,
7257                    options = _ref5.options;
7258                var _options$gpuAccelerat = options.gpuAcceleration,
7259                    gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,
7260                    _options$adaptive = options.adaptive,
7261                    adaptive = _options$adaptive === void 0 ? true : _options$adaptive,
7262                    _options$roundOffsets = options.roundOffsets,
7263                    roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
7264                var commonStyles = {
7265                    placement: (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state.placement),
7266                    variation: (0,_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_7__["default"])(state.placement),
7267                    popper: state.elements.popper,
7268                    popperRect: state.rects.popper,
7269                    gpuAcceleration: gpuAcceleration,
7270                    isFixed: state.options.strategy === 'fixed'
7271                };
7272
7273                if (state.modifiersData.popperOffsets != null) {
7274                    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
7275                        offsets: state.modifiersData.popperOffsets,
7276                        position: state.options.strategy,
7277                        adaptive: adaptive,
7278                        roundOffsets: roundOffsets
7279                    })));
7280                }
7281
7282                if (state.modifiersData.arrow != null) {
7283                    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
7284                        offsets: state.modifiersData.arrow,
7285                        position: 'absolute',
7286                        adaptive: false,
7287                        roundOffsets: roundOffsets
7288                    })));
7289                }
7290
7291                state.attributes.popper = Object.assign({}, state.attributes.popper, {
7292                    'data-popper-placement': state.placement
7293                });
7294            } // eslint-disable-next-line import/no-unused-modules
7295
7296
7297            /* harmony default export */ __webpack_exports__["default"] = ({
7298                name: 'computeStyles',
7299                enabled: true,
7300                phase: 'beforeWrite',
7301                fn: computeStyles,
7302                data: {}
7303            });
7304
7305            /***/ }),
7306
7307        
vendor: 2,700 bytes, lines 7307-7368
7307/***/ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js":
7308        /*!*********************************************************************!*\
7309  !*** ./node_modules/@popperjs/core/lib/modifiers/eventListeners.js ***!
7310  \*********************************************************************/
7311        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7312
7313            "use strict";
7314            __webpack_require__.r(__webpack_exports__);
7315            /* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js");
7316            // eslint-disable-next-line import/no-unused-modules
7317
7318            var passive = {
7319                passive: true
7320            };
7321
7322            function effect(_ref) {
7323                var state = _ref.state,
7324                    instance = _ref.instance,
7325                    options = _ref.options;
7326                var _options$scroll = options.scroll,
7327                    scroll = _options$scroll === void 0 ? true : _options$scroll,
7328                    _options$resize = options.resize,
7329                    resize = _options$resize === void 0 ? true : _options$resize;
7330                var window = (0,_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state.elements.popper);
7331                var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
7332
7333                if (scroll) {
7334                    scrollParents.forEach(function (scrollParent) {
7335                        scrollParent.addEventListener('scroll', instance.update, passive);
7336                    });
7337                }
7338
7339                if (resize) {
7340                    window.addEventListener('resize', instance.update, passive);
7341                }
7342
7343                return function () {
7344                    if (scroll) {
7345                        scrollParents.forEach(function (scrollParent) {
7346                            scrollParent.removeEventListener('scroll', instance.update, passive);
7347                        });
7348                    }
7349
7350                    if (resize) {
7351                        window.removeEventListener('resize', instance.update, passive);
7352                    }
7353                };
7354            } // eslint-disable-next-line import/no-unused-modules
7355
7356
7357            /* harmony default export */ __webpack_exports__["default"] = ({
7358                name: 'eventListeners',
7359                enabled: true,
7360                phase: 'write',
7361                fn: function fn() {},
7362                effect: effect,
7363                data: {}
7364            });
7365
7366            /***/ }),
7367
7368        
vendor: 9,387 bytes, lines 7368-7533
7368/***/ "./node_modules/@popperjs/core/lib/modifiers/flip.js":
7369        /*!***********************************************************!*\
7370  !*** ./node_modules/@popperjs/core/lib/modifiers/flip.js ***!
7371  \***********************************************************/
7372        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7373
7374            "use strict";
7375            __webpack_require__.r(__webpack_exports__);
7376            /* harmony import */ var _utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getOppositePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js");
7377            /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js");
7378            /* harmony import */ var _utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getOppositeVariationPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js");
7379            /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
7380            /* harmony import */ var _utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/computeAutoPlacement.js */ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js");
7381            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
7382            /* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js");
7383
7384
7385
7386
7387
7388
7389            // eslint-disable-next-line import/no-unused-modules
7390
7391            function getExpandedFallbackPlacements(placement) {
7392                if ((0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_1__.auto) {
7393                    return [];
7394                }
7395
7396                var oppositePlacement = (0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(placement);
7397                return [(0,_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(placement), oppositePlacement, (0,_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(oppositePlacement)];
7398            }
7399
7400            function flip(_ref) {
7401                var state = _ref.state,
7402                    options = _ref.options,
7403                    name = _ref.name;
7404
7405                if (state.modifiersData[name]._skip) {
7406                    return;
7407                }
7408
7409                var _options$mainAxis = options.mainAxis,
7410                    checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
7411                    _options$altAxis = options.altAxis,
7412                    checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,
7413                    specifiedFallbackPlacements = options.fallbackPlacements,
7414                    padding = options.padding,
7415                    boundary = options.boundary,
7416                    rootBoundary = options.rootBoundary,
7417                    altBoundary = options.altBoundary,
7418                    _options$flipVariatio = options.flipVariations,
7419                    flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,
7420                    allowedAutoPlacements = options.allowedAutoPlacements;
7421                var preferredPlacement = state.options.placement;
7422                var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(preferredPlacement);
7423                var isBasePlacement = basePlacement === preferredPlacement;
7424                var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [(0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
7425                var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {
7426                    return acc.concat((0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_1__.auto ? (0,_utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(state, {
7427                        placement: placement,
7428                        boundary: boundary,
7429                        rootBoundary: rootBoundary,
7430                        padding: padding,
7431                        flipVariations: flipVariations,
7432                        allowedAutoPlacements: allowedAutoPlacements
7433                    }) : placement);
7434                }, []);
7435                var referenceRect = state.rects.reference;
7436                var popperRect = state.rects.popper;
7437                var checksMap = new Map();
7438                var makeFallbackChecks = true;
7439                var firstFittingPlacement = placements[0];
7440
7441                for (var i = 0; i < placements.length; i++) {
7442                    var placement = placements[i];
7443
7444                    var _basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement);
7445
7446                    var isStartVariation = (0,_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_5__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_1__.start;
7447                    var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_1__.top, _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom].indexOf(_basePlacement) >= 0;
7448                    var len = isVertical ? 'width' : 'height';
7449                    var overflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state, {
7450                        placement: placement,
7451                        boundary: boundary,
7452                        rootBoundary: rootBoundary,
7453                        altBoundary: altBoundary,
7454                        padding: padding
7455                    });
7456                    var mainVariationSide = isVertical ? isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_1__.right : _enums_js__WEBPACK_IMPORTED_MODULE_1__.left : isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_1__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_1__.top;
7457
7458                    if (referenceRect[len] > popperRect[len]) {
7459                        mainVariationSide = (0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mainVariationSide);
7460                    }
7461
7462                    var altVariationSide = (0,_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mainVariationSide);
7463                    var checks = [];
7464
7465                    if (checkMainAxis) {
7466                        checks.push(overflow[_basePlacement] <= 0);
7467                    }
7468
7469                    if (checkAltAxis) {
7470                        checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
7471                    }
7472
7473                    if (checks.every(function (check) {
7474                        return check;
7475                    })) {
7476                        firstFittingPlacement = placement;
7477                        makeFallbackChecks = false;
7478                        break;
7479                    }
7480
7481                    checksMap.set(placement, checks);
7482                }
7483
7484                if (makeFallbackChecks) {
7485                    // `2` may be desired in some cases – research later
7486                    var numberOfChecks = flipVariations ? 3 : 1;
7487
7488                    var _loop = function _loop(_i) {
7489                        var fittingPlacement = placements.find(function (placement) {
7490                            var checks = checksMap.get(placement);
7491
7492                            if (checks) {
7493                                return checks.slice(0, _i).every(function (check) {
7494                                    return check;
7495                                });
7496                            }
7497                        });
7498
7499                        if (fittingPlacement) {
7500                            firstFittingPlacement = fittingPlacement;
7501                            return "break";
7502                        }
7503                    };
7504
7505                    for (var _i = numberOfChecks; _i > 0; _i--) {
7506                        var _ret = _loop(_i);
7507
7508                        if (_ret === "break") break;
7509                    }
7510                }
7511
7512                if (state.placement !== firstFittingPlacement) {
7513                    state.modifiersData[name]._skip = true;
7514                    state.placement = firstFittingPlacement;
7515                    state.reset = true;
7516                }
7517            } // eslint-disable-next-line import/no-unused-modules
7518
7519
7520            /* harmony default export */ __webpack_exports__["default"] = ({
7521                name: 'flip',
7522                enabled: true,
7523                phase: 'main',
7524                fn: flip,
7525                requiresIfExists: ['offset'],
7526                data: {
7527                    _skip: false
7528                }
7529            });
7530
7531            /***/ }),
7532
7533        
vendor: 3,765 bytes, lines 7533-7607
7533/***/ "./node_modules/@popperjs/core/lib/modifiers/hide.js":
7534        /*!***********************************************************!*\
7535  !*** ./node_modules/@popperjs/core/lib/modifiers/hide.js ***!
7536  \***********************************************************/
7537        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7538
7539            "use strict";
7540            __webpack_require__.r(__webpack_exports__);
7541            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
7542            /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
7543
7544
7545
7546            function getSideOffsets(overflow, rect, preventedOffsets) {
7547                if (preventedOffsets === void 0) {
7548                    preventedOffsets = {
7549                        x: 0,
7550                        y: 0
7551                    };
7552                }
7553
7554                return {
7555                    top: overflow.top - rect.height - preventedOffsets.y,
7556                    right: overflow.right - rect.width + preventedOffsets.x,
7557                    bottom: overflow.bottom - rect.height + preventedOffsets.y,
7558                    left: overflow.left - rect.width - preventedOffsets.x
7559                };
7560            }
7561
7562            function isAnySideFullyClipped(overflow) {
7563                return [_enums_js__WEBPACK_IMPORTED_MODULE_0__.top, _enums_js__WEBPACK_IMPORTED_MODULE_0__.right, _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom, _enums_js__WEBPACK_IMPORTED_MODULE_0__.left].some(function (side) {
7564                    return overflow[side] >= 0;
7565                });
7566            }
7567
7568            function hide(_ref) {
7569                var state = _ref.state,
7570                    name = _ref.name;
7571                var referenceRect = state.rects.reference;
7572                var popperRect = state.rects.popper;
7573                var preventedOffsets = state.modifiersData.preventOverflow;
7574                var referenceOverflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, {
7575                    elementContext: 'reference'
7576                });
7577                var popperAltOverflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, {
7578                    altBoundary: true
7579                });
7580                var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
7581                var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
7582                var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
7583                var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
7584                state.modifiersData[name] = {
7585                    referenceClippingOffsets: referenceClippingOffsets,
7586                    popperEscapeOffsets: popperEscapeOffsets,
7587                    isReferenceHidden: isReferenceHidden,
7588                    hasPopperEscaped: hasPopperEscaped
7589                };
7590                state.attributes.popper = Object.assign({}, state.attributes.popper, {
7591                    'data-popper-reference-hidden': isReferenceHidden,
7592                    'data-popper-escaped': hasPopperEscaped
7593                });
7594            } // eslint-disable-next-line import/no-unused-modules
7595
7596
7597            /* harmony default export */ __webpack_exports__["default"] = ({
7598                name: 'hide',
7599                enabled: true,
7600                phase: 'main',
7601                requiresIfExists: ['preventOverflow'],
7602                fn: hide
7603            });
7604
7605            /***/ }),
7606
7607        
vendor: 3,619 bytes, lines 7607-7647
7607/***/ "./node_modules/@popperjs/core/lib/modifiers/index.js":
7608        /*!************************************************************!*\
7609  !*** ./node_modules/@popperjs/core/lib/modifiers/index.js ***!
7610  \************************************************************/
7611        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7612
7613            "use strict";
7614            __webpack_require__.r(__webpack_exports__);
7615            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7616                /* harmony export */   applyStyles: function() { return /* reexport safe */ _applyStyles_js__WEBPACK_IMPORTED_MODULE_0__["default"]; },
7617                /* harmony export */   arrow: function() { return /* reexport safe */ _arrow_js__WEBPACK_IMPORTED_MODULE_1__["default"]; },
7618                /* harmony export */   computeStyles: function() { return /* reexport safe */ _computeStyles_js__WEBPACK_IMPORTED_MODULE_2__["default"]; },
7619                /* harmony export */   eventListeners: function() { return /* reexport safe */ _eventListeners_js__WEBPACK_IMPORTED_MODULE_3__["default"]; },
7620                /* harmony export */   flip: function() { return /* reexport safe */ _flip_js__WEBPACK_IMPORTED_MODULE_4__["default"]; },
7621                /* harmony export */   hide: function() { return /* reexport safe */ _hide_js__WEBPACK_IMPORTED_MODULE_5__["default"]; },
7622                /* harmony export */   offset: function() { return /* reexport safe */ _offset_js__WEBPACK_IMPORTED_MODULE_6__["default"]; },
7623                /* harmony export */   popperOffsets: function() { return /* reexport safe */ _popperOffsets_js__WEBPACK_IMPORTED_MODULE_7__["default"]; },
7624                /* harmony export */   preventOverflow: function() { return /* reexport safe */ _preventOverflow_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }
7625                /* harmony export */ });
7626            /* harmony import */ var _applyStyles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js");
7627            /* harmony import */ var _arrow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./arrow.js */ "./node_modules/@popperjs/core/lib/modifiers/arrow.js");
7628            /* harmony import */ var _computeStyles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js");
7629            /* harmony import */ var _eventListeners_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js");
7630            /* harmony import */ var _flip_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./flip.js */ "./node_modules/@popperjs/core/lib/modifiers/flip.js");
7631            /* harmony import */ var _hide_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hide.js */ "./node_modules/@popperjs/core/lib/modifiers/hide.js");
7632            /* harmony import */ var _offset_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./offset.js */ "./node_modules/@popperjs/core/lib/modifiers/offset.js");
7633            /* harmony import */ var _popperOffsets_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js");
7634            /* harmony import */ var _preventOverflow_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./preventOverflow.js */ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js");
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645            /***/ }),
7646
7647        
vendor: 3,529 bytes, lines 7647-7717
7647/***/ "./node_modules/@popperjs/core/lib/modifiers/offset.js":
7648        /*!*************************************************************!*\
7649  !*** ./node_modules/@popperjs/core/lib/modifiers/offset.js ***!
7650  \*************************************************************/
7651        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7652
7653            "use strict";
7654            __webpack_require__.r(__webpack_exports__);
7655            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7656                /* harmony export */   distanceAndSkiddingToXY: function() { return /* binding */ distanceAndSkiddingToXY; }
7657                /* harmony export */ });
7658            /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js");
7659            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
7660
7661            // eslint-disable-next-line import/no-unused-modules
7662
7663            function distanceAndSkiddingToXY(placement, rects, offset) {
7664                var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement);
7665                var invertDistance = [_enums_js__WEBPACK_IMPORTED_MODULE_1__.left, _enums_js__WEBPACK_IMPORTED_MODULE_1__.top].indexOf(basePlacement) >= 0 ? -1 : 1;
7666
7667                var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {
7668                        placement: placement
7669                    })) : offset,
7670                    skidding = _ref[0],
7671                    distance = _ref[1];
7672
7673                skidding = skidding || 0;
7674                distance = (distance || 0) * invertDistance;
7675                return [_enums_js__WEBPACK_IMPORTED_MODULE_1__.left, _enums_js__WEBPACK_IMPORTED_MODULE_1__.right].indexOf(basePlacement) >= 0 ? {
7676                    x: distance,
7677                    y: skidding
7678                } : {
7679                    x: skidding,
7680                    y: distance
7681                };
7682            }
7683
7684            function offset(_ref2) {
7685                var state = _ref2.state,
7686                    options = _ref2.options,
7687                    name = _ref2.name;
7688                var _options$offset = options.offset,
7689                    offset = _options$offset === void 0 ? [0, 0] : _options$offset;
7690                var data = _enums_js__WEBPACK_IMPORTED_MODULE_1__.placements.reduce(function (acc, placement) {
7691                    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);
7692                    return acc;
7693                }, {});
7694                var _data$state$placement = data[state.placement],
7695                    x = _data$state$placement.x,
7696                    y = _data$state$placement.y;
7697
7698                if (state.modifiersData.popperOffsets != null) {
7699                    state.modifiersData.popperOffsets.x += x;
7700                    state.modifiersData.popperOffsets.y += y;
7701                }
7702
7703                state.modifiersData[name] = data;
7704            } // eslint-disable-next-line import/no-unused-modules
7705
7706
7707            /* harmony default export */ __webpack_exports__["default"] = ({
7708                name: 'offset',
7709                enabled: true,
7710                phase: 'main',
7711                requires: ['popperOffsets'],
7712                fn: offset
7713            });
7714
7715            /***/ }),
7716
7717        
vendor: 1,764 bytes, lines 7717-7754
7717/***/ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js":
7718        /*!********************************************************************!*\
7719  !*** ./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js ***!
7720  \********************************************************************/
7721        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7722
7723            "use strict";
7724            __webpack_require__.r(__webpack_exports__);
7725            /* harmony import */ var _utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js");
7726
7727
7728            function popperOffsets(_ref) {
7729                var state = _ref.state,
7730                    name = _ref.name;
7731                // Offsets are the actual position the popper needs to have to be
7732                // properly positioned near its reference element
7733                // This is the most basic placement, and will be adjusted by
7734                // the modifiers in the next step
7735                state.modifiersData[name] = (0,_utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__["default"])({
7736                    reference: state.rects.reference,
7737                    element: state.rects.popper,
7738                    strategy: 'absolute',
7739                    placement: state.placement
7740                });
7741            } // eslint-disable-next-line import/no-unused-modules
7742
7743
7744            /* harmony default export */ __webpack_exports__["default"] = ({
7745                name: 'popperOffsets',
7746                enabled: true,
7747                phase: 'read',
7748                fn: popperOffsets,
7749                data: {}
7750            });
7751
7752            /***/ }),
7753
7754        
vendor: 11,581 bytes, lines 7754-7918
7754/***/ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js":
7755        /*!**********************************************************************!*\
7756  !*** ./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js ***!
7757  \**********************************************************************/
7758        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7759
7760            "use strict";
7761            __webpack_require__.r(__webpack_exports__);
7762            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
7763            /* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js");
7764            /* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js");
7765            /* harmony import */ var _utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/getAltAxis.js */ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js");
7766            /* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js");
7767            /* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js");
7768            /* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js");
7769            /* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
7770            /* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js");
7771            /* harmony import */ var _utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js");
7772            /* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js");
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785            function preventOverflow(_ref) {
7786                var state = _ref.state,
7787                    options = _ref.options,
7788                    name = _ref.name;
7789                var _options$mainAxis = options.mainAxis,
7790                    checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
7791                    _options$altAxis = options.altAxis,
7792                    checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,
7793                    boundary = options.boundary,
7794                    rootBoundary = options.rootBoundary,
7795                    altBoundary = options.altBoundary,
7796                    padding = options.padding,
7797                    _options$tether = options.tether,
7798                    tether = _options$tether === void 0 ? true : _options$tether,
7799                    _options$tetherOffset = options.tetherOffset,
7800                    tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
7801                var overflow = (0,_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state, {
7802                    boundary: boundary,
7803                    rootBoundary: rootBoundary,
7804                    padding: padding,
7805                    altBoundary: altBoundary
7806                });
7807                var basePlacement = (0,_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state.placement);
7808                var variation = (0,_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state.placement);
7809                var isBasePlacement = !variation;
7810                var mainAxis = (0,_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(basePlacement);
7811                var altAxis = (0,_utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_4__["default"])(mainAxis);
7812                var popperOffsets = state.modifiersData.popperOffsets;
7813                var referenceRect = state.rects.reference;
7814                var popperRect = state.rects.popper;
7815                var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
7816                    placement: state.placement
7817                })) : tetherOffset;
7818                var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
7819                    mainAxis: tetherOffsetValue,
7820                    altAxis: tetherOffsetValue
7821                } : Object.assign({
7822                    mainAxis: 0,
7823                    altAxis: 0
7824                }, tetherOffsetValue);
7825                var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
7826                var data = {
7827                    x: 0,
7828                    y: 0
7829                };
7830
7831                if (!popperOffsets) {
7832                    return;
7833                }
7834
7835                if (checkMainAxis) {
7836                    var _offsetModifierState$;
7837
7838                    var mainSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.top : _enums_js__WEBPACK_IMPORTED_MODULE_5__.left;
7839                    var altSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_5__.right;
7840                    var len = mainAxis === 'y' ? 'height' : 'width';
7841                    var offset = popperOffsets[mainAxis];
7842                    var min = offset + overflow[mainSide];
7843                    var max = offset - overflow[altSide];
7844                    var additive = tether ? -popperRect[len] / 2 : 0;
7845                    var minLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_5__.start ? referenceRect[len] : popperRect[len];
7846                    var maxLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_5__.start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
7847                    // outside the reference bounds
7848
7849                    var arrowElement = state.elements.arrow;
7850                    var arrowRect = tether && arrowElement ? (0,_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_6__["default"])(arrowElement) : {
7851                        width: 0,
7852                        height: 0
7853                    };
7854                    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : (0,_utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_7__["default"])();
7855                    var arrowPaddingMin = arrowPaddingObject[mainSide];
7856                    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want
7857                    // to include its full size in the calculation. If the reference is small
7858                    // and near the edge of a boundary, the popper can overflow even if the
7859                    // reference is not overflowing as well (e.g. virtual elements with no
7860                    // width or height)
7861
7862                    var arrowLen = (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.within)(0, referenceRect[len], arrowRect[len]);
7863                    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
7864                    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
7865                    var arrowOffsetParent = state.elements.arrow && (0,_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_9__["default"])(state.elements.arrow);
7866                    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
7867                    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
7868                    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
7869                    var tetherMax = offset + maxOffset - offsetModifierValue;
7870                    var preventedOffset = (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.within)(tether ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_10__.min)(min, tetherMin) : min, offset, tether ? (0,_utils_math_js__WEBPACK_IMPORTED_MODULE_10__.max)(max, tetherMax) : max);
7871                    popperOffsets[mainAxis] = preventedOffset;
7872                    data[mainAxis] = preventedOffset - offset;
7873                }
7874
7875                if (checkAltAxis) {
7876                    var _offsetModifierState$2;
7877
7878                    var _mainSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.top : _enums_js__WEBPACK_IMPORTED_MODULE_5__.left;
7879
7880                    var _altSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_5__.bottom : _enums_js__WEBPACK_IMPORTED_MODULE_5__.right;
7881
7882                    var _offset = popperOffsets[altAxis];
7883
7884                    var _len = altAxis === 'y' ? 'height' : 'width';
7885
7886                    var _min = _offset + overflow[_mainSide];
7887
7888                    var _max = _offset - overflow[_altSide];
7889
7890                    var isOriginSide = [_enums_js__WEBPACK_IMPORTED_MODULE_5__.top, _enums_js__WEBPACK_IMPORTED_MODULE_5__.left].indexOf(basePlacement) !== -1;
7891
7892                    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
7893
7894                    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
7895
7896                    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
7897
7898                    var _preventedOffset = tether && isOriginSide ? (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.withinMaxClamp)(_tetherMin, _offset, _tetherMax) : (0,_utils_within_js__WEBPACK_IMPORTED_MODULE_8__.within)(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
7899
7900                    popperOffsets[altAxis] = _preventedOffset;
7901                    data[altAxis] = _preventedOffset - _offset;
7902                }
7903
7904                state.modifiersData[name] = data;
7905            } // eslint-disable-next-line import/no-unused-modules
7906
7907
7908            /* harmony default export */ __webpack_exports__["default"] = ({
7909                name: 'preventOverflow',
7910                enabled: true,
7911                phase: 'main',
7912                fn: preventOverflow,
7913                requiresIfExists: ['offset']
7914            });
7915
7916            /***/ }),
7917
7918        
vendor: 2,903 bytes, lines 7918-7952
7918/***/ "./node_modules/@popperjs/core/lib/popper-lite.js":
7919        /*!********************************************************!*\
7920  !*** ./node_modules/@popperjs/core/lib/popper-lite.js ***!
7921  \********************************************************/
7922        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7923
7924            "use strict";
7925            __webpack_require__.r(__webpack_exports__);
7926            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7927                /* harmony export */   createPopper: function() { return /* binding */ createPopper; },
7928                /* harmony export */   defaultModifiers: function() { return /* binding */ defaultModifiers; },
7929                /* harmony export */   detectOverflow: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_5__["default"]; },
7930                /* harmony export */   popperGenerator: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_4__.popperGenerator; }
7931                /* harmony export */ });
7932            /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js");
7933            /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
7934            /* harmony import */ var _modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modifiers/eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js");
7935            /* harmony import */ var _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js");
7936            /* harmony import */ var _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifiers/computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js");
7937            /* harmony import */ var _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiers/applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js");
7938
7939
7940
7941
7942
7943            var defaultModifiers = [_modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__["default"], _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__["default"], _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__["default"], _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__["default"]];
7944            var createPopper = /*#__PURE__*/(0,_createPopper_js__WEBPACK_IMPORTED_MODULE_4__.popperGenerator)({
7945                defaultModifiers: defaultModifiers
7946            }); // eslint-disable-next-line import/no-unused-modules
7947
7948
7949
7950            /***/ }),
7951
7952        
vendor: 6,258 bytes, lines 7952-8012
7952/***/ "./node_modules/@popperjs/core/lib/popper.js":
7953        /*!***************************************************!*\
7954  !*** ./node_modules/@popperjs/core/lib/popper.js ***!
7955  \***************************************************/
7956        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
7957
7958            "use strict";
7959            __webpack_require__.r(__webpack_exports__);
7960            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7961                /* harmony export */   applyStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.applyStyles; },
7962                /* harmony export */   arrow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.arrow; },
7963                /* harmony export */   computeStyles: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.computeStyles; },
7964                /* harmony export */   createPopper: function() { return /* binding */ createPopper; },
7965                /* harmony export */   createPopperLite: function() { return /* reexport safe */ _popper_lite_js__WEBPACK_IMPORTED_MODULE_11__.createPopper; },
7966                /* harmony export */   defaultModifiers: function() { return /* binding */ defaultModifiers; },
7967                /* harmony export */   detectOverflow: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_10__["default"]; },
7968                /* harmony export */   eventListeners: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.eventListeners; },
7969                /* harmony export */   flip: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.flip; },
7970                /* harmony export */   hide: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.hide; },
7971                /* harmony export */   offset: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.offset; },
7972                /* harmony export */   popperGenerator: function() { return /* reexport safe */ _createPopper_js__WEBPACK_IMPORTED_MODULE_9__.popperGenerator; },
7973                /* harmony export */   popperOffsets: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.popperOffsets; },
7974                /* harmony export */   preventOverflow: function() { return /* reexport safe */ _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__.preventOverflow; }
7975                /* harmony export */ });
7976            /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js");
7977            /* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
7978            /* harmony import */ var _modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modifiers/eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js");
7979            /* harmony import */ var _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js");
7980            /* harmony import */ var _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifiers/computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js");
7981            /* harmony import */ var _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiers/applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js");
7982            /* harmony import */ var _modifiers_offset_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modifiers/offset.js */ "./node_modules/@popperjs/core/lib/modifiers/offset.js");
7983            /* harmony import */ var _modifiers_flip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modifiers/flip.js */ "./node_modules/@popperjs/core/lib/modifiers/flip.js");
7984            /* harmony import */ var _modifiers_preventOverflow_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modifiers/preventOverflow.js */ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js");
7985            /* harmony import */ var _modifiers_arrow_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modifiers/arrow.js */ "./node_modules/@popperjs/core/lib/modifiers/arrow.js");
7986            /* harmony import */ var _modifiers_hide_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modifiers/hide.js */ "./node_modules/@popperjs/core/lib/modifiers/hide.js");
7987            /* harmony import */ var _popper_lite_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./popper-lite.js */ "./node_modules/@popperjs/core/lib/popper-lite.js");
7988            /* harmony import */ var _modifiers_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modifiers/index.js */ "./node_modules/@popperjs/core/lib/modifiers/index.js");
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999            var defaultModifiers = [_modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_0__["default"], _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_1__["default"], _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_2__["default"], _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_3__["default"], _modifiers_offset_js__WEBPACK_IMPORTED_MODULE_4__["default"], _modifiers_flip_js__WEBPACK_IMPORTED_MODULE_5__["default"], _modifiers_preventOverflow_js__WEBPACK_IMPORTED_MODULE_6__["default"], _modifiers_arrow_js__WEBPACK_IMPORTED_MODULE_7__["default"], _modifiers_hide_js__WEBPACK_IMPORTED_MODULE_8__["default"]];
8000            var createPopper = /*#__PURE__*/(0,_createPopper_js__WEBPACK_IMPORTED_MODULE_9__.popperGenerator)({
8001                defaultModifiers: defaultModifiers
8002            }); // eslint-disable-next-line import/no-unused-modules
8003
8004            // eslint-disable-next-line import/no-unused-modules
8005
8006            // eslint-disable-next-line import/no-unused-modules
8007
8008
8009
8010            /***/ }),
8011
8012        
vendor: 3,786 bytes, lines 8012-8073
8012/***/ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js":
8013        /*!***********************************************************************!*\
8014  !*** ./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js ***!
8015  \***********************************************************************/
8016        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8017
8018            "use strict";
8019            __webpack_require__.r(__webpack_exports__);
8020            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8021                /* harmony export */   "default": function() { return /* binding */ computeAutoPlacement; }
8022                /* harmony export */ });
8023            /* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js");
8024            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
8025            /* harmony import */ var _detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js");
8026            /* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js");
8027
8028
8029
8030
8031            function computeAutoPlacement(state, options) {
8032                if (options === void 0) {
8033                    options = {};
8034                }
8035
8036                var _options = options,
8037                    placement = _options.placement,
8038                    boundary = _options.boundary,
8039                    rootBoundary = _options.rootBoundary,
8040                    padding = _options.padding,
8041                    flipVariations = _options.flipVariations,
8042                    _options$allowedAutoP = _options.allowedAutoPlacements,
8043                    allowedAutoPlacements = _options$allowedAutoP === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.placements : _options$allowedAutoP;
8044                var variation = (0,_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement);
8045                var placements = variation ? flipVariations ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.variationPlacements : _enums_js__WEBPACK_IMPORTED_MODULE_0__.variationPlacements.filter(function (placement) {
8046                    return (0,_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) === variation;
8047                }) : _enums_js__WEBPACK_IMPORTED_MODULE_0__.basePlacements;
8048                var allowedPlacements = placements.filter(function (placement) {
8049                    return allowedAutoPlacements.indexOf(placement) >= 0;
8050                });
8051
8052                if (allowedPlacements.length === 0) {
8053                    allowedPlacements = placements;
8054                } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
8055
8056
8057                var overflows = allowedPlacements.reduce(function (acc, placement) {
8058                    acc[placement] = (0,_detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state, {
8059                        placement: placement,
8060                        boundary: boundary,
8061                        rootBoundary: rootBoundary,
8062                        padding: padding
8063                    })[(0,_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(placement)];
8064                    return acc;
8065                }, {});
8066                return Object.keys(overflows).sort(function (a, b) {
8067                    return overflows[a] - overflows[b];
8068                });
8069            }
8070
8071            /***/ }),
8072
8073        
vendor: 4,300 bytes, lines 8073-8161
8073/***/ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js":
8074        /*!*****************************************************************!*\
8075  !*** ./node_modules/@popperjs/core/lib/utils/computeOffsets.js ***!
8076  \*****************************************************************/
8077        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8078
8079            "use strict";
8080            __webpack_require__.r(__webpack_exports__);
8081            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8082                /* harmony export */   "default": function() { return /* binding */ computeOffsets; }
8083                /* harmony export */ });
8084            /* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js");
8085            /* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js");
8086            /* harmony import */ var _getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js");
8087            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
8088
8089
8090
8091
8092            function computeOffsets(_ref) {
8093                var reference = _ref.reference,
8094                    element = _ref.element,
8095                    placement = _ref.placement;
8096                var basePlacement = placement ? (0,_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) : null;
8097                var variation = placement ? (0,_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) : null;
8098                var commonX = reference.x + reference.width / 2 - element.width / 2;
8099                var commonY = reference.y + reference.height / 2 - element.height / 2;
8100                var offsets;
8101
8102                switch (basePlacement) {
8103                    case _enums_js__WEBPACK_IMPORTED_MODULE_2__.top:
8104                        offsets = {
8105                            x: commonX,
8106                            y: reference.y - element.height
8107                        };
8108                        break;
8109
8110                    case _enums_js__WEBPACK_IMPORTED_MODULE_2__.bottom:
8111                        offsets = {
8112                            x: commonX,
8113                            y: reference.y + reference.height
8114                        };
8115                        break;
8116
8117                    case _enums_js__WEBPACK_IMPORTED_MODULE_2__.right:
8118                        offsets = {
8119                            x: reference.x + reference.width,
8120                            y: commonY
8121                        };
8122                        break;
8123
8124                    case _enums_js__WEBPACK_IMPORTED_MODULE_2__.left:
8125                        offsets = {
8126                            x: reference.x - element.width,
8127                            y: commonY
8128                        };
8129                        break;
8130
8131                    default:
8132                        offsets = {
8133                            x: reference.x,
8134                            y: reference.y
8135                        };
8136                }
8137
8138                var mainAxis = basePlacement ? (0,_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(basePlacement) : null;
8139
8140                if (mainAxis != null) {
8141                    var len = mainAxis === 'y' ? 'height' : 'width';
8142
8143                    switch (variation) {
8144                        case _enums_js__WEBPACK_IMPORTED_MODULE_2__.start:
8145                            offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);
8146                            break;
8147
8148                        case _enums_js__WEBPACK_IMPORTED_MODULE_2__.end:
8149                            offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);
8150                            break;
8151
8152                        default:
8153                    }
8154                }
8155
8156                return offsets;
8157            }
8158
8159            /***/ }),
8160
8161        
vendor: 1,208 bytes, lines 8161-8190
8161/***/ "./node_modules/@popperjs/core/lib/utils/debounce.js":
8162        /*!***********************************************************!*\
8163  !*** ./node_modules/@popperjs/core/lib/utils/debounce.js ***!
8164  \***********************************************************/
8165        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8166
8167            "use strict";
8168            __webpack_require__.r(__webpack_exports__);
8169            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8170                /* harmony export */   "default": function() { return /* binding */ debounce; }
8171                /* harmony export */ });
8172            function debounce(fn) {
8173                var pending;
8174                return function () {
8175                    if (!pending) {
8176                        pending = new Promise(function (resolve) {
8177                            Promise.resolve().then(function () {
8178                                pending = undefined;
8179                                resolve(fn());
8180                            });
8181                        });
8182                    }
8183
8184                    return pending;
8185                };
8186            }
8187
8188            /***/ }),
8189
8190        
vendor: 7,215 bytes, lines 8190-8278
8190/***/ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js":
8191        /*!*****************************************************************!*\
8192  !*** ./node_modules/@popperjs/core/lib/utils/detectOverflow.js ***!
8193  \*****************************************************************/
8194        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8195
8196            "use strict";
8197            __webpack_require__.r(__webpack_exports__);
8198            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8199                /* harmony export */   "default": function() { return /* binding */ detectOverflow; }
8200                /* harmony export */ });
8201            /* harmony import */ var _dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getClippingRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js");
8202            /* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js");
8203            /* harmony import */ var _dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js");
8204            /* harmony import */ var _computeOffsets_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js");
8205            /* harmony import */ var _rectToClientRect_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js");
8206            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
8207            /* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js");
8208            /* harmony import */ var _mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js");
8209            /* harmony import */ var _expandToHashMap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js");
8210
8211
8212
8213
8214
8215
8216
8217
8218            // eslint-disable-next-line import/no-unused-modules
8219
8220            function detectOverflow(state, options) {
8221                if (options === void 0) {
8222                    options = {};
8223                }
8224
8225                var _options = options,
8226                    _options$placement = _options.placement,
8227                    placement = _options$placement === void 0 ? state.placement : _options$placement,
8228                    _options$strategy = _options.strategy,
8229                    strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,
8230                    _options$boundary = _options.boundary,
8231                    boundary = _options$boundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.clippingParents : _options$boundary,
8232                    _options$rootBoundary = _options.rootBoundary,
8233                    rootBoundary = _options$rootBoundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.viewport : _options$rootBoundary,
8234                    _options$elementConte = _options.elementContext,
8235                    elementContext = _options$elementConte === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper : _options$elementConte,
8236                    _options$altBoundary = _options.altBoundary,
8237                    altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,
8238                    _options$padding = _options.padding,
8239                    padding = _options$padding === void 0 ? 0 : _options$padding;
8240                var paddingObject = (0,_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(typeof padding !== 'number' ? padding : (0,_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_2__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_0__.basePlacements));
8241                var altContext = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper ? _enums_js__WEBPACK_IMPORTED_MODULE_0__.reference : _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper;
8242                var popperRect = state.rects.popper;
8243                var element = state.elements[altBoundary ? altContext : elementContext];
8244                var clippingClientRect = (0,_dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_3__["default"])((0,_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_4__.isElement)(element) ? element : element.contextElement || (0,_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(state.elements.popper), boundary, rootBoundary, strategy);
8245                var referenceClientRect = (0,_dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state.elements.reference);
8246                var popperOffsets = (0,_computeOffsets_js__WEBPACK_IMPORTED_MODULE_7__["default"])({
8247                    reference: referenceClientRect,
8248                    element: popperRect,
8249                    strategy: 'absolute',
8250                    placement: placement
8251                });
8252                var popperClientRect = (0,_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_8__["default"])(Object.assign({}, popperRect, popperOffsets));
8253                var elementClientRect = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect
8254                // 0 or negative = within the clipping rect
8255
8256                var overflowOffsets = {
8257                    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
8258                    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
8259                    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
8260                    right: elementClientRect.right - clippingClientRect.right + paddingObject.right
8261                };
8262                var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element
8263
8264                if (elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_0__.popper && offsetData) {
8265                    var offset = offsetData[placement];
8266                    Object.keys(overflowOffsets).forEach(function (key) {
8267                        var multiply = [_enums_js__WEBPACK_IMPORTED_MODULE_0__.right, _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom].indexOf(key) >= 0 ? 1 : -1;
8268                        var axis = [_enums_js__WEBPACK_IMPORTED_MODULE_0__.top, _enums_js__WEBPACK_IMPORTED_MODULE_0__.bottom].indexOf(key) >= 0 ? 'y' : 'x';
8269                        overflowOffsets[key] += offset[axis] * multiply;
8270                    });
8271                }
8272
8273                return overflowOffsets;
8274            }
8275
8276            /***/ }),
8277
8278        
vendor: 950 bytes, lines 8278-8298
8278/***/ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js":
8279        /*!******************************************************************!*\
8280  !*** ./node_modules/@popperjs/core/lib/utils/expandToHashMap.js ***!
8281  \******************************************************************/
8282        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8283
8284            "use strict";
8285            __webpack_require__.r(__webpack_exports__);
8286            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8287                /* harmony export */   "default": function() { return /* binding */ expandToHashMap; }
8288                /* harmony export */ });
8289            function expandToHashMap(value, keys) {
8290                return keys.reduce(function (hashMap, key) {
8291                    hashMap[key] = value;
8292                    return hashMap;
8293                }, {});
8294            }
8295
8296            /***/ }),
8297
8298        
vendor: 799 bytes, lines 8298-8315
8298/***/ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js":
8299        /*!*************************************************************!*\
8300  !*** ./node_modules/@popperjs/core/lib/utils/getAltAxis.js ***!
8301  \*************************************************************/
8302        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8303
8304            "use strict";
8305            __webpack_require__.r(__webpack_exports__);
8306            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8307                /* harmony export */   "default": function() { return /* binding */ getAltAxis; }
8308                /* harmony export */ });
8309            function getAltAxis(axis) {
8310                return axis === 'x' ? 'y' : 'x';
8311            }
8312
8313            /***/ }),
8314
8315        
vendor: 840 bytes, lines 8315-8333
8315/***/ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js":
8316        /*!*******************************************************************!*\
8317  !*** ./node_modules/@popperjs/core/lib/utils/getBasePlacement.js ***!
8318  \*******************************************************************/
8319        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8320
8321            "use strict";
8322            __webpack_require__.r(__webpack_exports__);
8323            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8324                /* harmony export */   "default": function() { return /* binding */ getBasePlacement; }
8325                /* harmony export */ });
8326
8327            function getBasePlacement(placement) {
8328                return placement.split('-')[0];
8329            }
8330
8331            /***/ }),
8332
8333        
vendor: 955 bytes, lines 8333-8355
8333/***/ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js":
8334        /*!*********************************************************************!*\
8335  !*** ./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js ***!
8336  \*********************************************************************/
8337        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8338
8339            "use strict";
8340            __webpack_require__.r(__webpack_exports__);
8341            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8342                /* harmony export */   "default": function() { return /* binding */ getFreshSideObject; }
8343                /* harmony export */ });
8344            function getFreshSideObject() {
8345                return {
8346                    top: 0,
8347                    right: 0,
8348                    bottom: 0,
8349                    left: 0
8350                };
8351            }
8352
8353            /***/ }),
8354
8355        
vendor: 917 bytes, lines 8355-8372
8355/***/ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js":
8356        /*!***************************************************************************!*\
8357  !*** ./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js ***!
8358  \***************************************************************************/
8359        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8360
8361            "use strict";
8362            __webpack_require__.r(__webpack_exports__);
8363            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8364                /* harmony export */   "default": function() { return /* binding */ getMainAxisFromPlacement; }
8365                /* harmony export */ });
8366            function getMainAxisFromPlacement(placement) {
8367                return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
8368            }
8369
8370            /***/ }),
8371
8372        
vendor: 1,128 bytes, lines 8372-8397
8372/***/ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js":
8373        /*!***********************************************************************!*\
8374  !*** ./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js ***!
8375  \***********************************************************************/
8376        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8377
8378            "use strict";
8379            __webpack_require__.r(__webpack_exports__);
8380            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8381                /* harmony export */   "default": function() { return /* binding */ getOppositePlacement; }
8382                /* harmony export */ });
8383            var hash = {
8384                left: 'right',
8385                right: 'left',
8386                bottom: 'top',
8387                top: 'bottom'
8388            };
8389            function getOppositePlacement(placement) {
8390                return placement.replace(/left|right|bottom|top/g, function (matched) {
8391                    return hash[matched];
8392                });
8393            }
8394
8395            /***/ }),
8396
8397        
vendor: 1,106 bytes, lines 8397-8420
8397/***/ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js":
8398        /*!********************************************************************************!*\
8399  !*** ./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js ***!
8400  \********************************************************************************/
8401        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8402
8403            "use strict";
8404            __webpack_require__.r(__webpack_exports__);
8405            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8406                /* harmony export */   "default": function() { return /* binding */ getOppositeVariationPlacement; }
8407                /* harmony export */ });
8408            var hash = {
8409                start: 'end',
8410                end: 'start'
8411            };
8412            function getOppositeVariationPlacement(placement) {
8413                return placement.replace(/start|end/g, function (matched) {
8414                    return hash[matched];
8415                });
8416            }
8417
8418            /***/ }),
8419
8420        
vendor: 815 bytes, lines 8420-8437
8420/***/ "./node_modules/@popperjs/core/lib/utils/getVariation.js":
8421        /*!***************************************************************!*\
8422  !*** ./node_modules/@popperjs/core/lib/utils/getVariation.js ***!
8423  \***************************************************************/
8424        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8425
8426            "use strict";
8427            __webpack_require__.r(__webpack_exports__);
8428            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8429                /* harmony export */   "default": function() { return /* binding */ getVariation; }
8430                /* harmony export */ });
8431            function getVariation(placement) {
8432                return placement.split('-')[1];
8433            }
8434
8435            /***/ }),
8436
8437        
vendor: 935 bytes, lines 8437-8456
8437/***/ "./node_modules/@popperjs/core/lib/utils/math.js":
8438        /*!*******************************************************!*\
8439  !*** ./node_modules/@popperjs/core/lib/utils/math.js ***!
8440  \*******************************************************/
8441        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8442
8443            "use strict";
8444            __webpack_require__.r(__webpack_exports__);
8445            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8446                /* harmony export */   max: function() { return /* binding */ max; },
8447                /* harmony export */   min: function() { return /* binding */ min; },
8448                /* harmony export */   round: function() { return /* binding */ round; }
8449                /* harmony export */ });
8450            var max = Math.max;
8451            var min = Math.min;
8452            var round = Math.round;
8453
8454            /***/ }),
8455
8456        
vendor: 1,407 bytes, lines 8456-8484
8456/***/ "./node_modules/@popperjs/core/lib/utils/mergeByName.js":
8457        /*!**************************************************************!*\
8458  !*** ./node_modules/@popperjs/core/lib/utils/mergeByName.js ***!
8459  \**************************************************************/
8460        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8461
8462            "use strict";
8463            __webpack_require__.r(__webpack_exports__);
8464            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8465                /* harmony export */   "default": function() { return /* binding */ mergeByName; }
8466                /* harmony export */ });
8467            function mergeByName(modifiers) {
8468                var merged = modifiers.reduce(function (merged, current) {
8469                    var existing = merged[current.name];
8470                    merged[current.name] = existing ? Object.assign({}, existing, current, {
8471                        options: Object.assign({}, existing.options, current.options),
8472                        data: Object.assign({}, existing.data, current.data)
8473                    }) : current;
8474                    return merged;
8475                }, {}); // IE11 does not support Object.values
8476
8477                return Object.keys(merged).map(function (key) {
8478                    return merged[key];
8479                });
8480            }
8481
8482            /***/ }),
8483
8484        
vendor: 1,143 bytes, lines 8484-8503
8484/***/ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js":
8485        /*!*********************************************************************!*\
8486  !*** ./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js ***!
8487  \*********************************************************************/
8488        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8489
8490            "use strict";
8491            __webpack_require__.r(__webpack_exports__);
8492            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8493                /* harmony export */   "default": function() { return /* binding */ mergePaddingObject; }
8494                /* harmony export */ });
8495            /* harmony import */ var _getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js");
8496
8497            function mergePaddingObject(paddingObject) {
8498                return Object.assign({}, (0,_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(), paddingObject);
8499            }
8500
8501            /***/ }),
8502
8503        
vendor: 2,687 bytes, lines 8503-8562
8503/***/ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js":
8504        /*!*****************************************************************!*\
8505  !*** ./node_modules/@popperjs/core/lib/utils/orderModifiers.js ***!
8506  \*****************************************************************/
8507        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8508
8509            "use strict";
8510            __webpack_require__.r(__webpack_exports__);
8511            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8512                /* harmony export */   "default": function() { return /* binding */ orderModifiers; }
8513                /* harmony export */ });
8514            /* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js");
8515            // source: https://stackoverflow.com/questions/49875255
8516
8517            function order(modifiers) {
8518                var map = new Map();
8519                var visited = new Set();
8520                var result = [];
8521                modifiers.forEach(function (modifier) {
8522                    map.set(modifier.name, modifier);
8523                }); // On visiting object, check for its dependencies and visit them recursively
8524
8525                function sort(modifier) {
8526                    visited.add(modifier.name);
8527                    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
8528                    requires.forEach(function (dep) {
8529                        if (!visited.has(dep)) {
8530                            var depModifier = map.get(dep);
8531
8532                            if (depModifier) {
8533                                sort(depModifier);
8534                            }
8535                        }
8536                    });
8537                    result.push(modifier);
8538                }
8539
8540                modifiers.forEach(function (modifier) {
8541                    if (!visited.has(modifier.name)) {
8542                        // check for visited object
8543                        sort(modifier);
8544                    }
8545                });
8546                return result;
8547            }
8548
8549            function orderModifiers(modifiers) {
8550                // order based on dependencies
8551                var orderedModifiers = order(modifiers); // order based on phase
8552
8553                return _enums_js__WEBPACK_IMPORTED_MODULE_0__.modifierPhases.reduce(function (acc, phase) {
8554                    return acc.concat(orderedModifiers.filter(function (modifier) {
8555                        return modifier.phase === phase;
8556                    }));
8557                }, []);
8558            }
8559
8560            /***/ }),
8561
8562        
vendor: 1,019 bytes, lines 8562-8584
8562/***/ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js":
8563        /*!*******************************************************************!*\
8564  !*** ./node_modules/@popperjs/core/lib/utils/rectToClientRect.js ***!
8565  \*******************************************************************/
8566        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8567
8568            "use strict";
8569            __webpack_require__.r(__webpack_exports__);
8570            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8571                /* harmony export */   "default": function() { return /* binding */ rectToClientRect; }
8572                /* harmony export */ });
8573            function rectToClientRect(rect) {
8574                return Object.assign({}, rect, {
8575                    left: rect.x,
8576                    top: rect.y,
8577                    right: rect.x + rect.width,
8578                    bottom: rect.y + rect.height
8579                });
8580            }
8581
8582            /***/ }),
8583
8584        
vendor: 1,110 bytes, lines 8584-8609
8584/***/ "./node_modules/@popperjs/core/lib/utils/userAgent.js":
8585        /*!************************************************************!*\
8586  !*** ./node_modules/@popperjs/core/lib/utils/userAgent.js ***!
8587  \************************************************************/
8588        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8589
8590            "use strict";
8591            __webpack_require__.r(__webpack_exports__);
8592            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8593                /* harmony export */   "default": function() { return /* binding */ getUAString; }
8594                /* harmony export */ });
8595            function getUAString() {
8596                var uaData = navigator.userAgentData;
8597
8598                if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
8599                    return uaData.brands.map(function (item) {
8600                        return item.brand + "/" + item.version;
8601                    }).join(' ');
8602                }
8603
8604                return navigator.userAgent;
8605            }
8606
8607            /***/ }),
8608
8609        
vendor: 1,303 bytes, lines 8609-8633
8609/***/ "./node_modules/@popperjs/core/lib/utils/within.js":
8610        /*!*********************************************************!*\
8611  !*** ./node_modules/@popperjs/core/lib/utils/within.js ***!
8612  \*********************************************************/
8613        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8614
8615            "use strict";
8616            __webpack_require__.r(__webpack_exports__);
8617            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8618                /* harmony export */   within: function() { return /* binding */ within; },
8619                /* harmony export */   withinMaxClamp: function() { return /* binding */ withinMaxClamp; }
8620                /* harmony export */ });
8621            /* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./math.js */ "./node_modules/@popperjs/core/lib/utils/math.js");
8622
8623            function within(min, value, max) {
8624                return (0,_math_js__WEBPACK_IMPORTED_MODULE_0__.max)(min, (0,_math_js__WEBPACK_IMPORTED_MODULE_0__.min)(value, max));
8625            }
8626            function withinMaxClamp(min, value, max) {
8627                var v = within(min, value, max);
8628                return v > max ? max : v;
8629            }
8630
8631            /***/ }),
8632
8633        
vendor: 14,805 bytes, lines 8633-8643
8633/***/ "./node_modules/aos/dist/aos.js":
8634        /*!**************************************!*\
8635  !*** ./node_modules/aos/dist/aos.js ***!
8636  \**************************************/
8637        /***/ (function(module) {
8638
8639            !function(e,t){ true?module.exports=t():0}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},r=n(1),a=(o(r),n(6)),u=o(a),c=n(7),s=o(c),f=n(8),d=o(f),l=n(9),p=o(l),m=n(10),b=o(m),v=n(11),y=o(v),g=n(14),h=o(g),w=[],k=!1,x={offset:120,delay:0,easing:"ease",duration:400,disable:!1,once:!1,startEvent:"DOMContentLoaded",throttleDelay:99,debounceDelay:50,disableMutationObserver:!1},j=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},M=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},S=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},_=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?M():(x.disableMutationObserver||d.default.isSupported()||(console.info('\n      aos: MutationObserver is not supported on this browser,\n      code mutations observing has been disabled.\n      You may have to call "refreshHard()" by yourself.\n    '),x.disableMutationObserver=!0),document.querySelector("body").setAttribute("data-aos-easing",x.easing),document.querySelector("body").setAttribute("data-aos-duration",x.duration),document.querySelector("body").setAttribute("data-aos-delay",x.delay),"DOMContentLoaded"===x.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?j(!0):"load"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener("resize",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener("orientationchange",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||d.default.ready("[data-aos]",O),w)};e.exports={init:_,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(f,t),M?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=O();return c(e)?d(e):void(h=setTimeout(f,a(e)))}function d(e){return h=void 0,_&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),o(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,k=0,M=!1,S=!1,_=!0;if("function"!=typeof e)throw new TypeError(s);return t=u(t)||0,i(n)&&(M=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(s);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return f;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?f:+e}var c="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},s="Expected a function",f=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(f,t),M?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function s(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=j();return s(e)?d(e):void(h=setTimeout(f,u(e)))}function d(e){return h=void 0,_&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=s(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),i(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,O=0,M=!1,S=!1,_=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(M=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==f}function a(e){if("number"==typeof e)return e;if(r(e))return s;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?s:+e}var u="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},c="Expected a function",s=NaN,f="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e){var t=void 0,o=void 0,i=void 0;for(t=0;t<e.length;t+=1){if(o=e[t],o.dataset&&o.dataset.aos)return!0;if(i=o.children&&n(o.children))return!0}return!1}function o(){return window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver}function i(){return!!o()}function r(e,t){var n=window.document,i=o(),r=new i(a);u=t,r.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function a(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),o=Array.prototype.slice.call(e.removedNodes),i=t.concat(o);if(n(i))return u()})}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){};t.default={isSupported:i,ready:r}},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),r=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,a=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,u=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i,c=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,s=function(){function e(){n(this,e)}return i(e,[{key:"phone",value:function(){var e=o();return!(!r.test(e)&&!a.test(e.substr(0,4)))}},{key:"mobile",value:function(){var e=o();return!(!u.test(e)&&!c.test(e.substr(0,4)))}},{key:"tablet",value:function(){return this.mobile()&&!this.phone()}}]),e}();t.default=new s},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t,n){var o=e.node.getAttribute("data-aos-once");t>e.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});
8640
8641            /***/ }),
8642
8643        
vendor: 395 bytes, lines 8643-8653
8643/***/ "./node_modules/axios/index.js":
8644        /*!*************************************!*\
8645  !*** ./node_modules/axios/index.js ***!
8646  \*************************************/
8647        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
8648
8649            module.exports = __webpack_require__(/*! ./lib/axios */ "./node_modules/axios/lib/axios.js");
8650
8651            /***/ }),
8652
8653        
vendor: 11,709 bytes, lines 8653-8886
8653/***/ "./node_modules/axios/lib/adapters/xhr.js":
8654        /*!************************************************!*\
8655  !*** ./node_modules/axios/lib/adapters/xhr.js ***!
8656  \************************************************/
8657        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
8658
8659            "use strict";
8660
8661
8662            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
8663            var settle = __webpack_require__(/*! ./../core/settle */ "./node_modules/axios/lib/core/settle.js");
8664            var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./node_modules/axios/lib/helpers/cookies.js");
8665            var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js");
8666            var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ "./node_modules/axios/lib/core/buildFullPath.js");
8667            var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./node_modules/axios/lib/helpers/parseHeaders.js");
8668            var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./node_modules/axios/lib/helpers/isURLSameOrigin.js");
8669            var transitionalDefaults = __webpack_require__(/*! ../defaults/transitional */ "./node_modules/axios/lib/defaults/transitional.js");
8670            var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js");
8671            var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js");
8672            var parseProtocol = __webpack_require__(/*! ../helpers/parseProtocol */ "./node_modules/axios/lib/helpers/parseProtocol.js");
8673
8674            module.exports = function xhrAdapter(config) {
8675                return new Promise(function dispatchXhrRequest(resolve, reject) {
8676                    var requestData = config.data;
8677                    var requestHeaders = config.headers;
8678                    var responseType = config.responseType;
8679                    var onCanceled;
8680                    function done() {
8681                        if (config.cancelToken) {
8682                            config.cancelToken.unsubscribe(onCanceled);
8683                        }
8684
8685                        if (config.signal) {
8686                            config.signal.removeEventListener('abort', onCanceled);
8687                        }
8688                    }
8689
8690                    if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {
8691                        delete requestHeaders['Content-Type']; // Let the browser set it
8692                    }
8693
8694                    var request = new XMLHttpRequest();
8695
8696                    // HTTP basic authentication
8697                    if (config.auth) {
8698                        var username = config.auth.username || '';
8699                        var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
8700                        requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
8701                    }
8702
8703                    var fullPath = buildFullPath(config.baseURL, config.url);
8704
8705                    request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
8706
8707                    // Set the request timeout in MS
8708                    request.timeout = config.timeout;
8709
8710                    function onloadend() {
8711                        if (!request) {
8712                            return;
8713                        }
8714                        // Prepare the response
8715                        var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
8716                        var responseData = !responseType || responseType === 'text' ||  responseType === 'json' ?
8717                            request.responseText : request.response;
8718                        var response = {
8719                            data: responseData,
8720                            status: request.status,
8721                            statusText: request.statusText,
8722                            headers: responseHeaders,
8723                            config: config,
8724                            request: request
8725                        };
8726
8727                        settle(function _resolve(value) {
8728                            resolve(value);
8729                            done();
8730                        }, function _reject(err) {
8731                            reject(err);
8732                            done();
8733                        }, response);
8734
8735                        // Clean up request
8736                        request = null;
8737                    }
8738
8739                    if ('onloadend' in request) {
8740                        // Use onloadend if available
8741                        request.onloadend = onloadend;
8742                    } else {
8743                        // Listen for ready state to emulate onloadend
8744                        request.onreadystatechange = function handleLoad() {
8745                            if (!request || request.readyState !== 4) {
8746                                return;
8747                            }
8748
8749                            // The request errored out and we didn't get a response, this will be
8750                            // handled by onerror instead
8751                            // With one exception: request that using file: protocol, most browsers
8752                            // will return status as 0 even though it's a successful request
8753                            if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
8754                                return;
8755                            }
8756                            // readystate handler is calling before onerror or ontimeout handlers,
8757                            // so we should call onloadend on the next 'tick'
8758                            setTimeout(onloadend);
8759                        };
8760                    }
8761
8762                    // Handle browser request cancellation (as opposed to a manual cancellation)
8763                    request.onabort = function handleAbort() {
8764                        if (!request) {
8765                            return;
8766                        }
8767
8768                        reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
8769
8770                        // Clean up request
8771                        request = null;
8772                    };
8773
8774                    // Handle low level network errors
8775                    request.onerror = function handleError() {
8776                        // Real errors are hidden from us by the browser
8777                        // onerror should only fire if it's a network error
8778                        reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request));
8779
8780                        // Clean up request
8781                        request = null;
8782                    };
8783
8784                    // Handle timeout
8785                    request.ontimeout = function handleTimeout() {
8786                        var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
8787                        var transitional = config.transitional || transitionalDefaults;
8788                        if (config.timeoutErrorMessage) {
8789                            timeoutErrorMessage = config.timeoutErrorMessage;
8790                        }
8791                        reject(new AxiosError(
8792                            timeoutErrorMessage,
8793                            transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
8794                            config,
8795                            request));
8796
8797                        // Clean up request
8798                        request = null;
8799                    };
8800
8801                    // Add xsrf header
8802                    // This is only done if running in a standard browser environment.
8803                    // Specifically not if we're in a web worker, or react-native.
8804                    if (utils.isStandardBrowserEnv()) {
8805                        // Add xsrf header
8806                        var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
8807                            cookies.read(config.xsrfCookieName) :
8808                            undefined;
8809
8810                        if (xsrfValue) {
8811                            requestHeaders[config.xsrfHeaderName] = xsrfValue;
8812                        }
8813                    }
8814
8815                    // Add headers to the request
8816                    if ('setRequestHeader' in request) {
8817                        utils.forEach(requestHeaders, function setRequestHeader(val, key) {
8818                            if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
8819                                // Remove Content-Type if data is undefined
8820                                delete requestHeaders[key];
8821                            } else {
8822                                // Otherwise add header to the request
8823                                request.setRequestHeader(key, val);
8824                            }
8825                        });
8826                    }
8827
8828                    // Add withCredentials to request if needed
8829                    if (!utils.isUndefined(config.withCredentials)) {
8830                        request.withCredentials = !!config.withCredentials;
8831                    }
8832
8833                    // Add responseType to request if needed
8834                    if (responseType && responseType !== 'json') {
8835                        request.responseType = config.responseType;
8836                    }
8837
8838                    // Handle progress if needed
8839                    if (typeof config.onDownloadProgress === 'function') {
8840                        request.addEventListener('progress', config.onDownloadProgress);
8841                    }
8842
8843                    // Not all browsers support upload events
8844                    if (typeof config.onUploadProgress === 'function' && request.upload) {
8845                        request.upload.addEventListener('progress', config.onUploadProgress);
8846                    }
8847
8848                    if (config.cancelToken || config.signal) {
8849                        // Handle cancellation
8850                        // eslint-disable-next-line func-names
8851                        onCanceled = function(cancel) {
8852                            if (!request) {
8853                                return;
8854                            }
8855                            reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);
8856                            request.abort();
8857                            request = null;
8858                        };
8859
8860                        config.cancelToken && config.cancelToken.subscribe(onCanceled);
8861                        if (config.signal) {
8862                            config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
8863                        }
8864                    }
8865
8866                    if (!requestData) {
8867                        requestData = null;
8868                    }
8869
8870                    var protocol = parseProtocol(fullPath);
8871
8872                    if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) {
8873                        reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
8874                        return;
8875                    }
8876
8877
8878                    // Send the request
8879                    request.send(requestData);
8880                });
8881            };
8882
8883
8884            /***/ }),
8885
8886        
vendor: 3,438 bytes, lines 8886-8961
8886/***/ "./node_modules/axios/lib/axios.js":
8887        /*!*****************************************!*\
8888  !*** ./node_modules/axios/lib/axios.js ***!
8889  \*****************************************/
8890        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
8891
8892            "use strict";
8893
8894
8895            var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js");
8896            var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js");
8897            var Axios = __webpack_require__(/*! ./core/Axios */ "./node_modules/axios/lib/core/Axios.js");
8898            var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js");
8899            var defaults = __webpack_require__(/*! ./defaults */ "./node_modules/axios/lib/defaults/index.js");
8900
8901            /**
8902             * Create an instance of Axios
8903             *
8904             * @param {Object} defaultConfig The default config for the instance
8905             * @return {Axios} A new instance of Axios
8906             */
8907            function createInstance(defaultConfig) {
8908                var context = new Axios(defaultConfig);
8909                var instance = bind(Axios.prototype.request, context);
8910
8911                // Copy axios.prototype to instance
8912                utils.extend(instance, Axios.prototype, context);
8913
8914                // Copy context to instance
8915                utils.extend(instance, context);
8916
8917                // Factory for creating new instances
8918                instance.create = function create(instanceConfig) {
8919                    return createInstance(mergeConfig(defaultConfig, instanceConfig));
8920                };
8921
8922                return instance;
8923            }
8924
8925// Create the default instance to be exported
8926            var axios = createInstance(defaults);
8927
8928// Expose Axios class to allow class inheritance
8929            axios.Axios = Axios;
8930
8931// Expose Cancel & CancelToken
8932            axios.CanceledError = __webpack_require__(/*! ./cancel/CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js");
8933            axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./node_modules/axios/lib/cancel/CancelToken.js");
8934            axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js");
8935            axios.VERSION = (__webpack_require__(/*! ./env/data */ "./node_modules/axios/lib/env/data.js").version);
8936            axios.toFormData = __webpack_require__(/*! ./helpers/toFormData */ "./node_modules/axios/lib/helpers/toFormData.js");
8937
8938// Expose AxiosError class
8939            axios.AxiosError = __webpack_require__(/*! ../lib/core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js");
8940
8941// alias for CanceledError for backward compatibility
8942            axios.Cancel = axios.CanceledError;
8943
8944// Expose all/spread
8945            axios.all = function all(promises) {
8946                return Promise.all(promises);
8947            };
8948            axios.spread = __webpack_require__(/*! ./helpers/spread */ "./node_modules/axios/lib/helpers/spread.js");
8949
8950// Expose isAxiosError
8951            axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./node_modules/axios/lib/helpers/isAxiosError.js");
8952
8953            module.exports = axios;
8954
8955// Allow use of default import syntax in TypeScript
8956            module.exports["default"] = axios;
8957
8958
8959            /***/ }),
8960
8961        
vendor: 4,314 bytes, lines 8961-9091
8961/***/ "./node_modules/axios/lib/cancel/CancelToken.js":
8962        /*!******************************************************!*\
8963  !*** ./node_modules/axios/lib/cancel/CancelToken.js ***!
8964  \******************************************************/
8965        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
8966
8967            "use strict";
8968
8969
8970            var CanceledError = __webpack_require__(/*! ./CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js");
8971
8972            /**
8973             * A `CancelToken` is an object that can be used to request cancellation of an operation.
8974             *
8975             * @class
8976             * @param {Function} executor The executor function.
8977             */
8978            function CancelToken(executor) {
8979                if (typeof executor !== 'function') {
8980                    throw new TypeError('executor must be a function.');
8981                }
8982
8983                var resolvePromise;
8984
8985                this.promise = new Promise(function promiseExecutor(resolve) {
8986                    resolvePromise = resolve;
8987                });
8988
8989                var token = this;
8990
8991                // eslint-disable-next-line func-names
8992                this.promise.then(function(cancel) {
8993                    if (!token._listeners) return;
8994
8995                    var i;
8996                    var l = token._listeners.length;
8997
8998                    for (i = 0; i < l; i++) {
8999                        token._listeners[i](cancel);
9000                    }
9001                    token._listeners = null;
9002                });
9003
9004                // eslint-disable-next-line func-names
9005                this.promise.then = function(onfulfilled) {
9006                    var _resolve;
9007                    // eslint-disable-next-line func-names
9008                    var promise = new Promise(function(resolve) {
9009                        token.subscribe(resolve);
9010                        _resolve = resolve;
9011                    }).then(onfulfilled);
9012
9013                    promise.cancel = function reject() {
9014                        token.unsubscribe(_resolve);
9015                    };
9016
9017                    return promise;
9018                };
9019
9020                executor(function cancel(message) {
9021                    if (token.reason) {
9022                        // Cancellation has already been requested
9023                        return;
9024                    }
9025
9026                    token.reason = new CanceledError(message);
9027                    resolvePromise(token.reason);
9028                });
9029            }
9030
9031            /**
9032             * Throws a `CanceledError` if cancellation has been requested.
9033             */
9034            CancelToken.prototype.throwIfRequested = function throwIfRequested() {
9035                if (this.reason) {
9036                    throw this.reason;
9037                }
9038            };
9039
9040            /**
9041             * Subscribe to the cancel signal
9042             */
9043
9044            CancelToken.prototype.subscribe = function subscribe(listener) {
9045                if (this.reason) {
9046                    listener(this.reason);
9047                    return;
9048                }
9049
9050                if (this._listeners) {
9051                    this._listeners.push(listener);
9052                } else {
9053                    this._listeners = [listener];
9054                }
9055            };
9056
9057            /**
9058             * Unsubscribe from the cancel signal
9059             */
9060
9061            CancelToken.prototype.unsubscribe = function unsubscribe(listener) {
9062                if (!this._listeners) {
9063                    return;
9064                }
9065                var index = this._listeners.indexOf(listener);
9066                if (index !== -1) {
9067                    this._listeners.splice(index, 1);
9068                }
9069            };
9070
9071            /**
9072             * Returns an object that contains a new `CancelToken` and a function that, when called,
9073             * cancels the `CancelToken`.
9074             */
9075            CancelToken.source = function source() {
9076                var cancel;
9077                var token = new CancelToken(function executor(c) {
9078                    cancel = c;
9079                });
9080                return {
9081                    token: token,
9082                    cancel: cancel
9083                };
9084            };
9085
9086            module.exports = CancelToken;
9087
9088
9089            /***/ }),
9090
9091        
vendor: 1,252 bytes, lines 9091-9124
9091/***/ "./node_modules/axios/lib/cancel/CanceledError.js":
9092        /*!********************************************************!*\
9093  !*** ./node_modules/axios/lib/cancel/CanceledError.js ***!
9094  \********************************************************/
9095        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9096
9097            "use strict";
9098
9099
9100            var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js");
9101            var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
9102
9103            /**
9104             * A `CanceledError` is an object that is thrown when an operation is canceled.
9105             *
9106             * @class
9107             * @param {string=} message The message.
9108             */
9109            function CanceledError(message) {
9110                // eslint-disable-next-line no-eq-null,eqeqeq
9111                AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED);
9112                this.name = 'CanceledError';
9113            }
9114
9115            utils.inherits(CanceledError, AxiosError, {
9116                __CANCEL__: true
9117            });
9118
9119            module.exports = CanceledError;
9120
9121
9122            /***/ }),
9123
9124        
vendor: 452 bytes, lines 9124-9140
9124/***/ "./node_modules/axios/lib/cancel/isCancel.js":
9125        /*!***************************************************!*\
9126  !*** ./node_modules/axios/lib/cancel/isCancel.js ***!
9127  \***************************************************/
9128        /***/ (function(module) {
9129
9130            "use strict";
9131
9132
9133            module.exports = function isCancel(value) {
9134                return !!(value && value.__CANCEL__);
9135            };
9136
9137
9138            /***/ }),
9139
9140        
vendor: 7,292 bytes, lines 9140-9311
9140/***/ "./node_modules/axios/lib/core/Axios.js":
9141        /*!**********************************************!*\
9142  !*** ./node_modules/axios/lib/core/Axios.js ***!
9143  \**********************************************/
9144        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9145
9146            "use strict";
9147
9148
9149            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
9150            var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js");
9151            var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js");
9152            var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js");
9153            var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js");
9154            var buildFullPath = __webpack_require__(/*! ./buildFullPath */ "./node_modules/axios/lib/core/buildFullPath.js");
9155            var validator = __webpack_require__(/*! ../helpers/validator */ "./node_modules/axios/lib/helpers/validator.js");
9156
9157            var validators = validator.validators;
9158            /**
9159             * Create a new instance of Axios
9160             *
9161             * @param {Object} instanceConfig The default config for the instance
9162             */
9163            function Axios(instanceConfig) {
9164                this.defaults = instanceConfig;
9165                this.interceptors = {
9166                    request: new InterceptorManager(),
9167                    response: new InterceptorManager()
9168                };
9169            }
9170
9171            /**
9172             * Dispatch a request
9173             *
9174             * @param {Object} config The config specific for this request (merged with this.defaults)
9175             */
9176            Axios.prototype.request = function request(configOrUrl, config) {
9177                /*eslint no-param-reassign:0*/
9178                // Allow for axios('example/url'[, config]) a la fetch API
9179                if (typeof configOrUrl === 'string') {
9180                    config = config || {};
9181                    config.url = configOrUrl;
9182                } else {
9183                    config = configOrUrl || {};
9184                }
9185
9186                config = mergeConfig(this.defaults, config);
9187
9188                // Set config.method
9189                if (config.method) {
9190                    config.method = config.method.toLowerCase();
9191                } else if (this.defaults.method) {
9192                    config.method = this.defaults.method.toLowerCase();
9193                } else {
9194                    config.method = 'get';
9195                }
9196
9197                var transitional = config.transitional;
9198
9199                if (transitional !== undefined) {
9200                    validator.assertOptions(transitional, {
9201                        silentJSONParsing: validators.transitional(validators.boolean),
9202                        forcedJSONParsing: validators.transitional(validators.boolean),
9203                        clarifyTimeoutError: validators.transitional(validators.boolean)
9204                    }, false);
9205                }
9206
9207                // filter out skipped interceptors
9208                var requestInterceptorChain = [];
9209                var synchronousRequestInterceptors = true;
9210                this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
9211                    if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
9212                        return;
9213                    }
9214
9215                    synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
9216
9217                    requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
9218                });
9219
9220                var responseInterceptorChain = [];
9221                this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
9222                    responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
9223                });
9224
9225                var promise;
9226
9227                if (!synchronousRequestInterceptors) {
9228                    var chain = [dispatchRequest, undefined];
9229
9230                    Array.prototype.unshift.apply(chain, requestInterceptorChain);
9231                    chain = chain.concat(responseInterceptorChain);
9232
9233                    promise = Promise.resolve(config);
9234                    while (chain.length) {
9235                        promise = promise.then(chain.shift(), chain.shift());
9236                    }
9237
9238                    return promise;
9239                }
9240
9241
9242                var newConfig = config;
9243                while (requestInterceptorChain.length) {
9244                    var onFulfilled = requestInterceptorChain.shift();
9245                    var onRejected = requestInterceptorChain.shift();
9246                    try {
9247                        newConfig = onFulfilled(newConfig);
9248                    } catch (error) {
9249                        onRejected(error);
9250                        break;
9251                    }
9252                }
9253
9254                try {
9255                    promise = dispatchRequest(newConfig);
9256                } catch (error) {
9257                    return Promise.reject(error);
9258                }
9259
9260                while (responseInterceptorChain.length) {
9261                    promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
9262                }
9263
9264                return promise;
9265            };
9266
9267            Axios.prototype.getUri = function getUri(config) {
9268                config = mergeConfig(this.defaults, config);
9269                var fullPath = buildFullPath(config.baseURL, config.url);
9270                return buildURL(fullPath, config.params, config.paramsSerializer);
9271            };
9272
9273// Provide aliases for supported request methods
9274            utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
9275                /*eslint func-names:0*/
9276                Axios.prototype[method] = function(url, config) {
9277                    return this.request(mergeConfig(config || {}, {
9278                        method: method,
9279                        url: url,
9280                        data: (config || {}).data
9281                    }));
9282                };
9283            });
9284
9285            utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
9286                /*eslint func-names:0*/
9287
9288                function generateHTTPMethod(isForm) {
9289                    return function httpMethod(url, data, config) {
9290                        return this.request(mergeConfig(config || {}, {
9291                            method: method,
9292                            headers: isForm ? {
9293                                'Content-Type': 'multipart/form-data'
9294                            } : {},
9295                            url: url,
9296                            data: data
9297                        }));
9298                    };
9299                }
9300
9301                Axios.prototype[method] = generateHTTPMethod();
9302
9303                Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
9304            });
9305
9306            module.exports = Axios;
9307
9308
9309            /***/ }),
9310
9311        
vendor: 3,662 bytes, lines 9311-9408
9311/***/ "./node_modules/axios/lib/core/AxiosError.js":
9312        /*!***************************************************!*\
9313  !*** ./node_modules/axios/lib/core/AxiosError.js ***!
9314  \***************************************************/
9315        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9316
9317            "use strict";
9318
9319
9320            var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
9321
9322            /**
9323             * Create an Error with the specified message, config, error code, request and response.
9324             *
9325             * @param {string} message The error message.
9326             * @param {string} [code] The error code (for example, 'ECONNABORTED').
9327             * @param {Object} [config] The config.
9328             * @param {Object} [request] The request.
9329             * @param {Object} [response] The response.
9330             * @returns {Error} The created error.
9331             */
9332            function AxiosError(message, code, config, request, response) {
9333                Error.call(this);
9334                this.message = message;
9335                this.name = 'AxiosError';
9336                code && (this.code = code);
9337                config && (this.config = config);
9338                request && (this.request = request);
9339                response && (this.response = response);
9340            }
9341
9342            utils.inherits(AxiosError, Error, {
9343                toJSON: function toJSON() {
9344                    return {
9345                        // Standard
9346                        message: this.message,
9347                        name: this.name,
9348                        // Microsoft
9349                        description: this.description,
9350                        number: this.number,
9351                        // Mozilla
9352                        fileName: this.fileName,
9353                        lineNumber: this.lineNumber,
9354                        columnNumber: this.columnNumber,
9355                        stack: this.stack,
9356                        // Axios
9357                        config: this.config,
9358                        code: this.code,
9359                        status: this.response && this.response.status ? this.response.status : null
9360                    };
9361                }
9362            });
9363
9364            var prototype = AxiosError.prototype;
9365            var descriptors = {};
9366
9367            [
9368                'ERR_BAD_OPTION_VALUE',
9369                'ERR_BAD_OPTION',
9370                'ECONNABORTED',
9371                'ETIMEDOUT',
9372                'ERR_NETWORK',
9373                'ERR_FR_TOO_MANY_REDIRECTS',
9374                'ERR_DEPRECATED',
9375                'ERR_BAD_RESPONSE',
9376                'ERR_BAD_REQUEST',
9377                'ERR_CANCELED'
9378// eslint-disable-next-line func-names
9379            ].forEach(function(code) {
9380                descriptors[code] = {value: code};
9381            });
9382
9383            Object.defineProperties(AxiosError, descriptors);
9384            Object.defineProperty(prototype, 'isAxiosError', {value: true});
9385
9386// eslint-disable-next-line func-names
9387            AxiosError.from = function(error, code, config, request, response, customProps) {
9388                var axiosError = Object.create(prototype);
9389
9390                utils.toFlatObject(error, axiosError, function filter(obj) {
9391                    return obj !== Error.prototype;
9392                });
9393
9394                AxiosError.call(axiosError, error.message, code, config, request, response);
9395
9396                axiosError.name = error.name;
9397
9398                customProps && Object.assign(axiosError, customProps);
9399
9400                return axiosError;
9401            };
9402
9403            module.exports = AxiosError;
9404
9405
9406            /***/ }),
9407
9408        
vendor: 2,421 bytes, lines 9408-9473
9408/***/ "./node_modules/axios/lib/core/InterceptorManager.js":
9409        /*!***********************************************************!*\
9410  !*** ./node_modules/axios/lib/core/InterceptorManager.js ***!
9411  \***********************************************************/
9412        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9413
9414            "use strict";
9415
9416
9417            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
9418
9419            function InterceptorManager() {
9420                this.handlers = [];
9421            }
9422
9423            /**
9424             * Add a new interceptor to the stack
9425             *
9426             * @param {Function} fulfilled The function to handle `then` for a `Promise`
9427             * @param {Function} rejected The function to handle `reject` for a `Promise`
9428             *
9429             * @return {Number} An ID used to remove interceptor later
9430             */
9431            InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {
9432                this.handlers.push({
9433                    fulfilled: fulfilled,
9434                    rejected: rejected,
9435                    synchronous: options ? options.synchronous : false,
9436                    runWhen: options ? options.runWhen : null
9437                });
9438                return this.handlers.length - 1;
9439            };
9440
9441            /**
9442             * Remove an interceptor from the stack
9443             *
9444             * @param {Number} id The ID that was returned by `use`
9445             */
9446            InterceptorManager.prototype.eject = function eject(id) {
9447                if (this.handlers[id]) {
9448                    this.handlers[id] = null;
9449                }
9450            };
9451
9452            /**
9453             * Iterate over all the registered interceptors
9454             *
9455             * This method is particularly useful for skipping over any
9456             * interceptors that may have become `null` calling `eject`.
9457             *
9458             * @param {Function} fn The function to call for each interceptor
9459             */
9460            InterceptorManager.prototype.forEach = function forEach(fn) {
9461                utils.forEach(this.handlers, function forEachHandler(h) {
9462                    if (h !== null) {
9463                        fn(h);
9464                    }
9465                });
9466            };
9467
9468            module.exports = InterceptorManager;
9469
9470
9471            /***/ }),
9472
9473        
vendor: 1,416 bytes, lines 9473-9504
9473/***/ "./node_modules/axios/lib/core/buildFullPath.js":
9474        /*!******************************************************!*\
9475  !*** ./node_modules/axios/lib/core/buildFullPath.js ***!
9476  \******************************************************/
9477        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9478
9479            "use strict";
9480
9481
9482            var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ "./node_modules/axios/lib/helpers/isAbsoluteURL.js");
9483            var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ "./node_modules/axios/lib/helpers/combineURLs.js");
9484
9485            /**
9486             * Creates a new URL by combining the baseURL with the requestedURL,
9487             * only when the requestedURL is not already an absolute URL.
9488             * If the requestURL is absolute, this function returns the requestedURL untouched.
9489             *
9490             * @param {string} baseURL The base URL
9491             * @param {string} requestedURL Absolute or relative URL to combine
9492             * @returns {string} The combined full path
9493             */
9494            module.exports = function buildFullPath(baseURL, requestedURL) {
9495                if (baseURL && !isAbsoluteURL(requestedURL)) {
9496                    return combineURLs(baseURL, requestedURL);
9497                }
9498                return requestedURL;
9499            };
9500
9501
9502            /***/ }),
9503
9504        
vendor: 3,923 bytes, lines 9504-9602
9504/***/ "./node_modules/axios/lib/core/dispatchRequest.js":
9505        /*!********************************************************!*\
9506  !*** ./node_modules/axios/lib/core/dispatchRequest.js ***!
9507  \********************************************************/
9508        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9509
9510            "use strict";
9511
9512
9513            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
9514            var transformData = __webpack_require__(/*! ./transformData */ "./node_modules/axios/lib/core/transformData.js");
9515            var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js");
9516            var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults/index.js");
9517            var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./node_modules/axios/lib/cancel/CanceledError.js");
9518
9519            /**
9520             * Throws a `CanceledError` if cancellation has been requested.
9521             */
9522            function throwIfCancellationRequested(config) {
9523                if (config.cancelToken) {
9524                    config.cancelToken.throwIfRequested();
9525                }
9526
9527                if (config.signal && config.signal.aborted) {
9528                    throw new CanceledError();
9529                }
9530            }
9531
9532            /**
9533             * Dispatch a request to the server using the configured adapter.
9534             *
9535             * @param {object} config The config that is to be used for the request
9536             * @returns {Promise} The Promise to be fulfilled
9537             */
9538            module.exports = function dispatchRequest(config) {
9539                throwIfCancellationRequested(config);
9540
9541                // Ensure headers exist
9542                config.headers = config.headers || {};
9543
9544                // Transform request data
9545                config.data = transformData.call(
9546                    config,
9547                    config.data,
9548                    config.headers,
9549                    config.transformRequest
9550                );
9551
9552                // Flatten headers
9553                config.headers = utils.merge(
9554                    config.headers.common || {},
9555                    config.headers[config.method] || {},
9556                    config.headers
9557                );
9558
9559                utils.forEach(
9560                    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
9561                    function cleanHeaderConfig(method) {
9562                        delete config.headers[method];
9563                    }
9564                );
9565
9566                var adapter = config.adapter || defaults.adapter;
9567
9568                return adapter(config).then(function onAdapterResolution(response) {
9569                    throwIfCancellationRequested(config);
9570
9571                    // Transform response data
9572                    response.data = transformData.call(
9573                        config,
9574                        response.data,
9575                        response.headers,
9576                        config.transformResponse
9577                    );
9578
9579                    return response;
9580                }, function onAdapterRejection(reason) {
9581                    if (!isCancel(reason)) {
9582                        throwIfCancellationRequested(config);
9583
9584                        // Transform response data
9585                        if (reason && reason.response) {
9586                            reason.response.data = transformData.call(
9587                                config,
9588                                reason.response.data,
9589                                reason.response.headers,
9590                                config.transformResponse
9591                            );
9592                        }
9593                    }
9594
9595                    return Promise.reject(reason);
9596                });
9597            };
9598
9599
9600            /***/ }),
9601
9602        
vendor: 5,007 bytes, lines 9602-9713
9602/***/ "./node_modules/axios/lib/core/mergeConfig.js":
9603        /*!****************************************************!*\
9604  !*** ./node_modules/axios/lib/core/mergeConfig.js ***!
9605  \****************************************************/
9606        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9607
9608            "use strict";
9609
9610
9611            var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
9612
9613            /**
9614             * Config-specific merge-function which creates a new config-object
9615             * by merging two configuration objects together.
9616             *
9617             * @param {Object} config1
9618             * @param {Object} config2
9619             * @returns {Object} New object resulting from merging config2 to config1
9620             */
9621            module.exports = function mergeConfig(config1, config2) {
9622                // eslint-disable-next-line no-param-reassign
9623                config2 = config2 || {};
9624                var config = {};
9625
9626                function getMergedValue(target, source) {
9627                    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
9628                        return utils.merge(target, source);
9629                    } else if (utils.isPlainObject(source)) {
9630                        return utils.merge({}, source);
9631                    } else if (utils.isArray(source)) {
9632                        return source.slice();
9633                    }
9634                    return source;
9635                }
9636
9637                // eslint-disable-next-line consistent-return
9638                function mergeDeepProperties(prop) {
9639                    if (!utils.isUndefined(config2[prop])) {
9640                        return getMergedValue(config1[prop], config2[prop]);
9641                    } else if (!utils.isUndefined(config1[prop])) {
9642                        return getMergedValue(undefined, config1[prop]);
9643                    }
9644                }
9645
9646                // eslint-disable-next-line consistent-return
9647                function valueFromConfig2(prop) {
9648                    if (!utils.isUndefined(config2[prop])) {
9649                        return getMergedValue(undefined, config2[prop]);
9650                    }
9651                }
9652
9653                // eslint-disable-next-line consistent-return
9654                function defaultToConfig2(prop) {
9655                    if (!utils.isUndefined(config2[prop])) {
9656                        return getMergedValue(undefined, config2[prop]);
9657                    } else if (!utils.isUndefined(config1[prop])) {
9658                        return getMergedValue(undefined, config1[prop]);
9659                    }
9660                }
9661
9662                // eslint-disable-next-line consistent-return
9663                function mergeDirectKeys(prop) {
9664                    if (prop in config2) {
9665                        return getMergedValue(config1[prop], config2[prop]);
9666                    } else if (prop in config1) {
9667                        return getMergedValue(undefined, config1[prop]);
9668                    }
9669                }
9670
9671                var mergeMap = {
9672                    'url': valueFromConfig2,
9673                    'method': valueFromConfig2,
9674                    'data': valueFromConfig2,
9675                    'baseURL': defaultToConfig2,
9676                    'transformRequest': defaultToConfig2,
9677                    'transformResponse': defaultToConfig2,
9678                    'paramsSerializer': defaultToConfig2,
9679                    'timeout': defaultToConfig2,
9680                    'timeoutMessage': defaultToConfig2,
9681                    'withCredentials': defaultToConfig2,
9682                    'adapter': defaultToConfig2,
9683                    'responseType': defaultToConfig2,
9684                    'xsrfCookieName': defaultToConfig2,
9685                    'xsrfHeaderName': defaultToConfig2,
9686                    'onUploadProgress': defaultToConfig2,
9687                    'onDownloadProgress': defaultToConfig2,
9688                    'decompress': defaultToConfig2,
9689                    'maxContentLength': defaultToConfig2,
9690                    'maxBodyLength': defaultToConfig2,
9691                    'beforeRedirect': defaultToConfig2,
9692                    'transport': defaultToConfig2,
9693                    'httpAgent': defaultToConfig2,
9694                    'httpsAgent': defaultToConfig2,
9695                    'cancelToken': defaultToConfig2,
9696                    'socketPath': defaultToConfig2,
9697                    'responseEncoding': defaultToConfig2,
9698                    'validateStatus': mergeDirectKeys
9699                };
9700
9701                utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
9702                    var merge = mergeMap[prop] || mergeDeepProperties;
9703                    var configValue = merge(prop);
9704                    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
9705                });
9706
9707                return config;
9708            };
9709
9710
9711            /***/ }),
9712
9713        
vendor: 1,519 bytes, lines 9713-9749
9713/***/ "./node_modules/axios/lib/core/settle.js":
9714        /*!***********************************************!*\
9715  !*** ./node_modules/axios/lib/core/settle.js ***!
9716  \***********************************************/
9717        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9718
9719            "use strict";
9720
9721
9722            var AxiosError = __webpack_require__(/*! ./AxiosError */ "./node_modules/axios/lib/core/AxiosError.js");
9723
9724            /**
9725             * Resolve or reject a Promise based on response status.
9726             *
9727             * @param {Function} resolve A function that resolves the promise.
9728             * @param {Function} reject A function that rejects the promise.
9729             * @param {object} response The response.
9730             */
9731            module.exports = function settle(resolve, reject, response) {
9732                var validateStatus = response.config.validateStatus;
9733                if (!response.status || !validateStatus || validateStatus(response.status)) {
9734                    resolve(response);
9735                } else {
9736                    reject(new AxiosError(
9737                        'Request failed with status code ' + response.status,
9738                        [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
9739                        response.config,
9740                        response.request,
9741                        response
9742                    ));
9743                }
9744            };
9745
9746
9747            /***/ }),
9748
9749        
vendor: 1,353 bytes, lines 9749-9782
9749/***/ "./node_modules/axios/lib/core/transformData.js":
9750        /*!******************************************************!*\
9751  !*** ./node_modules/axios/lib/core/transformData.js ***!
9752  \******************************************************/
9753        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9754
9755            "use strict";
9756
9757
9758            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
9759            var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults/index.js");
9760
9761            /**
9762             * Transform the data for a request or a response
9763             *
9764             * @param {Object|String} data The data to be transformed
9765             * @param {Array} headers The headers for the request or response
9766             * @param {Array|Function} fns A single function or Array of functions
9767             * @returns {*} The resulting transformed data
9768             */
9769            module.exports = function transformData(data, headers, fns) {
9770                var context = this || defaults;
9771                /*eslint no-param-reassign:0*/
9772                utils.forEach(fns, function transform(fn) {
9773                    data = fn.call(context, data, headers);
9774                });
9775
9776                return data;
9777            };
9778
9779
9780            /***/ }),
9781
9782        
vendor: 6,892 bytes, lines 9782-9940
9782/***/ "./node_modules/axios/lib/defaults/index.js":
9783        /*!**************************************************!*\
9784  !*** ./node_modules/axios/lib/defaults/index.js ***!
9785  \**************************************************/
9786        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9787
9788            "use strict";
9789            /* provided dependency */ var process = __webpack_require__(/*! process/browser.js */ "./node_modules/process/browser.js");
9790
9791
9792            var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
9793            var normalizeHeaderName = __webpack_require__(/*! ../helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js");
9794            var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js");
9795            var transitionalDefaults = __webpack_require__(/*! ./transitional */ "./node_modules/axios/lib/defaults/transitional.js");
9796            var toFormData = __webpack_require__(/*! ../helpers/toFormData */ "./node_modules/axios/lib/helpers/toFormData.js");
9797
9798            var DEFAULT_CONTENT_TYPE = {
9799                'Content-Type': 'application/x-www-form-urlencoded'
9800            };
9801
9802            function setContentTypeIfUnset(headers, value) {
9803                if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
9804                    headers['Content-Type'] = value;
9805                }
9806            }
9807
9808            function getDefaultAdapter() {
9809                var adapter;
9810                if (typeof XMLHttpRequest !== 'undefined') {
9811                    // For browsers use XHR adapter
9812                    adapter = __webpack_require__(/*! ../adapters/xhr */ "./node_modules/axios/lib/adapters/xhr.js");
9813                } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
9814                    // For node use HTTP adapter
9815                    adapter = __webpack_require__(/*! ../adapters/http */ "./node_modules/axios/lib/adapters/xhr.js");
9816                }
9817                return adapter;
9818            }
9819
9820            function stringifySafely(rawValue, parser, encoder) {
9821                if (utils.isString(rawValue)) {
9822                    try {
9823                        (parser || JSON.parse)(rawValue);
9824                        return utils.trim(rawValue);
9825                    } catch (e) {
9826                        if (e.name !== 'SyntaxError') {
9827                            throw e;
9828                        }
9829                    }
9830                }
9831
9832                return (encoder || JSON.stringify)(rawValue);
9833            }
9834
9835            var defaults = {
9836
9837                transitional: transitionalDefaults,
9838
9839                adapter: getDefaultAdapter(),
9840
9841                transformRequest: [function transformRequest(data, headers) {
9842                    normalizeHeaderName(headers, 'Accept');
9843                    normalizeHeaderName(headers, 'Content-Type');
9844
9845                    if (utils.isFormData(data) ||
9846                        utils.isArrayBuffer(data) ||
9847                        utils.isBuffer(data) ||
9848                        utils.isStream(data) ||
9849                        utils.isFile(data) ||
9850                        utils.isBlob(data)
9851                    ) {
9852                        return data;
9853                    }
9854                    if (utils.isArrayBufferView(data)) {
9855                        return data.buffer;
9856                    }
9857                    if (utils.isURLSearchParams(data)) {
9858                        setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
9859                        return data.toString();
9860                    }
9861
9862                    var isObjectPayload = utils.isObject(data);
9863                    var contentType = headers && headers['Content-Type'];
9864
9865                    var isFileList;
9866
9867                    if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) {
9868                        var _FormData = this.env && this.env.FormData;
9869                        return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData());
9870                    } else if (isObjectPayload || contentType === 'application/json') {
9871                        setContentTypeIfUnset(headers, 'application/json');
9872                        return stringifySafely(data);
9873                    }
9874
9875                    return data;
9876                }],
9877
9878                transformResponse: [function transformResponse(data) {
9879                    var transitional = this.transitional || defaults.transitional;
9880                    var silentJSONParsing = transitional && transitional.silentJSONParsing;
9881                    var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
9882                    var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';
9883
9884                    if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
9885                        try {
9886                            return JSON.parse(data);
9887                        } catch (e) {
9888                            if (strictJSONParsing) {
9889                                if (e.name === 'SyntaxError') {
9890                                    throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
9891                                }
9892                                throw e;
9893                            }
9894                        }
9895                    }
9896
9897                    return data;
9898                }],
9899
9900                /**
9901                 * A timeout in milliseconds to abort a request. If set to 0 (default) a
9902                 * timeout is not created.
9903                 */
9904                timeout: 0,
9905
9906                xsrfCookieName: 'XSRF-TOKEN',
9907                xsrfHeaderName: 'X-XSRF-TOKEN',
9908
9909                maxContentLength: -1,
9910                maxBodyLength: -1,
9911
9912                env: {
9913                    FormData: __webpack_require__(/*! ./env/FormData */ "./node_modules/axios/lib/helpers/null.js")
9914                },
9915
9916                validateStatus: function validateStatus(status) {
9917                    return status >= 200 && status < 300;
9918                },
9919
9920                headers: {
9921                    common: {
9922                        'Accept': 'application/json, text/plain, */*'
9923                    }
9924                }
9925            };
9926
9927            utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
9928                defaults.headers[method] = {};
9929            });
9930
9931            utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
9932                defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
9933            });
9934
9935            module.exports = defaults;
9936
9937
9938            /***/ }),
9939
9940        
vendor: 522 bytes, lines 9940-9958
9940/***/ "./node_modules/axios/lib/defaults/transitional.js":
9941        /*!*********************************************************!*\
9942  !*** ./node_modules/axios/lib/defaults/transitional.js ***!
9943  \*********************************************************/
9944        /***/ (function(module) {
9945
9946            "use strict";
9947
9948
9949            module.exports = {
9950                silentJSONParsing: true,
9951                forcedJSONParsing: true,
9952                clarifyTimeoutError: false
9953            };
9954
9955
9956            /***/ }),
9957
9958        
vendor: 352 bytes, lines 9958-9970
9958/***/ "./node_modules/axios/lib/env/data.js":
9959        /*!********************************************!*\
9960  !*** ./node_modules/axios/lib/env/data.js ***!
9961  \********************************************/
9962        /***/ (function(module) {
9963
9964            module.exports = {
9965                "version": "0.27.2"
9966            };
9967
9968            /***/ }),
9969
9970        
vendor: 690 bytes, lines 9970-9992
9970/***/ "./node_modules/axios/lib/helpers/bind.js":
9971        /*!************************************************!*\
9972  !*** ./node_modules/axios/lib/helpers/bind.js ***!
9973  \************************************************/
9974        /***/ (function(module) {
9975
9976            "use strict";
9977
9978
9979            module.exports = function bind(fn, thisArg) {
9980                return function wrap() {
9981                    var args = new Array(arguments.length);
9982                    for (var i = 0; i < args.length; i++) {
9983                        args[i] = arguments[i];
9984                    }
9985                    return fn.apply(thisArg, args);
9986                };
9987            };
9988
9989
9990            /***/ }),
9991
9992        
vendor: 2,948 bytes, lines 9992-10073
9992/***/ "./node_modules/axios/lib/helpers/buildURL.js":
9993        /*!****************************************************!*\
9994  !*** ./node_modules/axios/lib/helpers/buildURL.js ***!
9995  \****************************************************/
9996        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
9997
9998            "use strict";
9999
10000
10001            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
10002
10003            function encode(val) {
10004                return encodeURIComponent(val).
10005                replace(/%3A/gi, ':').
10006                replace(/%24/g, '$').
10007                replace(/%2C/gi, ',').
10008                replace(/%20/g, '+').
10009                replace(/%5B/gi, '[').
10010                replace(/%5D/gi, ']');
10011            }
10012
10013            /**
10014             * Build a URL by appending params to the end
10015             *
10016             * @param {string} url The base of the url (e.g., http://www.google.com)
10017             * @param {object} [params] The params to be appended
10018             * @returns {string} The formatted url
10019             */
10020            module.exports = function buildURL(url, params, paramsSerializer) {
10021                /*eslint no-param-reassign:0*/
10022                if (!params) {
10023                    return url;
10024                }
10025
10026                var serializedParams;
10027                if (paramsSerializer) {
10028                    serializedParams = paramsSerializer(params);
10029                } else if (utils.isURLSearchParams(params)) {
10030                    serializedParams = params.toString();
10031                } else {
10032                    var parts = [];
10033
10034                    utils.forEach(params, function serialize(val, key) {
10035                        if (val === null || typeof val === 'undefined') {
10036                            return;
10037                        }
10038
10039                        if (utils.isArray(val)) {
10040                            key = key + '[]';
10041                        } else {
10042                            val = [val];
10043                        }
10044
10045                        utils.forEach(val, function parseValue(v) {
10046                            if (utils.isDate(v)) {
10047                                v = v.toISOString();
10048                            } else if (utils.isObject(v)) {
10049                                v = JSON.stringify(v);
10050                            }
10051                            parts.push(encode(key) + '=' + encode(v));
10052                        });
10053                    });
10054
10055                    serializedParams = parts.join('&');
10056                }
10057
10058                if (serializedParams) {
10059                    var hashmarkIndex = url.indexOf('#');
10060                    if (hashmarkIndex !== -1) {
10061                        url = url.slice(0, hashmarkIndex);
10062                    }
10063
10064                    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
10065                }
10066
10067                return url;
10068            };
10069
10070
10071            /***/ }),
10072
10073        
vendor: 862 bytes, lines 10073-10098
10073/***/ "./node_modules/axios/lib/helpers/combineURLs.js":
10074        /*!*******************************************************!*\
10075  !*** ./node_modules/axios/lib/helpers/combineURLs.js ***!
10076  \*******************************************************/
10077        /***/ (function(module) {
10078
10079            "use strict";
10080
10081
10082            /**
10083             * Creates a new URL by combining the specified URLs
10084             *
10085             * @param {string} baseURL The base URL
10086             * @param {string} relativeURL The relative URL
10087             * @returns {string} The combined URL
10088             */
10089            module.exports = function combineURLs(baseURL, relativeURL) {
10090                return relativeURL
10091                    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
10092                    : baseURL;
10093            };
10094
10095
10096            /***/ }),
10097
10098        
vendor: 2,653 bytes, lines 10098-10162
10098/***/ "./node_modules/axios/lib/helpers/cookies.js":
10099        /*!***************************************************!*\
10100  !*** ./node_modules/axios/lib/helpers/cookies.js ***!
10101  \***************************************************/
10102        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10103
10104            "use strict";
10105
10106
10107            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
10108
10109            module.exports = (
10110                utils.isStandardBrowserEnv() ?
10111
10112                    // Standard browser envs support document.cookie
10113                    (function standardBrowserEnv() {
10114                        return {
10115                            write: function write(name, value, expires, path, domain, secure) {
10116                                var cookie = [];
10117                                cookie.push(name + '=' + encodeURIComponent(value));
10118
10119                                if (utils.isNumber(expires)) {
10120                                    cookie.push('expires=' + new Date(expires).toGMTString());
10121                                }
10122
10123                                if (utils.isString(path)) {
10124                                    cookie.push('path=' + path);
10125                                }
10126
10127                                if (utils.isString(domain)) {
10128                                    cookie.push('domain=' + domain);
10129                                }
10130
10131                                if (secure === true) {
10132                                    cookie.push('secure');
10133                                }
10134
10135                                document.cookie = cookie.join('; ');
10136                            },
10137
10138                            read: function read(name) {
10139                                var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
10140                                return (match ? decodeURIComponent(match[3]) : null);
10141                            },
10142
10143                            remove: function remove(name) {
10144                                this.write(name, '', Date.now() - 86400000);
10145                            }
10146                        };
10147                    })() :
10148
10149                    // Non standard browser env (web workers, react-native) lack needed support.
10150                    (function nonStandardBrowserEnv() {
10151                        return {
10152                            write: function write() {},
10153                            read: function read() { return null; },
10154                            remove: function remove() {}
10155                        };
10156                    })()
10157            );
10158
10159
10160            /***/ }),
10161
10162        
vendor: 1,049 bytes, lines 10162-10187
10162/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js":
10163        /*!*********************************************************!*\
10164  !*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***!
10165  \*********************************************************/
10166        /***/ (function(module) {
10167
10168            "use strict";
10169
10170
10171            /**
10172             * Determines whether the specified URL is absolute
10173             *
10174             * @param {string} url The URL to test
10175             * @returns {boolean} True if the specified URL is absolute, otherwise false
10176             */
10177            module.exports = function isAbsoluteURL(url) {
10178                // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
10179                // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
10180                // by any combination of letters, digits, plus, period, or hyphen.
10181                return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
10182            };
10183
10184
10185            /***/ }),
10186
10187        
vendor: 927 bytes, lines 10187-10211
10187/***/ "./node_modules/axios/lib/helpers/isAxiosError.js":
10188        /*!********************************************************!*\
10189  !*** ./node_modules/axios/lib/helpers/isAxiosError.js ***!
10190  \********************************************************/
10191        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10192
10193            "use strict";
10194
10195
10196            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
10197
10198            /**
10199             * Determines whether the payload is an error thrown by Axios
10200             *
10201             * @param {*} payload The value to test
10202             * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
10203             */
10204            module.exports = function isAxiosError(payload) {
10205                return utils.isObject(payload) && (payload.isAxiosError === true);
10206            };
10207
10208
10209            /***/ }),
10210
10211        
vendor: 3,855 bytes, lines 10211-10290
10211/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js":
10212        /*!***********************************************************!*\
10213  !*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***!
10214  \***********************************************************/
10215        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10216
10217            "use strict";
10218
10219
10220            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
10221
10222            module.exports = (
10223                utils.isStandardBrowserEnv() ?
10224
10225                    // Standard browser envs have full support of the APIs needed to test
10226                    // whether the request URL is of the same origin as current location.
10227                    (function standardBrowserEnv() {
10228                        var msie = /(msie|trident)/i.test(navigator.userAgent);
10229                        var urlParsingNode = document.createElement('a');
10230                        var originURL;
10231
10232                        /**
10233                         * Parse a URL to discover it's components
10234                         *
10235                         * @param {String} url The URL to be parsed
10236                         * @returns {Object}
10237                         */
10238                        function resolveURL(url) {
10239                            var href = url;
10240
10241                            if (msie) {
10242                                // IE needs attribute set twice to normalize properties
10243                                urlParsingNode.setAttribute('href', href);
10244                                href = urlParsingNode.href;
10245                            }
10246
10247                            urlParsingNode.setAttribute('href', href);
10248
10249                            // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
10250                            return {
10251                                href: urlParsingNode.href,
10252                                protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
10253                                host: urlParsingNode.host,
10254                                search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
10255                                hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
10256                                hostname: urlParsingNode.hostname,
10257                                port: urlParsingNode.port,
10258                                pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
10259                                    urlParsingNode.pathname :
10260                                    '/' + urlParsingNode.pathname
10261                            };
10262                        }
10263
10264                        originURL = resolveURL(window.location.href);
10265
10266                        /**
10267                         * Determine if a URL shares the same origin as the current location
10268                         *
10269                         * @param {String} requestURL The URL to test
10270                         * @returns {boolean} True if URL shares the same origin, otherwise false
10271                         */
10272                        return function isURLSameOrigin(requestURL) {
10273                            var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
10274                            return (parsed.protocol === originURL.protocol &&
10275                                parsed.host === originURL.host);
10276                        };
10277                    })() :
10278
10279                    // Non standard browser envs (web workers, react-native) lack needed support.
10280                    (function nonStandardBrowserEnv() {
10281                        return function isURLSameOrigin() {
10282                            return true;
10283                        };
10284                    })()
10285            );
10286
10287
10288            /***/ }),
10289
10290        
vendor: 949 bytes, lines 10290-10313
10290/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js":
10291        /*!***************************************************************!*\
10292  !*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***!
10293  \***************************************************************/
10294        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10295
10296            "use strict";
10297
10298
10299            var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
10300
10301            module.exports = function normalizeHeaderName(headers, normalizedName) {
10302                utils.forEach(headers, function processHeader(value, name) {
10303                    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
10304                        headers[normalizedName] = value;
10305                        delete headers[name];
10306                    }
10307                });
10308            };
10309
10310
10311            /***/ }),
10312
10313        
vendor: 357 bytes, lines 10313-10325
10313/***/ "./node_modules/axios/lib/helpers/null.js":
10314        /*!************************************************!*\
10315  !*** ./node_modules/axios/lib/helpers/null.js ***!
10316  \************************************************/
10317        /***/ (function(module) {
10318
10319// eslint-disable-next-line strict
10320            module.exports = null;
10321
10322
10323            /***/ }),
10324
10325        
vendor: 2,439 bytes, lines 10325-10389
10325/***/ "./node_modules/axios/lib/helpers/parseHeaders.js":
10326        /*!********************************************************!*\
10327  !*** ./node_modules/axios/lib/helpers/parseHeaders.js ***!
10328  \********************************************************/
10329        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10330
10331            "use strict";
10332
10333
10334            var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
10335
10336// Headers whose duplicates are ignored by node
10337// c.f. https://nodejs.org/api/http.html#http_message_headers
10338            var ignoreDuplicateOf = [
10339                'age', 'authorization', 'content-length', 'content-type', 'etag',
10340                'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
10341                'last-modified', 'location', 'max-forwards', 'proxy-authorization',
10342                'referer', 'retry-after', 'user-agent'
10343            ];
10344
10345            /**
10346             * Parse headers into an object
10347             *
10348             * ```
10349             * Date: Wed, 27 Aug 2014 08:58:49 GMT
10350             * Content-Type: application/json
10351             * Connection: keep-alive
10352             * Transfer-Encoding: chunked
10353             * ```
10354             *
10355             * @param {String} headers Headers needing to be parsed
10356             * @returns {Object} Headers parsed into an object
10357             */
10358            module.exports = function parseHeaders(headers) {
10359                var parsed = {};
10360                var key;
10361                var val;
10362                var i;
10363
10364                if (!headers) { return parsed; }
10365
10366                utils.forEach(headers.split('\n'), function parser(line) {
10367                    i = line.indexOf(':');
10368                    key = utils.trim(line.substr(0, i)).toLowerCase();
10369                    val = utils.trim(line.substr(i + 1));
10370
10371                    if (key) {
10372                        if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
10373                            return;
10374                        }
10375                        if (key === 'set-cookie') {
10376                            parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
10377                        } else {
10378                            parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
10379                        }
10380                    }
10381                });
10382
10383                return parsed;
10384            };
10385
10386
10387            /***/ }),
10388
10389        
vendor: 540 bytes, lines 10389-10406
10389/***/ "./node_modules/axios/lib/helpers/parseProtocol.js":
10390        /*!*********************************************************!*\
10391  !*** ./node_modules/axios/lib/helpers/parseProtocol.js ***!
10392  \*********************************************************/
10393        /***/ (function(module) {
10394
10395            "use strict";
10396
10397
10398            module.exports = function parseProtocol(url) {
10399                var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
10400                return match && match[1] || '';
10401            };
10402
10403
10404            /***/ }),
10405
10406        
vendor: 1,180 bytes, lines 10406-10444
10406/***/ "./node_modules/axios/lib/helpers/spread.js":
10407        /*!**************************************************!*\
10408  !*** ./node_modules/axios/lib/helpers/spread.js ***!
10409  \**************************************************/
10410        /***/ (function(module) {
10411
10412            "use strict";
10413
10414
10415            /**
10416             * Syntactic sugar for invoking a function and expanding an array for arguments.
10417             *
10418             * Common use case would be to use `Function.prototype.apply`.
10419             *
10420             *  ```js
10421             *  function f(x, y, z) {}
10422             *  var args = [1, 2, 3];
10423             *  f.apply(null, args);
10424             *  ```
10425             *
10426             * With `spread` this example can be re-written.
10427             *
10428             *  ```js
10429             *  spread(function(x, y, z) {})([1, 2, 3]);
10430             *  ```
10431             *
10432             * @param {Function} callback
10433             * @returns {Function}
10434             */
10435            module.exports = function spread(callback) {
10436                return function wrap(arr) {
10437                    return callback.apply(null, arr);
10438                };
10439            };
10440
10441
10442            /***/ }),
10443
10444        
vendor: 3,266 bytes, lines 10444-10528
10444/***/ "./node_modules/axios/lib/helpers/toFormData.js":
10445        /*!******************************************************!*\
10446  !*** ./node_modules/axios/lib/helpers/toFormData.js ***!
10447  \******************************************************/
10448        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10449
10450            "use strict";
10451            /* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js")["Buffer"];
10452
10453
10454            var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
10455
10456            /**
10457             * Convert a data object to FormData
10458             * @param {Object} obj
10459             * @param {?Object} [formData]
10460             * @returns {Object}
10461             **/
10462
10463            function toFormData(obj, formData) {
10464                // eslint-disable-next-line no-param-reassign
10465                formData = formData || new FormData();
10466
10467                var stack = [];
10468
10469                function convertValue(value) {
10470                    if (value === null) return '';
10471
10472                    if (utils.isDate(value)) {
10473                        return value.toISOString();
10474                    }
10475
10476                    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
10477                        return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
10478                    }
10479
10480                    return value;
10481                }
10482
10483                function build(data, parentKey) {
10484                    if (utils.isPlainObject(data) || utils.isArray(data)) {
10485                        if (stack.indexOf(data) !== -1) {
10486                            throw Error('Circular reference detected in ' + parentKey);
10487                        }
10488
10489                        stack.push(data);
10490
10491                        utils.forEach(data, function each(value, key) {
10492                            if (utils.isUndefined(value)) return;
10493                            var fullKey = parentKey ? parentKey + '.' + key : key;
10494                            var arr;
10495
10496                            if (value && !parentKey && typeof value === 'object') {
10497                                if (utils.endsWith(key, '{}')) {
10498                                    // eslint-disable-next-line no-param-reassign
10499                                    value = JSON.stringify(value);
10500                                } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {
10501                                    // eslint-disable-next-line func-names
10502                                    arr.forEach(function(el) {
10503                                        !utils.isUndefined(el) && formData.append(fullKey, convertValue(el));
10504                                    });
10505                                    return;
10506                                }
10507                            }
10508
10509                            build(value, fullKey);
10510                        });
10511
10512                        stack.pop();
10513                    } else {
10514                        formData.append(parentKey, convertValue(data));
10515                    }
10516                }
10517
10518                build(obj);
10519
10520                return formData;
10521            }
10522
10523            module.exports = toFormData;
10524
10525
10526            /***/ }),
10527
10528        
vendor: 4,137 bytes, lines 10528-10625
10528/***/ "./node_modules/axios/lib/helpers/validator.js":
10529        /*!*****************************************************!*\
10530  !*** ./node_modules/axios/lib/helpers/validator.js ***!
10531  \*****************************************************/
10532        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10533
10534            "use strict";
10535
10536
10537            var VERSION = (__webpack_require__(/*! ../env/data */ "./node_modules/axios/lib/env/data.js").version);
10538            var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./node_modules/axios/lib/core/AxiosError.js");
10539
10540            var validators = {};
10541
10542// eslint-disable-next-line func-names
10543            ['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {
10544                validators[type] = function validator(thing) {
10545                    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
10546                };
10547            });
10548
10549            var deprecatedWarnings = {};
10550
10551            /**
10552             * Transitional option validator
10553             * @param {function|boolean?} validator - set to false if the transitional option has been removed
10554             * @param {string?} version - deprecated version / removed since version
10555             * @param {string?} message - some message with additional info
10556             * @returns {function}
10557             */
10558            validators.transitional = function transitional(validator, version, message) {
10559                function formatMessage(opt, desc) {
10560                    return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
10561                }
10562
10563                // eslint-disable-next-line func-names
10564                return function(value, opt, opts) {
10565                    if (validator === false) {
10566                        throw new AxiosError(
10567                            formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
10568                            AxiosError.ERR_DEPRECATED
10569                        );
10570                    }
10571
10572                    if (version && !deprecatedWarnings[opt]) {
10573                        deprecatedWarnings[opt] = true;
10574                        // eslint-disable-next-line no-console
10575                        console.warn(
10576                            formatMessage(
10577                                opt,
10578                                ' has been deprecated since v' + version + ' and will be removed in the near future'
10579                            )
10580                        );
10581                    }
10582
10583                    return validator ? validator(value, opt, opts) : true;
10584                };
10585            };
10586
10587            /**
10588             * Assert object's properties type
10589             * @param {object} options
10590             * @param {object} schema
10591             * @param {boolean?} allowUnknown
10592             */
10593
10594            function assertOptions(options, schema, allowUnknown) {
10595                if (typeof options !== 'object') {
10596                    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
10597                }
10598                var keys = Object.keys(options);
10599                var i = keys.length;
10600                while (i-- > 0) {
10601                    var opt = keys[i];
10602                    var validator = schema[opt];
10603                    if (validator) {
10604                        var value = options[opt];
10605                        var result = value === undefined || validator(value, opt, options);
10606                        if (result !== true) {
10607                            throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
10608                        }
10609                        continue;
10610                    }
10611                    if (allowUnknown !== true) {
10612                        throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
10613                    }
10614                }
10615            }
10616
10617            module.exports = {
10618                assertOptions: assertOptions,
10619                validators: validators
10620            };
10621
10622
10623            /***/ }),
10624
10625        
vendor: 17,754 bytes, lines 10625-11106
10625/***/ "./node_modules/axios/lib/utils.js":
10626        /*!*****************************************!*\
10627  !*** ./node_modules/axios/lib/utils.js ***!
10628  \*****************************************/
10629        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
10630
10631            "use strict";
10632
10633
10634            var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js");
10635
10636// utils is a library of generic helper functions non-specific to axios
10637
10638            var toString = Object.prototype.toString;
10639
10640// eslint-disable-next-line func-names
10641            var kindOf = (function(cache) {
10642                // eslint-disable-next-line func-names
10643                return function(thing) {
10644                    var str = toString.call(thing);
10645                    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
10646                };
10647            })(Object.create(null));
10648
10649            function kindOfTest(type) {
10650                type = type.toLowerCase();
10651                return function isKindOf(thing) {
10652                    return kindOf(thing) === type;
10653                };
10654            }
10655
10656            /**
10657             * Determine if a value is an Array
10658             *
10659             * @param {Object} val The value to test
10660             * @returns {boolean} True if value is an Array, otherwise false
10661             */
10662            function isArray(val) {
10663                return Array.isArray(val);
10664            }
10665
10666            /**
10667             * Determine if a value is undefined
10668             *
10669             * @param {Object} val The value to test
10670             * @returns {boolean} True if the value is undefined, otherwise false
10671             */
10672            function isUndefined(val) {
10673                return typeof val === 'undefined';
10674            }
10675
10676            /**
10677             * Determine if a value is a Buffer
10678             *
10679             * @param {Object} val The value to test
10680             * @returns {boolean} True if value is a Buffer, otherwise false
10681             */
10682            function isBuffer(val) {
10683                return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
10684                    && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
10685            }
10686
10687            /**
10688             * Determine if a value is an ArrayBuffer
10689             *
10690             * @function
10691             * @param {Object} val The value to test
10692             * @returns {boolean} True if value is an ArrayBuffer, otherwise false
10693             */
10694            var isArrayBuffer = kindOfTest('ArrayBuffer');
10695
10696
10697            /**
10698             * Determine if a value is a view on an ArrayBuffer
10699             *
10700             * @param {Object} val The value to test
10701             * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
10702             */
10703            function isArrayBufferView(val) {
10704                var result;
10705                if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
10706                    result = ArrayBuffer.isView(val);
10707                } else {
10708                    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
10709                }
10710                return result;
10711            }
10712
10713            /**
10714             * Determine if a value is a String
10715             *
10716             * @param {Object} val The value to test
10717             * @returns {boolean} True if value is a String, otherwise false
10718             */
10719            function isString(val) {
10720                return typeof val === 'string';
10721            }
10722
10723            /**
10724             * Determine if a value is a Number
10725             *
10726             * @param {Object} val The value to test
10727             * @returns {boolean} True if value is a Number, otherwise false
10728             */
10729            function isNumber(val) {
10730                return typeof val === 'number';
10731            }
10732
10733            /**
10734             * Determine if a value is an Object
10735             *
10736             * @param {Object} val The value to test
10737             * @returns {boolean} True if value is an Object, otherwise false
10738             */
10739            function isObject(val) {
10740                return val !== null && typeof val === 'object';
10741            }
10742
10743            /**
10744             * Determine if a value is a plain Object
10745             *
10746             * @param {Object} val The value to test
10747             * @return {boolean} True if value is a plain Object, otherwise false
10748             */
10749            function isPlainObject(val) {
10750                if (kindOf(val) !== 'object') {
10751                    return false;
10752                }
10753
10754                var prototype = Object.getPrototypeOf(val);
10755                return prototype === null || prototype === Object.prototype;
10756            }
10757
10758            /**
10759             * Determine if a value is a Date
10760             *
10761             * @function
10762             * @param {Object} val The value to test
10763             * @returns {boolean} True if value is a Date, otherwise false
10764             */
10765            var isDate = kindOfTest('Date');
10766
10767            /**
10768             * Determine if a value is a File
10769             *
10770             * @function
10771             * @param {Object} val The value to test
10772             * @returns {boolean} True if value is a File, otherwise false
10773             */
10774            var isFile = kindOfTest('File');
10775
10776            /**
10777             * Determine if a value is a Blob
10778             *
10779             * @function
10780             * @param {Object} val The value to test
10781             * @returns {boolean} True if value is a Blob, otherwise false
10782             */
10783            var isBlob = kindOfTest('Blob');
10784
10785            /**
10786             * Determine if a value is a FileList
10787             *
10788             * @function
10789             * @param {Object} val The value to test
10790             * @returns {boolean} True if value is a File, otherwise false
10791             */
10792            var isFileList = kindOfTest('FileList');
10793
10794            /**
10795             * Determine if a value is a Function
10796             *
10797             * @param {Object} val The value to test
10798             * @returns {boolean} True if value is a Function, otherwise false
10799             */
10800            function isFunction(val) {
10801                return toString.call(val) === '[object Function]';
10802            }
10803
10804            /**
10805             * Determine if a value is a Stream
10806             *
10807             * @param {Object} val The value to test
10808             * @returns {boolean} True if value is a Stream, otherwise false
10809             */
10810            function isStream(val) {
10811                return isObject(val) && isFunction(val.pipe);
10812            }
10813
10814            /**
10815             * Determine if a value is a FormData
10816             *
10817             * @param {Object} thing The value to test
10818             * @returns {boolean} True if value is an FormData, otherwise false
10819             */
10820            function isFormData(thing) {
10821                var pattern = '[object FormData]';
10822                return thing && (
10823                    (typeof FormData === 'function' && thing instanceof FormData) ||
10824                    toString.call(thing) === pattern ||
10825                    (isFunction(thing.toString) && thing.toString() === pattern)
10826                );
10827            }
10828
10829            /**
10830             * Determine if a value is a URLSearchParams object
10831             * @function
10832             * @param {Object} val The value to test
10833             * @returns {boolean} True if value is a URLSearchParams object, otherwise false
10834             */
10835            var isURLSearchParams = kindOfTest('URLSearchParams');
10836
10837            /**
10838             * Trim excess whitespace off the beginning and end of a string
10839             *
10840             * @param {String} str The String to trim
10841             * @returns {String} The String freed of excess whitespace
10842             */
10843            function trim(str) {
10844                return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
10845            }
10846
10847            /**
10848             * Determine if we're running in a standard browser environment
10849             *
10850             * This allows axios to run in a web worker, and react-native.
10851             * Both environments support XMLHttpRequest, but not fully standard globals.
10852             *
10853             * web workers:
10854             *  typeof window -> undefined
10855             *  typeof document -> undefined
10856             *
10857             * react-native:
10858             *  navigator.product -> 'ReactNative'
10859             * nativescript
10860             *  navigator.product -> 'NativeScript' or 'NS'
10861             */
10862            function isStandardBrowserEnv() {
10863                if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
10864                    navigator.product === 'NativeScript' ||
10865                    navigator.product === 'NS')) {
10866                    return false;
10867                }
10868                return (
10869                    typeof window !== 'undefined' &&
10870                    typeof document !== 'undefined'
10871                );
10872            }
10873
10874            /**
10875             * Iterate over an Array or an Object invoking a function for each item.
10876             *
10877             * If `obj` is an Array callback will be called passing
10878             * the value, index, and complete array for each item.
10879             *
10880             * If 'obj' is an Object callback will be called passing
10881             * the value, key, and complete object for each property.
10882             *
10883             * @param {Object|Array} obj The object to iterate
10884             * @param {Function} fn The callback to invoke for each item
10885             */
10886            function forEach(obj, fn) {
10887                // Don't bother if no value provided
10888                if (obj === null || typeof obj === 'undefined') {
10889                    return;
10890                }
10891
10892                // Force an array if not already something iterable
10893                if (typeof obj !== 'object') {
10894                    /*eslint no-param-reassign:0*/
10895                    obj = [obj];
10896                }
10897
10898                if (isArray(obj)) {
10899                    // Iterate over array values
10900                    for (var i = 0, l = obj.length; i < l; i++) {
10901                        fn.call(null, obj[i], i, obj);
10902                    }
10903                } else {
10904                    // Iterate over object keys
10905                    for (var key in obj) {
10906                        if (Object.prototype.hasOwnProperty.call(obj, key)) {
10907                            fn.call(null, obj[key], key, obj);
10908                        }
10909                    }
10910                }
10911            }
10912
10913            /**
10914             * Accepts varargs expecting each argument to be an object, then
10915             * immutably merges the properties of each object and returns result.
10916             *
10917             * When multiple objects contain the same key the later object in
10918             * the arguments list will take precedence.
10919             *
10920             * Example:
10921             *
10922             * ```js
10923             * var result = merge({foo: 123}, {foo: 456});
10924             * console.log(result.foo); // outputs 456
10925             * ```
10926             *
10927             * @param {Object} obj1 Object to merge
10928             * @returns {Object} Result of all merge properties
10929             */
10930            function merge(/* obj1, obj2, obj3, ... */) {
10931                var result = {};
10932                function assignValue(val, key) {
10933                    if (isPlainObject(result[key]) && isPlainObject(val)) {
10934                        result[key] = merge(result[key], val);
10935                    } else if (isPlainObject(val)) {
10936                        result[key] = merge({}, val);
10937                    } else if (isArray(val)) {
10938                        result[key] = val.slice();
10939                    } else {
10940                        result[key] = val;
10941                    }
10942                }
10943
10944                for (var i = 0, l = arguments.length; i < l; i++) {
10945                    forEach(arguments[i], assignValue);
10946                }
10947                return result;
10948            }
10949
10950            /**
10951             * Extends object a by mutably adding to it the properties of object b.
10952             *
10953             * @param {Object} a The object to be extended
10954             * @param {Object} b The object to copy properties from
10955             * @param {Object} thisArg The object to bind function to
10956             * @return {Object} The resulting value of object a
10957             */
10958            function extend(a, b, thisArg) {
10959                forEach(b, function assignValue(val, key) {
10960                    if (thisArg && typeof val === 'function') {
10961                        a[key] = bind(val, thisArg);
10962                    } else {
10963                        a[key] = val;
10964                    }
10965                });
10966                return a;
10967            }
10968
10969            /**
10970             * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
10971             *
10972             * @param {string} content with BOM
10973             * @return {string} content value without BOM
10974             */
10975            function stripBOM(content) {
10976                if (content.charCodeAt(0) === 0xFEFF) {
10977                    content = content.slice(1);
10978                }
10979                return content;
10980            }
10981
10982            /**
10983             * Inherit the prototype methods from one constructor into another
10984             * @param {function} constructor
10985             * @param {function} superConstructor
10986             * @param {object} [props]
10987             * @param {object} [descriptors]
10988             */
10989
10990            function inherits(constructor, superConstructor, props, descriptors) {
10991                constructor.prototype = Object.create(superConstructor.prototype, descriptors);
10992                constructor.prototype.constructor = constructor;
10993                props && Object.assign(constructor.prototype, props);
10994            }
10995
10996            /**
10997             * Resolve object with deep prototype chain to a flat object
10998             * @param {Object} sourceObj source object
10999             * @param {Object} [destObj]
11000             * @param {Function} [filter]
11001             * @returns {Object}
11002             */
11003
11004            function toFlatObject(sourceObj, destObj, filter) {
11005                var props;
11006                var i;
11007                var prop;
11008                var merged = {};
11009
11010                destObj = destObj || {};
11011
11012                do {
11013                    props = Object.getOwnPropertyNames(sourceObj);
11014                    i = props.length;
11015                    while (i-- > 0) {
11016                        prop = props[i];
11017                        if (!merged[prop]) {
11018                            destObj[prop] = sourceObj[prop];
11019                            merged[prop] = true;
11020                        }
11021                    }
11022                    sourceObj = Object.getPrototypeOf(sourceObj);
11023                } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
11024
11025                return destObj;
11026            }
11027
11028            /*
11029 * determines whether a string ends with the characters of a specified string
11030 * @param {String} str
11031 * @param {String} searchString
11032 * @param {Number} [position= 0]
11033 * @returns {boolean}
11034 */
11035            function endsWith(str, searchString, position) {
11036                str = String(str);
11037                if (position === undefined || position > str.length) {
11038                    position = str.length;
11039                }
11040                position -= searchString.length;
11041                var lastIndex = str.indexOf(searchString, position);
11042                return lastIndex !== -1 && lastIndex === position;
11043            }
11044
11045
11046            /**
11047             * Returns new array from array like object
11048             * @param {*} [thing]
11049             * @returns {Array}
11050             */
11051            function toArray(thing) {
11052                if (!thing) return null;
11053                var i = thing.length;
11054                if (isUndefined(i)) return null;
11055                var arr = new Array(i);
11056                while (i-- > 0) {
11057                    arr[i] = thing[i];
11058                }
11059                return arr;
11060            }
11061
11062// eslint-disable-next-line func-names
11063            var isTypedArray = (function(TypedArray) {
11064                // eslint-disable-next-line func-names
11065                return function(thing) {
11066                    return TypedArray && thing instanceof TypedArray;
11067                };
11068            })(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array));
11069
11070            module.exports = {
11071                isArray: isArray,
11072                isArrayBuffer: isArrayBuffer,
11073                isBuffer: isBuffer,
11074                isFormData: isFormData,
11075                isArrayBufferView: isArrayBufferView,
11076                isString: isString,
11077                isNumber: isNumber,
11078                isObject: isObject,
11079                isPlainObject: isPlainObject,
11080                isUndefined: isUndefined,
11081                isDate: isDate,
11082                isFile: isFile,
11083                isBlob: isBlob,
11084                isFunction: isFunction,
11085                isStream: isStream,
11086                isURLSearchParams: isURLSearchParams,
11087                isStandardBrowserEnv: isStandardBrowserEnv,
11088                forEach: forEach,
11089                merge: merge,
11090                extend: extend,
11091                trim: trim,
11092                stripBOM: stripBOM,
11093                inherits: inherits,
11094                toFlatObject: toFlatObject,
11095                kindOf: kindOf,
11096                kindOfTest: kindOfTest,
11097                endsWith: endsWith,
11098                toArray: toArray,
11099                isTypedArray: isTypedArray,
11100                isFileList: isFileList
11101            };
11102
11103
11104            /***/ }),
11105
11106        
vendor: 6,003 bytes, lines 11106-11267
11106/***/ "./node_modules/base64-js/index.js":
11107        /*!*****************************************!*\
11108  !*** ./node_modules/base64-js/index.js ***!
11109  \*****************************************/
11110        /***/ (function(__unused_webpack_module, exports) {
11111
11112            "use strict";
11113
11114
11115            exports.byteLength = byteLength
11116            exports.toByteArray = toByteArray
11117            exports.fromByteArray = fromByteArray
11118
11119            var lookup = []
11120            var revLookup = []
11121            var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
11122
11123            var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
11124            for (var i = 0, len = code.length; i < len; ++i) {
11125                lookup[i] = code[i]
11126                revLookup[code.charCodeAt(i)] = i
11127            }
11128
11129// Support decoding URL-safe base64 strings, as Node.js does.
11130// See: https://en.wikipedia.org/wiki/Base64#URL_applications
11131            revLookup['-'.charCodeAt(0)] = 62
11132            revLookup['_'.charCodeAt(0)] = 63
11133
11134            function getLens (b64) {
11135                var len = b64.length
11136
11137                if (len % 4 > 0) {
11138                    throw new Error('Invalid string. Length must be a multiple of 4')
11139                }
11140
11141                // Trim off extra bytes after placeholder bytes are found
11142                // See: https://github.com/beatgammit/base64-js/issues/42
11143                var validLen = b64.indexOf('=')
11144                if (validLen === -1) validLen = len
11145
11146                var placeHoldersLen = validLen === len
11147                    ? 0
11148                    : 4 - (validLen % 4)
11149
11150                return [validLen, placeHoldersLen]
11151            }
11152
11153// base64 is 4/3 + up to two characters of the original data
11154            function byteLength (b64) {
11155                var lens = getLens(b64)
11156                var validLen = lens[0]
11157                var placeHoldersLen = lens[1]
11158                return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
11159            }
11160
11161            function _byteLength (b64, validLen, placeHoldersLen) {
11162                return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
11163            }
11164
11165            function toByteArray (b64) {
11166                var tmp
11167                var lens = getLens(b64)
11168                var validLen = lens[0]
11169                var placeHoldersLen = lens[1]
11170
11171                var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
11172
11173                var curByte = 0
11174
11175                // if there are placeholders, only get up to the last complete 4 chars
11176                var len = placeHoldersLen > 0
11177                    ? validLen - 4
11178                    : validLen
11179
11180                var i
11181                for (i = 0; i < len; i += 4) {
11182                    tmp =
11183                        (revLookup[b64.charCodeAt(i)] << 18) |
11184                        (revLookup[b64.charCodeAt(i + 1)] << 12) |
11185                        (revLookup[b64.charCodeAt(i + 2)] << 6) |
11186                        revLookup[b64.charCodeAt(i + 3)]
11187                    arr[curByte++] = (tmp >> 16) & 0xFF
11188                    arr[curByte++] = (tmp >> 8) & 0xFF
11189                    arr[curByte++] = tmp & 0xFF
11190                }
11191
11192                if (placeHoldersLen === 2) {
11193                    tmp =
11194                        (revLookup[b64.charCodeAt(i)] << 2) |
11195                        (revLookup[b64.charCodeAt(i + 1)] >> 4)
11196                    arr[curByte++] = tmp & 0xFF
11197                }
11198
11199                if (placeHoldersLen === 1) {
11200                    tmp =
11201                        (revLookup[b64.charCodeAt(i)] << 10) |
11202                        (revLookup[b64.charCodeAt(i + 1)] << 4) |
11203                        (revLookup[b64.charCodeAt(i + 2)] >> 2)
11204                    arr[curByte++] = (tmp >> 8) & 0xFF
11205                    arr[curByte++] = tmp & 0xFF
11206                }
11207
11208                return arr
11209            }
11210
11211            function tripletToBase64 (num) {
11212                return lookup[num >> 18 & 0x3F] +
11213                    lookup[num >> 12 & 0x3F] +
11214                    lookup[num >> 6 & 0x3F] +
11215                    lookup[num & 0x3F]
11216            }
11217
11218            function encodeChunk (uint8, start, end) {
11219                var tmp
11220                var output = []
11221                for (var i = start; i < end; i += 3) {
11222                    tmp =
11223                        ((uint8[i] << 16) & 0xFF0000) +
11224                        ((uint8[i + 1] << 8) & 0xFF00) +
11225                        (uint8[i + 2] & 0xFF)
11226                    output.push(tripletToBase64(tmp))
11227                }
11228                return output.join('')
11229            }
11230
11231            function fromByteArray (uint8) {
11232                var tmp
11233                var len = uint8.length
11234                var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
11235                var parts = []
11236                var maxChunkLength = 16383 // must be multiple of 3
11237
11238                // go through the array every three bytes, we'll deal with trailing stuff later
11239                for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
11240                    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
11241                }
11242
11243                // pad the end with zeros, but make sure to not forget the extra bytes
11244                if (extraBytes === 1) {
11245                    tmp = uint8[len - 1]
11246                    parts.push(
11247                        lookup[tmp >> 2] +
11248                        lookup[(tmp << 4) & 0x3F] +
11249                        '=='
11250                    )
11251                } else if (extraBytes === 2) {
11252                    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
11253                    parts.push(
11254                        lookup[tmp >> 10] +
11255                        lookup[(tmp >> 4) & 0x3F] +
11256                        lookup[(tmp << 2) & 0x3F] +
11257                        '='
11258                    )
11259                }
11260
11261                return parts.join('')
11262            }
11263
11264
11265            /***/ }),
11266
11267        
vendor: 4,200 bytes, lines 11267-11360
11267/***/ "./node_modules/bootstrap/js/dist/base-component.js":
11268        /*!**********************************************************!*\
11269  !*** ./node_modules/bootstrap/js/dist/base-component.js ***!
11270  \**********************************************************/
11271        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
11272
11273            /*!
11274  * Bootstrap base-component.js v5.3.3 (https://getbootstrap.com/)
11275  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11276  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11277  */
11278            (function (global, factory) {
11279                true ? module.exports = factory(__webpack_require__(/*! ./dom/data.js */ "./node_modules/bootstrap/js/dist/dom/data.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./util/config.js */ "./node_modules/bootstrap/js/dist/util/config.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
11280                    0;
11281            })(this, (function (Data, EventHandler, Config, index_js) { 'use strict';
11282
11283                /**
11284                 * --------------------------------------------------------------------------
11285                 * Bootstrap base-component.js
11286                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11287                 * --------------------------------------------------------------------------
11288                 */
11289
11290
11291                /**
11292                 * Constants
11293                 */
11294
11295                const VERSION = '5.3.3';
11296
11297                /**
11298                 * Class definition
11299                 */
11300
11301                class BaseComponent extends Config {
11302                    constructor(element, config) {
11303                        super();
11304                        element = index_js.getElement(element);
11305                        if (!element) {
11306                            return;
11307                        }
11308                        this._element = element;
11309                        this._config = this._getConfig(config);
11310                        Data.set(this._element, this.constructor.DATA_KEY, this);
11311                    }
11312
11313                    // Public
11314                    dispose() {
11315                        Data.remove(this._element, this.constructor.DATA_KEY);
11316                        EventHandler.off(this._element, this.constructor.EVENT_KEY);
11317                        for (const propertyName of Object.getOwnPropertyNames(this)) {
11318                            this[propertyName] = null;
11319                        }
11320                    }
11321                    _queueCallback(callback, element, isAnimated = true) {
11322                        index_js.executeAfterTransition(callback, element, isAnimated);
11323                    }
11324                    _getConfig(config) {
11325                        config = this._mergeConfigObj(config, this._element);
11326                        config = this._configAfterMerge(config);
11327                        this._typeCheckConfig(config);
11328                        return config;
11329                    }
11330
11331                    // Static
11332                    static getInstance(element) {
11333                        return Data.get(index_js.getElement(element), this.DATA_KEY);
11334                    }
11335                    static getOrCreateInstance(element, config = {}) {
11336                        return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
11337                    }
11338                    static get VERSION() {
11339                        return VERSION;
11340                    }
11341                    static get DATA_KEY() {
11342                        return `bs.${this.NAME}`;
11343                    }
11344                    static get EVENT_KEY() {
11345                        return `.${this.DATA_KEY}`;
11346                    }
11347                    static eventName(name) {
11348                        return `${name}${this.EVENT_KEY}`;
11349                    }
11350                }
11351
11352                return BaseComponent;
11353
11354            }));
11355//# sourceMappingURL=base-component.js.map
11356
11357
11358            /***/ }),
11359
11360        
vendor: 3,571 bytes, lines 11360-11448
11360/***/ "./node_modules/bootstrap/js/dist/button.js":
11361        /*!**************************************************!*\
11362  !*** ./node_modules/bootstrap/js/dist/button.js ***!
11363  \**************************************************/
11364        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
11365
11366            /*!
11367  * Bootstrap button.js v5.3.3 (https://getbootstrap.com/)
11368  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11369  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11370  */
11371            (function (global, factory) {
11372                true ? module.exports = factory(__webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
11373                    0;
11374            })(this, (function (BaseComponent, EventHandler, index_js) { 'use strict';
11375
11376                /**
11377                 * --------------------------------------------------------------------------
11378                 * Bootstrap button.js
11379                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11380                 * --------------------------------------------------------------------------
11381                 */
11382
11383
11384                /**
11385                 * Constants
11386                 */
11387
11388                const NAME = 'button';
11389                const DATA_KEY = 'bs.button';
11390                const EVENT_KEY = `.${DATA_KEY}`;
11391                const DATA_API_KEY = '.data-api';
11392                const CLASS_NAME_ACTIVE = 'active';
11393                const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]';
11394                const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
11395
11396                /**
11397                 * Class definition
11398                 */
11399
11400                class Button extends BaseComponent {
11401                    // Getters
11402                    static get NAME() {
11403                        return NAME;
11404                    }
11405
11406                    // Public
11407                    toggle() {
11408                        // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
11409                        this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE));
11410                    }
11411
11412                    // Static
11413                    static jQueryInterface(config) {
11414                        return this.each(function () {
11415                            const data = Button.getOrCreateInstance(this);
11416                            if (config === 'toggle') {
11417                                data[config]();
11418                            }
11419                        });
11420                    }
11421                }
11422
11423                /**
11424                 * Data API implementation
11425                 */
11426
11427                EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {
11428                    event.preventDefault();
11429                    const button = event.target.closest(SELECTOR_DATA_TOGGLE);
11430                    const data = Button.getOrCreateInstance(button);
11431                    data.toggle();
11432                });
11433
11434                /**
11435                 * jQuery
11436                 */
11437
11438                index_js.defineJQueryPlugin(Button);
11439
11440                return Button;
11441
11442            }));
11443//# sourceMappingURL=button.js.map
11444
11445
11446            /***/ }),
11447
11448        
vendor: 3,021 bytes, lines 11448-11520
11448/***/ "./node_modules/bootstrap/js/dist/dom/data.js":
11449        /*!****************************************************!*\
11450  !*** ./node_modules/bootstrap/js/dist/dom/data.js ***!
11451  \****************************************************/
11452        /***/ (function(module) {
11453
11454            /*!
11455  * Bootstrap data.js v5.3.3 (https://getbootstrap.com/)
11456  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11457  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11458  */
11459            (function (global, factory) {
11460                true ? module.exports = factory() :
11461                    0;
11462            })(this, (function () { 'use strict';
11463
11464                /**
11465                 * --------------------------------------------------------------------------
11466                 * Bootstrap dom/data.js
11467                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11468                 * --------------------------------------------------------------------------
11469                 */
11470
11471                /**
11472                 * Constants
11473                 */
11474
11475                const elementMap = new Map();
11476                const data = {
11477                    set(element, key, instance) {
11478                        if (!elementMap.has(element)) {
11479                            elementMap.set(element, new Map());
11480                        }
11481                        const instanceMap = elementMap.get(element);
11482
11483                        // make it clear we only want one instance per element
11484                        // can be removed later when multiple key/instances are fine to be used
11485                        if (!instanceMap.has(key) && instanceMap.size !== 0) {
11486                            // eslint-disable-next-line no-console
11487                            console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
11488                            return;
11489                        }
11490                        instanceMap.set(key, instance);
11491                    },
11492                    get(element, key) {
11493                        if (elementMap.has(element)) {
11494                            return elementMap.get(element).get(key) || null;
11495                        }
11496                        return null;
11497                    },
11498                    remove(element, key) {
11499                        if (!elementMap.has(element)) {
11500                            return;
11501                        }
11502                        const instanceMap = elementMap.get(element);
11503                        instanceMap.delete(key);
11504
11505                        // free up element references if there are no instances left for an element
11506                        if (instanceMap.size === 0) {
11507                            elementMap.delete(element);
11508                        }
11509                    }
11510                };
11511
11512                return data;
11513
11514            }));
11515//# sourceMappingURL=data.js.map
11516
11517
11518            /***/ }),
11519
11520        
vendor: 13,454 bytes, lines 11520-11766
11520/***/ "./node_modules/bootstrap/js/dist/dom/event-handler.js":
11521        /*!*************************************************************!*\
11522  !*** ./node_modules/bootstrap/js/dist/dom/event-handler.js ***!
11523  \*************************************************************/
11524        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
11525
11526            /*!
11527  * Bootstrap event-handler.js v5.3.3 (https://getbootstrap.com/)
11528  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11529  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11530  */
11531            (function (global, factory) {
11532                true ? module.exports = factory(__webpack_require__(/*! ../util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
11533                    0;
11534            })(this, (function (index_js) { 'use strict';
11535
11536                /**
11537                 * --------------------------------------------------------------------------
11538                 * Bootstrap dom/event-handler.js
11539                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11540                 * --------------------------------------------------------------------------
11541                 */
11542
11543
11544                /**
11545                 * Constants
11546                 */
11547
11548                const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
11549                const stripNameRegex = /\..*/;
11550                const stripUidRegex = /::\d+$/;
11551                const eventRegistry = {}; // Events storage
11552                let uidEvent = 1;
11553                const customEvents = {
11554                    mouseenter: 'mouseover',
11555                    mouseleave: 'mouseout'
11556                };
11557                const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
11558
11559                /**
11560                 * Private methods
11561                 */
11562
11563                function makeEventUid(element, uid) {
11564                    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
11565                }
11566                function getElementEvents(element) {
11567                    const uid = makeEventUid(element);
11568                    element.uidEvent = uid;
11569                    eventRegistry[uid] = eventRegistry[uid] || {};
11570                    return eventRegistry[uid];
11571                }
11572                function bootstrapHandler(element, fn) {
11573                    return function handler(event) {
11574                        hydrateObj(event, {
11575                            delegateTarget: element
11576                        });
11577                        if (handler.oneOff) {
11578                            EventHandler.off(element, event.type, fn);
11579                        }
11580                        return fn.apply(element, [event]);
11581                    };
11582                }
11583                function bootstrapDelegationHandler(element, selector, fn) {
11584                    return function handler(event) {
11585                        const domElements = element.querySelectorAll(selector);
11586                        for (let {
11587                            target
11588                        } = event; target && target !== this; target = target.parentNode) {
11589                            for (const domElement of domElements) {
11590                                if (domElement !== target) {
11591                                    continue;
11592                                }
11593                                hydrateObj(event, {
11594                                    delegateTarget: target
11595                                });
11596                                if (handler.oneOff) {
11597                                    EventHandler.off(element, event.type, selector, fn);
11598                                }
11599                                return fn.apply(target, [event]);
11600                            }
11601                        }
11602                    };
11603                }
11604                function findHandler(events, callable, delegationSelector = null) {
11605                    return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
11606                }
11607                function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
11608                    const isDelegated = typeof handler === 'string';
11609                    // TODO: tooltip passes `false` instead of selector, so we need to check
11610                    const callable = isDelegated ? delegationFunction : handler || delegationFunction;
11611                    let typeEvent = getTypeEvent(originalTypeEvent);
11612                    if (!nativeEvents.has(typeEvent)) {
11613                        typeEvent = originalTypeEvent;
11614                    }
11615                    return [isDelegated, callable, typeEvent];
11616                }
11617                function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
11618                    if (typeof originalTypeEvent !== 'string' || !element) {
11619                        return;
11620                    }
11621                    let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
11622
11623                    // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
11624                    // this prevents the handler from being dispatched the same way as mouseover or mouseout does
11625                    if (originalTypeEvent in customEvents) {
11626                        const wrapFunction = fn => {
11627                            return function (event) {
11628                                if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
11629                                    return fn.call(this, event);
11630                                }
11631                            };
11632                        };
11633                        callable = wrapFunction(callable);
11634                    }
11635                    const events = getElementEvents(element);
11636                    const handlers = events[typeEvent] || (events[typeEvent] = {});
11637                    const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
11638                    if (previousFunction) {
11639                        previousFunction.oneOff = previousFunction.oneOff && oneOff;
11640                        return;
11641                    }
11642                    const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
11643                    const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
11644                    fn.delegationSelector = isDelegated ? handler : null;
11645                    fn.callable = callable;
11646                    fn.oneOff = oneOff;
11647                    fn.uidEvent = uid;
11648                    handlers[uid] = fn;
11649                    element.addEventListener(typeEvent, fn, isDelegated);
11650                }
11651                function removeHandler(element, events, typeEvent, handler, delegationSelector) {
11652                    const fn = findHandler(events[typeEvent], handler, delegationSelector);
11653                    if (!fn) {
11654                        return;
11655                    }
11656                    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
11657                    delete events[typeEvent][fn.uidEvent];
11658                }
11659                function removeNamespacedHandlers(element, events, typeEvent, namespace) {
11660                    const storeElementEvent = events[typeEvent] || {};
11661                    for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
11662                        if (handlerKey.includes(namespace)) {
11663                            removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
11664                        }
11665                    }
11666                }
11667                function getTypeEvent(event) {
11668                    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
11669                    event = event.replace(stripNameRegex, '');
11670                    return customEvents[event] || event;
11671                }
11672                const EventHandler = {
11673                    on(element, event, handler, delegationFunction) {
11674                        addHandler(element, event, handler, delegationFunction, false);
11675                    },
11676                    one(element, event, handler, delegationFunction) {
11677                        addHandler(element, event, handler, delegationFunction, true);
11678                    },
11679                    off(element, originalTypeEvent, handler, delegationFunction) {
11680                        if (typeof originalTypeEvent !== 'string' || !element) {
11681                            return;
11682                        }
11683                        const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
11684                        const inNamespace = typeEvent !== originalTypeEvent;
11685                        const events = getElementEvents(element);
11686                        const storeElementEvent = events[typeEvent] || {};
11687                        const isNamespace = originalTypeEvent.startsWith('.');
11688                        if (typeof callable !== 'undefined') {
11689                            // Simplest case: handler is passed, remove that listener ONLY.
11690                            if (!Object.keys(storeElementEvent).length) {
11691                                return;
11692                            }
11693                            removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
11694                            return;
11695                        }
11696                        if (isNamespace) {
11697                            for (const elementEvent of Object.keys(events)) {
11698                                removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
11699                            }
11700                        }
11701                        for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
11702                            const handlerKey = keyHandlers.replace(stripUidRegex, '');
11703                            if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
11704                                removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
11705                            }
11706                        }
11707                    },
11708                    trigger(element, event, args) {
11709                        if (typeof event !== 'string' || !element) {
11710                            return null;
11711                        }
11712                        const $ = index_js.getjQuery();
11713                        const typeEvent = getTypeEvent(event);
11714                        const inNamespace = event !== typeEvent;
11715                        let jQueryEvent = null;
11716                        let bubbles = true;
11717                        let nativeDispatch = true;
11718                        let defaultPrevented = false;
11719                        if (inNamespace && $) {
11720                            jQueryEvent = $.Event(event, args);
11721                            $(element).trigger(jQueryEvent);
11722                            bubbles = !jQueryEvent.isPropagationStopped();
11723                            nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
11724                            defaultPrevented = jQueryEvent.isDefaultPrevented();
11725                        }
11726                        const evt = hydrateObj(new Event(event, {
11727                            bubbles,
11728                            cancelable: true
11729                        }), args);
11730                        if (defaultPrevented) {
11731                            evt.preventDefault();
11732                        }
11733                        if (nativeDispatch) {
11734                            element.dispatchEvent(evt);
11735                        }
11736                        if (evt.defaultPrevented && jQueryEvent) {
11737                            jQueryEvent.preventDefault();
11738                        }
11739                        return evt;
11740                    }
11741                };
11742                function hydrateObj(obj, meta = {}) {
11743                    for (const [key, value] of Object.entries(meta)) {
11744                        try {
11745                            obj[key] = value;
11746                        } catch (_unused) {
11747                            Object.defineProperty(obj, key, {
11748                                configurable: true,
11749                                get() {
11750                                    return value;
11751                                }
11752                            });
11753                        }
11754                    }
11755                    return obj;
11756                }
11757
11758                return EventHandler;
11759
11760            }));
11761//# sourceMappingURL=event-handler.js.map
11762
11763
11764            /***/ }),
11765
11766        
vendor: 3,520 bytes, lines 11766-11847
11766/***/ "./node_modules/bootstrap/js/dist/dom/manipulator.js":
11767        /*!***********************************************************!*\
11768  !*** ./node_modules/bootstrap/js/dist/dom/manipulator.js ***!
11769  \***********************************************************/
11770        /***/ (function(module) {
11771
11772            /*!
11773  * Bootstrap manipulator.js v5.3.3 (https://getbootstrap.com/)
11774  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11775  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11776  */
11777            (function (global, factory) {
11778                true ? module.exports = factory() :
11779                    0;
11780            })(this, (function () { 'use strict';
11781
11782                /**
11783                 * --------------------------------------------------------------------------
11784                 * Bootstrap dom/manipulator.js
11785                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11786                 * --------------------------------------------------------------------------
11787                 */
11788
11789                function normalizeData(value) {
11790                    if (value === 'true') {
11791                        return true;
11792                    }
11793                    if (value === 'false') {
11794                        return false;
11795                    }
11796                    if (value === Number(value).toString()) {
11797                        return Number(value);
11798                    }
11799                    if (value === '' || value === 'null') {
11800                        return null;
11801                    }
11802                    if (typeof value !== 'string') {
11803                        return value;
11804                    }
11805                    try {
11806                        return JSON.parse(decodeURIComponent(value));
11807                    } catch (_unused) {
11808                        return value;
11809                    }
11810                }
11811                function normalizeDataKey(key) {
11812                    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
11813                }
11814                const Manipulator = {
11815                    setDataAttribute(element, key, value) {
11816                        element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
11817                    },
11818                    removeDataAttribute(element, key) {
11819                        element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
11820                    },
11821                    getDataAttributes(element) {
11822                        if (!element) {
11823                            return {};
11824                        }
11825                        const attributes = {};
11826                        const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
11827                        for (const key of bsKeys) {
11828                            let pureKey = key.replace(/^bs/, '');
11829                            pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
11830                            attributes[pureKey] = normalizeData(element.dataset[key]);
11831                        }
11832                        return attributes;
11833                    },
11834                    getDataAttribute(element, key) {
11835                        return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
11836                    }
11837                };
11838
11839                return Manipulator;
11840
11841            }));
11842//# sourceMappingURL=manipulator.js.map
11843
11844
11845            /***/ }),
11846
11847        
vendor: 5,984 bytes, lines 11847-11960
11847/***/ "./node_modules/bootstrap/js/dist/dom/selector-engine.js":
11848        /*!***************************************************************!*\
11849  !*** ./node_modules/bootstrap/js/dist/dom/selector-engine.js ***!
11850  \***************************************************************/
11851        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
11852
11853            /*!
11854  * Bootstrap selector-engine.js v5.3.3 (https://getbootstrap.com/)
11855  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11856  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11857  */
11858            (function (global, factory) {
11859                true ? module.exports = factory(__webpack_require__(/*! ../util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
11860                    0;
11861            })(this, (function (index_js) { 'use strict';
11862
11863                /**
11864                 * --------------------------------------------------------------------------
11865                 * Bootstrap dom/selector-engine.js
11866                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11867                 * --------------------------------------------------------------------------
11868                 */
11869
11870                const getSelector = element => {
11871                    let selector = element.getAttribute('data-bs-target');
11872                    if (!selector || selector === '#') {
11873                        let hrefAttribute = element.getAttribute('href');
11874
11875                        // The only valid content that could double as a selector are IDs or classes,
11876                        // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
11877                        // `document.querySelector` will rightfully complain it is invalid.
11878                        // See https://github.com/twbs/bootstrap/issues/32273
11879                        if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
11880                            return null;
11881                        }
11882
11883                        // Just in case some CMS puts out a full URL with the anchor appended
11884                        if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
11885                            hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
11886                        }
11887                        selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
11888                    }
11889                    return selector ? selector.split(',').map(sel => index_js.parseSelector(sel)).join(',') : null;
11890                };
11891                const SelectorEngine = {
11892                    find(selector, element = document.documentElement) {
11893                        return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
11894                    },
11895                    findOne(selector, element = document.documentElement) {
11896                        return Element.prototype.querySelector.call(element, selector);
11897                    },
11898                    children(element, selector) {
11899                        return [].concat(...element.children).filter(child => child.matches(selector));
11900                    },
11901                    parents(element, selector) {
11902                        const parents = [];
11903                        let ancestor = element.parentNode.closest(selector);
11904                        while (ancestor) {
11905                            parents.push(ancestor);
11906                            ancestor = ancestor.parentNode.closest(selector);
11907                        }
11908                        return parents;
11909                    },
11910                    prev(element, selector) {
11911                        let previous = element.previousElementSibling;
11912                        while (previous) {
11913                            if (previous.matches(selector)) {
11914                                return [previous];
11915                            }
11916                            previous = previous.previousElementSibling;
11917                        }
11918                        return [];
11919                    },
11920                    // TODO: this is now unused; remove later along with prev()
11921                    next(element, selector) {
11922                        let next = element.nextElementSibling;
11923                        while (next) {
11924                            if (next.matches(selector)) {
11925                                return [next];
11926                            }
11927                            next = next.nextElementSibling;
11928                        }
11929                        return [];
11930                    },
11931                    focusableChildren(element) {
11932                        const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
11933                        return this.find(focusables, element).filter(el => !index_js.isDisabled(el) && index_js.isVisible(el));
11934                    },
11935                    getSelectorFromElement(element) {
11936                        const selector = getSelector(element);
11937                        if (selector) {
11938                            return SelectorEngine.findOne(selector) ? selector : null;
11939                        }
11940                        return null;
11941                    },
11942                    getElementFromSelector(element) {
11943                        const selector = getSelector(element);
11944                        return selector ? SelectorEngine.findOne(selector) : null;
11945                    },
11946                    getMultipleElementsFromSelector(element) {
11947                        const selector = getSelector(element);
11948                        return selector ? SelectorEngine.find(selector) : [];
11949                    }
11950                };
11951
11952                return SelectorEngine;
11953
11954            }));
11955//# sourceMappingURL=selector-engine.js.map
11956
11957
11958            /***/ }),
11959
11960        
vendor: 22,141 bytes, lines 11960-12371
11960/***/ "./node_modules/bootstrap/js/dist/dropdown.js":
11961        /*!****************************************************!*\
11962  !*** ./node_modules/bootstrap/js/dist/dropdown.js ***!
11963  \****************************************************/
11964        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
11965
11966            /*!
11967  * Bootstrap dropdown.js v5.3.3 (https://getbootstrap.com/)
11968  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11969  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11970  */
11971            (function (global, factory) {
11972                true ? module.exports = factory(__webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js"), __webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/manipulator.js */ "./node_modules/bootstrap/js/dist/dom/manipulator.js"), __webpack_require__(/*! ./dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
11973                    0;
11974            })(this, (function (Popper, BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js) { 'use strict';
11975
11976                function _interopNamespaceDefault(e) {
11977                    const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
11978                    if (e) {
11979                        for (const k in e) {
11980                            if (k !== 'default') {
11981                                const d = Object.getOwnPropertyDescriptor(e, k);
11982                                Object.defineProperty(n, k, d.get ? d : {
11983                                    enumerable: true,
11984                                    get: () => e[k]
11985                                });
11986                            }
11987                        }
11988                    }
11989                    n.default = e;
11990                    return Object.freeze(n);
11991                }
11992
11993                const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);
11994
11995                /**
11996                 * --------------------------------------------------------------------------
11997                 * Bootstrap dropdown.js
11998                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11999                 * --------------------------------------------------------------------------
12000                 */
12001
12002
12003                /**
12004                 * Constants
12005                 */
12006
12007                const NAME = 'dropdown';
12008                const DATA_KEY = 'bs.dropdown';
12009                const EVENT_KEY = `.${DATA_KEY}`;
12010                const DATA_API_KEY = '.data-api';
12011                const ESCAPE_KEY = 'Escape';
12012                const TAB_KEY = 'Tab';
12013                const ARROW_UP_KEY = 'ArrowUp';
12014                const ARROW_DOWN_KEY = 'ArrowDown';
12015                const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
12016
12017                const EVENT_HIDE = `hide${EVENT_KEY}`;
12018                const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
12019                const EVENT_SHOW = `show${EVENT_KEY}`;
12020                const EVENT_SHOWN = `shown${EVENT_KEY}`;
12021                const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
12022                const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
12023                const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
12024                const CLASS_NAME_SHOW = 'show';
12025                const CLASS_NAME_DROPUP = 'dropup';
12026                const CLASS_NAME_DROPEND = 'dropend';
12027                const CLASS_NAME_DROPSTART = 'dropstart';
12028                const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
12029                const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
12030                const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
12031                const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`;
12032                const SELECTOR_MENU = '.dropdown-menu';
12033                const SELECTOR_NAVBAR = '.navbar';
12034                const SELECTOR_NAVBAR_NAV = '.navbar-nav';
12035                const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
12036                const PLACEMENT_TOP = index_js.isRTL() ? 'top-end' : 'top-start';
12037                const PLACEMENT_TOPEND = index_js.isRTL() ? 'top-start' : 'top-end';
12038                const PLACEMENT_BOTTOM = index_js.isRTL() ? 'bottom-end' : 'bottom-start';
12039                const PLACEMENT_BOTTOMEND = index_js.isRTL() ? 'bottom-start' : 'bottom-end';
12040                const PLACEMENT_RIGHT = index_js.isRTL() ? 'left-start' : 'right-start';
12041                const PLACEMENT_LEFT = index_js.isRTL() ? 'right-start' : 'left-start';
12042                const PLACEMENT_TOPCENTER = 'top';
12043                const PLACEMENT_BOTTOMCENTER = 'bottom';
12044                const Default = {
12045                    autoClose: true,
12046                    boundary: 'clippingParents',
12047                    display: 'dynamic',
12048                    offset: [0, 2],
12049                    popperConfig: null,
12050                    reference: 'toggle'
12051                };
12052                const DefaultType = {
12053                    autoClose: '(boolean|string)',
12054                    boundary: '(string|element)',
12055                    display: 'string',
12056                    offset: '(array|string|function)',
12057                    popperConfig: '(null|object|function)',
12058                    reference: '(string|element|object)'
12059                };
12060
12061                /**
12062                 * Class definition
12063                 */
12064
12065                class Dropdown extends BaseComponent {
12066                    constructor(element, config) {
12067                        super(element, config);
12068                        this._popper = null;
12069                        this._parent = this._element.parentNode; // dropdown wrapper
12070                        // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
12071                        this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
12072                        this._inNavbar = this._detectNavbar();
12073                    }
12074
12075                    // Getters
12076                    static get Default() {
12077                        return Default;
12078                    }
12079                    static get DefaultType() {
12080                        return DefaultType;
12081                    }
12082                    static get NAME() {
12083                        return NAME;
12084                    }
12085
12086                    // Public
12087                    toggle() {
12088                        return this._isShown() ? this.hide() : this.show();
12089                    }
12090                    show() {
12091                        if (index_js.isDisabled(this._element) || this._isShown()) {
12092                            return;
12093                        }
12094                        const relatedTarget = {
12095                            relatedTarget: this._element
12096                        };
12097                        const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
12098                        if (showEvent.defaultPrevented) {
12099                            return;
12100                        }
12101                        this._createPopper();
12102
12103                        // If this is a touch-enabled device we add extra
12104                        // empty mouseover listeners to the body's immediate children;
12105                        // only needed because of broken event delegation on iOS
12106                        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
12107                        if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
12108                            for (const element of [].concat(...document.body.children)) {
12109                                EventHandler.on(element, 'mouseover', index_js.noop);
12110                            }
12111                        }
12112                        this._element.focus();
12113                        this._element.setAttribute('aria-expanded', true);
12114                        this._menu.classList.add(CLASS_NAME_SHOW);
12115                        this._element.classList.add(CLASS_NAME_SHOW);
12116                        EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget);
12117                    }
12118                    hide() {
12119                        if (index_js.isDisabled(this._element) || !this._isShown()) {
12120                            return;
12121                        }
12122                        const relatedTarget = {
12123                            relatedTarget: this._element
12124                        };
12125                        this._completeHide(relatedTarget);
12126                    }
12127                    dispose() {
12128                        if (this._popper) {
12129                            this._popper.destroy();
12130                        }
12131                        super.dispose();
12132                    }
12133                    update() {
12134                        this._inNavbar = this._detectNavbar();
12135                        if (this._popper) {
12136                            this._popper.update();
12137                        }
12138                    }
12139
12140                    // Private
12141                    _completeHide(relatedTarget) {
12142                        const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget);
12143                        if (hideEvent.defaultPrevented) {
12144                            return;
12145                        }
12146
12147                        // If this is a touch-enabled device we remove the extra
12148                        // empty mouseover listeners we added for iOS support
12149                        if ('ontouchstart' in document.documentElement) {
12150                            for (const element of [].concat(...document.body.children)) {
12151                                EventHandler.off(element, 'mouseover', index_js.noop);
12152                            }
12153                        }
12154                        if (this._popper) {
12155                            this._popper.destroy();
12156                        }
12157                        this._menu.classList.remove(CLASS_NAME_SHOW);
12158                        this._element.classList.remove(CLASS_NAME_SHOW);
12159                        this._element.setAttribute('aria-expanded', 'false');
12160                        Manipulator.removeDataAttribute(this._menu, 'popper');
12161                        EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget);
12162                    }
12163                    _getConfig(config) {
12164                        config = super._getConfig(config);
12165                        if (typeof config.reference === 'object' && !index_js.isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
12166                            // Popper virtual elements require a getBoundingClientRect method
12167                            throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
12168                        }
12169                        return config;
12170                    }
12171                    _createPopper() {
12172                        if (typeof Popper__namespace === 'undefined') {
12173                            throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
12174                        }
12175                        let referenceElement = this._element;
12176                        if (this._config.reference === 'parent') {
12177                            referenceElement = this._parent;
12178                        } else if (index_js.isElement(this._config.reference)) {
12179                            referenceElement = index_js.getElement(this._config.reference);
12180                        } else if (typeof this._config.reference === 'object') {
12181                            referenceElement = this._config.reference;
12182                        }
12183                        const popperConfig = this._getPopperConfig();
12184                        this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
12185                    }
12186                    _isShown() {
12187                        return this._menu.classList.contains(CLASS_NAME_SHOW);
12188                    }
12189                    _getPlacement() {
12190                        const parentDropdown = this._parent;
12191                        if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
12192                            return PLACEMENT_RIGHT;
12193                        }
12194                        if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
12195                            return PLACEMENT_LEFT;
12196                        }
12197                        if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
12198                            return PLACEMENT_TOPCENTER;
12199                        }
12200                        if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
12201                            return PLACEMENT_BOTTOMCENTER;
12202                        }
12203
12204                        // We need to trim the value because custom properties can also include spaces
12205                        const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
12206                        if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
12207                            return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
12208                        }
12209                        return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
12210                    }
12211                    _detectNavbar() {
12212                        return this._element.closest(SELECTOR_NAVBAR) !== null;
12213                    }
12214                    _getOffset() {
12215                        const {
12216                            offset
12217                        } = this._config;
12218                        if (typeof offset === 'string') {
12219                            return offset.split(',').map(value => Number.parseInt(value, 10));
12220                        }
12221                        if (typeof offset === 'function') {
12222                            return popperData => offset(popperData, this._element);
12223                        }
12224                        return offset;
12225                    }
12226                    _getPopperConfig() {
12227                        const defaultBsPopperConfig = {
12228                            placement: this._getPlacement(),
12229                            modifiers: [{
12230                                name: 'preventOverflow',
12231                                options: {
12232                                    boundary: this._config.boundary
12233                                }
12234                            }, {
12235                                name: 'offset',
12236                                options: {
12237                                    offset: this._getOffset()
12238                                }
12239                            }]
12240                        };
12241
12242                        // Disable Popper if we have a static display or Dropdown is in Navbar
12243                        if (this._inNavbar || this._config.display === 'static') {
12244                            Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
12245                            defaultBsPopperConfig.modifiers = [{
12246                                name: 'applyStyles',
12247                                enabled: false
12248                            }];
12249                        }
12250                        return {
12251                            ...defaultBsPopperConfig,
12252                            ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig])
12253                        };
12254                    }
12255                    _selectMenuItem({
12256                                        key,
12257                                        target
12258                                    }) {
12259                        const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => index_js.isVisible(element));
12260                        if (!items.length) {
12261                            return;
12262                        }
12263
12264                        // if target isn't included in items (e.g. when expanding the dropdown)
12265                        // allow cycling to get the last item in case key equals ARROW_UP_KEY
12266                        index_js.getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
12267                    }
12268
12269                    // Static
12270                    static jQueryInterface(config) {
12271                        return this.each(function () {
12272                            const data = Dropdown.getOrCreateInstance(this, config);
12273                            if (typeof config !== 'string') {
12274                                return;
12275                            }
12276                            if (typeof data[config] === 'undefined') {
12277                                throw new TypeError(`No method named "${config}"`);
12278                            }
12279                            data[config]();
12280                        });
12281                    }
12282                    static clearMenus(event) {
12283                        if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) {
12284                            return;
12285                        }
12286                        const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
12287                        for (const toggle of openToggles) {
12288                            const context = Dropdown.getInstance(toggle);
12289                            if (!context || context._config.autoClose === false) {
12290                                continue;
12291                            }
12292                            const composedPath = event.composedPath();
12293                            const isMenuTarget = composedPath.includes(context._menu);
12294                            if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
12295                                continue;
12296                            }
12297
12298                            // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
12299                            if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
12300                                continue;
12301                            }
12302                            const relatedTarget = {
12303                                relatedTarget: context._element
12304                            };
12305                            if (event.type === 'click') {
12306                                relatedTarget.clickEvent = event;
12307                            }
12308                            context._completeHide(relatedTarget);
12309                        }
12310                    }
12311                    static dataApiKeydownHandler(event) {
12312                        // If not an UP | DOWN | ESCAPE key => not a dropdown command
12313                        // If input/textarea && if key is other than ESCAPE => not a dropdown command
12314
12315                        const isInput = /input|textarea/i.test(event.target.tagName);
12316                        const isEscapeEvent = event.key === ESCAPE_KEY;
12317                        const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key);
12318                        if (!isUpOrDownEvent && !isEscapeEvent) {
12319                            return;
12320                        }
12321                        if (isInput && !isEscapeEvent) {
12322                            return;
12323                        }
12324                        event.preventDefault();
12325
12326                        // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
12327                        const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode);
12328                        const instance = Dropdown.getOrCreateInstance(getToggleButton);
12329                        if (isUpOrDownEvent) {
12330                            event.stopPropagation();
12331                            instance.show();
12332                            instance._selectMenuItem(event);
12333                            return;
12334                        }
12335                        if (instance._isShown()) {
12336                            // else is escape and we check if it is shown
12337                            event.stopPropagation();
12338                            instance.hide();
12339                            getToggleButton.focus();
12340                        }
12341                    }
12342                }
12343
12344                /**
12345                 * Data API implementation
12346                 */
12347
12348                EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
12349                EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
12350                EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
12351                EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
12352                EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
12353                    event.preventDefault();
12354                    Dropdown.getOrCreateInstance(this).toggle();
12355                });
12356
12357                /**
12358                 * jQuery
12359                 */
12360
12361                index_js.defineJQueryPlugin(Dropdown);
12362
12363                return Dropdown;
12364
12365            }));
12366//# sourceMappingURL=dropdown.js.map
12367
12368
12369            /***/ }),
12370
12371        
vendor: 14,406 bytes, lines 12371-12655
12371/***/ "./node_modules/bootstrap/js/dist/scrollspy.js":
12372        /*!*****************************************************!*\
12373  !*** ./node_modules/bootstrap/js/dist/scrollspy.js ***!
12374  \*****************************************************/
12375        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
12376
12377            /*!
12378  * Bootstrap scrollspy.js v5.3.3 (https://getbootstrap.com/)
12379  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
12380  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
12381  */
12382            (function (global, factory) {
12383                true ? module.exports = factory(__webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
12384                    0;
12385            })(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';
12386
12387                /**
12388                 * --------------------------------------------------------------------------
12389                 * Bootstrap scrollspy.js
12390                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
12391                 * --------------------------------------------------------------------------
12392                 */
12393
12394
12395                /**
12396                 * Constants
12397                 */
12398
12399                const NAME = 'scrollspy';
12400                const DATA_KEY = 'bs.scrollspy';
12401                const EVENT_KEY = `.${DATA_KEY}`;
12402                const DATA_API_KEY = '.data-api';
12403                const EVENT_ACTIVATE = `activate${EVENT_KEY}`;
12404                const EVENT_CLICK = `click${EVENT_KEY}`;
12405                const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
12406                const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
12407                const CLASS_NAME_ACTIVE = 'active';
12408                const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
12409                const SELECTOR_TARGET_LINKS = '[href]';
12410                const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
12411                const SELECTOR_NAV_LINKS = '.nav-link';
12412                const SELECTOR_NAV_ITEMS = '.nav-item';
12413                const SELECTOR_LIST_ITEMS = '.list-group-item';
12414                const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
12415                const SELECTOR_DROPDOWN = '.dropdown';
12416                const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
12417                const Default = {
12418                    offset: null,
12419                    // TODO: v6 @deprecated, keep it for backwards compatibility reasons
12420                    rootMargin: '0px 0px -25%',
12421                    smoothScroll: false,
12422                    target: null,
12423                    threshold: [0.1, 0.5, 1]
12424                };
12425                const DefaultType = {
12426                    offset: '(number|null)',
12427                    // TODO v6 @deprecated, keep it for backwards compatibility reasons
12428                    rootMargin: 'string',
12429                    smoothScroll: 'boolean',
12430                    target: 'element',
12431                    threshold: 'array'
12432                };
12433
12434                /**
12435                 * Class definition
12436                 */
12437
12438                class ScrollSpy extends BaseComponent {
12439                    constructor(element, config) {
12440                        super(element, config);
12441
12442                        // this._element is the observablesContainer and config.target the menu links wrapper
12443                        this._targetLinks = new Map();
12444                        this._observableSections = new Map();
12445                        this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
12446                        this._activeTarget = null;
12447                        this._observer = null;
12448                        this._previousScrollData = {
12449                            visibleEntryTop: 0,
12450                            parentScrollTop: 0
12451                        };
12452                        this.refresh(); // initialize
12453                    }
12454
12455                    // Getters
12456                    static get Default() {
12457                        return Default;
12458                    }
12459                    static get DefaultType() {
12460                        return DefaultType;
12461                    }
12462                    static get NAME() {
12463                        return NAME;
12464                    }
12465
12466                    // Public
12467                    refresh() {
12468                        this._initializeTargetsAndObservables();
12469                        this._maybeEnableSmoothScroll();
12470                        if (this._observer) {
12471                            this._observer.disconnect();
12472                        } else {
12473                            this._observer = this._getNewObserver();
12474                        }
12475                        for (const section of this._observableSections.values()) {
12476                            this._observer.observe(section);
12477                        }
12478                    }
12479                    dispose() {
12480                        this._observer.disconnect();
12481                        super.dispose();
12482                    }
12483
12484                    // Private
12485                    _configAfterMerge(config) {
12486                        // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
12487                        config.target = index_js.getElement(config.target) || document.body;
12488
12489                        // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
12490                        config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
12491                        if (typeof config.threshold === 'string') {
12492                            config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));
12493                        }
12494                        return config;
12495                    }
12496                    _maybeEnableSmoothScroll() {
12497                        if (!this._config.smoothScroll) {
12498                            return;
12499                        }
12500
12501                        // unregister any previous listeners
12502                        EventHandler.off(this._config.target, EVENT_CLICK);
12503                        EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
12504                            const observableSection = this._observableSections.get(event.target.hash);
12505                            if (observableSection) {
12506                                event.preventDefault();
12507                                const root = this._rootElement || window;
12508                                const height = observableSection.offsetTop - this._element.offsetTop;
12509                                if (root.scrollTo) {
12510                                    root.scrollTo({
12511                                        top: height,
12512                                        behavior: 'smooth'
12513                                    });
12514                                    return;
12515                                }
12516
12517                                // Chrome 60 doesn't support `scrollTo`
12518                                root.scrollTop = height;
12519                            }
12520                        });
12521                    }
12522                    _getNewObserver() {
12523                        const options = {
12524                            root: this._rootElement,
12525                            threshold: this._config.threshold,
12526                            rootMargin: this._config.rootMargin
12527                        };
12528                        return new IntersectionObserver(entries => this._observerCallback(entries), options);
12529                    }
12530
12531                    // The logic of selection
12532                    _observerCallback(entries) {
12533                        const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
12534                        const activate = entry => {
12535                            this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
12536                            this._process(targetElement(entry));
12537                        };
12538                        const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
12539                        const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
12540                        this._previousScrollData.parentScrollTop = parentScrollTop;
12541                        for (const entry of entries) {
12542                            if (!entry.isIntersecting) {
12543                                this._activeTarget = null;
12544                                this._clearActiveClass(targetElement(entry));
12545                                continue;
12546                            }
12547                            const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
12548                            // if we are scrolling down, pick the bigger offsetTop
12549                            if (userScrollsDown && entryIsLowerThanPrevious) {
12550                                activate(entry);
12551                                // if parent isn't scrolled, let's keep the first visible item, breaking the iteration
12552                                if (!parentScrollTop) {
12553                                    return;
12554                                }
12555                                continue;
12556                            }
12557
12558                            // if we are scrolling up, pick the smallest offsetTop
12559                            if (!userScrollsDown && !entryIsLowerThanPrevious) {
12560                                activate(entry);
12561                            }
12562                        }
12563                    }
12564                    _initializeTargetsAndObservables() {
12565                        this._targetLinks = new Map();
12566                        this._observableSections = new Map();
12567                        const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
12568                        for (const anchor of targetLinks) {
12569                            // ensure that the anchor has an id and is not disabled
12570                            if (!anchor.hash || index_js.isDisabled(anchor)) {
12571                                continue;
12572                            }
12573                            const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
12574
12575                            // ensure that the observableSection exists & is visible
12576                            if (index_js.isVisible(observableSection)) {
12577                                this._targetLinks.set(decodeURI(anchor.hash), anchor);
12578                                this._observableSections.set(anchor.hash, observableSection);
12579                            }
12580                        }
12581                    }
12582                    _process(target) {
12583                        if (this._activeTarget === target) {
12584                            return;
12585                        }
12586                        this._clearActiveClass(this._config.target);
12587                        this._activeTarget = target;
12588                        target.classList.add(CLASS_NAME_ACTIVE);
12589                        this._activateParents(target);
12590                        EventHandler.trigger(this._element, EVENT_ACTIVATE, {
12591                            relatedTarget: target
12592                        });
12593                    }
12594                    _activateParents(target) {
12595                        // Activate dropdown parents
12596                        if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
12597                            SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
12598                            return;
12599                        }
12600                        for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
12601                            // Set triggered links parents as active
12602                            // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
12603                            for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
12604                                item.classList.add(CLASS_NAME_ACTIVE);
12605                            }
12606                        }
12607                    }
12608                    _clearActiveClass(parent) {
12609                        parent.classList.remove(CLASS_NAME_ACTIVE);
12610                        const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent);
12611                        for (const node of activeNodes) {
12612                            node.classList.remove(CLASS_NAME_ACTIVE);
12613                        }
12614                    }
12615
12616                    // Static
12617                    static jQueryInterface(config) {
12618                        return this.each(function () {
12619                            const data = ScrollSpy.getOrCreateInstance(this, config);
12620                            if (typeof config !== 'string') {
12621                                return;
12622                            }
12623                            if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
12624                                throw new TypeError(`No method named "${config}"`);
12625                            }
12626                            data[config]();
12627                        });
12628                    }
12629                }
12630
12631                /**
12632                 * Data API implementation
12633                 */
12634
12635                EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
12636                    for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
12637                        ScrollSpy.getOrCreateInstance(spy);
12638                    }
12639                });
12640
12641                /**
12642                 * jQuery
12643                 */
12644
12645                index_js.defineJQueryPlugin(ScrollSpy);
12646
12647                return ScrollSpy;
12648
12649            }));
12650//# sourceMappingURL=scrollspy.js.map
12651
12652
12653            /***/ }),
12654
12655        
vendor: 15,044 bytes, lines 12655-12949
12655/***/ "./node_modules/bootstrap/js/dist/tab.js":
12656        /*!***********************************************!*\
12657  !*** ./node_modules/bootstrap/js/dist/tab.js ***!
12658  \***********************************************/
12659        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
12660
12661            /*!
12662  * Bootstrap tab.js v5.3.3 (https://getbootstrap.com/)
12663  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
12664  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
12665  */
12666            (function (global, factory) {
12667                true ? module.exports = factory(__webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
12668                    0;
12669            })(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';
12670
12671                /**
12672                 * --------------------------------------------------------------------------
12673                 * Bootstrap tab.js
12674                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
12675                 * --------------------------------------------------------------------------
12676                 */
12677
12678
12679                /**
12680                 * Constants
12681                 */
12682
12683                const NAME = 'tab';
12684                const DATA_KEY = 'bs.tab';
12685                const EVENT_KEY = `.${DATA_KEY}`;
12686                const EVENT_HIDE = `hide${EVENT_KEY}`;
12687                const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
12688                const EVENT_SHOW = `show${EVENT_KEY}`;
12689                const EVENT_SHOWN = `shown${EVENT_KEY}`;
12690                const EVENT_CLICK_DATA_API = `click${EVENT_KEY}`;
12691                const EVENT_KEYDOWN = `keydown${EVENT_KEY}`;
12692                const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`;
12693                const ARROW_LEFT_KEY = 'ArrowLeft';
12694                const ARROW_RIGHT_KEY = 'ArrowRight';
12695                const ARROW_UP_KEY = 'ArrowUp';
12696                const ARROW_DOWN_KEY = 'ArrowDown';
12697                const HOME_KEY = 'Home';
12698                const END_KEY = 'End';
12699                const CLASS_NAME_ACTIVE = 'active';
12700                const CLASS_NAME_FADE = 'fade';
12701                const CLASS_NAME_SHOW = 'show';
12702                const CLASS_DROPDOWN = 'dropdown';
12703                const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
12704                const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
12705                const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
12706                const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
12707                const SELECTOR_OUTER = '.nav-item, .list-group-item';
12708                const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
12709                const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // TODO: could only be `tab` in v6
12710                const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
12711                const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
12712
12713                /**
12714                 * Class definition
12715                 */
12716
12717                class Tab extends BaseComponent {
12718                    constructor(element) {
12719                        super(element);
12720                        this._parent = this._element.closest(SELECTOR_TAB_PANEL);
12721                        if (!this._parent) {
12722                            return;
12723                            // TODO: should throw exception in v6
12724                            // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
12725                        }
12726
12727                        // Set up initial aria attributes
12728                        this._setInitialAttributes(this._parent, this._getChildren());
12729                        EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
12730                    }
12731
12732                    // Getters
12733                    static get NAME() {
12734                        return NAME;
12735                    }
12736
12737                    // Public
12738                    show() {
12739                        // Shows this elem and deactivate the active sibling if exists
12740                        const innerElem = this._element;
12741                        if (this._elemIsActive(innerElem)) {
12742                            return;
12743                        }
12744
12745                        // Search for active tab on same parent to deactivate it
12746                        const active = this._getActiveElem();
12747                        const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE, {
12748                            relatedTarget: innerElem
12749                        }) : null;
12750                        const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, {
12751                            relatedTarget: active
12752                        });
12753                        if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
12754                            return;
12755                        }
12756                        this._deactivate(active, innerElem);
12757                        this._activate(innerElem, active);
12758                    }
12759
12760                    // Private
12761                    _activate(element, relatedElem) {
12762                        if (!element) {
12763                            return;
12764                        }
12765                        element.classList.add(CLASS_NAME_ACTIVE);
12766                        this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section
12767
12768                        const complete = () => {
12769                            if (element.getAttribute('role') !== 'tab') {
12770                                element.classList.add(CLASS_NAME_SHOW);
12771                                return;
12772                            }
12773                            element.removeAttribute('tabindex');
12774                            element.setAttribute('aria-selected', true);
12775                            this._toggleDropDown(element, true);
12776                            EventHandler.trigger(element, EVENT_SHOWN, {
12777                                relatedTarget: relatedElem
12778                            });
12779                        };
12780                        this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));
12781                    }
12782                    _deactivate(element, relatedElem) {
12783                        if (!element) {
12784                            return;
12785                        }
12786                        element.classList.remove(CLASS_NAME_ACTIVE);
12787                        element.blur();
12788                        this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too
12789
12790                        const complete = () => {
12791                            if (element.getAttribute('role') !== 'tab') {
12792                                element.classList.remove(CLASS_NAME_SHOW);
12793                                return;
12794                            }
12795                            element.setAttribute('aria-selected', false);
12796                            element.setAttribute('tabindex', '-1');
12797                            this._toggleDropDown(element, false);
12798                            EventHandler.trigger(element, EVENT_HIDDEN, {
12799                                relatedTarget: relatedElem
12800                            });
12801                        };
12802                        this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));
12803                    }
12804                    _keydown(event) {
12805                        if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {
12806                            return;
12807                        }
12808                        event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
12809                        event.preventDefault();
12810                        const children = this._getChildren().filter(element => !index_js.isDisabled(element));
12811                        let nextActiveElement;
12812                        if ([HOME_KEY, END_KEY].includes(event.key)) {
12813                            nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
12814                        } else {
12815                            const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
12816                            nextActiveElement = index_js.getNextActiveElement(children, event.target, isNext, true);
12817                        }
12818                        if (nextActiveElement) {
12819                            nextActiveElement.focus({
12820                                preventScroll: true
12821                            });
12822                            Tab.getOrCreateInstance(nextActiveElement).show();
12823                        }
12824                    }
12825                    _getChildren() {
12826                        // collection of inner elements
12827                        return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
12828                    }
12829                    _getActiveElem() {
12830                        return this._getChildren().find(child => this._elemIsActive(child)) || null;
12831                    }
12832                    _setInitialAttributes(parent, children) {
12833                        this._setAttributeIfNotExists(parent, 'role', 'tablist');
12834                        for (const child of children) {
12835                            this._setInitialAttributesOnChild(child);
12836                        }
12837                    }
12838                    _setInitialAttributesOnChild(child) {
12839                        child = this._getInnerElement(child);
12840                        const isActive = this._elemIsActive(child);
12841                        const outerElem = this._getOuterElement(child);
12842                        child.setAttribute('aria-selected', isActive);
12843                        if (outerElem !== child) {
12844                            this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
12845                        }
12846                        if (!isActive) {
12847                            child.setAttribute('tabindex', '-1');
12848                        }
12849                        this._setAttributeIfNotExists(child, 'role', 'tab');
12850
12851                        // set attributes to the related panel too
12852                        this._setInitialAttributesOnTargetPanel(child);
12853                    }
12854                    _setInitialAttributesOnTargetPanel(child) {
12855                        const target = SelectorEngine.getElementFromSelector(child);
12856                        if (!target) {
12857                            return;
12858                        }
12859                        this._setAttributeIfNotExists(target, 'role', 'tabpanel');
12860                        if (child.id) {
12861                            this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);
12862                        }
12863                    }
12864                    _toggleDropDown(element, open) {
12865                        const outerElem = this._getOuterElement(element);
12866                        if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
12867                            return;
12868                        }
12869                        const toggle = (selector, className) => {
12870                            const element = SelectorEngine.findOne(selector, outerElem);
12871                            if (element) {
12872                                element.classList.toggle(className, open);
12873                            }
12874                        };
12875                        toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
12876                        toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW);
12877                        outerElem.setAttribute('aria-expanded', open);
12878                    }
12879                    _setAttributeIfNotExists(element, attribute, value) {
12880                        if (!element.hasAttribute(attribute)) {
12881                            element.setAttribute(attribute, value);
12882                        }
12883                    }
12884                    _elemIsActive(elem) {
12885                        return elem.classList.contains(CLASS_NAME_ACTIVE);
12886                    }
12887
12888                    // Try to get the inner element (usually the .nav-link)
12889                    _getInnerElement(elem) {
12890                        return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
12891                    }
12892
12893                    // Try to get the outer element (usually the .nav-item)
12894                    _getOuterElement(elem) {
12895                        return elem.closest(SELECTOR_OUTER) || elem;
12896                    }
12897
12898                    // Static
12899                    static jQueryInterface(config) {
12900                        return this.each(function () {
12901                            const data = Tab.getOrCreateInstance(this);
12902                            if (typeof config !== 'string') {
12903                                return;
12904                            }
12905                            if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
12906                                throw new TypeError(`No method named "${config}"`);
12907                            }
12908                            data[config]();
12909                        });
12910                    }
12911                }
12912
12913                /**
12914                 * Data API implementation
12915                 */
12916
12917                EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
12918                    if (['A', 'AREA'].includes(this.tagName)) {
12919                        event.preventDefault();
12920                    }
12921                    if (index_js.isDisabled(this)) {
12922                        return;
12923                    }
12924                    Tab.getOrCreateInstance(this).show();
12925                });
12926
12927                /**
12928                 * Initialize on focus
12929                 */
12930                EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
12931                    for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
12932                        Tab.getOrCreateInstance(element);
12933                    }
12934                });
12935                /**
12936                 * jQuery
12937                 */
12938
12939                index_js.defineJQueryPlugin(Tab);
12940
12941                return Tab;
12942
12943            }));
12944//# sourceMappingURL=tab.js.map
12945
12946
12947            /***/ }),
12948
12949        
vendor: 27,976 bytes, lines 12949-13504
12949/***/ "./node_modules/bootstrap/js/dist/tooltip.js":
12950        /*!***************************************************!*\
12951  !*** ./node_modules/bootstrap/js/dist/tooltip.js ***!
12952  \***************************************************/
12953        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
12954
12955            /*!
12956  * Bootstrap tooltip.js v5.3.3 (https://getbootstrap.com/)
12957  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
12958  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
12959  */
12960            (function (global, factory) {
12961                true ? module.exports = factory(__webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js"), __webpack_require__(/*! ./base-component.js */ "./node_modules/bootstrap/js/dist/base-component.js"), __webpack_require__(/*! ./dom/event-handler.js */ "./node_modules/bootstrap/js/dist/dom/event-handler.js"), __webpack_require__(/*! ./dom/manipulator.js */ "./node_modules/bootstrap/js/dist/dom/manipulator.js"), __webpack_require__(/*! ./util/index.js */ "./node_modules/bootstrap/js/dist/util/index.js"), __webpack_require__(/*! ./util/sanitizer.js */ "./node_modules/bootstrap/js/dist/util/sanitizer.js"), __webpack_require__(/*! ./util/template-factory.js */ "./node_modules/bootstrap/js/dist/util/template-factory.js")) :
12962                    0;
12963            })(this, (function (Popper, BaseComponent, EventHandler, Manipulator, index_js, sanitizer_js, TemplateFactory) { 'use strict';
12964
12965                function _interopNamespaceDefault(e) {
12966                    const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
12967                    if (e) {
12968                        for (const k in e) {
12969                            if (k !== 'default') {
12970                                const d = Object.getOwnPropertyDescriptor(e, k);
12971                                Object.defineProperty(n, k, d.get ? d : {
12972                                    enumerable: true,
12973                                    get: () => e[k]
12974                                });
12975                            }
12976                        }
12977                    }
12978                    n.default = e;
12979                    return Object.freeze(n);
12980                }
12981
12982                const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);
12983
12984                /**
12985                 * --------------------------------------------------------------------------
12986                 * Bootstrap tooltip.js
12987                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
12988                 * --------------------------------------------------------------------------
12989                 */
12990
12991
12992                /**
12993                 * Constants
12994                 */
12995
12996                const NAME = 'tooltip';
12997                const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
12998                const CLASS_NAME_FADE = 'fade';
12999                const CLASS_NAME_MODAL = 'modal';
13000                const CLASS_NAME_SHOW = 'show';
13001                const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
13002                const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
13003                const EVENT_MODAL_HIDE = 'hide.bs.modal';
13004                const TRIGGER_HOVER = 'hover';
13005                const TRIGGER_FOCUS = 'focus';
13006                const TRIGGER_CLICK = 'click';
13007                const TRIGGER_MANUAL = 'manual';
13008                const EVENT_HIDE = 'hide';
13009                const EVENT_HIDDEN = 'hidden';
13010                const EVENT_SHOW = 'show';
13011                const EVENT_SHOWN = 'shown';
13012                const EVENT_INSERTED = 'inserted';
13013                const EVENT_CLICK = 'click';
13014                const EVENT_FOCUSIN = 'focusin';
13015                const EVENT_FOCUSOUT = 'focusout';
13016                const EVENT_MOUSEENTER = 'mouseenter';
13017                const EVENT_MOUSELEAVE = 'mouseleave';
13018                const AttachmentMap = {
13019                    AUTO: 'auto',
13020                    TOP: 'top',
13021                    RIGHT: index_js.isRTL() ? 'left' : 'right',
13022                    BOTTOM: 'bottom',
13023                    LEFT: index_js.isRTL() ? 'right' : 'left'
13024                };
13025                const Default = {
13026                    allowList: sanitizer_js.DefaultAllowlist,
13027                    animation: true,
13028                    boundary: 'clippingParents',
13029                    container: false,
13030                    customClass: '',
13031                    delay: 0,
13032                    fallbackPlacements: ['top', 'right', 'bottom', 'left'],
13033                    html: false,
13034                    offset: [0, 6],
13035                    placement: 'top',
13036                    popperConfig: null,
13037                    sanitize: true,
13038                    sanitizeFn: null,
13039                    selector: false,
13040                    template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
13041                    title: '',
13042                    trigger: 'hover focus'
13043                };
13044                const DefaultType = {
13045                    allowList: 'object',
13046                    animation: 'boolean',
13047                    boundary: '(string|element)',
13048                    container: '(string|element|boolean)',
13049                    customClass: '(string|function)',
13050                    delay: '(number|object)',
13051                    fallbackPlacements: 'array',
13052                    html: 'boolean',
13053                    offset: '(array|string|function)',
13054                    placement: '(string|function)',
13055                    popperConfig: '(null|object|function)',
13056                    sanitize: 'boolean',
13057                    sanitizeFn: '(null|function)',
13058                    selector: '(string|boolean)',
13059                    template: 'string',
13060                    title: '(string|element|function)',
13061                    trigger: 'string'
13062                };
13063
13064                /**
13065                 * Class definition
13066                 */
13067
13068                class Tooltip extends BaseComponent {
13069                    constructor(element, config) {
13070                        if (typeof Popper__namespace === 'undefined') {
13071                            throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
13072                        }
13073                        super(element, config);
13074
13075                        // Private
13076                        this._isEnabled = true;
13077                        this._timeout = 0;
13078                        this._isHovered = null;
13079                        this._activeTrigger = {};
13080                        this._popper = null;
13081                        this._templateFactory = null;
13082                        this._newContent = null;
13083
13084                        // Protected
13085                        this.tip = null;
13086                        this._setListeners();
13087                        if (!this._config.selector) {
13088                            this._fixTitle();
13089                        }
13090                    }
13091
13092                    // Getters
13093                    static get Default() {
13094                        return Default;
13095                    }
13096                    static get DefaultType() {
13097                        return DefaultType;
13098                    }
13099                    static get NAME() {
13100                        return NAME;
13101                    }
13102
13103                    // Public
13104                    enable() {
13105                        this._isEnabled = true;
13106                    }
13107                    disable() {
13108                        this._isEnabled = false;
13109                    }
13110                    toggleEnabled() {
13111                        this._isEnabled = !this._isEnabled;
13112                    }
13113                    toggle() {
13114                        if (!this._isEnabled) {
13115                            return;
13116                        }
13117                        this._activeTrigger.click = !this._activeTrigger.click;
13118                        if (this._isShown()) {
13119                            this._leave();
13120                            return;
13121                        }
13122                        this._enter();
13123                    }
13124                    dispose() {
13125                        clearTimeout(this._timeout);
13126                        EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
13127                        if (this._element.getAttribute('data-bs-original-title')) {
13128                            this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
13129                        }
13130                        this._disposePopper();
13131                        super.dispose();
13132                    }
13133                    show() {
13134                        if (this._element.style.display === 'none') {
13135                            throw new Error('Please use show on visible elements');
13136                        }
13137                        if (!(this._isWithContent() && this._isEnabled)) {
13138                            return;
13139                        }
13140                        const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW));
13141                        const shadowRoot = index_js.findShadowRoot(this._element);
13142                        const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
13143                        if (showEvent.defaultPrevented || !isInTheDom) {
13144                            return;
13145                        }
13146
13147                        // TODO: v6 remove this or make it optional
13148                        this._disposePopper();
13149                        const tip = this._getTipElement();
13150                        this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
13151                        const {
13152                            container
13153                        } = this._config;
13154                        if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
13155                            container.append(tip);
13156                            EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
13157                        }
13158                        this._popper = this._createPopper(tip);
13159                        tip.classList.add(CLASS_NAME_SHOW);
13160
13161                        // If this is a touch-enabled device we add extra
13162                        // empty mouseover listeners to the body's immediate children;
13163                        // only needed because of broken event delegation on iOS
13164                        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
13165                        if ('ontouchstart' in document.documentElement) {
13166                            for (const element of [].concat(...document.body.children)) {
13167                                EventHandler.on(element, 'mouseover', index_js.noop);
13168                            }
13169                        }
13170                        const complete = () => {
13171                            EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN));
13172                            if (this._isHovered === false) {
13173                                this._leave();
13174                            }
13175                            this._isHovered = false;
13176                        };
13177                        this._queueCallback(complete, this.tip, this._isAnimated());
13178                    }
13179                    hide() {
13180                        if (!this._isShown()) {
13181                            return;
13182                        }
13183                        const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE));
13184                        if (hideEvent.defaultPrevented) {
13185                            return;
13186                        }
13187                        const tip = this._getTipElement();
13188                        tip.classList.remove(CLASS_NAME_SHOW);
13189
13190                        // If this is a touch-enabled device we remove the extra
13191                        // empty mouseover listeners we added for iOS support
13192                        if ('ontouchstart' in document.documentElement) {
13193                            for (const element of [].concat(...document.body.children)) {
13194                                EventHandler.off(element, 'mouseover', index_js.noop);
13195                            }
13196                        }
13197                        this._activeTrigger[TRIGGER_CLICK] = false;
13198                        this._activeTrigger[TRIGGER_FOCUS] = false;
13199                        this._activeTrigger[TRIGGER_HOVER] = false;
13200                        this._isHovered = null; // it is a trick to support manual triggering
13201
13202                        const complete = () => {
13203                            if (this._isWithActiveTrigger()) {
13204                                return;
13205                            }
13206                            if (!this._isHovered) {
13207                                this._disposePopper();
13208                            }
13209                            this._element.removeAttribute('aria-describedby');
13210                            EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN));
13211                        };
13212                        this._queueCallback(complete, this.tip, this._isAnimated());
13213                    }
13214                    update() {
13215                        if (this._popper) {
13216                            this._popper.update();
13217                        }
13218                    }
13219
13220                    // Protected
13221                    _isWithContent() {
13222                        return Boolean(this._getTitle());
13223                    }
13224                    _getTipElement() {
13225                        if (!this.tip) {
13226                            this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
13227                        }
13228                        return this.tip;
13229                    }
13230                    _createTipElement(content) {
13231                        const tip = this._getTemplateFactory(content).toHtml();
13232
13233                        // TODO: remove this check in v6
13234                        if (!tip) {
13235                            return null;
13236                        }
13237                        tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
13238                        // TODO: v6 the following can be achieved with CSS only
13239                        tip.classList.add(`bs-${this.constructor.NAME}-auto`);
13240                        const tipId = index_js.getUID(this.constructor.NAME).toString();
13241                        tip.setAttribute('id', tipId);
13242                        if (this._isAnimated()) {
13243                            tip.classList.add(CLASS_NAME_FADE);
13244                        }
13245                        return tip;
13246                    }
13247                    setContent(content) {
13248                        this._newContent = content;
13249                        if (this._isShown()) {
13250                            this._disposePopper();
13251                            this.show();
13252                        }
13253                    }
13254                    _getTemplateFactory(content) {
13255                        if (this._templateFactory) {
13256                            this._templateFactory.changeContent(content);
13257                        } else {
13258                            this._templateFactory = new TemplateFactory({
13259                                ...this._config,
13260                                // the `content` var has to be after `this._config`
13261                                // to override config.content in case of popover
13262                                content,
13263                                extraClass: this._resolvePossibleFunction(this._config.customClass)
13264                            });
13265                        }
13266                        return this._templateFactory;
13267                    }
13268                    _getContentForTemplate() {
13269                        return {
13270                            [SELECTOR_TOOLTIP_INNER]: this._getTitle()
13271                        };
13272                    }
13273                    _getTitle() {
13274                        return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');
13275                    }
13276
13277                    // Private
13278                    _initializeOnDelegatedTarget(event) {
13279                        return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
13280                    }
13281                    _isAnimated() {
13282                        return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE);
13283                    }
13284                    _isShown() {
13285                        return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW);
13286                    }
13287                    _createPopper(tip) {
13288                        const placement = index_js.execute(this._config.placement, [this, tip, this._element]);
13289                        const attachment = AttachmentMap[placement.toUpperCase()];
13290                        return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
13291                    }
13292                    _getOffset() {
13293                        const {
13294                            offset
13295                        } = this._config;
13296                        if (typeof offset === 'string') {
13297                            return offset.split(',').map(value => Number.parseInt(value, 10));
13298                        }
13299                        if (typeof offset === 'function') {
13300                            return popperData => offset(popperData, this._element);
13301                        }
13302                        return offset;
13303                    }
13304                    _resolvePossibleFunction(arg) {
13305                        return index_js.execute(arg, [this._element]);
13306                    }
13307                    _getPopperConfig(attachment) {
13308                        const defaultBsPopperConfig = {
13309                            placement: attachment,
13310                            modifiers: [{
13311                                name: 'flip',
13312                                options: {
13313                                    fallbackPlacements: this._config.fallbackPlacements
13314                                }
13315                            }, {
13316                                name: 'offset',
13317                                options: {
13318                                    offset: this._getOffset()
13319                                }
13320                            }, {
13321                                name: 'preventOverflow',
13322                                options: {
13323                                    boundary: this._config.boundary
13324                                }
13325                            }, {
13326                                name: 'arrow',
13327                                options: {
13328                                    element: `.${this.constructor.NAME}-arrow`
13329                                }
13330                            }, {
13331                                name: 'preSetPlacement',
13332                                enabled: true,
13333                                phase: 'beforeMain',
13334                                fn: data => {
13335                                    // Pre-set Popper's placement attribute in order to read the arrow sizes properly.
13336                                    // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement
13337                                    this._getTipElement().setAttribute('data-popper-placement', data.state.placement);
13338                                }
13339                            }]
13340                        };
13341                        return {
13342                            ...defaultBsPopperConfig,
13343                            ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig])
13344                        };
13345                    }
13346                    _setListeners() {
13347                        const triggers = this._config.trigger.split(' ');
13348                        for (const trigger of triggers) {
13349                            if (trigger === 'click') {
13350                                EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {
13351                                    const context = this._initializeOnDelegatedTarget(event);
13352                                    context.toggle();
13353                                });
13354                            } else if (trigger !== TRIGGER_MANUAL) {
13355                                const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN);
13356                                const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT);
13357                                EventHandler.on(this._element, eventIn, this._config.selector, event => {
13358                                    const context = this._initializeOnDelegatedTarget(event);
13359                                    context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
13360                                    context._enter();
13361                                });
13362                                EventHandler.on(this._element, eventOut, this._config.selector, event => {
13363                                    const context = this._initializeOnDelegatedTarget(event);
13364                                    context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
13365                                    context._leave();
13366                                });
13367                            }
13368                        }
13369                        this._hideModalHandler = () => {
13370                            if (this._element) {
13371                                this.hide();
13372                            }
13373                        };
13374                        EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
13375                    }
13376                    _fixTitle() {
13377                        const title = this._element.getAttribute('title');
13378                        if (!title) {
13379                            return;
13380                        }
13381                        if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
13382                            this._element.setAttribute('aria-label', title);
13383                        }
13384                        this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility
13385                        this._element.removeAttribute('title');
13386                    }
13387                    _enter() {
13388                        if (this._isShown() || this._isHovered) {
13389                            this._isHovered = true;
13390                            return;
13391                        }
13392                        this._isHovered = true;
13393                        this._setTimeout(() => {
13394                            if (this._isHovered) {
13395                                this.show();
13396                            }
13397                        }, this._config.delay.show);
13398                    }
13399                    _leave() {
13400                        if (this._isWithActiveTrigger()) {
13401                            return;
13402                        }
13403                        this._isHovered = false;
13404                        this._setTimeout(() => {
13405                            if (!this._isHovered) {
13406                                this.hide();
13407                            }
13408                        }, this._config.delay.hide);
13409                    }
13410                    _setTimeout(handler, timeout) {
13411                        clearTimeout(this._timeout);
13412                        this._timeout = setTimeout(handler, timeout);
13413                    }
13414                    _isWithActiveTrigger() {
13415                        return Object.values(this._activeTrigger).includes(true);
13416                    }
13417                    _getConfig(config) {
13418                        const dataAttributes = Manipulator.getDataAttributes(this._element);
13419                        for (const dataAttribute of Object.keys(dataAttributes)) {
13420                            if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
13421                                delete dataAttributes[dataAttribute];
13422                            }
13423                        }
13424                        config = {
13425                            ...dataAttributes,
13426                            ...(typeof config === 'object' && config ? config : {})
13427                        };
13428                        config = this._mergeConfigObj(config);
13429                        config = this._configAfterMerge(config);
13430                        this._typeCheckConfig(config);
13431                        return config;
13432                    }
13433                    _configAfterMerge(config) {
13434                        config.container = config.container === false ? document.body : index_js.getElement(config.container);
13435                        if (typeof config.delay === 'number') {
13436                            config.delay = {
13437                                show: config.delay,
13438                                hide: config.delay
13439                            };
13440                        }
13441                        if (typeof config.title === 'number') {
13442                            config.title = config.title.toString();
13443                        }
13444                        if (typeof config.content === 'number') {
13445                            config.content = config.content.toString();
13446                        }
13447                        return config;
13448                    }
13449                    _getDelegateConfig() {
13450                        const config = {};
13451                        for (const [key, value] of Object.entries(this._config)) {
13452                            if (this.constructor.Default[key] !== value) {
13453                                config[key] = value;
13454                            }
13455                        }
13456                        config.selector = false;
13457                        config.trigger = 'manual';
13458
13459                        // In the future can be replaced with:
13460                        // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
13461                        // `Object.fromEntries(keysWithDifferentValues)`
13462                        return config;
13463                    }
13464                    _disposePopper() {
13465                        if (this._popper) {
13466                            this._popper.destroy();
13467                            this._popper = null;
13468                        }
13469                        if (this.tip) {
13470                            this.tip.remove();
13471                            this.tip = null;
13472                        }
13473                    }
13474
13475                    // Static
13476                    static jQueryInterface(config) {
13477                        return this.each(function () {
13478                            const data = Tooltip.getOrCreateInstance(this, config);
13479                            if (typeof config !== 'string') {
13480                                return;
13481                            }
13482                            if (typeof data[config] === 'undefined') {
13483                                throw new TypeError(`No method named "${config}"`);
13484                            }
13485                            data[config]();
13486                        });
13487                    }
13488                }
13489
13490                /**
13491                 * jQuery
13492                 */
13493
13494                index_js.defineJQueryPlugin(Tooltip);
13495
13496                return Tooltip;
13497
13498            }));
13499//# sourceMappingURL=tooltip.js.map
13500
13501
13502            /***/ }),
13503
13504        
vendor: 3,681 bytes, lines 13504-13581
13504/***/ "./node_modules/bootstrap/js/dist/util/config.js":
13505        /*!*******************************************************!*\
13506  !*** ./node_modules/bootstrap/js/dist/util/config.js ***!
13507  \*******************************************************/
13508        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
13509
13510            /*!
13511  * Bootstrap config.js v5.3.3 (https://getbootstrap.com/)
13512  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
13513  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
13514  */
13515            (function (global, factory) {
13516                true ? module.exports = factory(__webpack_require__(/*! ../dom/manipulator.js */ "./node_modules/bootstrap/js/dist/dom/manipulator.js"), __webpack_require__(/*! ./index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
13517                    0;
13518            })(this, (function (Manipulator, index_js) { 'use strict';
13519
13520                /**
13521                 * --------------------------------------------------------------------------
13522                 * Bootstrap util/config.js
13523                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
13524                 * --------------------------------------------------------------------------
13525                 */
13526
13527
13528                /**
13529                 * Class definition
13530                 */
13531
13532                class Config {
13533                    // Getters
13534                    static get Default() {
13535                        return {};
13536                    }
13537                    static get DefaultType() {
13538                        return {};
13539                    }
13540                    static get NAME() {
13541                        throw new Error('You have to implement the static method "NAME", for each component!');
13542                    }
13543                    _getConfig(config) {
13544                        config = this._mergeConfigObj(config);
13545                        config = this._configAfterMerge(config);
13546                        this._typeCheckConfig(config);
13547                        return config;
13548                    }
13549                    _configAfterMerge(config) {
13550                        return config;
13551                    }
13552                    _mergeConfigObj(config, element) {
13553                        const jsonConfig = index_js.isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse
13554
13555                        return {
13556                            ...this.constructor.Default,
13557                            ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
13558                            ...(index_js.isElement(element) ? Manipulator.getDataAttributes(element) : {}),
13559                            ...(typeof config === 'object' ? config : {})
13560                        };
13561                    }
13562                    _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
13563                        for (const [property, expectedTypes] of Object.entries(configTypes)) {
13564                            const value = config[property];
13565                            const valueType = index_js.isElement(value) ? 'element' : index_js.toType(value);
13566                            if (!new RegExp(expectedTypes).test(valueType)) {
13567                                throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
13568                            }
13569                        }
13570                    }
13571                }
13572
13573                return Config;
13574
13575            }));
13576//# sourceMappingURL=config.js.map
13577
13578
13579            /***/ }),
13580
13581        
vendor: 13,781 bytes, lines 13581-13872
13581/***/ "./node_modules/bootstrap/js/dist/util/index.js":
13582        /*!******************************************************!*\
13583  !*** ./node_modules/bootstrap/js/dist/util/index.js ***!
13584  \******************************************************/
13585        /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
13586
13587            /* provided dependency */ var __webpack_provided_window_dot_jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
13588            /*!
13589  * Bootstrap index.js v5.3.3 (https://getbootstrap.com/)
13590  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
13591  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
13592  */
13593            (function (global, factory) {
13594                true ? factory(exports) :
13595                    0;
13596            })(this, (function (exports) { 'use strict';
13597
13598                /**
13599                 * --------------------------------------------------------------------------
13600                 * Bootstrap util/index.js
13601                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
13602                 * --------------------------------------------------------------------------
13603                 */
13604
13605                const MAX_UID = 1000000;
13606                const MILLISECONDS_MULTIPLIER = 1000;
13607                const TRANSITION_END = 'transitionend';
13608
13609                /**
13610                 * Properly escape IDs selectors to handle weird IDs
13611                 * @param {string} selector
13612                 * @returns {string}
13613                 */
13614                const parseSelector = selector => {
13615                    if (selector && window.CSS && window.CSS.escape) {
13616                        // document.querySelector needs escaping to handle IDs (html5+) containing for instance /
13617                        selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
13618                    }
13619                    return selector;
13620                };
13621
13622                // Shout-out Angus Croll (https://goo.gl/pxwQGp)
13623                const toType = object => {
13624                    if (object === null || object === undefined) {
13625                        return `${object}`;
13626                    }
13627                    return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
13628                };
13629
13630                /**
13631                 * Public Util API
13632                 */
13633
13634                const getUID = prefix => {
13635                    do {
13636                        prefix += Math.floor(Math.random() * MAX_UID);
13637                    } while (document.getElementById(prefix));
13638                    return prefix;
13639                };
13640                const getTransitionDurationFromElement = element => {
13641                    if (!element) {
13642                        return 0;
13643                    }
13644
13645                    // Get transition-duration of the element
13646                    let {
13647                        transitionDuration,
13648                        transitionDelay
13649                    } = window.getComputedStyle(element);
13650                    const floatTransitionDuration = Number.parseFloat(transitionDuration);
13651                    const floatTransitionDelay = Number.parseFloat(transitionDelay);
13652
13653                    // Return 0 if element or transition duration is not found
13654                    if (!floatTransitionDuration && !floatTransitionDelay) {
13655                        return 0;
13656                    }
13657
13658                    // If multiple durations are defined, take the first
13659                    transitionDuration = transitionDuration.split(',')[0];
13660                    transitionDelay = transitionDelay.split(',')[0];
13661                    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
13662                };
13663                const triggerTransitionEnd = element => {
13664                    element.dispatchEvent(new Event(TRANSITION_END));
13665                };
13666                const isElement = object => {
13667                    if (!object || typeof object !== 'object') {
13668                        return false;
13669                    }
13670                    if (typeof object.jquery !== 'undefined') {
13671                        object = object[0];
13672                    }
13673                    return typeof object.nodeType !== 'undefined';
13674                };
13675                const getElement = object => {
13676                    // it's a jQuery object or a node element
13677                    if (isElement(object)) {
13678                        return object.jquery ? object[0] : object;
13679                    }
13680                    if (typeof object === 'string' && object.length > 0) {
13681                        return document.querySelector(parseSelector(object));
13682                    }
13683                    return null;
13684                };
13685                const isVisible = element => {
13686                    if (!isElement(element) || element.getClientRects().length === 0) {
13687                        return false;
13688                    }
13689                    const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';
13690                    // Handle `details` element as its content may falsie appear visible when it is closed
13691                    const closedDetails = element.closest('details:not([open])');
13692                    if (!closedDetails) {
13693                        return elementIsVisible;
13694                    }
13695                    if (closedDetails !== element) {
13696                        const summary = element.closest('summary');
13697                        if (summary && summary.parentNode !== closedDetails) {
13698                            return false;
13699                        }
13700                        if (summary === null) {
13701                            return false;
13702                        }
13703                    }
13704                    return elementIsVisible;
13705                };
13706                const isDisabled = element => {
13707                    if (!element || element.nodeType !== Node.ELEMENT_NODE) {
13708                        return true;
13709                    }
13710                    if (element.classList.contains('disabled')) {
13711                        return true;
13712                    }
13713                    if (typeof element.disabled !== 'undefined') {
13714                        return element.disabled;
13715                    }
13716                    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
13717                };
13718                const findShadowRoot = element => {
13719                    if (!document.documentElement.attachShadow) {
13720                        return null;
13721                    }
13722
13723                    // Can find the shadow root otherwise it'll return the document
13724                    if (typeof element.getRootNode === 'function') {
13725                        const root = element.getRootNode();
13726                        return root instanceof ShadowRoot ? root : null;
13727                    }
13728                    if (element instanceof ShadowRoot) {
13729                        return element;
13730                    }
13731
13732                    // when we don't find a shadow root
13733                    if (!element.parentNode) {
13734                        return null;
13735                    }
13736                    return findShadowRoot(element.parentNode);
13737                };
13738                const noop = () => {};
13739
13740                /**
13741                 * Trick to restart an element's animation
13742                 *
13743                 * @param {HTMLElement} element
13744                 * @return void
13745                 *
13746                 * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
13747                 */
13748                const reflow = element => {
13749                    element.offsetHeight; // eslint-disable-line no-unused-expressions
13750                };
13751                const getjQuery = () => {
13752                    if (__webpack_provided_window_dot_jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
13753                        return __webpack_provided_window_dot_jQuery;
13754                    }
13755                    return null;
13756                };
13757                const DOMContentLoadedCallbacks = [];
13758                const onDOMContentLoaded = callback => {
13759                    if (document.readyState === 'loading') {
13760                        // add listener on the first call when the document is in loading state
13761                        if (!DOMContentLoadedCallbacks.length) {
13762                            document.addEventListener('DOMContentLoaded', () => {
13763                                for (const callback of DOMContentLoadedCallbacks) {
13764                                    callback();
13765                                }
13766                            });
13767                        }
13768                        DOMContentLoadedCallbacks.push(callback);
13769                    } else {
13770                        callback();
13771                    }
13772                };
13773                const isRTL = () => document.documentElement.dir === 'rtl';
13774                const defineJQueryPlugin = plugin => {
13775                    onDOMContentLoaded(() => {
13776                        const $ = getjQuery();
13777                        /* istanbul ignore if */
13778                        if ($) {
13779                            const name = plugin.NAME;
13780                            const JQUERY_NO_CONFLICT = $.fn[name];
13781                            $.fn[name] = plugin.jQueryInterface;
13782                            $.fn[name].Constructor = plugin;
13783                            $.fn[name].noConflict = () => {
13784                                $.fn[name] = JQUERY_NO_CONFLICT;
13785                                return plugin.jQueryInterface;
13786                            };
13787                        }
13788                    });
13789                };
13790                const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
13791                    return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;
13792                };
13793                const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
13794                    if (!waitForTransition) {
13795                        execute(callback);
13796                        return;
13797                    }
13798                    const durationPadding = 5;
13799                    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
13800                    let called = false;
13801                    const handler = ({
13802                                         target
13803                                     }) => {
13804                        if (target !== transitionElement) {
13805                            return;
13806                        }
13807                        called = true;
13808                        transitionElement.removeEventListener(TRANSITION_END, handler);
13809                        execute(callback);
13810                    };
13811                    transitionElement.addEventListener(TRANSITION_END, handler);
13812                    setTimeout(() => {
13813                        if (!called) {
13814                            triggerTransitionEnd(transitionElement);
13815                        }
13816                    }, emulatedDuration);
13817                };
13818
13819                /**
13820                 * Return the previous/next element of a list.
13821                 *
13822                 * @param {array} list    The list of elements
13823                 * @param activeElement   The active element
13824                 * @param shouldGetNext   Choose to get next or previous element
13825                 * @param isCycleAllowed
13826                 * @return {Element|elem} The proper element
13827                 */
13828                const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
13829                    const listLength = list.length;
13830                    let index = list.indexOf(activeElement);
13831
13832                    // if the element does not exist in the list return an element
13833                    // depending on the direction and if cycle is allowed
13834                    if (index === -1) {
13835                        return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
13836                    }
13837                    index += shouldGetNext ? 1 : -1;
13838                    if (isCycleAllowed) {
13839                        index = (index + listLength) % listLength;
13840                    }
13841                    return list[Math.max(0, Math.min(index, listLength - 1))];
13842                };
13843
13844                exports.defineJQueryPlugin = defineJQueryPlugin;
13845                exports.execute = execute;
13846                exports.executeAfterTransition = executeAfterTransition;
13847                exports.findShadowRoot = findShadowRoot;
13848                exports.getElement = getElement;
13849                exports.getNextActiveElement = getNextActiveElement;
13850                exports.getTransitionDurationFromElement = getTransitionDurationFromElement;
13851                exports.getUID = getUID;
13852                exports.getjQuery = getjQuery;
13853                exports.isDisabled = isDisabled;
13854                exports.isElement = isElement;
13855                exports.isRTL = isRTL;
13856                exports.isVisible = isVisible;
13857                exports.noop = noop;
13858                exports.onDOMContentLoaded = onDOMContentLoaded;
13859                exports.parseSelector = parseSelector;
13860                exports.reflow = reflow;
13861                exports.toType = toType;
13862                exports.triggerTransitionEnd = triggerTransitionEnd;
13863
13864                Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
13865
13866            }));
13867//# sourceMappingURL=index.js.map
13868
13869
13870            /***/ }),
13871
13872        
vendor: 5,624 bytes, lines 13872-13995
13872/***/ "./node_modules/bootstrap/js/dist/util/sanitizer.js":
13873        /*!**********************************************************!*\
13874  !*** ./node_modules/bootstrap/js/dist/util/sanitizer.js ***!
13875  \**********************************************************/
13876        /***/ (function(__unused_webpack_module, exports) {
13877
13878            /*!
13879  * Bootstrap sanitizer.js v5.3.3 (https://getbootstrap.com/)
13880  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
13881  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
13882  */
13883            (function (global, factory) {
13884                true ? factory(exports) :
13885                    0;
13886            })(this, (function (exports) { 'use strict';
13887
13888                /**
13889                 * --------------------------------------------------------------------------
13890                 * Bootstrap util/sanitizer.js
13891                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
13892                 * --------------------------------------------------------------------------
13893                 */
13894
13895                    // js-docs-start allow-list
13896                const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
13897                const DefaultAllowlist = {
13898                    // Global attributes allowed on any supplied element below.
13899                    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
13900                    a: ['target', 'href', 'title', 'rel'],
13901                    area: [],
13902                    b: [],
13903                    br: [],
13904                    col: [],
13905                    code: [],
13906                    dd: [],
13907                    div: [],
13908                    dl: [],
13909                    dt: [],
13910                    em: [],
13911                    hr: [],
13912                    h1: [],
13913                    h2: [],
13914                    h3: [],
13915                    h4: [],
13916                    h5: [],
13917                    h6: [],
13918                    i: [],
13919                    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
13920                    li: [],
13921                    ol: [],
13922                    p: [],
13923                    pre: [],
13924                    s: [],
13925                    small: [],
13926                    span: [],
13927                    sub: [],
13928                    sup: [],
13929                    strong: [],
13930                    u: [],
13931                    ul: []
13932                };
13933                // js-docs-end allow-list
13934
13935                const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
13936
13937                /**
13938                 * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
13939                 * contexts.
13940                 *
13941                 * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
13942                 */
13943                    // eslint-disable-next-line unicorn/better-regex
13944                const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
13945                const allowedAttribute = (attribute, allowedAttributeList) => {
13946                    const attributeName = attribute.nodeName.toLowerCase();
13947                    if (allowedAttributeList.includes(attributeName)) {
13948                        if (uriAttributes.has(attributeName)) {
13949                            return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
13950                        }
13951                        return true;
13952                    }
13953
13954                    // Check if a regular expression validates the attribute.
13955                    return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
13956                };
13957                function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
13958                    if (!unsafeHtml.length) {
13959                        return unsafeHtml;
13960                    }
13961                    if (sanitizeFunction && typeof sanitizeFunction === 'function') {
13962                        return sanitizeFunction(unsafeHtml);
13963                    }
13964                    const domParser = new window.DOMParser();
13965                    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
13966                    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
13967                    for (const element of elements) {
13968                        const elementName = element.nodeName.toLowerCase();
13969                        if (!Object.keys(allowList).includes(elementName)) {
13970                            element.remove();
13971                            continue;
13972                        }
13973                        const attributeList = [].concat(...element.attributes);
13974                        const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
13975                        for (const attribute of attributeList) {
13976                            if (!allowedAttribute(attribute, allowedAttributes)) {
13977                                element.removeAttribute(attribute.nodeName);
13978                            }
13979                        }
13980                    }
13981                    return createdDocument.body.innerHTML;
13982                }
13983
13984                exports.DefaultAllowlist = DefaultAllowlist;
13985                exports.sanitizeHtml = sanitizeHtml;
13986
13987                Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
13988
13989            }));
13990//# sourceMappingURL=sanitizer.js.map
13991
13992
13993            /***/ }),
13994
13995        
vendor: 7,240 bytes, lines 13995-14155
13995/***/ "./node_modules/bootstrap/js/dist/util/template-factory.js":
13996        /*!*****************************************************************!*\
13997  !*** ./node_modules/bootstrap/js/dist/util/template-factory.js ***!
13998  \*****************************************************************/
13999        /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
14000
14001            /*!
14002  * Bootstrap template-factory.js v5.3.3 (https://getbootstrap.com/)
14003  * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
14004  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
14005  */
14006            (function (global, factory) {
14007                true ? module.exports = factory(__webpack_require__(/*! ../dom/selector-engine.js */ "./node_modules/bootstrap/js/dist/dom/selector-engine.js"), __webpack_require__(/*! ./config.js */ "./node_modules/bootstrap/js/dist/util/config.js"), __webpack_require__(/*! ./sanitizer.js */ "./node_modules/bootstrap/js/dist/util/sanitizer.js"), __webpack_require__(/*! ./index.js */ "./node_modules/bootstrap/js/dist/util/index.js")) :
14008                    0;
14009            })(this, (function (SelectorEngine, Config, sanitizer_js, index_js) { 'use strict';
14010
14011                /**
14012                 * --------------------------------------------------------------------------
14013                 * Bootstrap util/template-factory.js
14014                 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
14015                 * --------------------------------------------------------------------------
14016                 */
14017
14018
14019                /**
14020                 * Constants
14021                 */
14022
14023                const NAME = 'TemplateFactory';
14024                const Default = {
14025                    allowList: sanitizer_js.DefaultAllowlist,
14026                    content: {},
14027                    // { selector : text ,  selector2 : text2 , }
14028                    extraClass: '',
14029                    html: false,
14030                    sanitize: true,
14031                    sanitizeFn: null,
14032                    template: '<div></div>'
14033                };
14034                const DefaultType = {
14035                    allowList: 'object',
14036                    content: 'object',
14037                    extraClass: '(string|function)',
14038                    html: 'boolean',
14039                    sanitize: 'boolean',
14040                    sanitizeFn: '(null|function)',
14041                    template: 'string'
14042                };
14043                const DefaultContentType = {
14044                    entry: '(string|element|function|null)',
14045                    selector: '(string|element)'
14046                };
14047
14048                /**
14049                 * Class definition
14050                 */
14051
14052                class TemplateFactory extends Config {
14053                    constructor(config) {
14054                        super();
14055                        this._config = this._getConfig(config);
14056                    }
14057
14058                    // Getters
14059                    static get Default() {
14060                        return Default;
14061                    }
14062                    static get DefaultType() {
14063                        return DefaultType;
14064                    }
14065                    static get NAME() {
14066                        return NAME;
14067                    }
14068
14069                    // Public
14070                    getContent() {
14071                        return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);
14072                    }
14073                    hasContent() {
14074                        return this.getContent().length > 0;
14075                    }
14076                    changeContent(content) {
14077                        this._checkContent(content);
14078                        this._config.content = {
14079                            ...this._config.content,
14080                            ...content
14081                        };
14082                        return this;
14083                    }
14084                    toHtml() {
14085                        const templateWrapper = document.createElement('div');
14086                        templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
14087                        for (const [selector, text] of Object.entries(this._config.content)) {
14088                            this._setContent(templateWrapper, text, selector);
14089                        }
14090                        const template = templateWrapper.children[0];
14091                        const extraClass = this._resolvePossibleFunction(this._config.extraClass);
14092                        if (extraClass) {
14093                            template.classList.add(...extraClass.split(' '));
14094                        }
14095                        return template;
14096                    }
14097
14098                    // Private
14099                    _typeCheckConfig(config) {
14100                        super._typeCheckConfig(config);
14101                        this._checkContent(config.content);
14102                    }
14103                    _checkContent(arg) {
14104                        for (const [selector, content] of Object.entries(arg)) {
14105                            super._typeCheckConfig({
14106                                selector,
14107                                entry: content
14108                            }, DefaultContentType);
14109                        }
14110                    }
14111                    _setContent(template, content, selector) {
14112                        const templateElement = SelectorEngine.findOne(selector, template);
14113                        if (!templateElement) {
14114                            return;
14115                        }
14116                        content = this._resolvePossibleFunction(content);
14117                        if (!content) {
14118                            templateElement.remove();
14119                            return;
14120                        }
14121                        if (index_js.isElement(content)) {
14122                            this._putElementInTemplate(index_js.getElement(content), templateElement);
14123                            return;
14124                        }
14125                        if (this._config.html) {
14126                            templateElement.innerHTML = this._maybeSanitize(content);
14127                            return;
14128                        }
14129                        templateElement.textContent = content;
14130                    }
14131                    _maybeSanitize(arg) {
14132                        return this._config.sanitize ? sanitizer_js.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
14133                    }
14134                    _resolvePossibleFunction(arg) {
14135                        return index_js.execute(arg, [this]);
14136                    }
14137                    _putElementInTemplate(element, templateElement) {
14138                        if (this._config.html) {
14139                            templateElement.innerHTML = '';
14140                            templateElement.append(element);
14141                            return;
14142                        }
14143                        templateElement.textContent = element.textContent;
14144                    }
14145                }
14146
14147                return TemplateFactory;
14148
14149            }));
14150//# sourceMappingURL=template-factory.js.map
14151
14152
14153            /***/ }),
14154
14155        
vendor: 71,522 bytes, lines 14155-15955
14155/***/ "./node_modules/buffer/index.js":
14156        /*!**************************************!*\
14157  !*** ./node_modules/buffer/index.js ***!
14158  \**************************************/
14159        /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
14160
14161            "use strict";
14162            /*!
14163 * The buffer module from node.js, for the browser.
14164 *
14165 * @author   Feross Aboukhadijeh <http://feross.org>
14166 * @license  MIT
14167 */
14168            /* eslint-disable no-proto */
14169
14170
14171
14172            var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js")
14173            var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js")
14174            var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js")
14175
14176            exports.Buffer = Buffer
14177            exports.SlowBuffer = SlowBuffer
14178            exports.INSPECT_MAX_BYTES = 50
14179
14180            /**
14181             * If `Buffer.TYPED_ARRAY_SUPPORT`:
14182             *   === true    Use Uint8Array implementation (fastest)
14183             *   === false   Use Object implementation (most compatible, even IE6)
14184             *
14185             * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
14186             * Opera 11.6+, iOS 4.2+.
14187             *
14188             * Due to various browser bugs, sometimes the Object implementation will be used even
14189             * when the browser supports typed arrays.
14190             *
14191             * Note:
14192             *
14193             *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
14194             *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
14195             *
14196             *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
14197             *
14198             *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
14199             *     incorrect length in some situations.
14200
14201             * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
14202             * get the Object implementation, which is slower but behaves correctly.
14203             */
14204            Buffer.TYPED_ARRAY_SUPPORT = __webpack_require__.g.TYPED_ARRAY_SUPPORT !== undefined
14205                ? __webpack_require__.g.TYPED_ARRAY_SUPPORT
14206                : typedArraySupport()
14207
14208            /*
14209 * Export kMaxLength after typed array support is determined.
14210 */
14211            exports.kMaxLength = kMaxLength()
14212
14213            function typedArraySupport () {
14214                try {
14215                    var arr = new Uint8Array(1)
14216                    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
14217                    return arr.foo() === 42 && // typed array instances can be augmented
14218                        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
14219                        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
14220                } catch (e) {
14221                    return false
14222                }
14223            }
14224
14225            function kMaxLength () {
14226                return Buffer.TYPED_ARRAY_SUPPORT
14227                    ? 0x7fffffff
14228                    : 0x3fffffff
14229            }
14230
14231            function createBuffer (that, length) {
14232                if (kMaxLength() < length) {
14233                    throw new RangeError('Invalid typed array length')
14234                }
14235                if (Buffer.TYPED_ARRAY_SUPPORT) {
14236                    // Return an augmented `Uint8Array` instance, for best performance
14237                    that = new Uint8Array(length)
14238                    that.__proto__ = Buffer.prototype
14239                } else {
14240                    // Fallback: Return an object instance of the Buffer class
14241                    if (that === null) {
14242                        that = new Buffer(length)
14243                    }
14244                    that.length = length
14245                }
14246
14247                return that
14248            }
14249
14250            /**
14251             * The Buffer constructor returns instances of `Uint8Array` that have their
14252             * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
14253             * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
14254             * and the `Uint8Array` methods. Square bracket notation works as expected -- it
14255             * returns a single octet.
14256             *
14257             * The `Uint8Array` prototype remains unmodified.
14258             */
14259
14260            function Buffer (arg, encodingOrOffset, length) {
14261                if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
14262                    return new Buffer(arg, encodingOrOffset, length)
14263                }
14264
14265                // Common case.
14266                if (typeof arg === 'number') {
14267                    if (typeof encodingOrOffset === 'string') {
14268                        throw new Error(
14269                            'If encoding is specified then the first argument must be a string'
14270                        )
14271                    }
14272                    return allocUnsafe(this, arg)
14273                }
14274                return from(this, arg, encodingOrOffset, length)
14275            }
14276
14277            Buffer.poolSize = 8192 // not used by this implementation
14278
14279// TODO: Legacy, not needed anymore. Remove in next major version.
14280            Buffer._augment = function (arr) {
14281                arr.__proto__ = Buffer.prototype
14282                return arr
14283            }
14284
14285            function from (that, value, encodingOrOffset, length) {
14286                if (typeof value === 'number') {
14287                    throw new TypeError('"value" argument must not be a number')
14288                }
14289
14290                if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
14291                    return fromArrayBuffer(that, value, encodingOrOffset, length)
14292                }
14293
14294                if (typeof value === 'string') {
14295                    return fromString(that, value, encodingOrOffset)
14296                }
14297
14298                return fromObject(that, value)
14299            }
14300
14301            /**
14302             * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
14303             * if value is a number.
14304             * Buffer.from(str[, encoding])
14305             * Buffer.from(array)
14306             * Buffer.from(buffer)
14307             * Buffer.from(arrayBuffer[, byteOffset[, length]])
14308             **/
14309            Buffer.from = function (value, encodingOrOffset, length) {
14310                return from(null, value, encodingOrOffset, length)
14311            }
14312
14313            if (Buffer.TYPED_ARRAY_SUPPORT) {
14314                Buffer.prototype.__proto__ = Uint8Array.prototype
14315                Buffer.__proto__ = Uint8Array
14316                if (typeof Symbol !== 'undefined' && Symbol.species &&
14317                    Buffer[Symbol.species] === Buffer) {
14318                    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
14319                    Object.defineProperty(Buffer, Symbol.species, {
14320                        value: null,
14321                        configurable: true
14322                    })
14323                }
14324            }
14325
14326            function assertSize (size) {
14327                if (typeof size !== 'number') {
14328                    throw new TypeError('"size" argument must be a number')
14329                } else if (size < 0) {
14330                    throw new RangeError('"size" argument must not be negative')
14331                }
14332            }
14333
14334            function alloc (that, size, fill, encoding) {
14335                assertSize(size)
14336                if (size <= 0) {
14337                    return createBuffer(that, size)
14338                }
14339                if (fill !== undefined) {
14340                    // Only pay attention to encoding if it's a string. This
14341                    // prevents accidentally sending in a number that would
14342                    // be interpretted as a start offset.
14343                    return typeof encoding === 'string'
14344                        ? createBuffer(that, size).fill(fill, encoding)
14345                        : createBuffer(that, size).fill(fill)
14346                }
14347                return createBuffer(that, size)
14348            }
14349
14350            /**
14351             * Creates a new filled Buffer instance.
14352             * alloc(size[, fill[, encoding]])
14353             **/
14354            Buffer.alloc = function (size, fill, encoding) {
14355                return alloc(null, size, fill, encoding)
14356            }
14357
14358            function allocUnsafe (that, size) {
14359                assertSize(size)
14360                that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
14361                if (!Buffer.TYPED_ARRAY_SUPPORT) {
14362                    for (var i = 0; i < size; ++i) {
14363                        that[i] = 0
14364                    }
14365                }
14366                return that
14367            }
14368
14369            /**
14370             * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
14371             * */
14372            Buffer.allocUnsafe = function (size) {
14373                return allocUnsafe(null, size)
14374            }
14375            /**
14376             * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
14377             */
14378            Buffer.allocUnsafeSlow = function (size) {
14379                return allocUnsafe(null, size)
14380            }
14381
14382            function fromString (that, string, encoding) {
14383                if (typeof encoding !== 'string' || encoding === '') {
14384                    encoding = 'utf8'
14385                }
14386
14387                if (!Buffer.isEncoding(encoding)) {
14388                    throw new TypeError('"encoding" must be a valid string encoding')
14389                }
14390
14391                var length = byteLength(string, encoding) | 0
14392                that = createBuffer(that, length)
14393
14394                var actual = that.write(string, encoding)
14395
14396                if (actual !== length) {
14397                    // Writing a hex string, for example, that contains invalid characters will
14398                    // cause everything after the first invalid character to be ignored. (e.g.
14399                    // 'abxxcd' will be treated as 'ab')
14400                    that = that.slice(0, actual)
14401                }
14402
14403                return that
14404            }
14405
14406            function fromArrayLike (that, array) {
14407                var length = array.length < 0 ? 0 : checked(array.length) | 0
14408                that = createBuffer(that, length)
14409                for (var i = 0; i < length; i += 1) {
14410                    that[i] = array[i] & 255
14411                }
14412                return that
14413            }
14414
14415            function fromArrayBuffer (that, array, byteOffset, length) {
14416                array.byteLength // this throws if `array` is not a valid ArrayBuffer
14417
14418                if (byteOffset < 0 || array.byteLength < byteOffset) {
14419                    throw new RangeError('\'offset\' is out of bounds')
14420                }
14421
14422                if (array.byteLength < byteOffset + (length || 0)) {
14423                    throw new RangeError('\'length\' is out of bounds')
14424                }
14425
14426                if (byteOffset === undefined && length === undefined) {
14427                    array = new Uint8Array(array)
14428                } else if (length === undefined) {
14429                    array = new Uint8Array(array, byteOffset)
14430                } else {
14431                    array = new Uint8Array(array, byteOffset, length)
14432                }
14433
14434                if (Buffer.TYPED_ARRAY_SUPPORT) {
14435                    // Return an augmented `Uint8Array` instance, for best performance
14436                    that = array
14437                    that.__proto__ = Buffer.prototype
14438                } else {
14439                    // Fallback: Return an object instance of the Buffer class
14440                    that = fromArrayLike(that, array)
14441                }
14442                return that
14443            }
14444
14445            function fromObject (that, obj) {
14446                if (Buffer.isBuffer(obj)) {
14447                    var len = checked(obj.length) | 0
14448                    that = createBuffer(that, len)
14449
14450                    if (that.length === 0) {
14451                        return that
14452                    }
14453
14454                    obj.copy(that, 0, 0, len)
14455                    return that
14456                }
14457
14458                if (obj) {
14459                    if ((typeof ArrayBuffer !== 'undefined' &&
14460                        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
14461                        if (typeof obj.length !== 'number' || isnan(obj.length)) {
14462                            return createBuffer(that, 0)
14463                        }
14464                        return fromArrayLike(that, obj)
14465                    }
14466
14467                    if (obj.type === 'Buffer' && isArray(obj.data)) {
14468                        return fromArrayLike(that, obj.data)
14469                    }
14470                }
14471
14472                throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
14473            }
14474
14475            function checked (length) {
14476                // Note: cannot use `length < kMaxLength()` here because that fails when
14477                // length is NaN (which is otherwise coerced to zero.)
14478                if (length >= kMaxLength()) {
14479                    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
14480                        'size: 0x' + kMaxLength().toString(16) + ' bytes')
14481                }
14482                return length | 0
14483            }
14484
14485            function SlowBuffer (length) {
14486                if (+length != length) { // eslint-disable-line eqeqeq
14487                    length = 0
14488                }
14489                return Buffer.alloc(+length)
14490            }
14491
14492            Buffer.isBuffer = function isBuffer (b) {
14493                return !!(b != null && b._isBuffer)
14494            }
14495
14496            Buffer.compare = function compare (a, b) {
14497                if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
14498                    throw new TypeError('Arguments must be Buffers')
14499                }
14500
14501                if (a === b) return 0
14502
14503                var x = a.length
14504                var y = b.length
14505
14506                for (var i = 0, len = Math.min(x, y); i < len; ++i) {
14507                    if (a[i] !== b[i]) {
14508                        x = a[i]
14509                        y = b[i]
14510                        break
14511                    }
14512                }
14513
14514                if (x < y) return -1
14515                if (y < x) return 1
14516                return 0
14517            }
14518
14519            Buffer.isEncoding = function isEncoding (encoding) {
14520                switch (String(encoding).toLowerCase()) {
14521                    case 'hex':
14522                    case 'utf8':
14523                    case 'utf-8':
14524                    case 'ascii':
14525                    case 'latin1':
14526                    case 'binary':
14527                    case 'base64':
14528                    case 'ucs2':
14529                    case 'ucs-2':
14530                    case 'utf16le':
14531                    case 'utf-16le':
14532                        return true
14533                    default:
14534                        return false
14535                }
14536            }
14537
14538            Buffer.concat = function concat (list, length) {
14539                if (!isArray(list)) {
14540                    throw new TypeError('"list" argument must be an Array of Buffers')
14541                }
14542
14543                if (list.length === 0) {
14544                    return Buffer.alloc(0)
14545                }
14546
14547                var i
14548                if (length === undefined) {
14549                    length = 0
14550                    for (i = 0; i < list.length; ++i) {
14551                        length += list[i].length
14552                    }
14553                }
14554
14555                var buffer = Buffer.allocUnsafe(length)
14556                var pos = 0
14557                for (i = 0; i < list.length; ++i) {
14558                    var buf = list[i]
14559                    if (!Buffer.isBuffer(buf)) {
14560                        throw new TypeError('"list" argument must be an Array of Buffers')
14561                    }
14562                    buf.copy(buffer, pos)
14563                    pos += buf.length
14564                }
14565                return buffer
14566            }
14567
14568            function byteLength (string, encoding) {
14569                if (Buffer.isBuffer(string)) {
14570                    return string.length
14571                }
14572                if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
14573                    (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
14574                    return string.byteLength
14575                }
14576                if (typeof string !== 'string') {
14577                    string = '' + string
14578                }
14579
14580                var len = string.length
14581                if (len === 0) return 0
14582
14583                // Use a for loop to avoid recursion
14584                var loweredCase = false
14585                for (;;) {
14586                    switch (encoding) {
14587                        case 'ascii':
14588                        case 'latin1':
14589                        case 'binary':
14590                            return len
14591                        case 'utf8':
14592                        case 'utf-8':
14593                        case undefined:
14594                            return utf8ToBytes(string).length
14595                        case 'ucs2':
14596                        case 'ucs-2':
14597                        case 'utf16le':
14598                        case 'utf-16le':
14599                            return len * 2
14600                        case 'hex':
14601                            return len >>> 1
14602                        case 'base64':
14603                            return base64ToBytes(string).length
14604                        default:
14605                            if (loweredCase) return utf8ToBytes(string).length // assume utf8
14606                            encoding = ('' + encoding).toLowerCase()
14607                            loweredCase = true
14608                    }
14609                }
14610            }
14611            Buffer.byteLength = byteLength
14612
14613            function slowToString (encoding, start, end) {
14614                var loweredCase = false
14615
14616                // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
14617                // property of a typed array.
14618
14619                // This behaves neither like String nor Uint8Array in that we set start/end
14620                // to their upper/lower bounds if the value passed is out of range.
14621                // undefined is handled specially as per ECMA-262 6th Edition,
14622                // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
14623                if (start === undefined || start < 0) {
14624                    start = 0
14625                }
14626                // Return early if start > this.length. Done here to prevent potential uint32
14627                // coercion fail below.
14628                if (start > this.length) {
14629                    return ''
14630                }
14631
14632                if (end === undefined || end > this.length) {
14633                    end = this.length
14634                }
14635
14636                if (end <= 0) {
14637                    return ''
14638                }
14639
14640                // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
14641                end >>>= 0
14642                start >>>= 0
14643
14644                if (end <= start) {
14645                    return ''
14646                }
14647
14648                if (!encoding) encoding = 'utf8'
14649
14650                while (true) {
14651                    switch (encoding) {
14652                        case 'hex':
14653                            return hexSlice(this, start, end)
14654
14655                        case 'utf8':
14656                        case 'utf-8':
14657                            return utf8Slice(this, start, end)
14658
14659                        case 'ascii':
14660                            return asciiSlice(this, start, end)
14661
14662                        case 'latin1':
14663                        case 'binary':
14664                            return latin1Slice(this, start, end)
14665
14666                        case 'base64':
14667                            return base64Slice(this, start, end)
14668
14669                        case 'ucs2':
14670                        case 'ucs-2':
14671                        case 'utf16le':
14672                        case 'utf-16le':
14673                            return utf16leSlice(this, start, end)
14674
14675                        default:
14676                            if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
14677                            encoding = (encoding + '').toLowerCase()
14678                            loweredCase = true
14679                    }
14680                }
14681            }
14682
14683// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
14684// Buffer instances.
14685            Buffer.prototype._isBuffer = true
14686
14687            function swap (b, n, m) {
14688                var i = b[n]
14689                b[n] = b[m]
14690                b[m] = i
14691            }
14692
14693            Buffer.prototype.swap16 = function swap16 () {
14694                var len = this.length
14695                if (len % 2 !== 0) {
14696                    throw new RangeError('Buffer size must be a multiple of 16-bits')
14697                }
14698                for (var i = 0; i < len; i += 2) {
14699                    swap(this, i, i + 1)
14700                }
14701                return this
14702            }
14703
14704            Buffer.prototype.swap32 = function swap32 () {
14705                var len = this.length
14706                if (len % 4 !== 0) {
14707                    throw new RangeError('Buffer size must be a multiple of 32-bits')
14708                }
14709                for (var i = 0; i < len; i += 4) {
14710                    swap(this, i, i + 3)
14711                    swap(this, i + 1, i + 2)
14712                }
14713                return this
14714            }
14715
14716            Buffer.prototype.swap64 = function swap64 () {
14717                var len = this.length
14718                if (len % 8 !== 0) {
14719                    throw new RangeError('Buffer size must be a multiple of 64-bits')
14720                }
14721                for (var i = 0; i < len; i += 8) {
14722                    swap(this, i, i + 7)
14723                    swap(this, i + 1, i + 6)
14724                    swap(this, i + 2, i + 5)
14725                    swap(this, i + 3, i + 4)
14726                }
14727                return this
14728            }
14729
14730            Buffer.prototype.toString = function toString () {
14731                var length = this.length | 0
14732                if (length === 0) return ''
14733                if (arguments.length === 0) return utf8Slice(this, 0, length)
14734                return slowToString.apply(this, arguments)
14735            }
14736
14737            Buffer.prototype.equals = function equals (b) {
14738                if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
14739                if (this === b) return true
14740                return Buffer.compare(this, b) === 0
14741            }
14742
14743            Buffer.prototype.inspect = function inspect () {
14744                var str = ''
14745                var max = exports.INSPECT_MAX_BYTES
14746                if (this.length > 0) {
14747                    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
14748                    if (this.length > max) str += ' ... '
14749                }
14750                return '<Buffer ' + str + '>'
14751            }
14752
14753            Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
14754                if (!Buffer.isBuffer(target)) {
14755                    throw new TypeError('Argument must be a Buffer')
14756                }
14757
14758                if (start === undefined) {
14759                    start = 0
14760                }
14761                if (end === undefined) {
14762                    end = target ? target.length : 0
14763                }
14764                if (thisStart === undefined) {
14765                    thisStart = 0
14766                }
14767                if (thisEnd === undefined) {
14768                    thisEnd = this.length
14769                }
14770
14771                if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
14772                    throw new RangeError('out of range index')
14773                }
14774
14775                if (thisStart >= thisEnd && start >= end) {
14776                    return 0
14777                }
14778                if (thisStart >= thisEnd) {
14779                    return -1
14780                }
14781                if (start >= end) {
14782                    return 1
14783                }
14784
14785                start >>>= 0
14786                end >>>= 0
14787                thisStart >>>= 0
14788                thisEnd >>>= 0
14789
14790                if (this === target) return 0
14791
14792                var x = thisEnd - thisStart
14793                var y = end - start
14794                var len = Math.min(x, y)
14795
14796                var thisCopy = this.slice(thisStart, thisEnd)
14797                var targetCopy = target.slice(start, end)
14798
14799                for (var i = 0; i < len; ++i) {
14800                    if (thisCopy[i] !== targetCopy[i]) {
14801                        x = thisCopy[i]
14802                        y = targetCopy[i]
14803                        break
14804                    }
14805                }
14806
14807                if (x < y) return -1
14808                if (y < x) return 1
14809                return 0
14810            }
14811
14812// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
14813// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
14814//
14815// Arguments:
14816// - buffer - a Buffer to search
14817// - val - a string, Buffer, or number
14818// - byteOffset - an index into `buffer`; will be clamped to an int32
14819// - encoding - an optional encoding, relevant is val is a string
14820// - dir - true for indexOf, false for lastIndexOf
14821            function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
14822                // Empty buffer means no match
14823                if (buffer.length === 0) return -1
14824
14825                // Normalize byteOffset
14826                if (typeof byteOffset === 'string') {
14827                    encoding = byteOffset
14828                    byteOffset = 0
14829                } else if (byteOffset > 0x7fffffff) {
14830                    byteOffset = 0x7fffffff
14831                } else if (byteOffset < -0x80000000) {
14832                    byteOffset = -0x80000000
14833                }
14834                byteOffset = +byteOffset  // Coerce to Number.
14835                if (isNaN(byteOffset)) {
14836                    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
14837                    byteOffset = dir ? 0 : (buffer.length - 1)
14838                }
14839
14840                // Normalize byteOffset: negative offsets start from the end of the buffer
14841                if (byteOffset < 0) byteOffset = buffer.length + byteOffset
14842                if (byteOffset >= buffer.length) {
14843                    if (dir) return -1
14844                    else byteOffset = buffer.length - 1
14845                } else if (byteOffset < 0) {
14846                    if (dir) byteOffset = 0
14847                    else return -1
14848                }
14849
14850                // Normalize val
14851                if (typeof val === 'string') {
14852                    val = Buffer.from(val, encoding)
14853                }
14854
14855                // Finally, search either indexOf (if dir is true) or lastIndexOf
14856                if (Buffer.isBuffer(val)) {
14857                    // Special case: looking for empty string/buffer always fails
14858                    if (val.length === 0) {
14859                        return -1
14860                    }
14861                    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
14862                } else if (typeof val === 'number') {
14863                    val = val & 0xFF // Search for a byte value [0-255]
14864                    if (Buffer.TYPED_ARRAY_SUPPORT &&
14865                        typeof Uint8Array.prototype.indexOf === 'function') {
14866                        if (dir) {
14867                            return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
14868                        } else {
14869                            return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
14870                        }
14871                    }
14872                    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
14873                }
14874
14875                throw new TypeError('val must be string, number or Buffer')
14876            }
14877
14878            function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
14879                var indexSize = 1
14880                var arrLength = arr.length
14881                var valLength = val.length
14882
14883                if (encoding !== undefined) {
14884                    encoding = String(encoding).toLowerCase()
14885                    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
14886                        encoding === 'utf16le' || encoding === 'utf-16le') {
14887                        if (arr.length < 2 || val.length < 2) {
14888                            return -1
14889                        }
14890                        indexSize = 2
14891                        arrLength /= 2
14892                        valLength /= 2
14893                        byteOffset /= 2
14894                    }
14895                }
14896
14897                function read (buf, i) {
14898                    if (indexSize === 1) {
14899                        return buf[i]
14900                    } else {
14901                        return buf.readUInt16BE(i * indexSize)
14902                    }
14903                }
14904
14905                var i
14906                if (dir) {
14907                    var foundIndex = -1
14908                    for (i = byteOffset; i < arrLength; i++) {
14909                        if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
14910                            if (foundIndex === -1) foundIndex = i
14911                            if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
14912                        } else {
14913                            if (foundIndex !== -1) i -= i - foundIndex
14914                            foundIndex = -1
14915                        }
14916                    }
14917                } else {
14918                    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
14919                    for (i = byteOffset; i >= 0; i--) {
14920                        var found = true
14921                        for (var j = 0; j < valLength; j++) {
14922                            if (read(arr, i + j) !== read(val, j)) {
14923                                found = false
14924                                break
14925                            }
14926                        }
14927                        if (found) return i
14928                    }
14929                }
14930
14931                return -1
14932            }
14933
14934            Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
14935                return this.indexOf(val, byteOffset, encoding) !== -1
14936            }
14937
14938            Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
14939                return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
14940            }
14941
14942            Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
14943                return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
14944            }
14945
14946            function hexWrite (buf, string, offset, length) {
14947                offset = Number(offset) || 0
14948                var remaining = buf.length - offset
14949                if (!length) {
14950                    length = remaining
14951                } else {
14952                    length = Number(length)
14953                    if (length > remaining) {
14954                        length = remaining
14955                    }
14956                }
14957
14958                // must be an even number of digits
14959                var strLen = string.length
14960                if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
14961
14962                if (length > strLen / 2) {
14963                    length = strLen / 2
14964                }
14965                for (var i = 0; i < length; ++i) {
14966                    var parsed = parseInt(string.substr(i * 2, 2), 16)
14967                    if (isNaN(parsed)) return i
14968                    buf[offset + i] = parsed
14969                }
14970                return i
14971            }
14972
14973            function utf8Write (buf, string, offset, length) {
14974                return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
14975            }
14976
14977            function asciiWrite (buf, string, offset, length) {
14978                return blitBuffer(asciiToBytes(string), buf, offset, length)
14979            }
14980
14981            function latin1Write (buf, string, offset, length) {
14982                return asciiWrite(buf, string, offset, length)
14983            }
14984
14985            function base64Write (buf, string, offset, length) {
14986                return blitBuffer(base64ToBytes(string), buf, offset, length)
14987            }
14988
14989            function ucs2Write (buf, string, offset, length) {
14990                return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
14991            }
14992
14993            Buffer.prototype.write = function write (string, offset, length, encoding) {
14994                // Buffer#write(string)
14995                if (offset === undefined) {
14996                    encoding = 'utf8'
14997                    length = this.length
14998                    offset = 0
14999                    // Buffer#write(string, encoding)
15000                } else if (length === undefined && typeof offset === 'string') {
15001                    encoding = offset
15002                    length = this.length
15003                    offset = 0
15004                    // Buffer#write(string, offset[, length][, encoding])
15005                } else if (isFinite(offset)) {
15006                    offset = offset | 0
15007                    if (isFinite(length)) {
15008                        length = length | 0
15009                        if (encoding === undefined) encoding = 'utf8'
15010                    } else {
15011                        encoding = length
15012                        length = undefined
15013                    }
15014                    // legacy write(string, encoding, offset, length) - remove in v0.13
15015                } else {
15016                    throw new Error(
15017                        'Buffer.write(string, encoding, offset[, length]) is no longer supported'
15018                    )
15019                }
15020
15021                var remaining = this.length - offset
15022                if (length === undefined || length > remaining) length = remaining
15023
15024                if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
15025                    throw new RangeError('Attempt to write outside buffer bounds')
15026                }
15027
15028                if (!encoding) encoding = 'utf8'
15029
15030                var loweredCase = false
15031                for (;;) {
15032                    switch (encoding) {
15033                        case 'hex':
15034                            return hexWrite(this, string, offset, length)
15035
15036                        case 'utf8':
15037                        case 'utf-8':
15038                            return utf8Write(this, string, offset, length)
15039
15040                        case 'ascii':
15041                            return asciiWrite(this, string, offset, length)
15042
15043                        case 'latin1':
15044                        case 'binary':
15045                            return latin1Write(this, string, offset, length)
15046
15047                        case 'base64':
15048                            // Warning: maxLength not taken into account in base64Write
15049                            return base64Write(this, string, offset, length)
15050
15051                        case 'ucs2':
15052                        case 'ucs-2':
15053                        case 'utf16le':
15054                        case 'utf-16le':
15055                            return ucs2Write(this, string, offset, length)
15056
15057                        default:
15058                            if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
15059                            encoding = ('' + encoding).toLowerCase()
15060                            loweredCase = true
15061                    }
15062                }
15063            }
15064
15065            Buffer.prototype.toJSON = function toJSON () {
15066                return {
15067                    type: 'Buffer',
15068                    data: Array.prototype.slice.call(this._arr || this, 0)
15069                }
15070            }
15071
15072            function base64Slice (buf, start, end) {
15073                if (start === 0 && end === buf.length) {
15074                    return base64.fromByteArray(buf)
15075                } else {
15076                    return base64.fromByteArray(buf.slice(start, end))
15077                }
15078            }
15079
15080            function utf8Slice (buf, start, end) {
15081                end = Math.min(buf.length, end)
15082                var res = []
15083
15084                var i = start
15085                while (i < end) {
15086                    var firstByte = buf[i]
15087                    var codePoint = null
15088                    var bytesPerSequence = (firstByte > 0xEF) ? 4
15089                        : (firstByte > 0xDF) ? 3
15090                            : (firstByte > 0xBF) ? 2
15091                                : 1
15092
15093                    if (i + bytesPerSequence <= end) {
15094                        var secondByte, thirdByte, fourthByte, tempCodePoint
15095
15096                        switch (bytesPerSequence) {
15097                            case 1:
15098                                if (firstByte < 0x80) {
15099                                    codePoint = firstByte
15100                                }
15101                                break
15102                            case 2:
15103                                secondByte = buf[i + 1]
15104                                if ((secondByte & 0xC0) === 0x80) {
15105                                    tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
15106                                    if (tempCodePoint > 0x7F) {
15107                                        codePoint = tempCodePoint
15108                                    }
15109                                }
15110                                break
15111                            case 3:
15112                                secondByte = buf[i + 1]
15113                                thirdByte = buf[i + 2]
15114                                if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
15115                                    tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
15116                                    if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
15117                                        codePoint = tempCodePoint
15118                                    }
15119                                }
15120                                break
15121                            case 4:
15122                                secondByte = buf[i + 1]
15123                                thirdByte = buf[i + 2]
15124                                fourthByte = buf[i + 3]
15125                                if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
15126                                    tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
15127                                    if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
15128                                        codePoint = tempCodePoint
15129                                    }
15130                                }
15131                        }
15132                    }
15133
15134                    if (codePoint === null) {
15135                        // we did not generate a valid codePoint so insert a
15136                        // replacement char (U+FFFD) and advance only 1 byte
15137                        codePoint = 0xFFFD
15138                        bytesPerSequence = 1
15139                    } else if (codePoint > 0xFFFF) {
15140                        // encode to utf16 (surrogate pair dance)
15141                        codePoint -= 0x10000
15142                        res.push(codePoint >>> 10 & 0x3FF | 0xD800)
15143                        codePoint = 0xDC00 | codePoint & 0x3FF
15144                    }
15145
15146                    res.push(codePoint)
15147                    i += bytesPerSequence
15148                }
15149
15150                return decodeCodePointsArray(res)
15151            }
15152
15153// Based on http://stackoverflow.com/a/22747272/680742, the browser with
15154// the lowest limit is Chrome, with 0x10000 args.
15155// We go 1 magnitude less, for safety
15156            var MAX_ARGUMENTS_LENGTH = 0x1000
15157
15158            function decodeCodePointsArray (codePoints) {
15159                var len = codePoints.length
15160                if (len <= MAX_ARGUMENTS_LENGTH) {
15161                    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
15162                }
15163
15164                // Decode in chunks to avoid "call stack size exceeded".
15165                var res = ''
15166                var i = 0
15167                while (i < len) {
15168                    res += String.fromCharCode.apply(
15169                        String,
15170                        codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
15171                    )
15172                }
15173                return res
15174            }
15175
15176            function asciiSlice (buf, start, end) {
15177                var ret = ''
15178                end = Math.min(buf.length, end)
15179
15180                for (var i = start; i < end; ++i) {
15181                    ret += String.fromCharCode(buf[i] & 0x7F)
15182                }
15183                return ret
15184            }
15185
15186            function latin1Slice (buf, start, end) {
15187                var ret = ''
15188                end = Math.min(buf.length, end)
15189
15190                for (var i = start; i < end; ++i) {
15191                    ret += String.fromCharCode(buf[i])
15192                }
15193                return ret
15194            }
15195
15196            function hexSlice (buf, start, end) {
15197                var len = buf.length
15198
15199                if (!start || start < 0) start = 0
15200                if (!end || end < 0 || end > len) end = len
15201
15202                var out = ''
15203                for (var i = start; i < end; ++i) {
15204                    out += toHex(buf[i])
15205                }
15206                return out
15207            }
15208
15209            function utf16leSlice (buf, start, end) {
15210                var bytes = buf.slice(start, end)
15211                var res = ''
15212                for (var i = 0; i < bytes.length; i += 2) {
15213                    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
15214                }
15215                return res
15216            }
15217
15218            Buffer.prototype.slice = function slice (start, end) {
15219                var len = this.length
15220                start = ~~start
15221                end = end === undefined ? len : ~~end
15222
15223                if (start < 0) {
15224                    start += len
15225                    if (start < 0) start = 0
15226                } else if (start > len) {
15227                    start = len
15228                }
15229
15230                if (end < 0) {
15231                    end += len
15232                    if (end < 0) end = 0
15233                } else if (end > len) {
15234                    end = len
15235                }
15236
15237                if (end < start) end = start
15238
15239                var newBuf
15240                if (Buffer.TYPED_ARRAY_SUPPORT) {
15241                    newBuf = this.subarray(start, end)
15242                    newBuf.__proto__ = Buffer.prototype
15243                } else {
15244                    var sliceLen = end - start
15245                    newBuf = new Buffer(sliceLen, undefined)
15246                    for (var i = 0; i < sliceLen; ++i) {
15247                        newBuf[i] = this[i + start]
15248                    }
15249                }
15250
15251                return newBuf
15252            }
15253
15254            /*
15255 * Need to make sure that buffer isn't trying to write out of bounds.
15256 */
15257            function checkOffset (offset, ext, length) {
15258                if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
15259                if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
15260            }
15261
15262            Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
15263                offset = offset | 0
15264                byteLength = byteLength | 0
15265                if (!noAssert) checkOffset(offset, byteLength, this.length)
15266
15267                var val = this[offset]
15268                var mul = 1
15269                var i = 0
15270                while (++i < byteLength && (mul *= 0x100)) {
15271                    val += this[offset + i] * mul
15272                }
15273
15274                return val
15275            }
15276
15277            Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
15278                offset = offset | 0
15279                byteLength = byteLength | 0
15280                if (!noAssert) {
15281                    checkOffset(offset, byteLength, this.length)
15282                }
15283
15284                var val = this[offset + --byteLength]
15285                var mul = 1
15286                while (byteLength > 0 && (mul *= 0x100)) {
15287                    val += this[offset + --byteLength] * mul
15288                }
15289
15290                return val
15291            }
15292
15293            Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
15294                if (!noAssert) checkOffset(offset, 1, this.length)
15295                return this[offset]
15296            }
15297
15298            Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
15299                if (!noAssert) checkOffset(offset, 2, this.length)
15300                return this[offset] | (this[offset + 1] << 8)
15301            }
15302
15303            Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
15304                if (!noAssert) checkOffset(offset, 2, this.length)
15305                return (this[offset] << 8) | this[offset + 1]
15306            }
15307
15308            Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
15309                if (!noAssert) checkOffset(offset, 4, this.length)
15310
15311                return ((this[offset]) |
15312                        (this[offset + 1] << 8) |
15313                        (this[offset + 2] << 16)) +
15314                    (this[offset + 3] * 0x1000000)
15315            }
15316
15317            Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
15318                if (!noAssert) checkOffset(offset, 4, this.length)
15319
15320                return (this[offset] * 0x1000000) +
15321                    ((this[offset + 1] << 16) |
15322                        (this[offset + 2] << 8) |
15323                        this[offset + 3])
15324            }
15325
15326            Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
15327                offset = offset | 0
15328                byteLength = byteLength | 0
15329                if (!noAssert) checkOffset(offset, byteLength, this.length)
15330
15331                var val = this[offset]
15332                var mul = 1
15333                var i = 0
15334                while (++i < byteLength && (mul *= 0x100)) {
15335                    val += this[offset + i] * mul
15336                }
15337                mul *= 0x80
15338
15339                if (val >= mul) val -= Math.pow(2, 8 * byteLength)
15340
15341                return val
15342            }
15343
15344            Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
15345                offset = offset | 0
15346                byteLength = byteLength | 0
15347                if (!noAssert) checkOffset(offset, byteLength, this.length)
15348
15349                var i = byteLength
15350                var mul = 1
15351                var val = this[offset + --i]
15352                while (i > 0 && (mul *= 0x100)) {
15353                    val += this[offset + --i] * mul
15354                }
15355                mul *= 0x80
15356
15357                if (val >= mul) val -= Math.pow(2, 8 * byteLength)
15358
15359                return val
15360            }
15361
15362            Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
15363                if (!noAssert) checkOffset(offset, 1, this.length)
15364                if (!(this[offset] & 0x80)) return (this[offset])
15365                return ((0xff - this[offset] + 1) * -1)
15366            }
15367
15368            Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
15369                if (!noAssert) checkOffset(offset, 2, this.length)
15370                var val = this[offset] | (this[offset + 1] << 8)
15371                return (val & 0x8000) ? val | 0xFFFF0000 : val
15372            }
15373
15374            Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
15375                if (!noAssert) checkOffset(offset, 2, this.length)
15376                var val = this[offset + 1] | (this[offset] << 8)
15377                return (val & 0x8000) ? val | 0xFFFF0000 : val
15378            }
15379
15380            Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
15381                if (!noAssert) checkOffset(offset, 4, this.length)
15382
15383                return (this[offset]) |
15384                    (this[offset + 1] << 8) |
15385                    (this[offset + 2] << 16) |
15386                    (this[offset + 3] << 24)
15387            }
15388
15389            Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
15390                if (!noAssert) checkOffset(offset, 4, this.length)
15391
15392                return (this[offset] << 24) |
15393                    (this[offset + 1] << 16) |
15394                    (this[offset + 2] << 8) |
15395                    (this[offset + 3])
15396            }
15397
15398            Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
15399                if (!noAssert) checkOffset(offset, 4, this.length)
15400                return ieee754.read(this, offset, true, 23, 4)
15401            }
15402
15403            Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
15404                if (!noAssert) checkOffset(offset, 4, this.length)
15405                return ieee754.read(this, offset, false, 23, 4)
15406            }
15407
15408            Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
15409                if (!noAssert) checkOffset(offset, 8, this.length)
15410                return ieee754.read(this, offset, true, 52, 8)
15411            }
15412
15413            Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
15414                if (!noAssert) checkOffset(offset, 8, this.length)
15415                return ieee754.read(this, offset, false, 52, 8)
15416            }
15417
15418            function checkInt (buf, value, offset, ext, max, min) {
15419                if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
15420                if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
15421                if (offset + ext > buf.length) throw new RangeError('Index out of range')
15422            }
15423
15424            Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
15425                value = +value
15426                offset = offset | 0
15427                byteLength = byteLength | 0
15428                if (!noAssert) {
15429                    var maxBytes = Math.pow(2, 8 * byteLength) - 1
15430                    checkInt(this, value, offset, byteLength, maxBytes, 0)
15431                }
15432
15433                var mul = 1
15434                var i = 0
15435                this[offset] = value & 0xFF
15436                while (++i < byteLength && (mul *= 0x100)) {
15437                    this[offset + i] = (value / mul) & 0xFF
15438                }
15439
15440                return offset + byteLength
15441            }
15442
15443            Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
15444                value = +value
15445                offset = offset | 0
15446                byteLength = byteLength | 0
15447                if (!noAssert) {
15448                    var maxBytes = Math.pow(2, 8 * byteLength) - 1
15449                    checkInt(this, value, offset, byteLength, maxBytes, 0)
15450                }
15451
15452                var i = byteLength - 1
15453                var mul = 1
15454                this[offset + i] = value & 0xFF
15455                while (--i >= 0 && (mul *= 0x100)) {
15456                    this[offset + i] = (value / mul) & 0xFF
15457                }
15458
15459                return offset + byteLength
15460            }
15461
15462            Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
15463                value = +value
15464                offset = offset | 0
15465                if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
15466                if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
15467                this[offset] = (value & 0xff)
15468                return offset + 1
15469            }
15470
15471            function objectWriteUInt16 (buf, value, offset, littleEndian) {
15472                if (value < 0) value = 0xffff + value + 1
15473                for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
15474                    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
15475                        (littleEndian ? i : 1 - i) * 8
15476                }
15477            }
15478
15479            Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
15480                value = +value
15481                offset = offset | 0
15482                if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
15483                if (Buffer.TYPED_ARRAY_SUPPORT) {
15484                    this[offset] = (value & 0xff)
15485                    this[offset + 1] = (value >>> 8)
15486                } else {
15487                    objectWriteUInt16(this, value, offset, true)
15488                }
15489                return offset + 2
15490            }
15491
15492            Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
15493                value = +value
15494                offset = offset | 0
15495                if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
15496                if (Buffer.TYPED_ARRAY_SUPPORT) {
15497                    this[offset] = (value >>> 8)
15498                    this[offset + 1] = (value & 0xff)
15499                } else {
15500                    objectWriteUInt16(this, value, offset, false)
15501                }
15502                return offset + 2
15503            }
15504
15505            function objectWriteUInt32 (buf, value, offset, littleEndian) {
15506                if (value < 0) value = 0xffffffff + value + 1
15507                for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
15508                    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
15509                }
15510            }
15511
15512            Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
15513                value = +value
15514                offset = offset | 0
15515                if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
15516                if (Buffer.TYPED_ARRAY_SUPPORT) {
15517                    this[offset + 3] = (value >>> 24)
15518                    this[offset + 2] = (value >>> 16)
15519                    this[offset + 1] = (value >>> 8)
15520                    this[offset] = (value & 0xff)
15521                } else {
15522                    objectWriteUInt32(this, value, offset, true)
15523                }
15524                return offset + 4
15525            }
15526
15527            Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
15528                value = +value
15529                offset = offset | 0
15530                if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
15531                if (Buffer.TYPED_ARRAY_SUPPORT) {
15532                    this[offset] = (value >>> 24)
15533                    this[offset + 1] = (value >>> 16)
15534                    this[offset + 2] = (value >>> 8)
15535                    this[offset + 3] = (value & 0xff)
15536                } else {
15537                    objectWriteUInt32(this, value, offset, false)
15538                }
15539                return offset + 4
15540            }
15541
15542            Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
15543                value = +value
15544                offset = offset | 0
15545                if (!noAssert) {
15546                    var limit = Math.pow(2, 8 * byteLength - 1)
15547
15548                    checkInt(this, value, offset, byteLength, limit - 1, -limit)
15549                }
15550
15551                var i = 0
15552                var mul = 1
15553                var sub = 0
15554                this[offset] = value & 0xFF
15555                while (++i < byteLength && (mul *= 0x100)) {
15556                    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
15557                        sub = 1
15558                    }
15559                    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
15560                }
15561
15562                return offset + byteLength
15563            }
15564
15565            Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
15566                value = +value
15567                offset = offset | 0
15568                if (!noAssert) {
15569                    var limit = Math.pow(2, 8 * byteLength - 1)
15570
15571                    checkInt(this, value, offset, byteLength, limit - 1, -limit)
15572                }
15573
15574                var i = byteLength - 1
15575                var mul = 1
15576                var sub = 0
15577                this[offset + i] = value & 0xFF
15578                while (--i >= 0 && (mul *= 0x100)) {
15579                    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
15580                        sub = 1
15581                    }
15582                    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
15583                }
15584
15585                return offset + byteLength
15586            }
15587
15588            Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
15589                value = +value
15590                offset = offset | 0
15591                if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
15592                if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
15593                if (value < 0) value = 0xff + value + 1
15594                this[offset] = (value & 0xff)
15595                return offset + 1
15596            }
15597
15598            Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
15599                value = +value
15600                offset = offset | 0
15601                if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
15602                if (Buffer.TYPED_ARRAY_SUPPORT) {
15603                    this[offset] = (value & 0xff)
15604                    this[offset + 1] = (value >>> 8)
15605                } else {
15606                    objectWriteUInt16(this, value, offset, true)
15607                }
15608                return offset + 2
15609            }
15610
15611            Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
15612                value = +value
15613                offset = offset | 0
15614                if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
15615                if (Buffer.TYPED_ARRAY_SUPPORT) {
15616                    this[offset] = (value >>> 8)
15617                    this[offset + 1] = (value & 0xff)
15618                } else {
15619                    objectWriteUInt16(this, value, offset, false)
15620                }
15621                return offset + 2
15622            }
15623
15624            Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
15625                value = +value
15626                offset = offset | 0
15627                if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
15628                if (Buffer.TYPED_ARRAY_SUPPORT) {
15629                    this[offset] = (value & 0xff)
15630                    this[offset + 1] = (value >>> 8)
15631                    this[offset + 2] = (value >>> 16)
15632                    this[offset + 3] = (value >>> 24)
15633                } else {
15634                    objectWriteUInt32(this, value, offset, true)
15635                }
15636                return offset + 4
15637            }
15638
15639            Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
15640                value = +value
15641                offset = offset | 0
15642                if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
15643                if (value < 0) value = 0xffffffff + value + 1
15644                if (Buffer.TYPED_ARRAY_SUPPORT) {
15645                    this[offset] = (value >>> 24)
15646                    this[offset + 1] = (value >>> 16)
15647                    this[offset + 2] = (value >>> 8)
15648                    this[offset + 3] = (value & 0xff)
15649                } else {
15650                    objectWriteUInt32(this, value, offset, false)
15651                }
15652                return offset + 4
15653            }
15654
15655            function checkIEEE754 (buf, value, offset, ext, max, min) {
15656                if (offset + ext > buf.length) throw new RangeError('Index out of range')
15657                if (offset < 0) throw new RangeError('Index out of range')
15658            }
15659
15660            function writeFloat (buf, value, offset, littleEndian, noAssert) {
15661                if (!noAssert) {
15662                    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
15663                }
15664                ieee754.write(buf, value, offset, littleEndian, 23, 4)
15665                return offset + 4
15666            }
15667
15668            Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
15669                return writeFloat(this, value, offset, true, noAssert)
15670            }
15671
15672            Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
15673                return writeFloat(this, value, offset, false, noAssert)
15674            }
15675
15676            function writeDouble (buf, value, offset, littleEndian, noAssert) {
15677                if (!noAssert) {
15678                    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
15679                }
15680                ieee754.write(buf, value, offset, littleEndian, 52, 8)
15681                return offset + 8
15682            }
15683
15684            Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
15685                return writeDouble(this, value, offset, true, noAssert)
15686            }
15687
15688            Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
15689                return writeDouble(this, value, offset, false, noAssert)
15690            }
15691
15692// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
15693            Buffer.prototype.copy = function copy (target, targetStart, start, end) {
15694                if (!start) start = 0
15695                if (!end && end !== 0) end = this.length
15696                if (targetStart >= target.length) targetStart = target.length
15697                if (!targetStart) targetStart = 0
15698                if (end > 0 && end < start) end = start
15699
15700                // Copy 0 bytes; we're done
15701                if (end === start) return 0
15702                if (target.length === 0 || this.length === 0) return 0
15703
15704                // Fatal error conditions
15705                if (targetStart < 0) {
15706                    throw new RangeError('targetStart out of bounds')
15707                }
15708                if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
15709                if (end < 0) throw new RangeError('sourceEnd out of bounds')
15710
15711                // Are we oob?
15712                if (end > this.length) end = this.length
15713                if (target.length - targetStart < end - start) {
15714                    end = target.length - targetStart + start
15715                }
15716
15717                var len = end - start
15718                var i
15719
15720                if (this === target && start < targetStart && targetStart < end) {
15721                    // descending copy from end
15722                    for (i = len - 1; i >= 0; --i) {
15723                        target[i + targetStart] = this[i + start]
15724                    }
15725                } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
15726                    // ascending copy from start
15727                    for (i = 0; i < len; ++i) {
15728                        target[i + targetStart] = this[i + start]
15729                    }
15730                } else {
15731                    Uint8Array.prototype.set.call(
15732                        target,
15733                        this.subarray(start, start + len),
15734                        targetStart
15735                    )
15736                }
15737
15738                return len
15739            }
15740
15741// Usage:
15742//    buffer.fill(number[, offset[, end]])
15743//    buffer.fill(buffer[, offset[, end]])
15744//    buffer.fill(string[, offset[, end]][, encoding])
15745            Buffer.prototype.fill = function fill (val, start, end, encoding) {
15746                // Handle string cases:
15747                if (typeof val === 'string') {
15748                    if (typeof start === 'string') {
15749                        encoding = start
15750                        start = 0
15751                        end = this.length
15752                    } else if (typeof end === 'string') {
15753                        encoding = end
15754                        end = this.length
15755                    }
15756                    if (val.length === 1) {
15757                        var code = val.charCodeAt(0)
15758                        if (code < 256) {
15759                            val = code
15760                        }
15761                    }
15762                    if (encoding !== undefined && typeof encoding !== 'string') {
15763                        throw new TypeError('encoding must be a string')
15764                    }
15765                    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
15766                        throw new TypeError('Unknown encoding: ' + encoding)
15767                    }
15768                } else if (typeof val === 'number') {
15769                    val = val & 255
15770                }
15771
15772                // Invalid ranges are not set to a default, so can range check early.
15773                if (start < 0 || this.length < start || this.length < end) {
15774                    throw new RangeError('Out of range index')
15775                }
15776
15777                if (end <= start) {
15778                    return this
15779                }
15780
15781                start = start >>> 0
15782                end = end === undefined ? this.length : end >>> 0
15783
15784                if (!val) val = 0
15785
15786                var i
15787                if (typeof val === 'number') {
15788                    for (i = start; i < end; ++i) {
15789                        this[i] = val
15790                    }
15791                } else {
15792                    var bytes = Buffer.isBuffer(val)
15793                        ? val
15794                        : utf8ToBytes(new Buffer(val, encoding).toString())
15795                    var len = bytes.length
15796                    for (i = 0; i < end - start; ++i) {
15797                        this[i + start] = bytes[i % len]
15798                    }
15799                }
15800
15801                return this
15802            }
15803
15804// HELPER FUNCTIONS
15805// ================
15806
15807            var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
15808
15809            function base64clean (str) {
15810                // Node strips out invalid characters like \n and \t from the string, base64-js does not
15811                str = stringtrim(str).replace(INVALID_BASE64_RE, '')
15812                // Node converts strings with length < 2 to ''
15813                if (str.length < 2) return ''
15814                // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
15815                while (str.length % 4 !== 0) {
15816                    str = str + '='
15817                }
15818                return str
15819            }
15820
15821            function stringtrim (str) {
15822                if (str.trim) return str.trim()
15823                return str.replace(/^\s+|\s+$/g, '')
15824            }
15825
15826            function toHex (n) {
15827                if (n < 16) return '0' + n.toString(16)
15828                return n.toString(16)
15829            }
15830
15831            function utf8ToBytes (string, units) {
15832                units = units || Infinity
15833                var codePoint
15834                var length = string.length
15835                var leadSurrogate = null
15836                var bytes = []
15837
15838                for (var i = 0; i < length; ++i) {
15839                    codePoint = string.charCodeAt(i)
15840
15841                    // is surrogate component
15842                    if (codePoint > 0xD7FF && codePoint < 0xE000) {
15843                        // last char was a lead
15844                        if (!leadSurrogate) {
15845                            // no lead yet
15846                            if (codePoint > 0xDBFF) {
15847                                // unexpected trail
15848                                if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
15849                                continue
15850                            } else if (i + 1 === length) {
15851                                // unpaired lead
15852                                if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
15853                                continue
15854                            }
15855
15856                            // valid lead
15857                            leadSurrogate = codePoint
15858
15859                            continue
15860                        }
15861
15862                        // 2 leads in a row
15863                        if (codePoint < 0xDC00) {
15864                            if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
15865                            leadSurrogate = codePoint
15866                            continue
15867                        }
15868
15869                        // valid surrogate pair
15870                        codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
15871                    } else if (leadSurrogate) {
15872                        // valid bmp char, but last char was a lead
15873                        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
15874                    }
15875
15876                    leadSurrogate = null
15877
15878                    // encode utf8
15879                    if (codePoint < 0x80) {
15880                        if ((units -= 1) < 0) break
15881                        bytes.push(codePoint)
15882                    } else if (codePoint < 0x800) {
15883                        if ((units -= 2) < 0) break
15884                        bytes.push(
15885                            codePoint >> 0x6 | 0xC0,
15886                            codePoint & 0x3F | 0x80
15887                        )
15888                    } else if (codePoint < 0x10000) {
15889                        if ((units -= 3) < 0) break
15890                        bytes.push(
15891                            codePoint >> 0xC | 0xE0,
15892                            codePoint >> 0x6 & 0x3F | 0x80,
15893                            codePoint & 0x3F | 0x80
15894                        )
15895                    } else if (codePoint < 0x110000) {
15896                        if ((units -= 4) < 0) break
15897                        bytes.push(
15898                            codePoint >> 0x12 | 0xF0,
15899                            codePoint >> 0xC & 0x3F | 0x80,
15900                            codePoint >> 0x6 & 0x3F | 0x80,
15901                            codePoint & 0x3F | 0x80
15902                        )
15903                    } else {
15904                        throw new Error('Invalid code point')
15905                    }
15906                }
15907
15908                return bytes
15909            }
15910
15911            function asciiToBytes (str) {
15912                var byteArray = []
15913                for (var i = 0; i < str.length; ++i) {
15914                    // Node's code seems to be doing this and not & 0x7F..
15915                    byteArray.push(str.charCodeAt(i) & 0xFF)
15916                }
15917                return byteArray
15918            }
15919
15920            function utf16leToBytes (str, units) {
15921                var c, hi, lo
15922                var byteArray = []
15923                for (var i = 0; i < str.length; ++i) {
15924                    if ((units -= 2) < 0) break
15925
15926                    c = str.charCodeAt(i)
15927                    hi = c >> 8
15928                    lo = c % 256
15929                    byteArray.push(lo)
15930                    byteArray.push(hi)
15931                }
15932
15933                return byteArray
15934            }
15935
15936            function base64ToBytes (str) {
15937                return base64.toByteArray(base64clean(str))
15938            }
15939
15940            function blitBuffer (src, dst, offset, length) {
15941                for (var i = 0; i < length; ++i) {
15942                    if ((i + offset >= dst.length) || (i >= src.length)) break
15943                    dst[i + offset] = src[i]
15944                }
15945                return i
15946            }
15947
15948            function isnan (val) {
15949                return val !== val // eslint-disable-line no-self-compare
15950            }
15951
15952
15953            /***/ }),
15954
15955        
vendor: 3,541 bytes, lines 15955-16050
15955/***/ "./node_modules/ieee754/index.js":
15956        /*!***************************************!*\
15957  !*** ./node_modules/ieee754/index.js ***!
15958  \***************************************/
15959        /***/ (function(__unused_webpack_module, exports) {
15960
15961            /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
15962            exports.read = function (buffer, offset, isLE, mLen, nBytes) {
15963                var e, m
15964                var eLen = (nBytes * 8) - mLen - 1
15965                var eMax = (1 << eLen) - 1
15966                var eBias = eMax >> 1
15967                var nBits = -7
15968                var i = isLE ? (nBytes - 1) : 0
15969                var d = isLE ? -1 : 1
15970                var s = buffer[offset + i]
15971
15972                i += d
15973
15974                e = s & ((1 << (-nBits)) - 1)
15975                s >>= (-nBits)
15976                nBits += eLen
15977                for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
15978
15979                m = e & ((1 << (-nBits)) - 1)
15980                e >>= (-nBits)
15981                nBits += mLen
15982                for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
15983
15984                if (e === 0) {
15985                    e = 1 - eBias
15986                } else if (e === eMax) {
15987                    return m ? NaN : ((s ? -1 : 1) * Infinity)
15988                } else {
15989                    m = m + Math.pow(2, mLen)
15990                    e = e - eBias
15991                }
15992                return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
15993            }
15994
15995            exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
15996                var e, m, c
15997                var eLen = (nBytes * 8) - mLen - 1
15998                var eMax = (1 << eLen) - 1
15999                var eBias = eMax >> 1
16000                var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
16001                var i = isLE ? 0 : (nBytes - 1)
16002                var d = isLE ? 1 : -1
16003                var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
16004
16005                value = Math.abs(value)
16006
16007                if (isNaN(value) || value === Infinity) {
16008                    m = isNaN(value) ? 1 : 0
16009                    e = eMax
16010                } else {
16011                    e = Math.floor(Math.log(value) / Math.LN2)
16012                    if (value * (c = Math.pow(2, -e)) < 1) {
16013                        e--
16014                        c *= 2
16015                    }
16016                    if (e + eBias >= 1) {
16017                        value += rt / c
16018                    } else {
16019                        value += rt * Math.pow(2, 1 - eBias)
16020                    }
16021                    if (value * c >= 2) {
16022                        e++
16023                        c /= 2
16024                    }
16025
16026                    if (e + eBias >= eMax) {
16027                        m = 0
16028                        e = eMax
16029                    } else if (e + eBias >= 1) {
16030                        m = ((value * c) - 1) * Math.pow(2, mLen)
16031                        e = e + eBias
16032                    } else {
16033                        m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
16034                        e = 0
16035                    }
16036                }
16037
16038                for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
16039
16040                e = (e << mLen) | m
16041                eLen += mLen
16042                for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
16043
16044                buffer[offset + i - d] |= s * 128
16045            }
16046
16047
16048            /***/ }),
16049
16050        
vendor: 433 bytes, lines 16050-16065
16050/***/ "./node_modules/isarray/index.js":
16051        /*!***************************************!*\
16052  !*** ./node_modules/isarray/index.js ***!
16053  \***************************************/
16054        /***/ (function(module) {
16055
16056            var toString = {}.toString;
16057
16058            module.exports = Array.isArray || function (arr) {
16059                return toString.call(arr) == '[object Array]';
16060            };
16061
16062
16063            /***/ }),
16064
16065        
vendor: 497,603 bytes, lines 16065-26792
16065/***/ "./node_modules/jquery/dist/jquery.js":
16066        /*!********************************************!*\
16067  !*** ./node_modules/jquery/dist/jquery.js ***!
16068  \********************************************/
16069        /***/ (function(module, exports) {
16070
16071            var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
16072 * jQuery JavaScript Library v3.7.1
16073 * https://jquery.com/
16074 *
16075 * Copyright OpenJS Foundation and other contributors
16076 * Released under the MIT license
16077 * https://jquery.org/license
16078 *
16079 * Date: 2023-08-28T13:37Z
16080 */
16081            ( function( global, factory ) {
16082
16083                "use strict";
16084
16085                if (  true && typeof module.exports === "object" ) {
16086
16087                    // For CommonJS and CommonJS-like environments where a proper `window`
16088                    // is present, execute the factory and get jQuery.
16089                    // For environments that do not have a `window` with a `document`
16090                    // (such as Node.js), expose a factory as module.exports.
16091                    // This accentuates the need for the creation of a real `window`.
16092                    // e.g. var jQuery = require("jquery")(window);
16093                    // See ticket trac-14549 for more info.
16094                    module.exports = global.document ?
16095                        factory( global, true ) :
16096                        function( w ) {
16097                            if ( !w.document ) {
16098                                throw new Error( "jQuery requires a window with a document" );
16099                            }
16100                            return factory( w );
16101                        };
16102                } else {
16103                    factory( global );
16104                }
16105
16106// Pass this if window is not defined yet
16107            } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
16108
16109// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
16110// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
16111// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
16112// enough that all such attempts are guarded in a try block.
16113                "use strict";
16114
16115                var arr = [];
16116
16117                var getProto = Object.getPrototypeOf;
16118
16119                var slice = arr.slice;
16120
16121                var flat = arr.flat ? function( array ) {
16122                    return arr.flat.call( array );
16123                } : function( array ) {
16124                    return arr.concat.apply( [], array );
16125                };
16126
16127
16128                var push = arr.push;
16129
16130                var indexOf = arr.indexOf;
16131
16132                var class2type = {};
16133
16134                var toString = class2type.toString;
16135
16136                var hasOwn = class2type.hasOwnProperty;
16137
16138                var fnToString = hasOwn.toString;
16139
16140                var ObjectFunctionString = fnToString.call( Object );
16141
16142                var support = {};
16143
16144                var isFunction = function isFunction( obj ) {
16145
16146                    // Support: Chrome <=57, Firefox <=52
16147                    // In some browsers, typeof returns "function" for HTML <object> elements
16148                    // (i.e., `typeof document.createElement( "object" ) === "function"`).
16149                    // We don't want to classify *any* DOM node as a function.
16150                    // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
16151                    // Plus for old WebKit, typeof returns "function" for HTML collections
16152                    // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
16153                    return typeof obj === "function" && typeof obj.nodeType !== "number" &&
16154                        typeof obj.item !== "function";
16155                };
16156
16157
16158                var isWindow = function isWindow( obj ) {
16159                    return obj != null && obj === obj.window;
16160                };
16161
16162
16163                var document = window.document;
16164
16165
16166
16167                var preservedScriptAttributes = {
16168                    type: true,
16169                    src: true,
16170                    nonce: true,
16171                    noModule: true
16172                };
16173
16174                function DOMEval( code, node, doc ) {
16175                    doc = doc || document;
16176
16177                    var i, val,
16178                        script = doc.createElement( "script" );
16179
16180                    script.text = code;
16181                    if ( node ) {
16182                        for ( i in preservedScriptAttributes ) {
16183
16184                            // Support: Firefox 64+, Edge 18+
16185                            // Some browsers don't support the "nonce" property on scripts.
16186                            // On the other hand, just using `getAttribute` is not enough as
16187                            // the `nonce` attribute is reset to an empty string whenever it
16188                            // becomes browsing-context connected.
16189                            // See https://github.com/whatwg/html/issues/2369
16190                            // See https://html.spec.whatwg.org/#nonce-attributes
16191                            // The `node.getAttribute` check was added for the sake of
16192                            // `jQuery.globalEval` so that it can fake a nonce-containing node
16193                            // via an object.
16194                            val = node[ i ] || node.getAttribute && node.getAttribute( i );
16195                            if ( val ) {
16196                                script.setAttribute( i, val );
16197                            }
16198                        }
16199                    }
16200                    doc.head.appendChild( script ).parentNode.removeChild( script );
16201                }
16202
16203
16204                function toType( obj ) {
16205                    if ( obj == null ) {
16206                        return obj + "";
16207                    }
16208
16209                    // Support: Android <=2.3 only (functionish RegExp)
16210                    return typeof obj === "object" || typeof obj === "function" ?
16211                        class2type[ toString.call( obj ) ] || "object" :
16212                        typeof obj;
16213                }
16214                /* global Symbol */
16215// Defining this global in .eslintrc.json would create a danger of using the global
16216// unguarded in another place, it seems safer to define global only for this module
16217
16218
16219
16220                var version = "3.7.1",
16221
16222                    rhtmlSuffix = /HTML$/i,
16223
16224                    // Define a local copy of jQuery
16225                    jQuery = function( selector, context ) {
16226
16227                        // The jQuery object is actually just the init constructor 'enhanced'
16228                        // Need init if jQuery is called (just allow error to be thrown if not included)
16229                        return new jQuery.fn.init( selector, context );
16230                    };
16231
16232                jQuery.fn = jQuery.prototype = {
16233
16234                    // The current version of jQuery being used
16235                    jquery: version,
16236
16237                    constructor: jQuery,
16238
16239                    // The default length of a jQuery object is 0
16240                    length: 0,
16241
16242                    toArray: function() {
16243                        return slice.call( this );
16244                    },
16245
16246                    // Get the Nth element in the matched element set OR
16247                    // Get the whole matched element set as a clean array
16248                    get: function( num ) {
16249
16250                        // Return all the elements in a clean array
16251                        if ( num == null ) {
16252                            return slice.call( this );
16253                        }
16254
16255                        // Return just the one element from the set
16256                        return num < 0 ? this[ num + this.length ] : this[ num ];
16257                    },
16258
16259                    // Take an array of elements and push it onto the stack
16260                    // (returning the new matched element set)
16261                    pushStack: function( elems ) {
16262
16263                        // Build a new jQuery matched element set
16264                        var ret = jQuery.merge( this.constructor(), elems );
16265
16266                        // Add the old object onto the stack (as a reference)
16267                        ret.prevObject = this;
16268
16269                        // Return the newly-formed element set
16270                        return ret;
16271                    },
16272
16273                    // Execute a callback for every element in the matched set.
16274                    each: function( callback ) {
16275                        return jQuery.each( this, callback );
16276                    },
16277
16278                    map: function( callback ) {
16279                        return this.pushStack( jQuery.map( this, function( elem, i ) {
16280                            return callback.call( elem, i, elem );
16281                        } ) );
16282                    },
16283
16284                    slice: function() {
16285                        return this.pushStack( slice.apply( this, arguments ) );
16286                    },
16287
16288                    first: function() {
16289                        return this.eq( 0 );
16290                    },
16291
16292                    last: function() {
16293                        return this.eq( -1 );
16294                    },
16295
16296                    even: function() {
16297                        return this.pushStack( jQuery.grep( this, function( _elem, i ) {
16298                            return ( i + 1 ) % 2;
16299                        } ) );
16300                    },
16301
16302                    odd: function() {
16303                        return this.pushStack( jQuery.grep( this, function( _elem, i ) {
16304                            return i % 2;
16305                        } ) );
16306                    },
16307
16308                    eq: function( i ) {
16309                        var len = this.length,
16310                            j = +i + ( i < 0 ? len : 0 );
16311                        return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
16312                    },
16313
16314                    end: function() {
16315                        return this.prevObject || this.constructor();
16316                    },
16317
16318                    // For internal use only.
16319                    // Behaves like an Array's method, not like a jQuery method.
16320                    push: push,
16321                    sort: arr.sort,
16322                    splice: arr.splice
16323                };
16324
16325                jQuery.extend = jQuery.fn.extend = function() {
16326                    var options, name, src, copy, copyIsArray, clone,
16327                        target = arguments[ 0 ] || {},
16328                        i = 1,
16329                        length = arguments.length,
16330                        deep = false;
16331
16332                    // Handle a deep copy situation
16333                    if ( typeof target === "boolean" ) {
16334                        deep = target;
16335
16336                        // Skip the boolean and the target
16337                        target = arguments[ i ] || {};
16338                        i++;
16339                    }
16340
16341                    // Handle case when target is a string or something (possible in deep copy)
16342                    if ( typeof target !== "object" && !isFunction( target ) ) {
16343                        target = {};
16344                    }
16345
16346                    // Extend jQuery itself if only one argument is passed
16347                    if ( i === length ) {
16348                        target = this;
16349                        i--;
16350                    }
16351
16352                    for ( ; i < length; i++ ) {
16353
16354                        // Only deal with non-null/undefined values
16355                        if ( ( options = arguments[ i ] ) != null ) {
16356
16357                            // Extend the base object
16358                            for ( name in options ) {
16359                                copy = options[ name ];
16360
16361                                // Prevent Object.prototype pollution
16362                                // Prevent never-ending loop
16363                                if ( name === "__proto__" || target === copy ) {
16364                                    continue;
16365                                }
16366
16367                                // Recurse if we're merging plain objects or arrays
16368                                if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
16369                                    ( copyIsArray = Array.isArray( copy ) ) ) ) {
16370                                    src = target[ name ];
16371
16372                                    // Ensure proper type for the source value
16373                                    if ( copyIsArray && !Array.isArray( src ) ) {
16374                                        clone = [];
16375                                    } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
16376                                        clone = {};
16377                                    } else {
16378                                        clone = src;
16379                                    }
16380                                    copyIsArray = false;
16381
16382                                    // Never move original objects, clone them
16383                                    target[ name ] = jQuery.extend( deep, clone, copy );
16384
16385                                    // Don't bring in undefined values
16386                                } else if ( copy !== undefined ) {
16387                                    target[ name ] = copy;
16388                                }
16389                            }
16390                        }
16391                    }
16392
16393                    // Return the modified object
16394                    return target;
16395                };
16396
16397                jQuery.extend( {
16398
16399                    // Unique for each copy of jQuery on the page
16400                    expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
16401
16402                    // Assume jQuery is ready without the ready module
16403                    isReady: true,
16404
16405                    error: function( msg ) {
16406                        throw new Error( msg );
16407                    },
16408
16409                    noop: function() {},
16410
16411                    isPlainObject: function( obj ) {
16412                        var proto, Ctor;
16413
16414                        // Detect obvious negatives
16415                        // Use toString instead of jQuery.type to catch host objects
16416                        if ( !obj || toString.call( obj ) !== "[object Object]" ) {
16417                            return false;
16418                        }
16419
16420                        proto = getProto( obj );
16421
16422                        // Objects with no prototype (e.g., `Object.create( null )`) are plain
16423                        if ( !proto ) {
16424                            return true;
16425                        }
16426
16427                        // Objects with prototype are plain iff they were constructed by a global Object function
16428                        Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
16429                        return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
16430                    },
16431
16432                    isEmptyObject: function( obj ) {
16433                        var name;
16434
16435                        for ( name in obj ) {
16436                            return false;
16437                        }
16438                        return true;
16439                    },
16440
16441                    // Evaluates a script in a provided context; falls back to the global one
16442                    // if not specified.
16443                    globalEval: function( code, options, doc ) {
16444                        DOMEval( code, { nonce: options && options.nonce }, doc );
16445                    },
16446
16447                    each: function( obj, callback ) {
16448                        var length, i = 0;
16449
16450                        if ( isArrayLike( obj ) ) {
16451                            length = obj.length;
16452                            for ( ; i < length; i++ ) {
16453                                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
16454                                    break;
16455                                }
16456                            }
16457                        } else {
16458                            for ( i in obj ) {
16459                                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
16460                                    break;
16461                                }
16462                            }
16463                        }
16464
16465                        return obj;
16466                    },
16467
16468
16469                    // Retrieve the text value of an array of DOM nodes
16470                    text: function( elem ) {
16471                        var node,
16472                            ret = "",
16473                            i = 0,
16474                            nodeType = elem.nodeType;
16475
16476                        if ( !nodeType ) {
16477
16478                            // If no nodeType, this is expected to be an array
16479                            while ( ( node = elem[ i++ ] ) ) {
16480
16481                                // Do not traverse comment nodes
16482                                ret += jQuery.text( node );
16483                            }
16484                        }
16485                        if ( nodeType === 1 || nodeType === 11 ) {
16486                            return elem.textContent;
16487                        }
16488                        if ( nodeType === 9 ) {
16489                            return elem.documentElement.textContent;
16490                        }
16491                        if ( nodeType === 3 || nodeType === 4 ) {
16492                            return elem.nodeValue;
16493                        }
16494
16495                        // Do not include comment or processing instruction nodes
16496
16497                        return ret;
16498                    },
16499
16500                    // results is for internal usage only
16501                    makeArray: function( arr, results ) {
16502                        var ret = results || [];
16503
16504                        if ( arr != null ) {
16505                            if ( isArrayLike( Object( arr ) ) ) {
16506                                jQuery.merge( ret,
16507                                    typeof arr === "string" ?
16508                                        [ arr ] : arr
16509                                );
16510                            } else {
16511                                push.call( ret, arr );
16512                            }
16513                        }
16514
16515                        return ret;
16516                    },
16517
16518                    inArray: function( elem, arr, i ) {
16519                        return arr == null ? -1 : indexOf.call( arr, elem, i );
16520                    },
16521
16522                    isXMLDoc: function( elem ) {
16523                        var namespace = elem && elem.namespaceURI,
16524                            docElem = elem && ( elem.ownerDocument || elem ).documentElement;
16525
16526                        // Assume HTML when documentElement doesn't yet exist, such as inside
16527                        // document fragments.
16528                        return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
16529                    },
16530
16531                    // Support: Android <=4.0 only, PhantomJS 1 only
16532                    // push.apply(_, arraylike) throws on ancient WebKit
16533                    merge: function( first, second ) {
16534                        var len = +second.length,
16535                            j = 0,
16536                            i = first.length;
16537
16538                        for ( ; j < len; j++ ) {
16539                            first[ i++ ] = second[ j ];
16540                        }
16541
16542                        first.length = i;
16543
16544                        return first;
16545                    },
16546
16547                    grep: function( elems, callback, invert ) {
16548                        var callbackInverse,
16549                            matches = [],
16550                            i = 0,
16551                            length = elems.length,
16552                            callbackExpect = !invert;
16553
16554                        // Go through the array, only saving the items
16555                        // that pass the validator function
16556                        for ( ; i < length; i++ ) {
16557                            callbackInverse = !callback( elems[ i ], i );
16558                            if ( callbackInverse !== callbackExpect ) {
16559                                matches.push( elems[ i ] );
16560                            }
16561                        }
16562
16563                        return matches;
16564                    },
16565
16566                    // arg is for internal usage only
16567                    map: function( elems, callback, arg ) {
16568                        var length, value,
16569                            i = 0,
16570                            ret = [];
16571
16572                        // Go through the array, translating each of the items to their new values
16573                        if ( isArrayLike( elems ) ) {
16574                            length = elems.length;
16575                            for ( ; i < length; i++ ) {
16576                                value = callback( elems[ i ], i, arg );
16577
16578                                if ( value != null ) {
16579                                    ret.push( value );
16580                                }
16581                            }
16582
16583                            // Go through every key on the object,
16584                        } else {
16585                            for ( i in elems ) {
16586                                value = callback( elems[ i ], i, arg );
16587
16588                                if ( value != null ) {
16589                                    ret.push( value );
16590                                }
16591                            }
16592                        }
16593
16594                        // Flatten any nested arrays
16595                        return flat( ret );
16596                    },
16597
16598                    // A global GUID counter for objects
16599                    guid: 1,
16600
16601                    // jQuery.support is not used in Core but other projects attach their
16602                    // properties to it so it needs to exist.
16603                    support: support
16604                } );
16605
16606                if ( typeof Symbol === "function" ) {
16607                    jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
16608                }
16609
16610// Populate the class2type map
16611                jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
16612                    function( _i, name ) {
16613                        class2type[ "[object " + name + "]" ] = name.toLowerCase();
16614                    } );
16615
16616                function isArrayLike( obj ) {
16617
16618                    // Support: real iOS 8.2 only (not reproducible in simulator)
16619                    // `in` check used to prevent JIT error (gh-2145)
16620                    // hasOwn isn't used here due to false negatives
16621                    // regarding Nodelist length in IE
16622                    var length = !!obj && "length" in obj && obj.length,
16623                        type = toType( obj );
16624
16625                    if ( isFunction( obj ) || isWindow( obj ) ) {
16626                        return false;
16627                    }
16628
16629                    return type === "array" || length === 0 ||
16630                        typeof length === "number" && length > 0 && ( length - 1 ) in obj;
16631                }
16632
16633
16634                function nodeName( elem, name ) {
16635
16636                    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
16637
16638                }
16639                var pop = arr.pop;
16640
16641
16642                var sort = arr.sort;
16643
16644
16645                var splice = arr.splice;
16646
16647
16648                var whitespace = "[\\x20\\t\\r\\n\\f]";
16649
16650
16651                var rtrimCSS = new RegExp(
16652                    "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
16653                    "g"
16654                );
16655
16656
16657
16658
16659// Note: an element does not contain itself
16660                jQuery.contains = function( a, b ) {
16661                    var bup = b && b.parentNode;
16662
16663                    return a === bup || !!( bup && bup.nodeType === 1 && (
16664
16665                        // Support: IE 9 - 11+
16666                        // IE doesn't have `contains` on SVG.
16667                        a.contains ?
16668                            a.contains( bup ) :
16669                            a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
16670                    ) );
16671                };
16672
16673
16674
16675
16676// CSS string/identifier serialization
16677// https://drafts.csswg.org/cssom/#common-serializing-idioms
16678                var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
16679
16680                function fcssescape( ch, asCodePoint ) {
16681                    if ( asCodePoint ) {
16682
16683                        // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
16684                        if ( ch === "\0" ) {
16685                            return "\uFFFD";
16686                        }
16687
16688                        // Control characters and (dependent upon position) numbers get escaped as code points
16689                        return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
16690                    }
16691
16692                    // Other potentially-special ASCII characters get backslash-escaped
16693                    return "\\" + ch;
16694                }
16695
16696                jQuery.escapeSelector = function( sel ) {
16697                    return ( sel + "" ).replace( rcssescape, fcssescape );
16698                };
16699
16700
16701
16702
16703                var preferredDoc = document,
16704                    pushNative = push;
16705
16706                ( function() {
16707
16708                    var i,
16709                        Expr,
16710                        outermostContext,
16711                        sortInput,
16712                        hasDuplicate,
16713                        push = pushNative,
16714
16715                        // Local document vars
16716                        document,
16717                        documentElement,
16718                        documentIsHTML,
16719                        rbuggyQSA,
16720                        matches,
16721
16722                        // Instance-specific data
16723                        expando = jQuery.expando,
16724                        dirruns = 0,
16725                        done = 0,
16726                        classCache = createCache(),
16727                        tokenCache = createCache(),
16728                        compilerCache = createCache(),
16729                        nonnativeSelectorCache = createCache(),
16730                        sortOrder = function( a, b ) {
16731                            if ( a === b ) {
16732                                hasDuplicate = true;
16733                            }
16734                            return 0;
16735                        },
16736
16737                        booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
16738                            "loop|multiple|open|readonly|required|scoped",
16739
16740                        // Regular expressions
16741
16742                        // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
16743                        identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
16744                            "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
16745
16746                        // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
16747                        attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
16748
16749                            // Operator (capture 2)
16750                            "*([*^$|!~]?=)" + whitespace +
16751
16752                            // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
16753                            "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
16754                            whitespace + "*\\]",
16755
16756                        pseudos = ":(" + identifier + ")(?:\\((" +
16757
16758                            // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
16759                            // 1. quoted (capture 3; capture 4 or capture 5)
16760                            "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
16761
16762                            // 2. simple (capture 6)
16763                            "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
16764
16765                            // 3. anything else (capture 2)
16766                            ".*" +
16767                            ")\\)|)",
16768
16769                        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
16770                        rwhitespace = new RegExp( whitespace + "+", "g" ),
16771
16772                        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
16773                        rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
16774                            whitespace + "*" ),
16775                        rdescend = new RegExp( whitespace + "|>" ),
16776
16777                        rpseudo = new RegExp( pseudos ),
16778                        ridentifier = new RegExp( "^" + identifier + "$" ),
16779
16780                        matchExpr = {
16781                            ID: new RegExp( "^#(" + identifier + ")" ),
16782                            CLASS: new RegExp( "^\\.(" + identifier + ")" ),
16783                            TAG: new RegExp( "^(" + identifier + "|[*])" ),
16784                            ATTR: new RegExp( "^" + attributes ),
16785                            PSEUDO: new RegExp( "^" + pseudos ),
16786                            CHILD: new RegExp(
16787                                "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
16788                                whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
16789                                whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
16790                            bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
16791
16792                            // For use in libraries implementing .is()
16793                            // We use this for POS matching in `select`
16794                            needsContext: new RegExp( "^" + whitespace +
16795                                "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
16796                                "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
16797                        },
16798
16799                        rinputs = /^(?:input|select|textarea|button)$/i,
16800                        rheader = /^h\d$/i,
16801
16802                        // Easily-parseable/retrievable ID or TAG or CLASS selectors
16803                        rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
16804
16805                        rsibling = /[+~]/,
16806
16807                        // CSS escapes
16808                        // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
16809                        runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
16810                            "?|\\\\([^\\r\\n\\f])", "g" ),
16811                        funescape = function( escape, nonHex ) {
16812                            var high = "0x" + escape.slice( 1 ) - 0x10000;
16813
16814                            if ( nonHex ) {
16815
16816                                // Strip the backslash prefix from a non-hex escape sequence
16817                                return nonHex;
16818                            }
16819
16820                            // Replace a hexadecimal escape sequence with the encoded Unicode code point
16821                            // Support: IE <=11+
16822                            // For values outside the Basic Multilingual Plane (BMP), manually construct a
16823                            // surrogate pair
16824                            return high < 0 ?
16825                                String.fromCharCode( high + 0x10000 ) :
16826                                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
16827                        },
16828
16829                        // Used for iframes; see `setDocument`.
16830                        // Support: IE 9 - 11+, Edge 12 - 18+
16831                        // Removing the function wrapper causes a "Permission Denied"
16832                        // error in IE/Edge.
16833                        unloadHandler = function() {
16834                            setDocument();
16835                        },
16836
16837                        inDisabledFieldset = addCombinator(
16838                            function( elem ) {
16839                                return elem.disabled === true && nodeName( elem, "fieldset" );
16840                            },
16841                            { dir: "parentNode", next: "legend" }
16842                        );
16843
16844// Support: IE <=9 only
16845// Accessing document.activeElement can throw unexpectedly
16846// https://bugs.jquery.com/ticket/13393
16847                    function safeActiveElement() {
16848                        try {
16849                            return document.activeElement;
16850                        } catch ( err ) { }
16851                    }
16852
16853// Optimize for push.apply( _, NodeList )
16854                    try {
16855                        push.apply(
16856                            ( arr = slice.call( preferredDoc.childNodes ) ),
16857                            preferredDoc.childNodes
16858                        );
16859
16860                        // Support: Android <=4.0
16861                        // Detect silently failing push.apply
16862                        // eslint-disable-next-line no-unused-expressions
16863                        arr[ preferredDoc.childNodes.length ].nodeType;
16864                    } catch ( e ) {
16865                        push = {
16866                            apply: function( target, els ) {
16867                                pushNative.apply( target, slice.call( els ) );
16868                            },
16869                            call: function( target ) {
16870                                pushNative.apply( target, slice.call( arguments, 1 ) );
16871                            }
16872                        };
16873                    }
16874
16875                    function find( selector, context, results, seed ) {
16876                        var m, i, elem, nid, match, groups, newSelector,
16877                            newContext = context && context.ownerDocument,
16878
16879                            // nodeType defaults to 9, since context defaults to document
16880                            nodeType = context ? context.nodeType : 9;
16881
16882                        results = results || [];
16883
16884                        // Return early from calls with invalid selector or context
16885                        if ( typeof selector !== "string" || !selector ||
16886                            nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
16887
16888                            return results;
16889                        }
16890
16891                        // Try to shortcut find operations (as opposed to filters) in HTML documents
16892                        if ( !seed ) {
16893                            setDocument( context );
16894                            context = context || document;
16895
16896                            if ( documentIsHTML ) {
16897
16898                                // If the selector is sufficiently simple, try using a "get*By*" DOM method
16899                                // (excepting DocumentFragment context, where the methods don't exist)
16900                                if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
16901
16902                                    // ID selector
16903                                    if ( ( m = match[ 1 ] ) ) {
16904
16905                                        // Document context
16906                                        if ( nodeType === 9 ) {
16907                                            if ( ( elem = context.getElementById( m ) ) ) {
16908
16909                                                // Support: IE 9 only
16910                                                // getElementById can match elements by name instead of ID
16911                                                if ( elem.id === m ) {
16912                                                    push.call( results, elem );
16913                                                    return results;
16914                                                }
16915                                            } else {
16916                                                return results;
16917                                            }
16918
16919                                            // Element context
16920                                        } else {
16921
16922                                            // Support: IE 9 only
16923                                            // getElementById can match elements by name instead of ID
16924                                            if ( newContext && ( elem = newContext.getElementById( m ) ) &&
16925                                                find.contains( context, elem ) &&
16926                                                elem.id === m ) {
16927
16928                                                push.call( results, elem );
16929                                                return results;
16930                                            }
16931                                        }
16932
16933                                        // Type selector
16934                                    } else if ( match[ 2 ] ) {
16935                                        push.apply( results, context.getElementsByTagName( selector ) );
16936                                        return results;
16937
16938                                        // Class selector
16939                                    } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
16940                                        push.apply( results, context.getElementsByClassName( m ) );
16941                                        return results;
16942                                    }
16943                                }
16944
16945                                // Take advantage of querySelectorAll
16946                                if ( !nonnativeSelectorCache[ selector + " " ] &&
16947                                    ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
16948
16949                                    newSelector = selector;
16950                                    newContext = context;
16951
16952                                    // qSA considers elements outside a scoping root when evaluating child or
16953                                    // descendant combinators, which is not what we want.
16954                                    // In such cases, we work around the behavior by prefixing every selector in the
16955                                    // list with an ID selector referencing the scope context.
16956                                    // The technique has to be used as well when a leading combinator is used
16957                                    // as such selectors are not recognized by querySelectorAll.
16958                                    // Thanks to Andrew Dupont for this technique.
16959                                    if ( nodeType === 1 &&
16960                                        ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
16961
16962                                        // Expand context for sibling selectors
16963                                        newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
16964                                            context;
16965
16966                                        // We can use :scope instead of the ID hack if the browser
16967                                        // supports it & if we're not changing the context.
16968                                        // Support: IE 11+, Edge 17 - 18+
16969                                        // IE/Edge sometimes throw a "Permission denied" error when
16970                                        // strict-comparing two documents; shallow comparisons work.
16971                                        // eslint-disable-next-line eqeqeq
16972                                        if ( newContext != context || !support.scope ) {
16973
16974                                            // Capture the context ID, setting it first if necessary
16975                                            if ( ( nid = context.getAttribute( "id" ) ) ) {
16976                                                nid = jQuery.escapeSelector( nid );
16977                                            } else {
16978                                                context.setAttribute( "id", ( nid = expando ) );
16979                                            }
16980                                        }
16981
16982                                        // Prefix every selector in the list
16983                                        groups = tokenize( selector );
16984                                        i = groups.length;
16985                                        while ( i-- ) {
16986                                            groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
16987                                                toSelector( groups[ i ] );
16988                                        }
16989                                        newSelector = groups.join( "," );
16990                                    }
16991
16992                                    try {
16993                                        push.apply( results,
16994                                            newContext.querySelectorAll( newSelector )
16995                                        );
16996                                        return results;
16997                                    } catch ( qsaError ) {
16998                                        nonnativeSelectorCache( selector, true );
16999                                    } finally {
17000                                        if ( nid === expando ) {
17001                                            context.removeAttribute( "id" );
17002                                        }
17003                                    }
17004                                }
17005                            }
17006                        }
17007
17008                        // All others
17009                        return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
17010                    }
17011
17012                    /**
17013                     * Create key-value caches of limited size
17014                     * @returns {function(string, object)} Returns the Object data after storing it on itself with
17015                     *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
17016                     *	deleting the oldest entry
17017                     */
17018                    function createCache() {
17019                        var keys = [];
17020
17021                        function cache( key, value ) {
17022
17023                            // Use (key + " ") to avoid collision with native prototype properties
17024                            // (see https://github.com/jquery/sizzle/issues/157)
17025                            if ( keys.push( key + " " ) > Expr.cacheLength ) {
17026
17027                                // Only keep the most recent entries
17028                                delete cache[ keys.shift() ];
17029                            }
17030                            return ( cache[ key + " " ] = value );
17031                        }
17032                        return cache;
17033                    }
17034
17035                    /**
17036                     * Mark a function for special use by jQuery selector module
17037                     * @param {Function} fn The function to mark
17038                     */
17039                    function markFunction( fn ) {
17040                        fn[ expando ] = true;
17041                        return fn;
17042                    }
17043
17044                    /**
17045                     * Support testing using an element
17046                     * @param {Function} fn Passed the created element and returns a boolean result
17047                     */
17048                    function assert( fn ) {
17049                        var el = document.createElement( "fieldset" );
17050
17051                        try {
17052                            return !!fn( el );
17053                        } catch ( e ) {
17054                            return false;
17055                        } finally {
17056
17057                            // Remove from its parent by default
17058                            if ( el.parentNode ) {
17059                                el.parentNode.removeChild( el );
17060                            }
17061
17062                            // release memory in IE
17063                            el = null;
17064                        }
17065                    }
17066
17067                    /**
17068                     * Returns a function to use in pseudos for input types
17069                     * @param {String} type
17070                     */
17071                    function createInputPseudo( type ) {
17072                        return function( elem ) {
17073                            return nodeName( elem, "input" ) && elem.type === type;
17074                        };
17075                    }
17076
17077                    /**
17078                     * Returns a function to use in pseudos for buttons
17079                     * @param {String} type
17080                     */
17081                    function createButtonPseudo( type ) {
17082                        return function( elem ) {
17083                            return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
17084                                elem.type === type;
17085                        };
17086                    }
17087
17088                    /**
17089                     * Returns a function to use in pseudos for :enabled/:disabled
17090                     * @param {Boolean} disabled true for :disabled; false for :enabled
17091                     */
17092                    function createDisabledPseudo( disabled ) {
17093
17094                        // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
17095                        return function( elem ) {
17096
17097                            // Only certain elements can match :enabled or :disabled
17098                            // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
17099                            // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
17100                            if ( "form" in elem ) {
17101
17102                                // Check for inherited disabledness on relevant non-disabled elements:
17103                                // * listed form-associated elements in a disabled fieldset
17104                                //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
17105                                //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
17106                                // * option elements in a disabled optgroup
17107                                //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
17108                                // All such elements have a "form" property.
17109                                if ( elem.parentNode && elem.disabled === false ) {
17110
17111                                    // Option elements defer to a parent optgroup if present
17112                                    if ( "label" in elem ) {
17113                                        if ( "label" in elem.parentNode ) {
17114                                            return elem.parentNode.disabled === disabled;
17115                                        } else {
17116                                            return elem.disabled === disabled;
17117                                        }
17118                                    }
17119
17120                                    // Support: IE 6 - 11+
17121                                    // Use the isDisabled shortcut property to check for disabled fieldset ancestors
17122                                    return elem.isDisabled === disabled ||
17123
17124                                        // Where there is no isDisabled, check manually
17125                                        elem.isDisabled !== !disabled &&
17126                                        inDisabledFieldset( elem ) === disabled;
17127                                }
17128
17129                                return elem.disabled === disabled;
17130
17131                                // Try to winnow out elements that can't be disabled before trusting the disabled property.
17132                                // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
17133                                // even exist on them, let alone have a boolean value.
17134                            } else if ( "label" in elem ) {
17135                                return elem.disabled === disabled;
17136                            }
17137
17138                            // Remaining elements are neither :enabled nor :disabled
17139                            return false;
17140                        };
17141                    }
17142
17143                    /**
17144                     * Returns a function to use in pseudos for positionals
17145                     * @param {Function} fn
17146                     */
17147                    function createPositionalPseudo( fn ) {
17148                        return markFunction( function( argument ) {
17149                            argument = +argument;
17150                            return markFunction( function( seed, matches ) {
17151                                var j,
17152                                    matchIndexes = fn( [], seed.length, argument ),
17153                                    i = matchIndexes.length;
17154
17155                                // Match elements found at the specified indexes
17156                                while ( i-- ) {
17157                                    if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
17158                                        seed[ j ] = !( matches[ j ] = seed[ j ] );
17159                                    }
17160                                }
17161                            } );
17162                        } );
17163                    }
17164
17165                    /**
17166                     * Checks a node for validity as a jQuery selector context
17167                     * @param {Element|Object=} context
17168                     * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
17169                     */
17170                    function testContext( context ) {
17171                        return context && typeof context.getElementsByTagName !== "undefined" && context;
17172                    }
17173
17174                    /**
17175                     * Sets document-related variables once based on the current document
17176                     * @param {Element|Object} [node] An element or document object to use to set the document
17177                     * @returns {Object} Returns the current document
17178                     */
17179                    function setDocument( node ) {
17180                        var subWindow,
17181                            doc = node ? node.ownerDocument || node : preferredDoc;
17182
17183                        // Return early if doc is invalid or already selected
17184                        // Support: IE 11+, Edge 17 - 18+
17185                        // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
17186                        // two documents; shallow comparisons work.
17187                        // eslint-disable-next-line eqeqeq
17188                        if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
17189                            return document;
17190                        }
17191
17192                        // Update global variables
17193                        document = doc;
17194                        documentElement = document.documentElement;
17195                        documentIsHTML = !jQuery.isXMLDoc( document );
17196
17197                        // Support: iOS 7 only, IE 9 - 11+
17198                        // Older browsers didn't support unprefixed `matches`.
17199                        matches = documentElement.matches ||
17200                            documentElement.webkitMatchesSelector ||
17201                            documentElement.msMatchesSelector;
17202
17203                        // Support: IE 9 - 11+, Edge 12 - 18+
17204                        // Accessing iframe documents after unload throws "permission denied" errors
17205                        // (see trac-13936).
17206                        // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,
17207                        // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.
17208                        if ( documentElement.msMatchesSelector &&
17209
17210                            // Support: IE 11+, Edge 17 - 18+
17211                            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
17212                            // two documents; shallow comparisons work.
17213                            // eslint-disable-next-line eqeqeq
17214                            preferredDoc != document &&
17215                            ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
17216
17217                            // Support: IE 9 - 11+, Edge 12 - 18+
17218                            subWindow.addEventListener( "unload", unloadHandler );
17219                        }
17220
17221                        // Support: IE <10
17222                        // Check if getElementById returns elements by name
17223                        // The broken getElementById methods don't pick up programmatically-set names,
17224                        // so use a roundabout getElementsByName test
17225                        support.getById = assert( function( el ) {
17226                            documentElement.appendChild( el ).id = jQuery.expando;
17227                            return !document.getElementsByName ||
17228                                !document.getElementsByName( jQuery.expando ).length;
17229                        } );
17230
17231                        // Support: IE 9 only
17232                        // Check to see if it's possible to do matchesSelector
17233                        // on a disconnected node.
17234                        support.disconnectedMatch = assert( function( el ) {
17235                            return matches.call( el, "*" );
17236                        } );
17237
17238                        // Support: IE 9 - 11+, Edge 12 - 18+
17239                        // IE/Edge don't support the :scope pseudo-class.
17240                        support.scope = assert( function() {
17241                            return document.querySelectorAll( ":scope" );
17242                        } );
17243
17244                        // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
17245                        // Make sure the `:has()` argument is parsed unforgivingly.
17246                        // We include `*` in the test to detect buggy implementations that are
17247                        // _selectively_ forgiving (specifically when the list includes at least
17248                        // one valid selector).
17249                        // Note that we treat complete lack of support for `:has()` as if it were
17250                        // spec-compliant support, which is fine because use of `:has()` in such
17251                        // environments will fail in the qSA path and fall back to jQuery traversal
17252                        // anyway.
17253                        support.cssHas = assert( function() {
17254                            try {
17255                                document.querySelector( ":has(*,:jqfake)" );
17256                                return false;
17257                            } catch ( e ) {
17258                                return true;
17259                            }
17260                        } );
17261
17262                        // ID filter and find
17263                        if ( support.getById ) {
17264                            Expr.filter.ID = function( id ) {
17265                                var attrId = id.replace( runescape, funescape );
17266                                return function( elem ) {
17267                                    return elem.getAttribute( "id" ) === attrId;
17268                                };
17269                            };
17270                            Expr.find.ID = function( id, context ) {
17271                                if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
17272                                    var elem = context.getElementById( id );
17273                                    return elem ? [ elem ] : [];
17274                                }
17275                            };
17276                        } else {
17277                            Expr.filter.ID =  function( id ) {
17278                                var attrId = id.replace( runescape, funescape );
17279                                return function( elem ) {
17280                                    var node = typeof elem.getAttributeNode !== "undefined" &&
17281                                        elem.getAttributeNode( "id" );
17282                                    return node && node.value === attrId;
17283                                };
17284                            };
17285
17286                            // Support: IE 6 - 7 only
17287                            // getElementById is not reliable as a find shortcut
17288                            Expr.find.ID = function( id, context ) {
17289                                if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
17290                                    var node, i, elems,
17291                                        elem = context.getElementById( id );
17292
17293                                    if ( elem ) {
17294
17295                                        // Verify the id attribute
17296                                        node = elem.getAttributeNode( "id" );
17297                                        if ( node && node.value === id ) {
17298                                            return [ elem ];
17299                                        }
17300
17301                                        // Fall back on getElementsByName
17302                                        elems = context.getElementsByName( id );
17303                                        i = 0;
17304                                        while ( ( elem = elems[ i++ ] ) ) {
17305                                            node = elem.getAttributeNode( "id" );
17306                                            if ( node && node.value === id ) {
17307                                                return [ elem ];
17308                                            }
17309                                        }
17310                                    }
17311
17312                                    return [];
17313                                }
17314                            };
17315                        }
17316
17317                        // Tag
17318                        Expr.find.TAG = function( tag, context ) {
17319                            if ( typeof context.getElementsByTagName !== "undefined" ) {
17320                                return context.getElementsByTagName( tag );
17321
17322                                // DocumentFragment nodes don't have gEBTN
17323                            } else {
17324                                return context.querySelectorAll( tag );
17325                            }
17326                        };
17327
17328                        // Class
17329                        Expr.find.CLASS = function( className, context ) {
17330                            if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
17331                                return context.getElementsByClassName( className );
17332                            }
17333                        };
17334
17335                        /* QSA/matchesSelector
17336	---------------------------------------------------------------------- */
17337
17338                        // QSA and matchesSelector support
17339
17340                        rbuggyQSA = [];
17341
17342                        // Build QSA regex
17343                        // Regex strategy adopted from Diego Perini
17344                        assert( function( el ) {
17345
17346                            var input;
17347
17348                            documentElement.appendChild( el ).innerHTML =
17349                                "<a id='" + expando + "' href='' disabled='disabled'></a>" +
17350                                "<select id='" + expando + "-\r\\' disabled='disabled'>" +
17351                                "<option selected=''></option></select>";
17352
17353                            // Support: iOS <=7 - 8 only
17354                            // Boolean attributes and "value" are not treated correctly in some XML documents
17355                            if ( !el.querySelectorAll( "[selected]" ).length ) {
17356                                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
17357                            }
17358
17359                            // Support: iOS <=7 - 8 only
17360                            if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
17361                                rbuggyQSA.push( "~=" );
17362                            }
17363
17364                            // Support: iOS 8 only
17365                            // https://bugs.webkit.org/show_bug.cgi?id=136851
17366                            // In-page `selector#id sibling-combinator selector` fails
17367                            if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
17368                                rbuggyQSA.push( ".#.+[+~]" );
17369                            }
17370
17371                            // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
17372                            // In some of the document kinds, these selectors wouldn't work natively.
17373                            // This is probably OK but for backwards compatibility we want to maintain
17374                            // handling them through jQuery traversal in jQuery 3.x.
17375                            if ( !el.querySelectorAll( ":checked" ).length ) {
17376                                rbuggyQSA.push( ":checked" );
17377                            }
17378
17379                            // Support: Windows 8 Native Apps
17380                            // The type and name attributes are restricted during .innerHTML assignment
17381                            input = document.createElement( "input" );
17382                            input.setAttribute( "type", "hidden" );
17383                            el.appendChild( input ).setAttribute( "name", "D" );
17384
17385                            // Support: IE 9 - 11+
17386                            // IE's :disabled selector does not pick up the children of disabled fieldsets
17387                            // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
17388                            // In some of the document kinds, these selectors wouldn't work natively.
17389                            // This is probably OK but for backwards compatibility we want to maintain
17390                            // handling them through jQuery traversal in jQuery 3.x.
17391                            documentElement.appendChild( el ).disabled = true;
17392                            if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
17393                                rbuggyQSA.push( ":enabled", ":disabled" );
17394                            }
17395
17396                            // Support: IE 11+, Edge 15 - 18+
17397                            // IE 11/Edge don't find elements on a `[name='']` query in some cases.
17398                            // Adding a temporary attribute to the document before the selection works
17399                            // around the issue.
17400                            // Interestingly, IE 10 & older don't seem to have the issue.
17401                            input = document.createElement( "input" );
17402                            input.setAttribute( "name", "" );
17403                            el.appendChild( input );
17404                            if ( !el.querySelectorAll( "[name='']" ).length ) {
17405                                rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
17406                                    whitespace + "*(?:''|\"\")" );
17407                            }
17408                        } );
17409
17410                        if ( !support.cssHas ) {
17411
17412                            // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
17413                            // Our regular `try-catch` mechanism fails to detect natively-unsupported
17414                            // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
17415                            // in browsers that parse the `:has()` argument as a forgiving selector list.
17416                            // https://drafts.csswg.org/selectors/#relational now requires the argument
17417                            // to be parsed unforgivingly, but browsers have not yet fully adjusted.
17418                            rbuggyQSA.push( ":has" );
17419                        }
17420
17421                        rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
17422
17423                        /* Sorting
17424	---------------------------------------------------------------------- */
17425
17426                        // Document order sorting
17427                        sortOrder = function( a, b ) {
17428
17429                            // Flag for duplicate removal
17430                            if ( a === b ) {
17431                                hasDuplicate = true;
17432                                return 0;
17433                            }
17434
17435                            // Sort on method existence if only one input has compareDocumentPosition
17436                            var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
17437                            if ( compare ) {
17438                                return compare;
17439                            }
17440
17441                            // Calculate position if both inputs belong to the same document
17442                            // Support: IE 11+, Edge 17 - 18+
17443                            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
17444                            // two documents; shallow comparisons work.
17445                            // eslint-disable-next-line eqeqeq
17446                            compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
17447                                a.compareDocumentPosition( b ) :
17448
17449                                // Otherwise we know they are disconnected
17450                                1;
17451
17452                            // Disconnected nodes
17453                            if ( compare & 1 ||
17454                                ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
17455
17456                                // Choose the first element that is related to our preferred document
17457                                // Support: IE 11+, Edge 17 - 18+
17458                                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
17459                                // two documents; shallow comparisons work.
17460                                // eslint-disable-next-line eqeqeq
17461                                if ( a === document || a.ownerDocument == preferredDoc &&
17462                                    find.contains( preferredDoc, a ) ) {
17463                                    return -1;
17464                                }
17465
17466                                // Support: IE 11+, Edge 17 - 18+
17467                                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
17468                                // two documents; shallow comparisons work.
17469                                // eslint-disable-next-line eqeqeq
17470                                if ( b === document || b.ownerDocument == preferredDoc &&
17471                                    find.contains( preferredDoc, b ) ) {
17472                                    return 1;
17473                                }
17474
17475                                // Maintain original order
17476                                return sortInput ?
17477                                    ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
17478                                    0;
17479                            }
17480
17481                            return compare & 4 ? -1 : 1;
17482                        };
17483
17484                        return document;
17485                    }
17486
17487                    find.matches = function( expr, elements ) {
17488                        return find( expr, null, null, elements );
17489                    };
17490
17491                    find.matchesSelector = function( elem, expr ) {
17492                        setDocument( elem );
17493
17494                        if ( documentIsHTML &&
17495                            !nonnativeSelectorCache[ expr + " " ] &&
17496                            ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
17497
17498                            try {
17499                                var ret = matches.call( elem, expr );
17500
17501                                // IE 9's matchesSelector returns false on disconnected nodes
17502                                if ( ret || support.disconnectedMatch ||
17503
17504                                    // As well, disconnected nodes are said to be in a document
17505                                    // fragment in IE 9
17506                                    elem.document && elem.document.nodeType !== 11 ) {
17507                                    return ret;
17508                                }
17509                            } catch ( e ) {
17510                                nonnativeSelectorCache( expr, true );
17511                            }
17512                        }
17513
17514                        return find( expr, document, null, [ elem ] ).length > 0;
17515                    };
17516
17517                    find.contains = function( context, elem ) {
17518
17519                        // Set document vars if needed
17520                        // Support: IE 11+, Edge 17 - 18+
17521                        // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
17522                        // two documents; shallow comparisons work.
17523                        // eslint-disable-next-line eqeqeq
17524                        if ( ( context.ownerDocument || context ) != document ) {
17525                            setDocument( context );
17526                        }
17527                        return jQuery.contains( context, elem );
17528                    };
17529
17530
17531                    find.attr = function( elem, name ) {
17532
17533                        // Set document vars if needed
17534                        // Support: IE 11+, Edge 17 - 18+
17535                        // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
17536                        // two documents; shallow comparisons work.
17537                        // eslint-disable-next-line eqeqeq
17538                        if ( ( elem.ownerDocument || elem ) != document ) {
17539                            setDocument( elem );
17540                        }
17541
17542                        var fn = Expr.attrHandle[ name.toLowerCase() ],
17543
17544                            // Don't get fooled by Object.prototype properties (see trac-13807)
17545                            val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
17546                                fn( elem, name, !documentIsHTML ) :
17547                                undefined;
17548
17549                        if ( val !== undefined ) {
17550                            return val;
17551                        }
17552
17553                        return elem.getAttribute( name );
17554                    };
17555
17556                    find.error = function( msg ) {
17557                        throw new Error( "Syntax error, unrecognized expression: " + msg );
17558                    };
17559
17560                    /**
17561                     * Document sorting and removing duplicates
17562                     * @param {ArrayLike} results
17563                     */
17564                    jQuery.uniqueSort = function( results ) {
17565                        var elem,
17566                            duplicates = [],
17567                            j = 0,
17568                            i = 0;
17569
17570                        // Unless we *know* we can detect duplicates, assume their presence
17571                        //
17572                        // Support: Android <=4.0+
17573                        // Testing for detecting duplicates is unpredictable so instead assume we can't
17574                        // depend on duplicate detection in all browsers without a stable sort.
17575                        hasDuplicate = !support.sortStable;
17576                        sortInput = !support.sortStable && slice.call( results, 0 );
17577                        sort.call( results, sortOrder );
17578
17579                        if ( hasDuplicate ) {
17580                            while ( ( elem = results[ i++ ] ) ) {
17581                                if ( elem === results[ i ] ) {
17582                                    j = duplicates.push( i );
17583                                }
17584                            }
17585                            while ( j-- ) {
17586                                splice.call( results, duplicates[ j ], 1 );
17587                            }
17588                        }
17589
17590                        // Clear input after sorting to release objects
17591                        // See https://github.com/jquery/sizzle/pull/225
17592                        sortInput = null;
17593
17594                        return results;
17595                    };
17596
17597                    jQuery.fn.uniqueSort = function() {
17598                        return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
17599                    };
17600
17601                    Expr = jQuery.expr = {
17602
17603                        // Can be adjusted by the user
17604                        cacheLength: 50,
17605
17606                        createPseudo: markFunction,
17607
17608                        match: matchExpr,
17609
17610                        attrHandle: {},
17611
17612                        find: {},
17613
17614                        relative: {
17615                            ">": { dir: "parentNode", first: true },
17616                            " ": { dir: "parentNode" },
17617                            "+": { dir: "previousSibling", first: true },
17618                            "~": { dir: "previousSibling" }
17619                        },
17620
17621                        preFilter: {
17622                            ATTR: function( match ) {
17623                                match[ 1 ] = match[ 1 ].replace( runescape, funescape );
17624
17625                                // Move the given value to match[3] whether quoted or unquoted
17626                                match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
17627                                    .replace( runescape, funescape );
17628
17629                                if ( match[ 2 ] === "~=" ) {
17630                                    match[ 3 ] = " " + match[ 3 ] + " ";
17631                                }
17632
17633                                return match.slice( 0, 4 );
17634                            },
17635
17636                            CHILD: function( match ) {
17637
17638                                /* matches from matchExpr["CHILD"]
17639				1 type (only|nth|...)
17640				2 what (child|of-type)
17641				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
17642				4 xn-component of xn+y argument ([+-]?\d*n|)
17643				5 sign of xn-component
17644				6 x of xn-component
17645				7 sign of y-component
17646				8 y of y-component
17647			*/
17648                                match[ 1 ] = match[ 1 ].toLowerCase();
17649
17650                                if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
17651
17652                                    // nth-* requires argument
17653                                    if ( !match[ 3 ] ) {
17654                                        find.error( match[ 0 ] );
17655                                    }
17656
17657                                    // numeric x and y parameters for Expr.filter.CHILD
17658                                    // remember that false/true cast respectively to 0/1
17659                                    match[ 4 ] = +( match[ 4 ] ?
17660                                            match[ 5 ] + ( match[ 6 ] || 1 ) :
17661                                            2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
17662                                    );
17663                                    match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
17664
17665                                    // other types prohibit arguments
17666                                } else if ( match[ 3 ] ) {
17667                                    find.error( match[ 0 ] );
17668                                }
17669
17670                                return match;
17671                            },
17672
17673                            PSEUDO: function( match ) {
17674                                var excess,
17675                                    unquoted = !match[ 6 ] && match[ 2 ];
17676
17677                                if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
17678                                    return null;
17679                                }
17680
17681                                // Accept quoted arguments as-is
17682                                if ( match[ 3 ] ) {
17683                                    match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
17684
17685                                    // Strip excess characters from unquoted arguments
17686                                } else if ( unquoted && rpseudo.test( unquoted ) &&
17687
17688                                    // Get excess from tokenize (recursively)
17689                                    ( excess = tokenize( unquoted, true ) ) &&
17690
17691                                    // advance to the next closing parenthesis
17692                                    ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
17693
17694                                    // excess is a negative index
17695                                    match[ 0 ] = match[ 0 ].slice( 0, excess );
17696                                    match[ 2 ] = unquoted.slice( 0, excess );
17697                                }
17698
17699                                // Return only captures needed by the pseudo filter method (type and argument)
17700                                return match.slice( 0, 3 );
17701                            }
17702                        },
17703
17704                        filter: {
17705
17706                            TAG: function( nodeNameSelector ) {
17707                                var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
17708                                return nodeNameSelector === "*" ?
17709                                    function() {
17710                                        return true;
17711                                    } :
17712                                    function( elem ) {
17713                                        return nodeName( elem, expectedNodeName );
17714                                    };
17715                            },
17716
17717                            CLASS: function( className ) {
17718                                var pattern = classCache[ className + " " ];
17719
17720                                return pattern ||
17721                                    ( pattern = new RegExp( "(^|" + whitespace + ")" + className +
17722                                        "(" + whitespace + "|$)" ) ) &&
17723                                    classCache( className, function( elem ) {
17724                                        return pattern.test(
17725                                            typeof elem.className === "string" && elem.className ||
17726                                            typeof elem.getAttribute !== "undefined" &&
17727                                            elem.getAttribute( "class" ) ||
17728                                            ""
17729                                        );
17730                                    } );
17731                            },
17732
17733                            ATTR: function( name, operator, check ) {
17734                                return function( elem ) {
17735                                    var result = find.attr( elem, name );
17736
17737                                    if ( result == null ) {
17738                                        return operator === "!=";
17739                                    }
17740                                    if ( !operator ) {
17741                                        return true;
17742                                    }
17743
17744                                    result += "";
17745
17746                                    if ( operator === "=" ) {
17747                                        return result === check;
17748                                    }
17749                                    if ( operator === "!=" ) {
17750                                        return result !== check;
17751                                    }
17752                                    if ( operator === "^=" ) {
17753                                        return check && result.indexOf( check ) === 0;
17754                                    }
17755                                    if ( operator === "*=" ) {
17756                                        return check && result.indexOf( check ) > -1;
17757                                    }
17758                                    if ( operator === "$=" ) {
17759                                        return check && result.slice( -check.length ) === check;
17760                                    }
17761                                    if ( operator === "~=" ) {
17762                                        return ( " " + result.replace( rwhitespace, " " ) + " " )
17763                                            .indexOf( check ) > -1;
17764                                    }
17765                                    if ( operator === "|=" ) {
17766                                        return result === check || result.slice( 0, check.length + 1 ) === check + "-";
17767                                    }
17768
17769                                    return false;
17770                                };
17771                            },
17772
17773                            CHILD: function( type, what, _argument, first, last ) {
17774                                var simple = type.slice( 0, 3 ) !== "nth",
17775                                    forward = type.slice( -4 ) !== "last",
17776                                    ofType = what === "of-type";
17777
17778                                return first === 1 && last === 0 ?
17779
17780                                    // Shortcut for :nth-*(n)
17781                                    function( elem ) {
17782                                        return !!elem.parentNode;
17783                                    } :
17784
17785                                    function( elem, _context, xml ) {
17786                                        var cache, outerCache, node, nodeIndex, start,
17787                                            dir = simple !== forward ? "nextSibling" : "previousSibling",
17788                                            parent = elem.parentNode,
17789                                            name = ofType && elem.nodeName.toLowerCase(),
17790                                            useCache = !xml && !ofType,
17791                                            diff = false;
17792
17793                                        if ( parent ) {
17794
17795                                            // :(first|last|only)-(child|of-type)
17796                                            if ( simple ) {
17797                                                while ( dir ) {
17798                                                    node = elem;
17799                                                    while ( ( node = node[ dir ] ) ) {
17800                                                        if ( ofType ?
17801                                                            nodeName( node, name ) :
17802                                                            node.nodeType === 1 ) {
17803
17804                                                            return false;
17805                                                        }
17806                                                    }
17807
17808                                                    // Reverse direction for :only-* (if we haven't yet done so)
17809                                                    start = dir = type === "only" && !start && "nextSibling";
17810                                                }
17811                                                return true;
17812                                            }
17813
17814                                            start = [ forward ? parent.firstChild : parent.lastChild ];
17815
17816                                            // non-xml :nth-child(...) stores cache data on `parent`
17817                                            if ( forward && useCache ) {
17818
17819                                                // Seek `elem` from a previously-cached index
17820                                                outerCache = parent[ expando ] || ( parent[ expando ] = {} );
17821                                                cache = outerCache[ type ] || [];
17822                                                nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
17823                                                diff = nodeIndex && cache[ 2 ];
17824                                                node = nodeIndex && parent.childNodes[ nodeIndex ];
17825
17826                                                while ( ( node = ++nodeIndex && node && node[ dir ] ||
17827
17828                                                    // Fallback to seeking `elem` from the start
17829                                                    ( diff = nodeIndex = 0 ) || start.pop() ) ) {
17830
17831                                                    // When found, cache indexes on `parent` and break
17832                                                    if ( node.nodeType === 1 && ++diff && node === elem ) {
17833                                                        outerCache[ type ] = [ dirruns, nodeIndex, diff ];
17834                                                        break;
17835                                                    }
17836                                                }
17837
17838                                            } else {
17839
17840                                                // Use previously-cached element index if available
17841                                                if ( useCache ) {
17842                                                    outerCache = elem[ expando ] || ( elem[ expando ] = {} );
17843                                                    cache = outerCache[ type ] || [];
17844                                                    nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
17845                                                    diff = nodeIndex;
17846                                                }
17847
17848                                                // xml :nth-child(...)
17849                                                // or :nth-last-child(...) or :nth(-last)?-of-type(...)
17850                                                if ( diff === false ) {
17851
17852                                                    // Use the same loop as above to seek `elem` from the start
17853                                                    while ( ( node = ++nodeIndex && node && node[ dir ] ||
17854                                                        ( diff = nodeIndex = 0 ) || start.pop() ) ) {
17855
17856                                                        if ( ( ofType ?
17857                                                                nodeName( node, name ) :
17858                                                                node.nodeType === 1 ) &&
17859                                                            ++diff ) {
17860
17861                                                            // Cache the index of each encountered element
17862                                                            if ( useCache ) {
17863                                                                outerCache = node[ expando ] ||
17864                                                                    ( node[ expando ] = {} );
17865                                                                outerCache[ type ] = [ dirruns, diff ];
17866                                                            }
17867
17868                                                            if ( node === elem ) {
17869                                                                break;
17870                                                            }
17871                                                        }
17872                                                    }
17873                                                }
17874                                            }
17875
17876                                            // Incorporate the offset, then check against cycle size
17877                                            diff -= last;
17878                                            return diff === first || ( diff % first === 0 && diff / first >= 0 );
17879                                        }
17880                                    };
17881                            },
17882
17883                            PSEUDO: function( pseudo, argument ) {
17884
17885                                // pseudo-class names are case-insensitive
17886                                // https://www.w3.org/TR/selectors/#pseudo-classes
17887                                // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
17888                                // Remember that setFilters inherits from pseudos
17889                                var args,
17890                                    fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
17891                                        find.error( "unsupported pseudo: " + pseudo );
17892
17893                                // The user may use createPseudo to indicate that
17894                                // arguments are needed to create the filter function
17895                                // just as jQuery does
17896                                if ( fn[ expando ] ) {
17897                                    return fn( argument );
17898                                }
17899
17900                                // But maintain support for old signatures
17901                                if ( fn.length > 1 ) {
17902                                    args = [ pseudo, pseudo, "", argument ];
17903                                    return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
17904                                        markFunction( function( seed, matches ) {
17905                                            var idx,
17906                                                matched = fn( seed, argument ),
17907                                                i = matched.length;
17908                                            while ( i-- ) {
17909                                                idx = indexOf.call( seed, matched[ i ] );
17910                                                seed[ idx ] = !( matches[ idx ] = matched[ i ] );
17911                                            }
17912                                        } ) :
17913                                        function( elem ) {
17914                                            return fn( elem, 0, args );
17915                                        };
17916                                }
17917
17918                                return fn;
17919                            }
17920                        },
17921
17922                        pseudos: {
17923
17924                            // Potentially complex pseudos
17925                            not: markFunction( function( selector ) {
17926
17927                                // Trim the selector passed to compile
17928                                // to avoid treating leading and trailing
17929                                // spaces as combinators
17930                                var input = [],
17931                                    results = [],
17932                                    matcher = compile( selector.replace( rtrimCSS, "$1" ) );
17933
17934                                return matcher[ expando ] ?
17935                                    markFunction( function( seed, matches, _context, xml ) {
17936                                        var elem,
17937                                            unmatched = matcher( seed, null, xml, [] ),
17938                                            i = seed.length;
17939
17940                                        // Match elements unmatched by `matcher`
17941                                        while ( i-- ) {
17942                                            if ( ( elem = unmatched[ i ] ) ) {
17943                                                seed[ i ] = !( matches[ i ] = elem );
17944                                            }
17945                                        }
17946                                    } ) :
17947                                    function( elem, _context, xml ) {
17948                                        input[ 0 ] = elem;
17949                                        matcher( input, null, xml, results );
17950
17951                                        // Don't keep the element
17952                                        // (see https://github.com/jquery/sizzle/issues/299)
17953                                        input[ 0 ] = null;
17954                                        return !results.pop();
17955                                    };
17956                            } ),
17957
17958                            has: markFunction( function( selector ) {
17959                                return function( elem ) {
17960                                    return find( selector, elem ).length > 0;
17961                                };
17962                            } ),
17963
17964                            contains: markFunction( function( text ) {
17965                                text = text.replace( runescape, funescape );
17966                                return function( elem ) {
17967                                    return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
17968                                };
17969                            } ),
17970
17971                            // "Whether an element is represented by a :lang() selector
17972                            // is based solely on the element's language value
17973                            // being equal to the identifier C,
17974                            // or beginning with the identifier C immediately followed by "-".
17975                            // The matching of C against the element's language value is performed case-insensitively.
17976                            // The identifier C does not have to be a valid language name."
17977                            // https://www.w3.org/TR/selectors/#lang-pseudo
17978                            lang: markFunction( function( lang ) {
17979
17980                                // lang value must be a valid identifier
17981                                if ( !ridentifier.test( lang || "" ) ) {
17982                                    find.error( "unsupported lang: " + lang );
17983                                }
17984                                lang = lang.replace( runescape, funescape ).toLowerCase();
17985                                return function( elem ) {
17986                                    var elemLang;
17987                                    do {
17988                                        if ( ( elemLang = documentIsHTML ?
17989                                            elem.lang :
17990                                            elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
17991
17992                                            elemLang = elemLang.toLowerCase();
17993                                            return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
17994                                        }
17995                                    } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
17996                                    return false;
17997                                };
17998                            } ),
17999
18000                            // Miscellaneous
18001                            target: function( elem ) {
18002                                var hash = window.location && window.location.hash;
18003                                return hash && hash.slice( 1 ) === elem.id;
18004                            },
18005
18006                            root: function( elem ) {
18007                                return elem === documentElement;
18008                            },
18009
18010                            focus: function( elem ) {
18011                                return elem === safeActiveElement() &&
18012                                    document.hasFocus() &&
18013                                    !!( elem.type || elem.href || ~elem.tabIndex );
18014                            },
18015
18016                            // Boolean properties
18017                            enabled: createDisabledPseudo( false ),
18018                            disabled: createDisabledPseudo( true ),
18019
18020                            checked: function( elem ) {
18021
18022                                // In CSS3, :checked should return both checked and selected elements
18023                                // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
18024                                return ( nodeName( elem, "input" ) && !!elem.checked ) ||
18025                                    ( nodeName( elem, "option" ) && !!elem.selected );
18026                            },
18027
18028                            selected: function( elem ) {
18029
18030                                // Support: IE <=11+
18031                                // Accessing the selectedIndex property
18032                                // forces the browser to treat the default option as
18033                                // selected when in an optgroup.
18034                                if ( elem.parentNode ) {
18035                                    // eslint-disable-next-line no-unused-expressions
18036                                    elem.parentNode.selectedIndex;
18037                                }
18038
18039                                return elem.selected === true;
18040                            },
18041
18042                            // Contents
18043                            empty: function( elem ) {
18044
18045                                // https://www.w3.org/TR/selectors/#empty-pseudo
18046                                // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
18047                                //   but not by others (comment: 8; processing instruction: 7; etc.)
18048                                // nodeType < 6 works because attributes (2) do not appear as children
18049                                for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
18050                                    if ( elem.nodeType < 6 ) {
18051                                        return false;
18052                                    }
18053                                }
18054                                return true;
18055                            },
18056
18057                            parent: function( elem ) {
18058                                return !Expr.pseudos.empty( elem );
18059                            },
18060
18061                            // Element/input types
18062                            header: function( elem ) {
18063                                return rheader.test( elem.nodeName );
18064                            },
18065
18066                            input: function( elem ) {
18067                                return rinputs.test( elem.nodeName );
18068                            },
18069
18070                            button: function( elem ) {
18071                                return nodeName( elem, "input" ) && elem.type === "button" ||
18072                                    nodeName( elem, "button" );
18073                            },
18074
18075                            text: function( elem ) {
18076                                var attr;
18077                                return nodeName( elem, "input" ) && elem.type === "text" &&
18078
18079                                    // Support: IE <10 only
18080                                    // New HTML5 attribute values (e.g., "search") appear
18081                                    // with elem.type === "text"
18082                                    ( ( attr = elem.getAttribute( "type" ) ) == null ||
18083                                        attr.toLowerCase() === "text" );
18084                            },
18085
18086                            // Position-in-collection
18087                            first: createPositionalPseudo( function() {
18088                                return [ 0 ];
18089                            } ),
18090
18091                            last: createPositionalPseudo( function( _matchIndexes, length ) {
18092                                return [ length - 1 ];
18093                            } ),
18094
18095                            eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
18096                                return [ argument < 0 ? argument + length : argument ];
18097                            } ),
18098
18099                            even: createPositionalPseudo( function( matchIndexes, length ) {
18100                                var i = 0;
18101                                for ( ; i < length; i += 2 ) {
18102                                    matchIndexes.push( i );
18103                                }
18104                                return matchIndexes;
18105                            } ),
18106
18107                            odd: createPositionalPseudo( function( matchIndexes, length ) {
18108                                var i = 1;
18109                                for ( ; i < length; i += 2 ) {
18110                                    matchIndexes.push( i );
18111                                }
18112                                return matchIndexes;
18113                            } ),
18114
18115                            lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
18116                                var i;
18117
18118                                if ( argument < 0 ) {
18119                                    i = argument + length;
18120                                } else if ( argument > length ) {
18121                                    i = length;
18122                                } else {
18123                                    i = argument;
18124                                }
18125
18126                                for ( ; --i >= 0; ) {
18127                                    matchIndexes.push( i );
18128                                }
18129                                return matchIndexes;
18130                            } ),
18131
18132                            gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
18133                                var i = argument < 0 ? argument + length : argument;
18134                                for ( ; ++i < length; ) {
18135                                    matchIndexes.push( i );
18136                                }
18137                                return matchIndexes;
18138                            } )
18139                        }
18140                    };
18141
18142                    Expr.pseudos.nth = Expr.pseudos.eq;
18143
18144// Add button/input type pseudos
18145                    for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
18146                        Expr.pseudos[ i ] = createInputPseudo( i );
18147                    }
18148                    for ( i in { submit: true, reset: true } ) {
18149                        Expr.pseudos[ i ] = createButtonPseudo( i );
18150                    }
18151
18152// Easy API for creating new setFilters
18153                    function setFilters() {}
18154                    setFilters.prototype = Expr.filters = Expr.pseudos;
18155                    Expr.setFilters = new setFilters();
18156
18157                    function tokenize( selector, parseOnly ) {
18158                        var matched, match, tokens, type,
18159                            soFar, groups, preFilters,
18160                            cached = tokenCache[ selector + " " ];
18161
18162                        if ( cached ) {
18163                            return parseOnly ? 0 : cached.slice( 0 );
18164                        }
18165
18166                        soFar = selector;
18167                        groups = [];
18168                        preFilters = Expr.preFilter;
18169
18170                        while ( soFar ) {
18171
18172                            // Comma and first run
18173                            if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
18174                                if ( match ) {
18175
18176                                    // Don't consume trailing commas as valid
18177                                    soFar = soFar.slice( match[ 0 ].length ) || soFar;
18178                                }
18179                                groups.push( ( tokens = [] ) );
18180                            }
18181
18182                            matched = false;
18183
18184                            // Combinators
18185                            if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
18186                                matched = match.shift();
18187                                tokens.push( {
18188                                    value: matched,
18189
18190                                    // Cast descendant combinators to space
18191                                    type: match[ 0 ].replace( rtrimCSS, " " )
18192                                } );
18193                                soFar = soFar.slice( matched.length );
18194                            }
18195
18196                            // Filters
18197                            for ( type in Expr.filter ) {
18198                                if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
18199                                    ( match = preFilters[ type ]( match ) ) ) ) {
18200                                    matched = match.shift();
18201                                    tokens.push( {
18202                                        value: matched,
18203                                        type: type,
18204                                        matches: match
18205                                    } );
18206                                    soFar = soFar.slice( matched.length );
18207                                }
18208                            }
18209
18210                            if ( !matched ) {
18211                                break;
18212                            }
18213                        }
18214
18215                        // Return the length of the invalid excess
18216                        // if we're just parsing
18217                        // Otherwise, throw an error or return tokens
18218                        if ( parseOnly ) {
18219                            return soFar.length;
18220                        }
18221
18222                        return soFar ?
18223                            find.error( selector ) :
18224
18225                            // Cache the tokens
18226                            tokenCache( selector, groups ).slice( 0 );
18227                    }
18228
18229                    function toSelector( tokens ) {
18230                        var i = 0,
18231                            len = tokens.length,
18232                            selector = "";
18233                        for ( ; i < len; i++ ) {
18234                            selector += tokens[ i ].value;
18235                        }
18236                        return selector;
18237                    }
18238
18239                    function addCombinator( matcher, combinator, base ) {
18240                        var dir = combinator.dir,
18241                            skip = combinator.next,
18242                            key = skip || dir,
18243                            checkNonElements = base && key === "parentNode",
18244                            doneName = done++;
18245
18246                        return combinator.first ?
18247
18248                            // Check against closest ancestor/preceding element
18249                            function( elem, context, xml ) {
18250                                while ( ( elem = elem[ dir ] ) ) {
18251                                    if ( elem.nodeType === 1 || checkNonElements ) {
18252                                        return matcher( elem, context, xml );
18253                                    }
18254                                }
18255                                return false;
18256                            } :
18257
18258                            // Check against all ancestor/preceding elements
18259                            function( elem, context, xml ) {
18260                                var oldCache, outerCache,
18261                                    newCache = [ dirruns, doneName ];
18262
18263                                // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
18264                                if ( xml ) {
18265                                    while ( ( elem = elem[ dir ] ) ) {
18266                                        if ( elem.nodeType === 1 || checkNonElements ) {
18267                                            if ( matcher( elem, context, xml ) ) {
18268                                                return true;
18269                                            }
18270                                        }
18271                                    }
18272                                } else {
18273                                    while ( ( elem = elem[ dir ] ) ) {
18274                                        if ( elem.nodeType === 1 || checkNonElements ) {
18275                                            outerCache = elem[ expando ] || ( elem[ expando ] = {} );
18276
18277                                            if ( skip && nodeName( elem, skip ) ) {
18278                                                elem = elem[ dir ] || elem;
18279                                            } else if ( ( oldCache = outerCache[ key ] ) &&
18280                                                oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
18281
18282                                                // Assign to newCache so results back-propagate to previous elements
18283                                                return ( newCache[ 2 ] = oldCache[ 2 ] );
18284                                            } else {
18285
18286                                                // Reuse newcache so results back-propagate to previous elements
18287                                                outerCache[ key ] = newCache;
18288
18289                                                // A match means we're done; a fail means we have to keep checking
18290                                                if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
18291                                                    return true;
18292                                                }
18293                                            }
18294                                        }
18295                                    }
18296                                }
18297                                return false;
18298                            };
18299                    }
18300
18301                    function elementMatcher( matchers ) {
18302                        return matchers.length > 1 ?
18303                            function( elem, context, xml ) {
18304                                var i = matchers.length;
18305                                while ( i-- ) {
18306                                    if ( !matchers[ i ]( elem, context, xml ) ) {
18307                                        return false;
18308                                    }
18309                                }
18310                                return true;
18311                            } :
18312                            matchers[ 0 ];
18313                    }
18314
18315                    function multipleContexts( selector, contexts, results ) {
18316                        var i = 0,
18317                            len = contexts.length;
18318                        for ( ; i < len; i++ ) {
18319                            find( selector, contexts[ i ], results );
18320                        }
18321                        return results;
18322                    }
18323
18324                    function condense( unmatched, map, filter, context, xml ) {
18325                        var elem,
18326                            newUnmatched = [],
18327                            i = 0,
18328                            len = unmatched.length,
18329                            mapped = map != null;
18330
18331                        for ( ; i < len; i++ ) {
18332                            if ( ( elem = unmatched[ i ] ) ) {
18333                                if ( !filter || filter( elem, context, xml ) ) {
18334                                    newUnmatched.push( elem );
18335                                    if ( mapped ) {
18336                                        map.push( i );
18337                                    }
18338                                }
18339                            }
18340                        }
18341
18342                        return newUnmatched;
18343                    }
18344
18345                    function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
18346                        if ( postFilter && !postFilter[ expando ] ) {
18347                            postFilter = setMatcher( postFilter );
18348                        }
18349                        if ( postFinder && !postFinder[ expando ] ) {
18350                            postFinder = setMatcher( postFinder, postSelector );
18351                        }
18352                        return markFunction( function( seed, results, context, xml ) {
18353                            var temp, i, elem, matcherOut,
18354                                preMap = [],
18355                                postMap = [],
18356                                preexisting = results.length,
18357
18358                                // Get initial elements from seed or context
18359                                elems = seed ||
18360                                    multipleContexts( selector || "*",
18361                                        context.nodeType ? [ context ] : context, [] ),
18362
18363                                // Prefilter to get matcher input, preserving a map for seed-results synchronization
18364                                matcherIn = preFilter && ( seed || !selector ) ?
18365                                    condense( elems, preMap, preFilter, context, xml ) :
18366                                    elems;
18367
18368                            if ( matcher ) {
18369
18370                                // If we have a postFinder, or filtered seed, or non-seed postFilter
18371                                // or preexisting results,
18372                                matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
18373
18374                                    // ...intermediate processing is necessary
18375                                    [] :
18376
18377                                    // ...otherwise use results directly
18378                                    results;
18379
18380                                // Find primary matches
18381                                matcher( matcherIn, matcherOut, context, xml );
18382                            } else {
18383                                matcherOut = matcherIn;
18384                            }
18385
18386                            // Apply postFilter
18387                            if ( postFilter ) {
18388                                temp = condense( matcherOut, postMap );
18389                                postFilter( temp, [], context, xml );
18390
18391                                // Un-match failing elements by moving them back to matcherIn
18392                                i = temp.length;
18393                                while ( i-- ) {
18394                                    if ( ( elem = temp[ i ] ) ) {
18395                                        matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
18396                                    }
18397                                }
18398                            }
18399
18400                            if ( seed ) {
18401                                if ( postFinder || preFilter ) {
18402                                    if ( postFinder ) {
18403
18404                                        // Get the final matcherOut by condensing this intermediate into postFinder contexts
18405                                        temp = [];
18406                                        i = matcherOut.length;
18407                                        while ( i-- ) {
18408                                            if ( ( elem = matcherOut[ i ] ) ) {
18409
18410                                                // Restore matcherIn since elem is not yet a final match
18411                                                temp.push( ( matcherIn[ i ] = elem ) );
18412                                            }
18413                                        }
18414                                        postFinder( null, ( matcherOut = [] ), temp, xml );
18415                                    }
18416
18417                                    // Move matched elements from seed to results to keep them synchronized
18418                                    i = matcherOut.length;
18419                                    while ( i-- ) {
18420                                        if ( ( elem = matcherOut[ i ] ) &&
18421                                            ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
18422
18423                                            seed[ temp ] = !( results[ temp ] = elem );
18424                                        }
18425                                    }
18426                                }
18427
18428                                // Add elements to results, through postFinder if defined
18429                            } else {
18430                                matcherOut = condense(
18431                                    matcherOut === results ?
18432                                        matcherOut.splice( preexisting, matcherOut.length ) :
18433                                        matcherOut
18434                                );
18435                                if ( postFinder ) {
18436                                    postFinder( null, results, matcherOut, xml );
18437                                } else {
18438                                    push.apply( results, matcherOut );
18439                                }
18440                            }
18441                        } );
18442                    }
18443
18444                    function matcherFromTokens( tokens ) {
18445                        var checkContext, matcher, j,
18446                            len = tokens.length,
18447                            leadingRelative = Expr.relative[ tokens[ 0 ].type ],
18448                            implicitRelative = leadingRelative || Expr.relative[ " " ],
18449                            i = leadingRelative ? 1 : 0,
18450
18451                            // The foundational matcher ensures that elements are reachable from top-level context(s)
18452                            matchContext = addCombinator( function( elem ) {
18453                                return elem === checkContext;
18454                            }, implicitRelative, true ),
18455                            matchAnyContext = addCombinator( function( elem ) {
18456                                return indexOf.call( checkContext, elem ) > -1;
18457                            }, implicitRelative, true ),
18458                            matchers = [ function( elem, context, xml ) {
18459
18460                                // Support: IE 11+, Edge 17 - 18+
18461                                // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
18462                                // two documents; shallow comparisons work.
18463                                // eslint-disable-next-line eqeqeq
18464                                var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
18465                                    ( checkContext = context ).nodeType ?
18466                                        matchContext( elem, context, xml ) :
18467                                        matchAnyContext( elem, context, xml ) );
18468
18469                                // Avoid hanging onto element
18470                                // (see https://github.com/jquery/sizzle/issues/299)
18471                                checkContext = null;
18472                                return ret;
18473                            } ];
18474
18475                        for ( ; i < len; i++ ) {
18476                            if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
18477                                matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
18478                            } else {
18479                                matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
18480
18481                                // Return special upon seeing a positional matcher
18482                                if ( matcher[ expando ] ) {
18483
18484                                    // Find the next relative operator (if any) for proper handling
18485                                    j = ++i;
18486                                    for ( ; j < len; j++ ) {
18487                                        if ( Expr.relative[ tokens[ j ].type ] ) {
18488                                            break;
18489                                        }
18490                                    }
18491                                    return setMatcher(
18492                                        i > 1 && elementMatcher( matchers ),
18493                                        i > 1 && toSelector(
18494
18495                                            // If the preceding token was a descendant combinator, insert an implicit any-element `*`
18496                                            tokens.slice( 0, i - 1 )
18497                                                .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
18498                                        ).replace( rtrimCSS, "$1" ),
18499                                        matcher,
18500                                        i < j && matcherFromTokens( tokens.slice( i, j ) ),
18501                                        j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
18502                                        j < len && toSelector( tokens )
18503                                    );
18504                                }
18505                                matchers.push( matcher );
18506                            }
18507                        }
18508
18509                        return elementMatcher( matchers );
18510                    }
18511
18512                    function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
18513                        var bySet = setMatchers.length > 0,
18514                            byElement = elementMatchers.length > 0,
18515                            superMatcher = function( seed, context, xml, results, outermost ) {
18516                                var elem, j, matcher,
18517                                    matchedCount = 0,
18518                                    i = "0",
18519                                    unmatched = seed && [],
18520                                    setMatched = [],
18521                                    contextBackup = outermostContext,
18522
18523                                    // We must always have either seed elements or outermost context
18524                                    elems = seed || byElement && Expr.find.TAG( "*", outermost ),
18525
18526                                    // Use integer dirruns iff this is the outermost matcher
18527                                    dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
18528                                    len = elems.length;
18529
18530                                if ( outermost ) {
18531
18532                                    // Support: IE 11+, Edge 17 - 18+
18533                                    // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
18534                                    // two documents; shallow comparisons work.
18535                                    // eslint-disable-next-line eqeqeq
18536                                    outermostContext = context == document || context || outermost;
18537                                }
18538
18539                                // Add elements passing elementMatchers directly to results
18540                                // Support: iOS <=7 - 9 only
18541                                // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
18542                                // elements by id. (see trac-14142)
18543                                for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
18544                                    if ( byElement && elem ) {
18545                                        j = 0;
18546
18547                                        // Support: IE 11+, Edge 17 - 18+
18548                                        // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
18549                                        // two documents; shallow comparisons work.
18550                                        // eslint-disable-next-line eqeqeq
18551                                        if ( !context && elem.ownerDocument != document ) {
18552                                            setDocument( elem );
18553                                            xml = !documentIsHTML;
18554                                        }
18555                                        while ( ( matcher = elementMatchers[ j++ ] ) ) {
18556                                            if ( matcher( elem, context || document, xml ) ) {
18557                                                push.call( results, elem );
18558                                                break;
18559                                            }
18560                                        }
18561                                        if ( outermost ) {
18562                                            dirruns = dirrunsUnique;
18563                                        }
18564                                    }
18565
18566                                    // Track unmatched elements for set filters
18567                                    if ( bySet ) {
18568
18569                                        // They will have gone through all possible matchers
18570                                        if ( ( elem = !matcher && elem ) ) {
18571                                            matchedCount--;
18572                                        }
18573
18574                                        // Lengthen the array for every element, matched or not
18575                                        if ( seed ) {
18576                                            unmatched.push( elem );
18577                                        }
18578                                    }
18579                                }
18580
18581                                // `i` is now the count of elements visited above, and adding it to `matchedCount`
18582                                // makes the latter nonnegative.
18583                                matchedCount += i;
18584
18585                                // Apply set filters to unmatched elements
18586                                // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
18587                                // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
18588                                // no element matchers and no seed.
18589                                // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
18590                                // case, which will result in a "00" `matchedCount` that differs from `i` but is also
18591                                // numerically zero.
18592                                if ( bySet && i !== matchedCount ) {
18593                                    j = 0;
18594                                    while ( ( matcher = setMatchers[ j++ ] ) ) {
18595                                        matcher( unmatched, setMatched, context, xml );
18596                                    }
18597
18598                                    if ( seed ) {
18599
18600                                        // Reintegrate element matches to eliminate the need for sorting
18601                                        if ( matchedCount > 0 ) {
18602                                            while ( i-- ) {
18603                                                if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
18604                                                    setMatched[ i ] = pop.call( results );
18605                                                }
18606                                            }
18607                                        }
18608
18609                                        // Discard index placeholder values to get only actual matches
18610                                        setMatched = condense( setMatched );
18611                                    }
18612
18613                                    // Add matches to results
18614                                    push.apply( results, setMatched );
18615
18616                                    // Seedless set matches succeeding multiple successful matchers stipulate sorting
18617                                    if ( outermost && !seed && setMatched.length > 0 &&
18618                                        ( matchedCount + setMatchers.length ) > 1 ) {
18619
18620                                        jQuery.uniqueSort( results );
18621                                    }
18622                                }
18623
18624                                // Override manipulation of globals by nested matchers
18625                                if ( outermost ) {
18626                                    dirruns = dirrunsUnique;
18627                                    outermostContext = contextBackup;
18628                                }
18629
18630                                return unmatched;
18631                            };
18632
18633                        return bySet ?
18634                            markFunction( superMatcher ) :
18635                            superMatcher;
18636                    }
18637
18638                    function compile( selector, match /* Internal Use Only */ ) {
18639                        var i,
18640                            setMatchers = [],
18641                            elementMatchers = [],
18642                            cached = compilerCache[ selector + " " ];
18643
18644                        if ( !cached ) {
18645
18646                            // Generate a function of recursive functions that can be used to check each element
18647                            if ( !match ) {
18648                                match = tokenize( selector );
18649                            }
18650                            i = match.length;
18651                            while ( i-- ) {
18652                                cached = matcherFromTokens( match[ i ] );
18653                                if ( cached[ expando ] ) {
18654                                    setMatchers.push( cached );
18655                                } else {
18656                                    elementMatchers.push( cached );
18657                                }
18658                            }
18659
18660                            // Cache the compiled function
18661                            cached = compilerCache( selector,
18662                                matcherFromGroupMatchers( elementMatchers, setMatchers ) );
18663
18664                            // Save selector and tokenization
18665                            cached.selector = selector;
18666                        }
18667                        return cached;
18668                    }
18669
18670                    /**
18671                     * A low-level selection function that works with jQuery's compiled
18672                     *  selector functions
18673                     * @param {String|Function} selector A selector or a pre-compiled
18674                     *  selector function built with jQuery selector compile
18675                     * @param {Element} context
18676                     * @param {Array} [results]
18677                     * @param {Array} [seed] A set of elements to match against
18678                     */
18679                    function select( selector, context, results, seed ) {
18680                        var i, tokens, token, type, find,
18681                            compiled = typeof selector === "function" && selector,
18682                            match = !seed && tokenize( ( selector = compiled.selector || selector ) );
18683
18684                        results = results || [];
18685
18686                        // Try to minimize operations if there is only one selector in the list and no seed
18687                        // (the latter of which guarantees us context)
18688                        if ( match.length === 1 ) {
18689
18690                            // Reduce context if the leading compound selector is an ID
18691                            tokens = match[ 0 ] = match[ 0 ].slice( 0 );
18692                            if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
18693                                context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
18694
18695                                context = ( Expr.find.ID(
18696                                    token.matches[ 0 ].replace( runescape, funescape ),
18697                                    context
18698                                ) || [] )[ 0 ];
18699                                if ( !context ) {
18700                                    return results;
18701
18702                                    // Precompiled matchers will still verify ancestry, so step up a level
18703                                } else if ( compiled ) {
18704                                    context = context.parentNode;
18705                                }
18706
18707                                selector = selector.slice( tokens.shift().value.length );
18708                            }
18709
18710                            // Fetch a seed set for right-to-left matching
18711                            i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
18712                            while ( i-- ) {
18713                                token = tokens[ i ];
18714
18715                                // Abort if we hit a combinator
18716                                if ( Expr.relative[ ( type = token.type ) ] ) {
18717                                    break;
18718                                }
18719                                if ( ( find = Expr.find[ type ] ) ) {
18720
18721                                    // Search, expanding context for leading sibling combinators
18722                                    if ( ( seed = find(
18723                                        token.matches[ 0 ].replace( runescape, funescape ),
18724                                        rsibling.test( tokens[ 0 ].type ) &&
18725                                        testContext( context.parentNode ) || context
18726                                    ) ) ) {
18727
18728                                        // If seed is empty or no tokens remain, we can return early
18729                                        tokens.splice( i, 1 );
18730                                        selector = seed.length && toSelector( tokens );
18731                                        if ( !selector ) {
18732                                            push.apply( results, seed );
18733                                            return results;
18734                                        }
18735
18736                                        break;
18737                                    }
18738                                }
18739                            }
18740                        }
18741
18742                        // Compile and execute a filtering function if one is not provided
18743                        // Provide `match` to avoid retokenization if we modified the selector above
18744                        ( compiled || compile( selector, match ) )(
18745                            seed,
18746                            context,
18747                            !documentIsHTML,
18748                            results,
18749                            !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
18750                        );
18751                        return results;
18752                    }
18753
18754// One-time assignments
18755
18756// Support: Android <=4.0 - 4.1+
18757// Sort stability
18758                    support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
18759
18760// Initialize against the default document
18761                    setDocument();
18762
18763// Support: Android <=4.0 - 4.1+
18764// Detached nodes confoundingly follow *each other*
18765                    support.sortDetached = assert( function( el ) {
18766
18767                        // Should return 1, but returns 4 (following)
18768                        return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
18769                    } );
18770
18771                    jQuery.find = find;
18772
18773// Deprecated
18774                    jQuery.expr[ ":" ] = jQuery.expr.pseudos;
18775                    jQuery.unique = jQuery.uniqueSort;
18776
18777// These have always been private, but they used to be documented as part of
18778// Sizzle so let's maintain them for now for backwards compatibility purposes.
18779                    find.compile = compile;
18780                    find.select = select;
18781                    find.setDocument = setDocument;
18782                    find.tokenize = tokenize;
18783
18784                    find.escape = jQuery.escapeSelector;
18785                    find.getText = jQuery.text;
18786                    find.isXML = jQuery.isXMLDoc;
18787                    find.selectors = jQuery.expr;
18788                    find.support = jQuery.support;
18789                    find.uniqueSort = jQuery.uniqueSort;
18790
18791                    /* eslint-enable */
18792
18793                } )();
18794
18795
18796                var dir = function( elem, dir, until ) {
18797                    var matched = [],
18798                        truncate = until !== undefined;
18799
18800                    while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
18801                        if ( elem.nodeType === 1 ) {
18802                            if ( truncate && jQuery( elem ).is( until ) ) {
18803                                break;
18804                            }
18805                            matched.push( elem );
18806                        }
18807                    }
18808                    return matched;
18809                };
18810
18811
18812                var siblings = function( n, elem ) {
18813                    var matched = [];
18814
18815                    for ( ; n; n = n.nextSibling ) {
18816                        if ( n.nodeType === 1 && n !== elem ) {
18817                            matched.push( n );
18818                        }
18819                    }
18820
18821                    return matched;
18822                };
18823
18824
18825                var rneedsContext = jQuery.expr.match.needsContext;
18826
18827                var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
18828
18829
18830
18831// Implement the identical functionality for filter and not
18832                function winnow( elements, qualifier, not ) {
18833                    if ( isFunction( qualifier ) ) {
18834                        return jQuery.grep( elements, function( elem, i ) {
18835                            return !!qualifier.call( elem, i, elem ) !== not;
18836                        } );
18837                    }
18838
18839                    // Single element
18840                    if ( qualifier.nodeType ) {
18841                        return jQuery.grep( elements, function( elem ) {
18842                            return ( elem === qualifier ) !== not;
18843                        } );
18844                    }
18845
18846                    // Arraylike of elements (jQuery, arguments, Array)
18847                    if ( typeof qualifier !== "string" ) {
18848                        return jQuery.grep( elements, function( elem ) {
18849                            return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
18850                        } );
18851                    }
18852
18853                    // Filtered directly for both simple and complex selectors
18854                    return jQuery.filter( qualifier, elements, not );
18855                }
18856
18857                jQuery.filter = function( expr, elems, not ) {
18858                    var elem = elems[ 0 ];
18859
18860                    if ( not ) {
18861                        expr = ":not(" + expr + ")";
18862                    }
18863
18864                    if ( elems.length === 1 && elem.nodeType === 1 ) {
18865                        return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
18866                    }
18867
18868                    return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
18869                        return elem.nodeType === 1;
18870                    } ) );
18871                };
18872
18873                jQuery.fn.extend( {
18874                    find: function( selector ) {
18875                        var i, ret,
18876                            len = this.length,
18877                            self = this;
18878
18879                        if ( typeof selector !== "string" ) {
18880                            return this.pushStack( jQuery( selector ).filter( function() {
18881                                for ( i = 0; i < len; i++ ) {
18882                                    if ( jQuery.contains( self[ i ], this ) ) {
18883                                        return true;
18884                                    }
18885                                }
18886                            } ) );
18887                        }
18888
18889                        ret = this.pushStack( [] );
18890
18891                        for ( i = 0; i < len; i++ ) {
18892                            jQuery.find( selector, self[ i ], ret );
18893                        }
18894
18895                        return len > 1 ? jQuery.uniqueSort( ret ) : ret;
18896                    },
18897                    filter: function( selector ) {
18898                        return this.pushStack( winnow( this, selector || [], false ) );
18899                    },
18900                    not: function( selector ) {
18901                        return this.pushStack( winnow( this, selector || [], true ) );
18902                    },
18903                    is: function( selector ) {
18904                        return !!winnow(
18905                            this,
18906
18907                            // If this is a positional/relative selector, check membership in the returned set
18908                            // so $("p:first").is("p:last") won't return true for a doc with two "p".
18909                            typeof selector === "string" && rneedsContext.test( selector ) ?
18910                                jQuery( selector ) :
18911                                selector || [],
18912                            false
18913                        ).length;
18914                    }
18915                } );
18916
18917
18918// Initialize a jQuery object
18919
18920
18921// A central reference to the root jQuery(document)
18922                var rootjQuery,
18923
18924                    // A simple way to check for HTML strings
18925                    // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
18926                    // Strict HTML recognition (trac-11290: must start with <)
18927                    // Shortcut simple #id case for speed
18928                    rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
18929
18930                    init = jQuery.fn.init = function( selector, context, root ) {
18931                        var match, elem;
18932
18933                        // HANDLE: $(""), $(null), $(undefined), $(false)
18934                        if ( !selector ) {
18935                            return this;
18936                        }
18937
18938                        // Method init() accepts an alternate rootjQuery
18939                        // so migrate can support jQuery.sub (gh-2101)
18940                        root = root || rootjQuery;
18941
18942                        // Handle HTML strings
18943                        if ( typeof selector === "string" ) {
18944                            if ( selector[ 0 ] === "<" &&
18945                                selector[ selector.length - 1 ] === ">" &&
18946                                selector.length >= 3 ) {
18947
18948                                // Assume that strings that start and end with <> are HTML and skip the regex check
18949                                match = [ null, selector, null ];
18950
18951                            } else {
18952                                match = rquickExpr.exec( selector );
18953                            }
18954
18955                            // Match html or make sure no context is specified for #id
18956                            if ( match && ( match[ 1 ] || !context ) ) {
18957
18958                                // HANDLE: $(html) -> $(array)
18959                                if ( match[ 1 ] ) {
18960                                    context = context instanceof jQuery ? context[ 0 ] : context;
18961
18962                                    // Option to run scripts is true for back-compat
18963                                    // Intentionally let the error be thrown if parseHTML is not present
18964                                    jQuery.merge( this, jQuery.parseHTML(
18965                                        match[ 1 ],
18966                                        context && context.nodeType ? context.ownerDocument || context : document,
18967                                        true
18968                                    ) );
18969
18970                                    // HANDLE: $(html, props)
18971                                    if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
18972                                        for ( match in context ) {
18973
18974                                            // Properties of context are called as methods if possible
18975                                            if ( isFunction( this[ match ] ) ) {
18976                                                this[ match ]( context[ match ] );
18977
18978                                                // ...and otherwise set as attributes
18979                                            } else {
18980                                                this.attr( match, context[ match ] );
18981                                            }
18982                                        }
18983                                    }
18984
18985                                    return this;
18986
18987                                    // HANDLE: $(#id)
18988                                } else {
18989                                    elem = document.getElementById( match[ 2 ] );
18990
18991                                    if ( elem ) {
18992
18993                                        // Inject the element directly into the jQuery object
18994                                        this[ 0 ] = elem;
18995                                        this.length = 1;
18996                                    }
18997                                    return this;
18998                                }
18999
19000                                // HANDLE: $(expr, $(...))
19001                            } else if ( !context || context.jquery ) {
19002                                return ( context || root ).find( selector );
19003
19004                                // HANDLE: $(expr, context)
19005                                // (which is just equivalent to: $(context).find(expr)
19006                            } else {
19007                                return this.constructor( context ).find( selector );
19008                            }
19009
19010                            // HANDLE: $(DOMElement)
19011                        } else if ( selector.nodeType ) {
19012                            this[ 0 ] = selector;
19013                            this.length = 1;
19014                            return this;
19015
19016                            // HANDLE: $(function)
19017                            // Shortcut for document ready
19018                        } else if ( isFunction( selector ) ) {
19019                            return root.ready !== undefined ?
19020                                root.ready( selector ) :
19021
19022                                // Execute immediately if ready is not present
19023                                selector( jQuery );
19024                        }
19025
19026                        return jQuery.makeArray( selector, this );
19027                    };
19028
19029// Give the init function the jQuery prototype for later instantiation
19030                init.prototype = jQuery.fn;
19031
19032// Initialize central reference
19033                rootjQuery = jQuery( document );
19034
19035
19036                var rparentsprev = /^(?:parents|prev(?:Until|All))/,
19037
19038                    // Methods guaranteed to produce a unique set when starting from a unique set
19039                    guaranteedUnique = {
19040                        children: true,
19041                        contents: true,
19042                        next: true,
19043                        prev: true
19044                    };
19045
19046                jQuery.fn.extend( {
19047                    has: function( target ) {
19048                        var targets = jQuery( target, this ),
19049                            l = targets.length;
19050
19051                        return this.filter( function() {
19052                            var i = 0;
19053                            for ( ; i < l; i++ ) {
19054                                if ( jQuery.contains( this, targets[ i ] ) ) {
19055                                    return true;
19056                                }
19057                            }
19058                        } );
19059                    },
19060
19061                    closest: function( selectors, context ) {
19062                        var cur,
19063                            i = 0,
19064                            l = this.length,
19065                            matched = [],
19066                            targets = typeof selectors !== "string" && jQuery( selectors );
19067
19068                        // Positional selectors never match, since there's no _selection_ context
19069                        if ( !rneedsContext.test( selectors ) ) {
19070                            for ( ; i < l; i++ ) {
19071                                for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
19072
19073                                    // Always skip document fragments
19074                                    if ( cur.nodeType < 11 && ( targets ?
19075                                        targets.index( cur ) > -1 :
19076
19077                                        // Don't pass non-elements to jQuery#find
19078                                        cur.nodeType === 1 &&
19079                                        jQuery.find.matchesSelector( cur, selectors ) ) ) {
19080
19081                                        matched.push( cur );
19082                                        break;
19083                                    }
19084                                }
19085                            }
19086                        }
19087
19088                        return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
19089                    },
19090
19091                    // Determine the position of an element within the set
19092                    index: function( elem ) {
19093
19094                        // No argument, return index in parent
19095                        if ( !elem ) {
19096                            return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
19097                        }
19098
19099                        // Index in selector
19100                        if ( typeof elem === "string" ) {
19101                            return indexOf.call( jQuery( elem ), this[ 0 ] );
19102                        }
19103
19104                        // Locate the position of the desired element
19105                        return indexOf.call( this,
19106
19107                            // If it receives a jQuery object, the first element is used
19108                            elem.jquery ? elem[ 0 ] : elem
19109                        );
19110                    },
19111
19112                    add: function( selector, context ) {
19113                        return this.pushStack(
19114                            jQuery.uniqueSort(
19115                                jQuery.merge( this.get(), jQuery( selector, context ) )
19116                            )
19117                        );
19118                    },
19119
19120                    addBack: function( selector ) {
19121                        return this.add( selector == null ?
19122                            this.prevObject : this.prevObject.filter( selector )
19123                        );
19124                    }
19125                } );
19126
19127                function sibling( cur, dir ) {
19128                    while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
19129                    return cur;
19130                }
19131
19132                jQuery.each( {
19133                    parent: function( elem ) {
19134                        var parent = elem.parentNode;
19135                        return parent && parent.nodeType !== 11 ? parent : null;
19136                    },
19137                    parents: function( elem ) {
19138                        return dir( elem, "parentNode" );
19139                    },
19140                    parentsUntil: function( elem, _i, until ) {
19141                        return dir( elem, "parentNode", until );
19142                    },
19143                    next: function( elem ) {
19144                        return sibling( elem, "nextSibling" );
19145                    },
19146                    prev: function( elem ) {
19147                        return sibling( elem, "previousSibling" );
19148                    },
19149                    nextAll: function( elem ) {
19150                        return dir( elem, "nextSibling" );
19151                    },
19152                    prevAll: function( elem ) {
19153                        return dir( elem, "previousSibling" );
19154                    },
19155                    nextUntil: function( elem, _i, until ) {
19156                        return dir( elem, "nextSibling", until );
19157                    },
19158                    prevUntil: function( elem, _i, until ) {
19159                        return dir( elem, "previousSibling", until );
19160                    },
19161                    siblings: function( elem ) {
19162                        return siblings( ( elem.parentNode || {} ).firstChild, elem );
19163                    },
19164                    children: function( elem ) {
19165                        return siblings( elem.firstChild );
19166                    },
19167                    contents: function( elem ) {
19168                        if ( elem.contentDocument != null &&
19169
19170                            // Support: IE 11+
19171                            // <object> elements with no `data` attribute has an object
19172                            // `contentDocument` with a `null` prototype.
19173                            getProto( elem.contentDocument ) ) {
19174
19175                            return elem.contentDocument;
19176                        }
19177
19178                        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
19179                        // Treat the template element as a regular one in browsers that
19180                        // don't support it.
19181                        if ( nodeName( elem, "template" ) ) {
19182                            elem = elem.content || elem;
19183                        }
19184
19185                        return jQuery.merge( [], elem.childNodes );
19186                    }
19187                }, function( name, fn ) {
19188                    jQuery.fn[ name ] = function( until, selector ) {
19189                        var matched = jQuery.map( this, fn, until );
19190
19191                        if ( name.slice( -5 ) !== "Until" ) {
19192                            selector = until;
19193                        }
19194
19195                        if ( selector && typeof selector === "string" ) {
19196                            matched = jQuery.filter( selector, matched );
19197                        }
19198
19199                        if ( this.length > 1 ) {
19200
19201                            // Remove duplicates
19202                            if ( !guaranteedUnique[ name ] ) {
19203                                jQuery.uniqueSort( matched );
19204                            }
19205
19206                            // Reverse order for parents* and prev-derivatives
19207                            if ( rparentsprev.test( name ) ) {
19208                                matched.reverse();
19209                            }
19210                        }
19211
19212                        return this.pushStack( matched );
19213                    };
19214                } );
19215                var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
19216
19217
19218
19219// Convert String-formatted options into Object-formatted ones
19220                function createOptions( options ) {
19221                    var object = {};
19222                    jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
19223                        object[ flag ] = true;
19224                    } );
19225                    return object;
19226                }
19227
19228                /*
19229 * Create a callback list using the following parameters:
19230 *
19231 *	options: an optional list of space-separated options that will change how
19232 *			the callback list behaves or a more traditional option object
19233 *
19234 * By default a callback list will act like an event callback list and can be
19235 * "fired" multiple times.
19236 *
19237 * Possible options:
19238 *
19239 *	once:			will ensure the callback list can only be fired once (like a Deferred)
19240 *
19241 *	memory:			will keep track of previous values and will call any callback added
19242 *					after the list has been fired right away with the latest "memorized"
19243 *					values (like a Deferred)
19244 *
19245 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
19246 *
19247 *	stopOnFalse:	interrupt callings when a callback returns false
19248 *
19249 */
19250                jQuery.Callbacks = function( options ) {
19251
19252                    // Convert options from String-formatted to Object-formatted if needed
19253                    // (we check in cache first)
19254                    options = typeof options === "string" ?
19255                        createOptions( options ) :
19256                        jQuery.extend( {}, options );
19257
19258                    var // Flag to know if list is currently firing
19259                        firing,
19260
19261                        // Last fire value for non-forgettable lists
19262                        memory,
19263
19264                        // Flag to know if list was already fired
19265                        fired,
19266
19267                        // Flag to prevent firing
19268                        locked,
19269
19270                        // Actual callback list
19271                        list = [],
19272
19273                        // Queue of execution data for repeatable lists
19274                        queue = [],
19275
19276                        // Index of currently firing callback (modified by add/remove as needed)
19277                        firingIndex = -1,
19278
19279                        // Fire callbacks
19280                        fire = function() {
19281
19282                            // Enforce single-firing
19283                            locked = locked || options.once;
19284
19285                            // Execute callbacks for all pending executions,
19286                            // respecting firingIndex overrides and runtime changes
19287                            fired = firing = true;
19288                            for ( ; queue.length; firingIndex = -1 ) {
19289                                memory = queue.shift();
19290                                while ( ++firingIndex < list.length ) {
19291
19292                                    // Run callback and check for early termination
19293                                    if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
19294                                        options.stopOnFalse ) {
19295
19296                                        // Jump to end and forget the data so .add doesn't re-fire
19297                                        firingIndex = list.length;
19298                                        memory = false;
19299                                    }
19300                                }
19301                            }
19302
19303                            // Forget the data if we're done with it
19304                            if ( !options.memory ) {
19305                                memory = false;
19306                            }
19307
19308                            firing = false;
19309
19310                            // Clean up if we're done firing for good
19311                            if ( locked ) {
19312
19313                                // Keep an empty list if we have data for future add calls
19314                                if ( memory ) {
19315                                    list = [];
19316
19317                                    // Otherwise, this object is spent
19318                                } else {
19319                                    list = "";
19320                                }
19321                            }
19322                        },
19323
19324                        // Actual Callbacks object
19325                        self = {
19326
19327                            // Add a callback or a collection of callbacks to the list
19328                            add: function() {
19329                                if ( list ) {
19330
19331                                    // If we have memory from a past run, we should fire after adding
19332                                    if ( memory && !firing ) {
19333                                        firingIndex = list.length - 1;
19334                                        queue.push( memory );
19335                                    }
19336
19337                                    ( function add( args ) {
19338                                        jQuery.each( args, function( _, arg ) {
19339                                            if ( isFunction( arg ) ) {
19340                                                if ( !options.unique || !self.has( arg ) ) {
19341                                                    list.push( arg );
19342                                                }
19343                                            } else if ( arg && arg.length && toType( arg ) !== "string" ) {
19344
19345                                                // Inspect recursively
19346                                                add( arg );
19347                                            }
19348                                        } );
19349                                    } )( arguments );
19350
19351                                    if ( memory && !firing ) {
19352                                        fire();
19353                                    }
19354                                }
19355                                return this;
19356                            },
19357
19358                            // Remove a callback from the list
19359                            remove: function() {
19360                                jQuery.each( arguments, function( _, arg ) {
19361                                    var index;
19362                                    while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
19363                                        list.splice( index, 1 );
19364
19365                                        // Handle firing indexes
19366                                        if ( index <= firingIndex ) {
19367                                            firingIndex--;
19368                                        }
19369                                    }
19370                                } );
19371                                return this;
19372                            },
19373
19374                            // Check if a given callback is in the list.
19375                            // If no argument is given, return whether or not list has callbacks attached.
19376                            has: function( fn ) {
19377                                return fn ?
19378                                    jQuery.inArray( fn, list ) > -1 :
19379                                    list.length > 0;
19380                            },
19381
19382                            // Remove all callbacks from the list
19383                            empty: function() {
19384                                if ( list ) {
19385                                    list = [];
19386                                }
19387                                return this;
19388                            },
19389
19390                            // Disable .fire and .add
19391                            // Abort any current/pending executions
19392                            // Clear all callbacks and values
19393                            disable: function() {
19394                                locked = queue = [];
19395                                list = memory = "";
19396                                return this;
19397                            },
19398                            disabled: function() {
19399                                return !list;
19400                            },
19401
19402                            // Disable .fire
19403                            // Also disable .add unless we have memory (since it would have no effect)
19404                            // Abort any pending executions
19405                            lock: function() {
19406                                locked = queue = [];
19407                                if ( !memory && !firing ) {
19408                                    list = memory = "";
19409                                }
19410                                return this;
19411                            },
19412                            locked: function() {
19413                                return !!locked;
19414                            },
19415
19416                            // Call all callbacks with the given context and arguments
19417                            fireWith: function( context, args ) {
19418                                if ( !locked ) {
19419                                    args = args || [];
19420                                    args = [ context, args.slice ? args.slice() : args ];
19421                                    queue.push( args );
19422                                    if ( !firing ) {
19423                                        fire();
19424                                    }
19425                                }
19426                                return this;
19427                            },
19428
19429                            // Call all the callbacks with the given arguments
19430                            fire: function() {
19431                                self.fireWith( this, arguments );
19432                                return this;
19433                            },
19434
19435                            // To know if the callbacks have already been called at least once
19436                            fired: function() {
19437                                return !!fired;
19438                            }
19439                        };
19440
19441                    return self;
19442                };
19443
19444
19445                function Identity( v ) {
19446                    return v;
19447                }
19448                function Thrower( ex ) {
19449                    throw ex;
19450                }
19451
19452                function adoptValue( value, resolve, reject, noValue ) {
19453                    var method;
19454
19455                    try {
19456
19457                        // Check for promise aspect first to privilege synchronous behavior
19458                        if ( value && isFunction( ( method = value.promise ) ) ) {
19459                            method.call( value ).done( resolve ).fail( reject );
19460
19461                            // Other thenables
19462                        } else if ( value && isFunction( ( method = value.then ) ) ) {
19463                            method.call( value, resolve, reject );
19464
19465                            // Other non-thenables
19466                        } else {
19467
19468                            // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
19469                            // * false: [ value ].slice( 0 ) => resolve( value )
19470                            // * true: [ value ].slice( 1 ) => resolve()
19471                            resolve.apply( undefined, [ value ].slice( noValue ) );
19472                        }
19473
19474                        // For Promises/A+, convert exceptions into rejections
19475                        // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
19476                        // Deferred#then to conditionally suppress rejection.
19477                    } catch ( value ) {
19478
19479                        // Support: Android 4.0 only
19480                        // Strict mode functions invoked without .call/.apply get global-object context
19481                        reject.apply( undefined, [ value ] );
19482                    }
19483                }
19484
19485                jQuery.extend( {
19486
19487                    Deferred: function( func ) {
19488                        var tuples = [
19489
19490                                // action, add listener, callbacks,
19491                                // ... .then handlers, argument index, [final state]
19492                                [ "notify", "progress", jQuery.Callbacks( "memory" ),
19493                                    jQuery.Callbacks( "memory" ), 2 ],
19494                                [ "resolve", "done", jQuery.Callbacks( "once memory" ),
19495                                    jQuery.Callbacks( "once memory" ), 0, "resolved" ],
19496                                [ "reject", "fail", jQuery.Callbacks( "once memory" ),
19497                                    jQuery.Callbacks( "once memory" ), 1, "rejected" ]
19498                            ],
19499                            state = "pending",
19500                            promise = {
19501                                state: function() {
19502                                    return state;
19503                                },
19504                                always: function() {
19505                                    deferred.done( arguments ).fail( arguments );
19506                                    return this;
19507                                },
19508                                "catch": function( fn ) {
19509                                    return promise.then( null, fn );
19510                                },
19511
19512                                // Keep pipe for back-compat
19513                                pipe: function( /* fnDone, fnFail, fnProgress */ ) {
19514                                    var fns = arguments;
19515
19516                                    return jQuery.Deferred( function( newDefer ) {
19517                                        jQuery.each( tuples, function( _i, tuple ) {
19518
19519                                            // Map tuples (progress, done, fail) to arguments (done, fail, progress)
19520                                            var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
19521
19522                                            // deferred.progress(function() { bind to newDefer or newDefer.notify })
19523                                            // deferred.done(function() { bind to newDefer or newDefer.resolve })
19524                                            // deferred.fail(function() { bind to newDefer or newDefer.reject })
19525                                            deferred[ tuple[ 1 ] ]( function() {
19526                                                var returned = fn && fn.apply( this, arguments );
19527                                                if ( returned && isFunction( returned.promise ) ) {
19528                                                    returned.promise()
19529                                                        .progress( newDefer.notify )
19530                                                        .done( newDefer.resolve )
19531                                                        .fail( newDefer.reject );
19532                                                } else {
19533                                                    newDefer[ tuple[ 0 ] + "With" ](
19534                                                        this,
19535                                                        fn ? [ returned ] : arguments
19536                                                    );
19537                                                }
19538                                            } );
19539                                        } );
19540                                        fns = null;
19541                                    } ).promise();
19542                                },
19543                                then: function( onFulfilled, onRejected, onProgress ) {
19544                                    var maxDepth = 0;
19545                                    function resolve( depth, deferred, handler, special ) {
19546                                        return function() {
19547                                            var that = this,
19548                                                args = arguments,
19549                                                mightThrow = function() {
19550                                                    var returned, then;
19551
19552                                                    // Support: Promises/A+ section 2.3.3.3.3
19553                                                    // https://promisesaplus.com/#point-59
19554                                                    // Ignore double-resolution attempts
19555                                                    if ( depth < maxDepth ) {
19556                                                        return;
19557                                                    }
19558
19559                                                    returned = handler.apply( that, args );
19560
19561                                                    // Support: Promises/A+ section 2.3.1
19562                                                    // https://promisesaplus.com/#point-48
19563                                                    if ( returned === deferred.promise() ) {
19564                                                        throw new TypeError( "Thenable self-resolution" );
19565                                                    }
19566
19567                                                    // Support: Promises/A+ sections 2.3.3.1, 3.5
19568                                                    // https://promisesaplus.com/#point-54
19569                                                    // https://promisesaplus.com/#point-75
19570                                                    // Retrieve `then` only once
19571                                                    then = returned &&
19572
19573                                                        // Support: Promises/A+ section 2.3.4
19574                                                        // https://promisesaplus.com/#point-64
19575                                                        // Only check objects and functions for thenability
19576                                                        ( typeof returned === "object" ||
19577                                                            typeof returned === "function" ) &&
19578                                                        returned.then;
19579
19580                                                    // Handle a returned thenable
19581                                                    if ( isFunction( then ) ) {
19582
19583                                                        // Special processors (notify) just wait for resolution
19584                                                        if ( special ) {
19585                                                            then.call(
19586                                                                returned,
19587                                                                resolve( maxDepth, deferred, Identity, special ),
19588                                                                resolve( maxDepth, deferred, Thrower, special )
19589                                                            );
19590
19591                                                            // Normal processors (resolve) also hook into progress
19592                                                        } else {
19593
19594                                                            // ...and disregard older resolution values
19595                                                            maxDepth++;
19596
19597                                                            then.call(
19598                                                                returned,
19599                                                                resolve( maxDepth, deferred, Identity, special ),
19600                                                                resolve( maxDepth, deferred, Thrower, special ),
19601                                                                resolve( maxDepth, deferred, Identity,
19602                                                                    deferred.notifyWith )
19603                                                            );
19604                                                        }
19605
19606                                                        // Handle all other returned values
19607                                                    } else {
19608
19609                                                        // Only substitute handlers pass on context
19610                                                        // and multiple values (non-spec behavior)
19611                                                        if ( handler !== Identity ) {
19612                                                            that = undefined;
19613                                                            args = [ returned ];
19614                                                        }
19615
19616                                                        // Process the value(s)
19617                                                        // Default process is resolve
19618                                                        ( special || deferred.resolveWith )( that, args );
19619                                                    }
19620                                                },
19621
19622                                                // Only normal processors (resolve) catch and reject exceptions
19623                                                process = special ?
19624                                                    mightThrow :
19625                                                    function() {
19626                                                        try {
19627                                                            mightThrow();
19628                                                        } catch ( e ) {
19629
19630                                                            if ( jQuery.Deferred.exceptionHook ) {
19631                                                                jQuery.Deferred.exceptionHook( e,
19632                                                                    process.error );
19633                                                            }
19634
19635                                                            // Support: Promises/A+ section 2.3.3.3.4.1
19636                                                            // https://promisesaplus.com/#point-61
19637                                                            // Ignore post-resolution exceptions
19638                                                            if ( depth + 1 >= maxDepth ) {
19639
19640                                                                // Only substitute handlers pass on context
19641                                                                // and multiple values (non-spec behavior)
19642                                                                if ( handler !== Thrower ) {
19643                                                                    that = undefined;
19644                                                                    args = [ e ];
19645                                                                }
19646
19647                                                                deferred.rejectWith( that, args );
19648                                                            }
19649                                                        }
19650                                                    };
19651
19652                                            // Support: Promises/A+ section 2.3.3.3.1
19653                                            // https://promisesaplus.com/#point-57
19654                                            // Re-resolve promises immediately to dodge false rejection from
19655                                            // subsequent errors
19656                                            if ( depth ) {
19657                                                process();
19658                                            } else {
19659
19660                                                // Call an optional hook to record the error, in case of exception
19661                                                // since it's otherwise lost when execution goes async
19662                                                if ( jQuery.Deferred.getErrorHook ) {
19663                                                    process.error = jQuery.Deferred.getErrorHook();
19664
19665                                                    // The deprecated alias of the above. While the name suggests
19666                                                    // returning the stack, not an error instance, jQuery just passes
19667                                                    // it directly to `console.warn` so both will work; an instance
19668                                                    // just better cooperates with source maps.
19669                                                } else if ( jQuery.Deferred.getStackHook ) {
19670                                                    process.error = jQuery.Deferred.getStackHook();
19671                                                }
19672                                                window.setTimeout( process );
19673                                            }
19674                                        };
19675                                    }
19676
19677                                    return jQuery.Deferred( function( newDefer ) {
19678
19679                                        // progress_handlers.add( ... )
19680                                        tuples[ 0 ][ 3 ].add(
19681                                            resolve(
19682                                                0,
19683                                                newDefer,
19684                                                isFunction( onProgress ) ?
19685                                                    onProgress :
19686                                                    Identity,
19687                                                newDefer.notifyWith
19688                                            )
19689                                        );
19690
19691                                        // fulfilled_handlers.add( ... )
19692                                        tuples[ 1 ][ 3 ].add(
19693                                            resolve(
19694                                                0,
19695                                                newDefer,
19696                                                isFunction( onFulfilled ) ?
19697                                                    onFulfilled :
19698                                                    Identity
19699                                            )
19700                                        );
19701
19702                                        // rejected_handlers.add( ... )
19703                                        tuples[ 2 ][ 3 ].add(
19704                                            resolve(
19705                                                0,
19706                                                newDefer,
19707                                                isFunction( onRejected ) ?
19708                                                    onRejected :
19709                                                    Thrower
19710                                            )
19711                                        );
19712                                    } ).promise();
19713                                },
19714
19715                                // Get a promise for this deferred
19716                                // If obj is provided, the promise aspect is added to the object
19717                                promise: function( obj ) {
19718                                    return obj != null ? jQuery.extend( obj, promise ) : promise;
19719                                }
19720                            },
19721                            deferred = {};
19722
19723                        // Add list-specific methods
19724                        jQuery.each( tuples, function( i, tuple ) {
19725                            var list = tuple[ 2 ],
19726                                stateString = tuple[ 5 ];
19727
19728                            // promise.progress = list.add
19729                            // promise.done = list.add
19730                            // promise.fail = list.add
19731                            promise[ tuple[ 1 ] ] = list.add;
19732
19733                            // Handle state
19734                            if ( stateString ) {
19735                                list.add(
19736                                    function() {
19737
19738                                        // state = "resolved" (i.e., fulfilled)
19739                                        // state = "rejected"
19740                                        state = stateString;
19741                                    },
19742
19743                                    // rejected_callbacks.disable
19744                                    // fulfilled_callbacks.disable
19745                                    tuples[ 3 - i ][ 2 ].disable,
19746
19747                                    // rejected_handlers.disable
19748                                    // fulfilled_handlers.disable
19749                                    tuples[ 3 - i ][ 3 ].disable,
19750
19751                                    // progress_callbacks.lock
19752                                    tuples[ 0 ][ 2 ].lock,
19753
19754                                    // progress_handlers.lock
19755                                    tuples[ 0 ][ 3 ].lock
19756                                );
19757                            }
19758
19759                            // progress_handlers.fire
19760                            // fulfilled_handlers.fire
19761                            // rejected_handlers.fire
19762                            list.add( tuple[ 3 ].fire );
19763
19764                            // deferred.notify = function() { deferred.notifyWith(...) }
19765                            // deferred.resolve = function() { deferred.resolveWith(...) }
19766                            // deferred.reject = function() { deferred.rejectWith(...) }
19767                            deferred[ tuple[ 0 ] ] = function() {
19768                                deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
19769                                return this;
19770                            };
19771
19772                            // deferred.notifyWith = list.fireWith
19773                            // deferred.resolveWith = list.fireWith
19774                            // deferred.rejectWith = list.fireWith
19775                            deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
19776                        } );
19777
19778                        // Make the deferred a promise
19779                        promise.promise( deferred );
19780
19781                        // Call given func if any
19782                        if ( func ) {
19783                            func.call( deferred, deferred );
19784                        }
19785
19786                        // All done!
19787                        return deferred;
19788                    },
19789
19790                    // Deferred helper
19791                    when: function( singleValue ) {
19792                        var
19793
19794                            // count of uncompleted subordinates
19795                            remaining = arguments.length,
19796
19797                            // count of unprocessed arguments
19798                            i = remaining,
19799
19800                            // subordinate fulfillment data
19801                            resolveContexts = Array( i ),
19802                            resolveValues = slice.call( arguments ),
19803
19804                            // the primary Deferred
19805                            primary = jQuery.Deferred(),
19806
19807                            // subordinate callback factory
19808                            updateFunc = function( i ) {
19809                                return function( value ) {
19810                                    resolveContexts[ i ] = this;
19811                                    resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
19812                                    if ( !( --remaining ) ) {
19813                                        primary.resolveWith( resolveContexts, resolveValues );
19814                                    }
19815                                };
19816                            };
19817
19818                        // Single- and empty arguments are adopted like Promise.resolve
19819                        if ( remaining <= 1 ) {
19820                            adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
19821                                !remaining );
19822
19823                            // Use .then() to unwrap secondary thenables (cf. gh-3000)
19824                            if ( primary.state() === "pending" ||
19825                                isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
19826
19827                                return primary.then();
19828                            }
19829                        }
19830
19831                        // Multiple arguments are aggregated like Promise.all array elements
19832                        while ( i-- ) {
19833                            adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
19834                        }
19835
19836                        return primary.promise();
19837                    }
19838                } );
19839
19840
19841// These usually indicate a programmer mistake during development,
19842// warn about them ASAP rather than swallowing them by default.
19843                var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
19844
19845// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
19846// captured before the async barrier to get the original error cause
19847// which may otherwise be hidden.
19848                jQuery.Deferred.exceptionHook = function( error, asyncError ) {
19849
19850                    // Support: IE 8 - 9 only
19851                    // Console exists when dev tools are open, which can happen at any time
19852                    if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
19853                        window.console.warn( "jQuery.Deferred exception: " + error.message,
19854                            error.stack, asyncError );
19855                    }
19856                };
19857
19858
19859
19860
19861                jQuery.readyException = function( error ) {
19862                    window.setTimeout( function() {
19863                        throw error;
19864                    } );
19865                };
19866
19867
19868
19869
19870// The deferred used on DOM ready
19871                var readyList = jQuery.Deferred();
19872
19873                jQuery.fn.ready = function( fn ) {
19874
19875                    readyList
19876                        .then( fn )
19877
19878                        // Wrap jQuery.readyException in a function so that the lookup
19879                        // happens at the time of error handling instead of callback
19880                        // registration.
19881                        .catch( function( error ) {
19882                            jQuery.readyException( error );
19883                        } );
19884
19885                    return this;
19886                };
19887
19888                jQuery.extend( {
19889
19890                    // Is the DOM ready to be used? Set to true once it occurs.
19891                    isReady: false,
19892
19893                    // A counter to track how many items to wait for before
19894                    // the ready event fires. See trac-6781
19895                    readyWait: 1,
19896
19897                    // Handle when the DOM is ready
19898                    ready: function( wait ) {
19899
19900                        // Abort if there are pending holds or we're already ready
19901                        if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
19902                            return;
19903                        }
19904
19905                        // Remember that the DOM is ready
19906                        jQuery.isReady = true;
19907
19908                        // If a normal DOM Ready event fired, decrement, and wait if need be
19909                        if ( wait !== true && --jQuery.readyWait > 0 ) {
19910                            return;
19911                        }
19912
19913                        // If there are functions bound, to execute
19914                        readyList.resolveWith( document, [ jQuery ] );
19915                    }
19916                } );
19917
19918                jQuery.ready.then = readyList.then;
19919
19920// The ready event handler and self cleanup method
19921                function completed() {
19922                    document.removeEventListener( "DOMContentLoaded", completed );
19923                    window.removeEventListener( "load", completed );
19924                    jQuery.ready();
19925                }
19926
19927// Catch cases where $(document).ready() is called
19928// after the browser event has already occurred.
19929// Support: IE <=9 - 10 only
19930// Older IE sometimes signals "interactive" too soon
19931                if ( document.readyState === "complete" ||
19932                    ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
19933
19934                    // Handle it asynchronously to allow scripts the opportunity to delay ready
19935                    window.setTimeout( jQuery.ready );
19936
19937                } else {
19938
19939                    // Use the handy event callback
19940                    document.addEventListener( "DOMContentLoaded", completed );
19941
19942                    // A fallback to window.onload, that will always work
19943                    window.addEventListener( "load", completed );
19944                }
19945
19946
19947
19948
19949// Multifunctional method to get and set values of a collection
19950// The value/s can optionally be executed if it's a function
19951                var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
19952                    var i = 0,
19953                        len = elems.length,
19954                        bulk = key == null;
19955
19956                    // Sets many values
19957                    if ( toType( key ) === "object" ) {
19958                        chainable = true;
19959                        for ( i in key ) {
19960                            access( elems, fn, i, key[ i ], true, emptyGet, raw );
19961                        }
19962
19963                        // Sets one value
19964                    } else if ( value !== undefined ) {
19965                        chainable = true;
19966
19967                        if ( !isFunction( value ) ) {
19968                            raw = true;
19969                        }
19970
19971                        if ( bulk ) {
19972
19973                            // Bulk operations run against the entire set
19974                            if ( raw ) {
19975                                fn.call( elems, value );
19976                                fn = null;
19977
19978                                // ...except when executing function values
19979                            } else {
19980                                bulk = fn;
19981                                fn = function( elem, _key, value ) {
19982                                    return bulk.call( jQuery( elem ), value );
19983                                };
19984                            }
19985                        }
19986
19987                        if ( fn ) {
19988                            for ( ; i < len; i++ ) {
19989                                fn(
19990                                    elems[ i ], key, raw ?
19991                                        value :
19992                                        value.call( elems[ i ], i, fn( elems[ i ], key ) )
19993                                );
19994                            }
19995                        }
19996                    }
19997
19998                    if ( chainable ) {
19999                        return elems;
20000                    }
20001
20002                    // Gets
20003                    if ( bulk ) {
20004                        return fn.call( elems );
20005                    }
20006
20007                    return len ? fn( elems[ 0 ], key ) : emptyGet;
20008                };
20009
20010
20011// Matches dashed string for camelizing
20012                var rmsPrefix = /^-ms-/,
20013                    rdashAlpha = /-([a-z])/g;
20014
20015// Used by camelCase as callback to replace()
20016                function fcamelCase( _all, letter ) {
20017                    return letter.toUpperCase();
20018                }
20019
20020// Convert dashed to camelCase; used by the css and data modules
20021// Support: IE <=9 - 11, Edge 12 - 15
20022// Microsoft forgot to hump their vendor prefix (trac-9572)
20023                function camelCase( string ) {
20024                    return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
20025                }
20026                var acceptData = function( owner ) {
20027
20028                    // Accepts only:
20029                    //  - Node
20030                    //    - Node.ELEMENT_NODE
20031                    //    - Node.DOCUMENT_NODE
20032                    //  - Object
20033                    //    - Any
20034                    return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
20035                };
20036
20037
20038
20039
20040                function Data() {
20041                    this.expando = jQuery.expando + Data.uid++;
20042                }
20043
20044                Data.uid = 1;
20045
20046                Data.prototype = {
20047
20048                    cache: function( owner ) {
20049
20050                        // Check if the owner object already has a cache
20051                        var value = owner[ this.expando ];
20052
20053                        // If not, create one
20054                        if ( !value ) {
20055                            value = {};
20056
20057                            // We can accept data for non-element nodes in modern browsers,
20058                            // but we should not, see trac-8335.
20059                            // Always return an empty object.
20060                            if ( acceptData( owner ) ) {
20061
20062                                // If it is a node unlikely to be stringify-ed or looped over
20063                                // use plain assignment
20064                                if ( owner.nodeType ) {
20065                                    owner[ this.expando ] = value;
20066
20067                                    // Otherwise secure it in a non-enumerable property
20068                                    // configurable must be true to allow the property to be
20069                                    // deleted when data is removed
20070                                } else {
20071                                    Object.defineProperty( owner, this.expando, {
20072                                        value: value,
20073                                        configurable: true
20074                                    } );
20075                                }
20076                            }
20077                        }
20078
20079                        return value;
20080                    },
20081                    set: function( owner, data, value ) {
20082                        var prop,
20083                            cache = this.cache( owner );
20084
20085                        // Handle: [ owner, key, value ] args
20086                        // Always use camelCase key (gh-2257)
20087                        if ( typeof data === "string" ) {
20088                            cache[ camelCase( data ) ] = value;
20089
20090                            // Handle: [ owner, { properties } ] args
20091                        } else {
20092
20093                            // Copy the properties one-by-one to the cache object
20094                            for ( prop in data ) {
20095                                cache[ camelCase( prop ) ] = data[ prop ];
20096                            }
20097                        }
20098                        return cache;
20099                    },
20100                    get: function( owner, key ) {
20101                        return key === undefined ?
20102                            this.cache( owner ) :
20103
20104                            // Always use camelCase key (gh-2257)
20105                            owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
20106                    },
20107                    access: function( owner, key, value ) {
20108
20109                        // In cases where either:
20110                        //
20111                        //   1. No key was specified
20112                        //   2. A string key was specified, but no value provided
20113                        //
20114                        // Take the "read" path and allow the get method to determine
20115                        // which value to return, respectively either:
20116                        //
20117                        //   1. The entire cache object
20118                        //   2. The data stored at the key
20119                        //
20120                        if ( key === undefined ||
20121                            ( ( key && typeof key === "string" ) && value === undefined ) ) {
20122
20123                            return this.get( owner, key );
20124                        }
20125
20126                        // When the key is not a string, or both a key and value
20127                        // are specified, set or extend (existing objects) with either:
20128                        //
20129                        //   1. An object of properties
20130                        //   2. A key and value
20131                        //
20132                        this.set( owner, key, value );
20133
20134                        // Since the "set" path can have two possible entry points
20135                        // return the expected data based on which path was taken[*]
20136                        return value !== undefined ? value : key;
20137                    },
20138                    remove: function( owner, key ) {
20139                        var i,
20140                            cache = owner[ this.expando ];
20141
20142                        if ( cache === undefined ) {
20143                            return;
20144                        }
20145
20146                        if ( key !== undefined ) {
20147
20148                            // Support array or space separated string of keys
20149                            if ( Array.isArray( key ) ) {
20150
20151                                // If key is an array of keys...
20152                                // We always set camelCase keys, so remove that.
20153                                key = key.map( camelCase );
20154                            } else {
20155                                key = camelCase( key );
20156
20157                                // If a key with the spaces exists, use it.
20158                                // Otherwise, create an array by matching non-whitespace
20159                                key = key in cache ?
20160                                    [ key ] :
20161                                    ( key.match( rnothtmlwhite ) || [] );
20162                            }
20163
20164                            i = key.length;
20165
20166                            while ( i-- ) {
20167                                delete cache[ key[ i ] ];
20168                            }
20169                        }
20170
20171                        // Remove the expando if there's no more data
20172                        if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
20173
20174                            // Support: Chrome <=35 - 45
20175                            // Webkit & Blink performance suffers when deleting properties
20176                            // from DOM nodes, so set to undefined instead
20177                            // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
20178                            if ( owner.nodeType ) {
20179                                owner[ this.expando ] = undefined;
20180                            } else {
20181                                delete owner[ this.expando ];
20182                            }
20183                        }
20184                    },
20185                    hasData: function( owner ) {
20186                        var cache = owner[ this.expando ];
20187                        return cache !== undefined && !jQuery.isEmptyObject( cache );
20188                    }
20189                };
20190                var dataPriv = new Data();
20191
20192                var dataUser = new Data();
20193
20194
20195
20196//	Implementation Summary
20197//
20198//	1. Enforce API surface and semantic compatibility with 1.9.x branch
20199//	2. Improve the module's maintainability by reducing the storage
20200//		paths to a single mechanism.
20201//	3. Use the same single mechanism to support "private" and "user" data.
20202//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
20203//	5. Avoid exposing implementation details on user objects (eg. expando properties)
20204//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
20205
20206                var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
20207                    rmultiDash = /[A-Z]/g;
20208
20209                function getData( data ) {
20210                    if ( data === "true" ) {
20211                        return true;
20212                    }
20213
20214                    if ( data === "false" ) {
20215                        return false;
20216                    }
20217
20218                    if ( data === "null" ) {
20219                        return null;
20220                    }
20221
20222                    // Only convert to a number if it doesn't change the string
20223                    if ( data === +data + "" ) {
20224                        return +data;
20225                    }
20226
20227                    if ( rbrace.test( data ) ) {
20228                        return JSON.parse( data );
20229                    }
20230
20231                    return data;
20232                }
20233
20234                function dataAttr( elem, key, data ) {
20235                    var name;
20236
20237                    // If nothing was found internally, try to fetch any
20238                    // data from the HTML5 data-* attribute
20239                    if ( data === undefined && elem.nodeType === 1 ) {
20240                        name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
20241                        data = elem.getAttribute( name );
20242
20243                        if ( typeof data === "string" ) {
20244                            try {
20245                                data = getData( data );
20246                            } catch ( e ) {}
20247
20248                            // Make sure we set the data so it isn't changed later
20249                            dataUser.set( elem, key, data );
20250                        } else {
20251                            data = undefined;
20252                        }
20253                    }
20254                    return data;
20255                }
20256
20257                jQuery.extend( {
20258                    hasData: function( elem ) {
20259                        return dataUser.hasData( elem ) || dataPriv.hasData( elem );
20260                    },
20261
20262                    data: function( elem, name, data ) {
20263                        return dataUser.access( elem, name, data );
20264                    },
20265
20266                    removeData: function( elem, name ) {
20267                        dataUser.remove( elem, name );
20268                    },
20269
20270                    // TODO: Now that all calls to _data and _removeData have been replaced
20271                    // with direct calls to dataPriv methods, these can be deprecated.
20272                    _data: function( elem, name, data ) {
20273                        return dataPriv.access( elem, name, data );
20274                    },
20275
20276                    _removeData: function( elem, name ) {
20277                        dataPriv.remove( elem, name );
20278                    }
20279                } );
20280
20281                jQuery.fn.extend( {
20282                    data: function( key, value ) {
20283                        var i, name, data,
20284                            elem = this[ 0 ],
20285                            attrs = elem && elem.attributes;
20286
20287                        // Gets all values
20288                        if ( key === undefined ) {
20289                            if ( this.length ) {
20290                                data = dataUser.get( elem );
20291
20292                                if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
20293                                    i = attrs.length;
20294                                    while ( i-- ) {
20295
20296                                        // Support: IE 11 only
20297                                        // The attrs elements can be null (trac-14894)
20298                                        if ( attrs[ i ] ) {
20299                                            name = attrs[ i ].name;
20300                                            if ( name.indexOf( "data-" ) === 0 ) {
20301                                                name = camelCase( name.slice( 5 ) );
20302                                                dataAttr( elem, name, data[ name ] );
20303                                            }
20304                                        }
20305                                    }
20306                                    dataPriv.set( elem, "hasDataAttrs", true );
20307                                }
20308                            }
20309
20310                            return data;
20311                        }
20312
20313                        // Sets multiple values
20314                        if ( typeof key === "object" ) {
20315                            return this.each( function() {
20316                                dataUser.set( this, key );
20317                            } );
20318                        }
20319
20320                        return access( this, function( value ) {
20321                            var data;
20322
20323                            // The calling jQuery object (element matches) is not empty
20324                            // (and therefore has an element appears at this[ 0 ]) and the
20325                            // `value` parameter was not undefined. An empty jQuery object
20326                            // will result in `undefined` for elem = this[ 0 ] which will
20327                            // throw an exception if an attempt to read a data cache is made.
20328                            if ( elem && value === undefined ) {
20329
20330                                // Attempt to get data from the cache
20331                                // The key will always be camelCased in Data
20332                                data = dataUser.get( elem, key );
20333                                if ( data !== undefined ) {
20334                                    return data;
20335                                }
20336
20337                                // Attempt to "discover" the data in
20338                                // HTML5 custom data-* attrs
20339                                data = dataAttr( elem, key );
20340                                if ( data !== undefined ) {
20341                                    return data;
20342                                }
20343
20344                                // We tried really hard, but the data doesn't exist.
20345                                return;
20346                            }
20347
20348                            // Set the data...
20349                            this.each( function() {
20350
20351                                // We always store the camelCased key
20352                                dataUser.set( this, key, value );
20353                            } );
20354                        }, null, value, arguments.length > 1, null, true );
20355                    },
20356
20357                    removeData: function( key ) {
20358                        return this.each( function() {
20359                            dataUser.remove( this, key );
20360                        } );
20361                    }
20362                } );
20363
20364
20365                jQuery.extend( {
20366                    queue: function( elem, type, data ) {
20367                        var queue;
20368
20369                        if ( elem ) {
20370                            type = ( type || "fx" ) + "queue";
20371                            queue = dataPriv.get( elem, type );
20372
20373                            // Speed up dequeue by getting out quickly if this is just a lookup
20374                            if ( data ) {
20375                                if ( !queue || Array.isArray( data ) ) {
20376                                    queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
20377                                } else {
20378                                    queue.push( data );
20379                                }
20380                            }
20381                            return queue || [];
20382                        }
20383                    },
20384
20385                    dequeue: function( elem, type ) {
20386                        type = type || "fx";
20387
20388                        var queue = jQuery.queue( elem, type ),
20389                            startLength = queue.length,
20390                            fn = queue.shift(),
20391                            hooks = jQuery._queueHooks( elem, type ),
20392                            next = function() {
20393                                jQuery.dequeue( elem, type );
20394                            };
20395
20396                        // If the fx queue is dequeued, always remove the progress sentinel
20397                        if ( fn === "inprogress" ) {
20398                            fn = queue.shift();
20399                            startLength--;
20400                        }
20401
20402                        if ( fn ) {
20403
20404                            // Add a progress sentinel to prevent the fx queue from being
20405                            // automatically dequeued
20406                            if ( type === "fx" ) {
20407                                queue.unshift( "inprogress" );
20408                            }
20409
20410                            // Clear up the last queue stop function
20411                            delete hooks.stop;
20412                            fn.call( elem, next, hooks );
20413                        }
20414
20415                        if ( !startLength && hooks ) {
20416                            hooks.empty.fire();
20417                        }
20418                    },
20419
20420                    // Not public - generate a queueHooks object, or return the current one
20421                    _queueHooks: function( elem, type ) {
20422                        var key = type + "queueHooks";
20423                        return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
20424                            empty: jQuery.Callbacks( "once memory" ).add( function() {
20425                                dataPriv.remove( elem, [ type + "queue", key ] );
20426                            } )
20427                        } );
20428                    }
20429                } );
20430
20431                jQuery.fn.extend( {
20432                    queue: function( type, data ) {
20433                        var setter = 2;
20434
20435                        if ( typeof type !== "string" ) {
20436                            data = type;
20437                            type = "fx";
20438                            setter--;
20439                        }
20440
20441                        if ( arguments.length < setter ) {
20442                            return jQuery.queue( this[ 0 ], type );
20443                        }
20444
20445                        return data === undefined ?
20446                            this :
20447                            this.each( function() {
20448                                var queue = jQuery.queue( this, type, data );
20449
20450                                // Ensure a hooks for this queue
20451                                jQuery._queueHooks( this, type );
20452
20453                                if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
20454                                    jQuery.dequeue( this, type );
20455                                }
20456                            } );
20457                    },
20458                    dequeue: function( type ) {
20459                        return this.each( function() {
20460                            jQuery.dequeue( this, type );
20461                        } );
20462                    },
20463                    clearQueue: function( type ) {
20464                        return this.queue( type || "fx", [] );
20465                    },
20466
20467                    // Get a promise resolved when queues of a certain type
20468                    // are emptied (fx is the type by default)
20469                    promise: function( type, obj ) {
20470                        var tmp,
20471                            count = 1,
20472                            defer = jQuery.Deferred(),
20473                            elements = this,
20474                            i = this.length,
20475                            resolve = function() {
20476                                if ( !( --count ) ) {
20477                                    defer.resolveWith( elements, [ elements ] );
20478                                }
20479                            };
20480
20481                        if ( typeof type !== "string" ) {
20482                            obj = type;
20483                            type = undefined;
20484                        }
20485                        type = type || "fx";
20486
20487                        while ( i-- ) {
20488                            tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
20489                            if ( tmp && tmp.empty ) {
20490                                count++;
20491                                tmp.empty.add( resolve );
20492                            }
20493                        }
20494                        resolve();
20495                        return defer.promise( obj );
20496                    }
20497                } );
20498                var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
20499
20500                var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
20501
20502
20503                var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
20504
20505                var documentElement = document.documentElement;
20506
20507
20508
20509                var isAttached = function( elem ) {
20510                        return jQuery.contains( elem.ownerDocument, elem );
20511                    },
20512                    composed = { composed: true };
20513
20514                // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
20515                // Check attachment across shadow DOM boundaries when possible (gh-3504)
20516                // Support: iOS 10.0-10.2 only
20517                // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
20518                // leading to errors. We need to check for `getRootNode`.
20519                if ( documentElement.getRootNode ) {
20520                    isAttached = function( elem ) {
20521                        return jQuery.contains( elem.ownerDocument, elem ) ||
20522                            elem.getRootNode( composed ) === elem.ownerDocument;
20523                    };
20524                }
20525                var isHiddenWithinTree = function( elem, el ) {
20526
20527                    // isHiddenWithinTree might be called from jQuery#filter function;
20528                    // in that case, element will be second argument
20529                    elem = el || elem;
20530
20531                    // Inline style trumps all
20532                    return elem.style.display === "none" ||
20533                        elem.style.display === "" &&
20534
20535                        // Otherwise, check computed style
20536                        // Support: Firefox <=43 - 45
20537                        // Disconnected elements can have computed display: none, so first confirm that elem is
20538                        // in the document.
20539                        isAttached( elem ) &&
20540
20541                        jQuery.css( elem, "display" ) === "none";
20542                };
20543
20544
20545
20546                function adjustCSS( elem, prop, valueParts, tween ) {
20547                    var adjusted, scale,
20548                        maxIterations = 20,
20549                        currentValue = tween ?
20550                            function() {
20551                                return tween.cur();
20552                            } :
20553                            function() {
20554                                return jQuery.css( elem, prop, "" );
20555                            },
20556                        initial = currentValue(),
20557                        unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
20558
20559                        // Starting value computation is required for potential unit mismatches
20560                        initialInUnit = elem.nodeType &&
20561                            ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
20562                            rcssNum.exec( jQuery.css( elem, prop ) );
20563
20564                    if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
20565
20566                        // Support: Firefox <=54
20567                        // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
20568                        initial = initial / 2;
20569
20570                        // Trust units reported by jQuery.css
20571                        unit = unit || initialInUnit[ 3 ];
20572
20573                        // Iteratively approximate from a nonzero starting point
20574                        initialInUnit = +initial || 1;
20575
20576                        while ( maxIterations-- ) {
20577
20578                            // Evaluate and update our best guess (doubling guesses that zero out).
20579                            // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
20580                            jQuery.style( elem, prop, initialInUnit + unit );
20581                            if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
20582                                maxIterations = 0;
20583                            }
20584                            initialInUnit = initialInUnit / scale;
20585
20586                        }
20587
20588                        initialInUnit = initialInUnit * 2;
20589                        jQuery.style( elem, prop, initialInUnit + unit );
20590
20591                        // Make sure we update the tween properties later on
20592                        valueParts = valueParts || [];
20593                    }
20594
20595                    if ( valueParts ) {
20596                        initialInUnit = +initialInUnit || +initial || 0;
20597
20598                        // Apply relative offset (+=/-=) if specified
20599                        adjusted = valueParts[ 1 ] ?
20600                            initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
20601                            +valueParts[ 2 ];
20602                        if ( tween ) {
20603                            tween.unit = unit;
20604                            tween.start = initialInUnit;
20605                            tween.end = adjusted;
20606                        }
20607                    }
20608                    return adjusted;
20609                }
20610
20611
20612                var defaultDisplayMap = {};
20613
20614                function getDefaultDisplay( elem ) {
20615                    var temp,
20616                        doc = elem.ownerDocument,
20617                        nodeName = elem.nodeName,
20618                        display = defaultDisplayMap[ nodeName ];
20619
20620                    if ( display ) {
20621                        return display;
20622                    }
20623
20624                    temp = doc.body.appendChild( doc.createElement( nodeName ) );
20625                    display = jQuery.css( temp, "display" );
20626
20627                    temp.parentNode.removeChild( temp );
20628
20629                    if ( display === "none" ) {
20630                        display = "block";
20631                    }
20632                    defaultDisplayMap[ nodeName ] = display;
20633
20634                    return display;
20635                }
20636
20637                function showHide( elements, show ) {
20638                    var display, elem,
20639                        values = [],
20640                        index = 0,
20641                        length = elements.length;
20642
20643                    // Determine new display value for elements that need to change
20644                    for ( ; index < length; index++ ) {
20645                        elem = elements[ index ];
20646                        if ( !elem.style ) {
20647                            continue;
20648                        }
20649
20650                        display = elem.style.display;
20651                        if ( show ) {
20652
20653                            // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
20654                            // check is required in this first loop unless we have a nonempty display value (either
20655                            // inline or about-to-be-restored)
20656                            if ( display === "none" ) {
20657                                values[ index ] = dataPriv.get( elem, "display" ) || null;
20658                                if ( !values[ index ] ) {
20659                                    elem.style.display = "";
20660                                }
20661                            }
20662                            if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
20663                                values[ index ] = getDefaultDisplay( elem );
20664                            }
20665                        } else {
20666                            if ( display !== "none" ) {
20667                                values[ index ] = "none";
20668
20669                                // Remember what we're overwriting
20670                                dataPriv.set( elem, "display", display );
20671                            }
20672                        }
20673                    }
20674
20675                    // Set the display of the elements in a second loop to avoid constant reflow
20676                    for ( index = 0; index < length; index++ ) {
20677                        if ( values[ index ] != null ) {
20678                            elements[ index ].style.display = values[ index ];
20679                        }
20680                    }
20681
20682                    return elements;
20683                }
20684
20685                jQuery.fn.extend( {
20686                    show: function() {
20687                        return showHide( this, true );
20688                    },
20689                    hide: function() {
20690                        return showHide( this );
20691                    },
20692                    toggle: function( state ) {
20693                        if ( typeof state === "boolean" ) {
20694                            return state ? this.show() : this.hide();
20695                        }
20696
20697                        return this.each( function() {
20698                            if ( isHiddenWithinTree( this ) ) {
20699                                jQuery( this ).show();
20700                            } else {
20701                                jQuery( this ).hide();
20702                            }
20703                        } );
20704                    }
20705                } );
20706                var rcheckableType = ( /^(?:checkbox|radio)$/i );
20707
20708                var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
20709
20710                var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
20711
20712
20713
20714                ( function() {
20715                    var fragment = document.createDocumentFragment(),
20716                        div = fragment.appendChild( document.createElement( "div" ) ),
20717                        input = document.createElement( "input" );
20718
20719                    // Support: Android 4.0 - 4.3 only
20720                    // Check state lost if the name is set (trac-11217)
20721                    // Support: Windows Web Apps (WWA)
20722                    // `name` and `type` must use .setAttribute for WWA (trac-14901)
20723                    input.setAttribute( "type", "radio" );
20724                    input.setAttribute( "checked", "checked" );
20725                    input.setAttribute( "name", "t" );
20726
20727                    div.appendChild( input );
20728
20729                    // Support: Android <=4.1 only
20730                    // Older WebKit doesn't clone checked state correctly in fragments
20731                    support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
20732
20733                    // Support: IE <=11 only
20734                    // Make sure textarea (and checkbox) defaultValue is properly cloned
20735                    div.innerHTML = "<textarea>x</textarea>";
20736                    support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
20737
20738                    // Support: IE <=9 only
20739                    // IE <=9 replaces <option> tags with their contents when inserted outside of
20740                    // the select element.
20741                    div.innerHTML = "<option></option>";
20742                    support.option = !!div.lastChild;
20743                } )();
20744
20745
20746// We have to close these tags to support XHTML (trac-13200)
20747                var wrapMap = {
20748
20749                    // XHTML parsers do not magically insert elements in the
20750                    // same way that tag soup parsers do. So we cannot shorten
20751                    // this by omitting <tbody> or other required elements.
20752                    thead: [ 1, "<table>", "</table>" ],
20753                    col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
20754                    tr: [ 2, "<table><tbody>", "</tbody></table>" ],
20755                    td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
20756
20757                    _default: [ 0, "", "" ]
20758                };
20759
20760                wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
20761                wrapMap.th = wrapMap.td;
20762
20763// Support: IE <=9 only
20764                if ( !support.option ) {
20765                    wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
20766                }
20767
20768
20769                function getAll( context, tag ) {
20770
20771                    // Support: IE <=9 - 11 only
20772                    // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
20773                    var ret;
20774
20775                    if ( typeof context.getElementsByTagName !== "undefined" ) {
20776                        ret = context.getElementsByTagName( tag || "*" );
20777
20778                    } else if ( typeof context.querySelectorAll !== "undefined" ) {
20779                        ret = context.querySelectorAll( tag || "*" );
20780
20781                    } else {
20782                        ret = [];
20783                    }
20784
20785                    if ( tag === undefined || tag && nodeName( context, tag ) ) {
20786                        return jQuery.merge( [ context ], ret );
20787                    }
20788
20789                    return ret;
20790                }
20791
20792
20793// Mark scripts as having already been evaluated
20794                function setGlobalEval( elems, refElements ) {
20795                    var i = 0,
20796                        l = elems.length;
20797
20798                    for ( ; i < l; i++ ) {
20799                        dataPriv.set(
20800                            elems[ i ],
20801                            "globalEval",
20802                            !refElements || dataPriv.get( refElements[ i ], "globalEval" )
20803                        );
20804                    }
20805                }
20806
20807
20808                var rhtml = /<|&#?\w+;/;
20809
20810                function buildFragment( elems, context, scripts, selection, ignored ) {
20811                    var elem, tmp, tag, wrap, attached, j,
20812                        fragment = context.createDocumentFragment(),
20813                        nodes = [],
20814                        i = 0,
20815                        l = elems.length;
20816
20817                    for ( ; i < l; i++ ) {
20818                        elem = elems[ i ];
20819
20820                        if ( elem || elem === 0 ) {
20821
20822                            // Add nodes directly
20823                            if ( toType( elem ) === "object" ) {
20824
20825                                // Support: Android <=4.0 only, PhantomJS 1 only
20826                                // push.apply(_, arraylike) throws on ancient WebKit
20827                                jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
20828
20829                                // Convert non-html into a text node
20830                            } else if ( !rhtml.test( elem ) ) {
20831                                nodes.push( context.createTextNode( elem ) );
20832
20833                                // Convert html into DOM nodes
20834                            } else {
20835                                tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
20836
20837                                // Deserialize a standard representation
20838                                tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
20839                                wrap = wrapMap[ tag ] || wrapMap._default;
20840                                tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
20841
20842                                // Descend through wrappers to the right content
20843                                j = wrap[ 0 ];
20844                                while ( j-- ) {
20845                                    tmp = tmp.lastChild;
20846                                }
20847
20848                                // Support: Android <=4.0 only, PhantomJS 1 only
20849                                // push.apply(_, arraylike) throws on ancient WebKit
20850                                jQuery.merge( nodes, tmp.childNodes );
20851
20852                                // Remember the top-level container
20853                                tmp = fragment.firstChild;
20854
20855                                // Ensure the created nodes are orphaned (trac-12392)
20856                                tmp.textContent = "";
20857                            }
20858                        }
20859                    }
20860
20861                    // Remove wrapper from fragment
20862                    fragment.textContent = "";
20863
20864                    i = 0;
20865                    while ( ( elem = nodes[ i++ ] ) ) {
20866
20867                        // Skip elements already in the context collection (trac-4087)
20868                        if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
20869                            if ( ignored ) {
20870                                ignored.push( elem );
20871                            }
20872                            continue;
20873                        }
20874
20875                        attached = isAttached( elem );
20876
20877                        // Append to fragment
20878                        tmp = getAll( fragment.appendChild( elem ), "script" );
20879
20880                        // Preserve script evaluation history
20881                        if ( attached ) {
20882                            setGlobalEval( tmp );
20883                        }
20884
20885                        // Capture executables
20886                        if ( scripts ) {
20887                            j = 0;
20888                            while ( ( elem = tmp[ j++ ] ) ) {
20889                                if ( rscriptType.test( elem.type || "" ) ) {
20890                                    scripts.push( elem );
20891                                }
20892                            }
20893                        }
20894                    }
20895
20896                    return fragment;
20897                }
20898
20899
20900                var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
20901
20902                function returnTrue() {
20903                    return true;
20904                }
20905
20906                function returnFalse() {
20907                    return false;
20908                }
20909
20910                function on( elem, types, selector, data, fn, one ) {
20911                    var origFn, type;
20912
20913                    // Types can be a map of types/handlers
20914                    if ( typeof types === "object" ) {
20915
20916                        // ( types-Object, selector, data )
20917                        if ( typeof selector !== "string" ) {
20918
20919                            // ( types-Object, data )
20920                            data = data || selector;
20921                            selector = undefined;
20922                        }
20923                        for ( type in types ) {
20924                            on( elem, type, selector, data, types[ type ], one );
20925                        }
20926                        return elem;
20927                    }
20928
20929                    if ( data == null && fn == null ) {
20930
20931                        // ( types, fn )
20932                        fn = selector;
20933                        data = selector = undefined;
20934                    } else if ( fn == null ) {
20935                        if ( typeof selector === "string" ) {
20936
20937                            // ( types, selector, fn )
20938                            fn = data;
20939                            data = undefined;
20940                        } else {
20941
20942                            // ( types, data, fn )
20943                            fn = data;
20944                            data = selector;
20945                            selector = undefined;
20946                        }
20947                    }
20948                    if ( fn === false ) {
20949                        fn = returnFalse;
20950                    } else if ( !fn ) {
20951                        return elem;
20952                    }
20953
20954                    if ( one === 1 ) {
20955                        origFn = fn;
20956                        fn = function( event ) {
20957
20958                            // Can use an empty set, since event contains the info
20959                            jQuery().off( event );
20960                            return origFn.apply( this, arguments );
20961                        };
20962
20963                        // Use same guid so caller can remove using origFn
20964                        fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
20965                    }
20966                    return elem.each( function() {
20967                        jQuery.event.add( this, types, fn, data, selector );
20968                    } );
20969                }
20970
20971                /*
20972 * Helper functions for managing events -- not part of the public interface.
20973 * Props to Dean Edwards' addEvent library for many of the ideas.
20974 */
20975                jQuery.event = {
20976
20977                    global: {},
20978
20979                    add: function( elem, types, handler, data, selector ) {
20980
20981                        var handleObjIn, eventHandle, tmp,
20982                            events, t, handleObj,
20983                            special, handlers, type, namespaces, origType,
20984                            elemData = dataPriv.get( elem );
20985
20986                        // Only attach events to objects that accept data
20987                        if ( !acceptData( elem ) ) {
20988                            return;
20989                        }
20990
20991                        // Caller can pass in an object of custom data in lieu of the handler
20992                        if ( handler.handler ) {
20993                            handleObjIn = handler;
20994                            handler = handleObjIn.handler;
20995                            selector = handleObjIn.selector;
20996                        }
20997
20998                        // Ensure that invalid selectors throw exceptions at attach time
20999                        // Evaluate against documentElement in case elem is a non-element node (e.g., document)
21000                        if ( selector ) {
21001                            jQuery.find.matchesSelector( documentElement, selector );
21002                        }
21003
21004                        // Make sure that the handler has a unique ID, used to find/remove it later
21005                        if ( !handler.guid ) {
21006                            handler.guid = jQuery.guid++;
21007                        }
21008
21009                        // Init the element's event structure and main handler, if this is the first
21010                        if ( !( events = elemData.events ) ) {
21011                            events = elemData.events = Object.create( null );
21012                        }
21013                        if ( !( eventHandle = elemData.handle ) ) {
21014                            eventHandle = elemData.handle = function( e ) {
21015
21016                                // Discard the second event of a jQuery.event.trigger() and
21017                                // when an event is called after a page has unloaded
21018                                return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
21019                                    jQuery.event.dispatch.apply( elem, arguments ) : undefined;
21020                            };
21021                        }
21022
21023                        // Handle multiple events separated by a space
21024                        types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
21025                        t = types.length;
21026                        while ( t-- ) {
21027                            tmp = rtypenamespace.exec( types[ t ] ) || [];
21028                            type = origType = tmp[ 1 ];
21029                            namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
21030
21031                            // There *must* be a type, no attaching namespace-only handlers
21032                            if ( !type ) {
21033                                continue;
21034                            }
21035
21036                            // If event changes its type, use the special event handlers for the changed type
21037                            special = jQuery.event.special[ type ] || {};
21038
21039                            // If selector defined, determine special event api type, otherwise given type
21040                            type = ( selector ? special.delegateType : special.bindType ) || type;
21041
21042                            // Update special based on newly reset type
21043                            special = jQuery.event.special[ type ] || {};
21044
21045                            // handleObj is passed to all event handlers
21046                            handleObj = jQuery.extend( {
21047                                type: type,
21048                                origType: origType,
21049                                data: data,
21050                                handler: handler,
21051                                guid: handler.guid,
21052                                selector: selector,
21053                                needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
21054                                namespace: namespaces.join( "." )
21055                            }, handleObjIn );
21056
21057                            // Init the event handler queue if we're the first
21058                            if ( !( handlers = events[ type ] ) ) {
21059                                handlers = events[ type ] = [];
21060                                handlers.delegateCount = 0;
21061
21062                                // Only use addEventListener if the special events handler returns false
21063                                if ( !special.setup ||
21064                                    special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
21065
21066                                    if ( elem.addEventListener ) {
21067                                        elem.addEventListener( type, eventHandle );
21068                                    }
21069                                }
21070                            }
21071
21072                            if ( special.add ) {
21073                                special.add.call( elem, handleObj );
21074
21075                                if ( !handleObj.handler.guid ) {
21076                                    handleObj.handler.guid = handler.guid;
21077                                }
21078                            }
21079
21080                            // Add to the element's handler list, delegates in front
21081                            if ( selector ) {
21082                                handlers.splice( handlers.delegateCount++, 0, handleObj );
21083                            } else {
21084                                handlers.push( handleObj );
21085                            }
21086
21087                            // Keep track of which events have ever been used, for event optimization
21088                            jQuery.event.global[ type ] = true;
21089                        }
21090
21091                    },
21092
21093                    // Detach an event or set of events from an element
21094                    remove: function( elem, types, handler, selector, mappedTypes ) {
21095
21096                        var j, origCount, tmp,
21097                            events, t, handleObj,
21098                            special, handlers, type, namespaces, origType,
21099                            elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
21100
21101                        if ( !elemData || !( events = elemData.events ) ) {
21102                            return;
21103                        }
21104
21105                        // Once for each type.namespace in types; type may be omitted
21106                        types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
21107                        t = types.length;
21108                        while ( t-- ) {
21109                            tmp = rtypenamespace.exec( types[ t ] ) || [];
21110                            type = origType = tmp[ 1 ];
21111                            namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
21112
21113                            // Unbind all events (on this namespace, if provided) for the element
21114                            if ( !type ) {
21115                                for ( type in events ) {
21116                                    jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
21117                                }
21118                                continue;
21119                            }
21120
21121                            special = jQuery.event.special[ type ] || {};
21122                            type = ( selector ? special.delegateType : special.bindType ) || type;
21123                            handlers = events[ type ] || [];
21124                            tmp = tmp[ 2 ] &&
21125                                new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
21126
21127                            // Remove matching events
21128                            origCount = j = handlers.length;
21129                            while ( j-- ) {
21130                                handleObj = handlers[ j ];
21131
21132                                if ( ( mappedTypes || origType === handleObj.origType ) &&
21133                                    ( !handler || handler.guid === handleObj.guid ) &&
21134                                    ( !tmp || tmp.test( handleObj.namespace ) ) &&
21135                                    ( !selector || selector === handleObj.selector ||
21136                                        selector === "**" && handleObj.selector ) ) {
21137                                    handlers.splice( j, 1 );
21138
21139                                    if ( handleObj.selector ) {
21140                                        handlers.delegateCount--;
21141                                    }
21142                                    if ( special.remove ) {
21143                                        special.remove.call( elem, handleObj );
21144                                    }
21145                                }
21146                            }
21147
21148                            // Remove generic event handler if we removed something and no more handlers exist
21149                            // (avoids potential for endless recursion during removal of special event handlers)
21150                            if ( origCount && !handlers.length ) {
21151                                if ( !special.teardown ||
21152                                    special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
21153
21154                                    jQuery.removeEvent( elem, type, elemData.handle );
21155                                }
21156
21157                                delete events[ type ];
21158                            }
21159                        }
21160
21161                        // Remove data and the expando if it's no longer used
21162                        if ( jQuery.isEmptyObject( events ) ) {
21163                            dataPriv.remove( elem, "handle events" );
21164                        }
21165                    },
21166
21167                    dispatch: function( nativeEvent ) {
21168
21169                        var i, j, ret, matched, handleObj, handlerQueue,
21170                            args = new Array( arguments.length ),
21171
21172                            // Make a writable jQuery.Event from the native event object
21173                            event = jQuery.event.fix( nativeEvent ),
21174
21175                            handlers = (
21176                                dataPriv.get( this, "events" ) || Object.create( null )
21177                            )[ event.type ] || [],
21178                            special = jQuery.event.special[ event.type ] || {};
21179
21180                        // Use the fix-ed jQuery.Event rather than the (read-only) native event
21181                        args[ 0 ] = event;
21182
21183                        for ( i = 1; i < arguments.length; i++ ) {
21184                            args[ i ] = arguments[ i ];
21185                        }
21186
21187                        event.delegateTarget = this;
21188
21189                        // Call the preDispatch hook for the mapped type, and let it bail if desired
21190                        if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
21191                            return;
21192                        }
21193
21194                        // Determine handlers
21195                        handlerQueue = jQuery.event.handlers.call( this, event, handlers );
21196
21197                        // Run delegates first; they may want to stop propagation beneath us
21198                        i = 0;
21199                        while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
21200                            event.currentTarget = matched.elem;
21201
21202                            j = 0;
21203                            while ( ( handleObj = matched.handlers[ j++ ] ) &&
21204                            !event.isImmediatePropagationStopped() ) {
21205
21206                                // If the event is namespaced, then each handler is only invoked if it is
21207                                // specially universal or its namespaces are a superset of the event's.
21208                                if ( !event.rnamespace || handleObj.namespace === false ||
21209                                    event.rnamespace.test( handleObj.namespace ) ) {
21210
21211                                    event.handleObj = handleObj;
21212                                    event.data = handleObj.data;
21213
21214                                    ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
21215                                        handleObj.handler ).apply( matched.elem, args );
21216
21217                                    if ( ret !== undefined ) {
21218                                        if ( ( event.result = ret ) === false ) {
21219                                            event.preventDefault();
21220                                            event.stopPropagation();
21221                                        }
21222                                    }
21223                                }
21224                            }
21225                        }
21226
21227                        // Call the postDispatch hook for the mapped type
21228                        if ( special.postDispatch ) {
21229                            special.postDispatch.call( this, event );
21230                        }
21231
21232                        return event.result;
21233                    },
21234
21235                    handlers: function( event, handlers ) {
21236                        var i, handleObj, sel, matchedHandlers, matchedSelectors,
21237                            handlerQueue = [],
21238                            delegateCount = handlers.delegateCount,
21239                            cur = event.target;
21240
21241                        // Find delegate handlers
21242                        if ( delegateCount &&
21243
21244                            // Support: IE <=9
21245                            // Black-hole SVG <use> instance trees (trac-13180)
21246                            cur.nodeType &&
21247
21248                            // Support: Firefox <=42
21249                            // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
21250                            // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
21251                            // Support: IE 11 only
21252                            // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
21253                            !( event.type === "click" && event.button >= 1 ) ) {
21254
21255                            for ( ; cur !== this; cur = cur.parentNode || this ) {
21256
21257                                // Don't check non-elements (trac-13208)
21258                                // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
21259                                if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
21260                                    matchedHandlers = [];
21261                                    matchedSelectors = {};
21262                                    for ( i = 0; i < delegateCount; i++ ) {
21263                                        handleObj = handlers[ i ];
21264
21265                                        // Don't conflict with Object.prototype properties (trac-13203)
21266                                        sel = handleObj.selector + " ";
21267
21268                                        if ( matchedSelectors[ sel ] === undefined ) {
21269                                            matchedSelectors[ sel ] = handleObj.needsContext ?
21270                                                jQuery( sel, this ).index( cur ) > -1 :
21271                                                jQuery.find( sel, this, null, [ cur ] ).length;
21272                                        }
21273                                        if ( matchedSelectors[ sel ] ) {
21274                                            matchedHandlers.push( handleObj );
21275                                        }
21276                                    }
21277                                    if ( matchedHandlers.length ) {
21278                                        handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
21279                                    }
21280                                }
21281                            }
21282                        }
21283
21284                        // Add the remaining (directly-bound) handlers
21285                        cur = this;
21286                        if ( delegateCount < handlers.length ) {
21287                            handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
21288                        }
21289
21290                        return handlerQueue;
21291                    },
21292
21293                    addProp: function( name, hook ) {
21294                        Object.defineProperty( jQuery.Event.prototype, name, {
21295                            enumerable: true,
21296                            configurable: true,
21297
21298                            get: isFunction( hook ) ?
21299                                function() {
21300                                    if ( this.originalEvent ) {
21301                                        return hook( this.originalEvent );
21302                                    }
21303                                } :
21304                                function() {
21305                                    if ( this.originalEvent ) {
21306                                        return this.originalEvent[ name ];
21307                                    }
21308                                },
21309
21310                            set: function( value ) {
21311                                Object.defineProperty( this, name, {
21312                                    enumerable: true,
21313                                    configurable: true,
21314                                    writable: true,
21315                                    value: value
21316                                } );
21317                            }
21318                        } );
21319                    },
21320
21321                    fix: function( originalEvent ) {
21322                        return originalEvent[ jQuery.expando ] ?
21323                            originalEvent :
21324                            new jQuery.Event( originalEvent );
21325                    },
21326
21327                    special: {
21328                        load: {
21329
21330                            // Prevent triggered image.load events from bubbling to window.load
21331                            noBubble: true
21332                        },
21333                        click: {
21334
21335                            // Utilize native event to ensure correct state for checkable inputs
21336                            setup: function( data ) {
21337
21338                                // For mutual compressibility with _default, replace `this` access with a local var.
21339                                // `|| data` is dead code meant only to preserve the variable through minification.
21340                                var el = this || data;
21341
21342                                // Claim the first handler
21343                                if ( rcheckableType.test( el.type ) &&
21344                                    el.click && nodeName( el, "input" ) ) {
21345
21346                                    // dataPriv.set( el, "click", ... )
21347                                    leverageNative( el, "click", true );
21348                                }
21349
21350                                // Return false to allow normal processing in the caller
21351                                return false;
21352                            },
21353                            trigger: function( data ) {
21354
21355                                // For mutual compressibility with _default, replace `this` access with a local var.
21356                                // `|| data` is dead code meant only to preserve the variable through minification.
21357                                var el = this || data;
21358
21359                                // Force setup before triggering a click
21360                                if ( rcheckableType.test( el.type ) &&
21361                                    el.click && nodeName( el, "input" ) ) {
21362
21363                                    leverageNative( el, "click" );
21364                                }
21365
21366                                // Return non-false to allow normal event-path propagation
21367                                return true;
21368                            },
21369
21370                            // For cross-browser consistency, suppress native .click() on links
21371                            // Also prevent it if we're currently inside a leveraged native-event stack
21372                            _default: function( event ) {
21373                                var target = event.target;
21374                                return rcheckableType.test( target.type ) &&
21375                                    target.click && nodeName( target, "input" ) &&
21376                                    dataPriv.get( target, "click" ) ||
21377                                    nodeName( target, "a" );
21378                            }
21379                        },
21380
21381                        beforeunload: {
21382                            postDispatch: function( event ) {
21383
21384                                // Support: Firefox 20+
21385                                // Firefox doesn't alert if the returnValue field is not set.
21386                                if ( event.result !== undefined && event.originalEvent ) {
21387                                    event.originalEvent.returnValue = event.result;
21388                                }
21389                            }
21390                        }
21391                    }
21392                };
21393
21394// Ensure the presence of an event listener that handles manually-triggered
21395// synthetic events by interrupting progress until reinvoked in response to
21396// *native* events that it fires directly, ensuring that state changes have
21397// already occurred before other listeners are invoked.
21398                function leverageNative( el, type, isSetup ) {
21399
21400                    // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
21401                    if ( !isSetup ) {
21402                        if ( dataPriv.get( el, type ) === undefined ) {
21403                            jQuery.event.add( el, type, returnTrue );
21404                        }
21405                        return;
21406                    }
21407
21408                    // Register the controller as a special universal handler for all event namespaces
21409                    dataPriv.set( el, type, false );
21410                    jQuery.event.add( el, type, {
21411                        namespace: false,
21412                        handler: function( event ) {
21413                            var result,
21414                                saved = dataPriv.get( this, type );
21415
21416                            if ( ( event.isTrigger & 1 ) && this[ type ] ) {
21417
21418                                // Interrupt processing of the outer synthetic .trigger()ed event
21419                                if ( !saved ) {
21420
21421                                    // Store arguments for use when handling the inner native event
21422                                    // There will always be at least one argument (an event object), so this array
21423                                    // will not be confused with a leftover capture object.
21424                                    saved = slice.call( arguments );
21425                                    dataPriv.set( this, type, saved );
21426
21427                                    // Trigger the native event and capture its result
21428                                    this[ type ]();
21429                                    result = dataPriv.get( this, type );
21430                                    dataPriv.set( this, type, false );
21431
21432                                    if ( saved !== result ) {
21433
21434                                        // Cancel the outer synthetic event
21435                                        event.stopImmediatePropagation();
21436                                        event.preventDefault();
21437
21438                                        return result;
21439                                    }
21440
21441                                    // If this is an inner synthetic event for an event with a bubbling surrogate
21442                                    // (focus or blur), assume that the surrogate already propagated from triggering
21443                                    // the native event and prevent that from happening again here.
21444                                    // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
21445                                    // bubbling surrogate propagates *after* the non-bubbling base), but that seems
21446                                    // less bad than duplication.
21447                                } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
21448                                    event.stopPropagation();
21449                                }
21450
21451                                // If this is a native event triggered above, everything is now in order
21452                                // Fire an inner synthetic event with the original arguments
21453                            } else if ( saved ) {
21454
21455                                // ...and capture the result
21456                                dataPriv.set( this, type, jQuery.event.trigger(
21457                                    saved[ 0 ],
21458                                    saved.slice( 1 ),
21459                                    this
21460                                ) );
21461
21462                                // Abort handling of the native event by all jQuery handlers while allowing
21463                                // native handlers on the same element to run. On target, this is achieved
21464                                // by stopping immediate propagation just on the jQuery event. However,
21465                                // the native event is re-wrapped by a jQuery one on each level of the
21466                                // propagation so the only way to stop it for jQuery is to stop it for
21467                                // everyone via native `stopPropagation()`. This is not a problem for
21468                                // focus/blur which don't bubble, but it does also stop click on checkboxes
21469                                // and radios. We accept this limitation.
21470                                event.stopPropagation();
21471                                event.isImmediatePropagationStopped = returnTrue;
21472                            }
21473                        }
21474                    } );
21475                }
21476
21477                jQuery.removeEvent = function( elem, type, handle ) {
21478
21479                    // This "if" is needed for plain objects
21480                    if ( elem.removeEventListener ) {
21481                        elem.removeEventListener( type, handle );
21482                    }
21483                };
21484
21485                jQuery.Event = function( src, props ) {
21486
21487                    // Allow instantiation without the 'new' keyword
21488                    if ( !( this instanceof jQuery.Event ) ) {
21489                        return new jQuery.Event( src, props );
21490                    }
21491
21492                    // Event object
21493                    if ( src && src.type ) {
21494                        this.originalEvent = src;
21495                        this.type = src.type;
21496
21497                        // Events bubbling up the document may have been marked as prevented
21498                        // by a handler lower down the tree; reflect the correct value.
21499                        this.isDefaultPrevented = src.defaultPrevented ||
21500                        src.defaultPrevented === undefined &&
21501
21502                        // Support: Android <=2.3 only
21503                        src.returnValue === false ?
21504                            returnTrue :
21505                            returnFalse;
21506
21507                        // Create target properties
21508                        // Support: Safari <=6 - 7 only
21509                        // Target should not be a text node (trac-504, trac-13143)
21510                        this.target = ( src.target && src.target.nodeType === 3 ) ?
21511                            src.target.parentNode :
21512                            src.target;
21513
21514                        this.currentTarget = src.currentTarget;
21515                        this.relatedTarget = src.relatedTarget;
21516
21517                        // Event type
21518                    } else {
21519                        this.type = src;
21520                    }
21521
21522                    // Put explicitly provided properties onto the event object
21523                    if ( props ) {
21524                        jQuery.extend( this, props );
21525                    }
21526
21527                    // Create a timestamp if incoming event doesn't have one
21528                    this.timeStamp = src && src.timeStamp || Date.now();
21529
21530                    // Mark it as fixed
21531                    this[ jQuery.expando ] = true;
21532                };
21533
21534// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
21535// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
21536                jQuery.Event.prototype = {
21537                    constructor: jQuery.Event,
21538                    isDefaultPrevented: returnFalse,
21539                    isPropagationStopped: returnFalse,
21540                    isImmediatePropagationStopped: returnFalse,
21541                    isSimulated: false,
21542
21543                    preventDefault: function() {
21544                        var e = this.originalEvent;
21545
21546                        this.isDefaultPrevented = returnTrue;
21547
21548                        if ( e && !this.isSimulated ) {
21549                            e.preventDefault();
21550                        }
21551                    },
21552                    stopPropagation: function() {
21553                        var e = this.originalEvent;
21554
21555                        this.isPropagationStopped = returnTrue;
21556
21557                        if ( e && !this.isSimulated ) {
21558                            e.stopPropagation();
21559                        }
21560                    },
21561                    stopImmediatePropagation: function() {
21562                        var e = this.originalEvent;
21563
21564                        this.isImmediatePropagationStopped = returnTrue;
21565
21566                        if ( e && !this.isSimulated ) {
21567                            e.stopImmediatePropagation();
21568                        }
21569
21570                        this.stopPropagation();
21571                    }
21572                };
21573
21574// Includes all common event props including KeyEvent and MouseEvent specific props
21575                jQuery.each( {
21576                    altKey: true,
21577                    bubbles: true,
21578                    cancelable: true,
21579                    changedTouches: true,
21580                    ctrlKey: true,
21581                    detail: true,
21582                    eventPhase: true,
21583                    metaKey: true,
21584                    pageX: true,
21585                    pageY: true,
21586                    shiftKey: true,
21587                    view: true,
21588                    "char": true,
21589                    code: true,
21590                    charCode: true,
21591                    key: true,
21592                    keyCode: true,
21593                    button: true,
21594                    buttons: true,
21595                    clientX: true,
21596                    clientY: true,
21597                    offsetX: true,
21598                    offsetY: true,
21599                    pointerId: true,
21600                    pointerType: true,
21601                    screenX: true,
21602                    screenY: true,
21603                    targetTouches: true,
21604                    toElement: true,
21605                    touches: true,
21606                    which: true
21607                }, jQuery.event.addProp );
21608
21609                jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
21610
21611                    function focusMappedHandler( nativeEvent ) {
21612                        if ( document.documentMode ) {
21613
21614                            // Support: IE 11+
21615                            // Attach a single focusin/focusout handler on the document while someone wants
21616                            // focus/blur. This is because the former are synchronous in IE while the latter
21617                            // are async. In other browsers, all those handlers are invoked synchronously.
21618
21619                            // `handle` from private data would already wrap the event, but we need
21620                            // to change the `type` here.
21621                            var handle = dataPriv.get( this, "handle" ),
21622                                event = jQuery.event.fix( nativeEvent );
21623                            event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
21624                            event.isSimulated = true;
21625
21626                            // First, handle focusin/focusout
21627                            handle( nativeEvent );
21628
21629                            // ...then, handle focus/blur
21630                            //
21631                            // focus/blur don't bubble while focusin/focusout do; simulate the former by only
21632                            // invoking the handler at the lower level.
21633                            if ( event.target === event.currentTarget ) {
21634
21635                                // The setup part calls `leverageNative`, which, in turn, calls
21636                                // `jQuery.event.add`, so event handle will already have been set
21637                                // by this point.
21638                                handle( event );
21639                            }
21640                        } else {
21641
21642                            // For non-IE browsers, attach a single capturing handler on the document
21643                            // while someone wants focusin/focusout.
21644                            jQuery.event.simulate( delegateType, nativeEvent.target,
21645                                jQuery.event.fix( nativeEvent ) );
21646                        }
21647                    }
21648
21649                    jQuery.event.special[ type ] = {
21650
21651                        // Utilize native event if possible so blur/focus sequence is correct
21652                        setup: function() {
21653
21654                            var attaches;
21655
21656                            // Claim the first handler
21657                            // dataPriv.set( this, "focus", ... )
21658                            // dataPriv.set( this, "blur", ... )
21659                            leverageNative( this, type, true );
21660
21661                            if ( document.documentMode ) {
21662
21663                                // Support: IE 9 - 11+
21664                                // We use the same native handler for focusin & focus (and focusout & blur)
21665                                // so we need to coordinate setup & teardown parts between those events.
21666                                // Use `delegateType` as the key as `type` is already used by `leverageNative`.
21667                                attaches = dataPriv.get( this, delegateType );
21668                                if ( !attaches ) {
21669                                    this.addEventListener( delegateType, focusMappedHandler );
21670                                }
21671                                dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
21672                            } else {
21673
21674                                // Return false to allow normal processing in the caller
21675                                return false;
21676                            }
21677                        },
21678                        trigger: function() {
21679
21680                            // Force setup before trigger
21681                            leverageNative( this, type );
21682
21683                            // Return non-false to allow normal event-path propagation
21684                            return true;
21685                        },
21686
21687                        teardown: function() {
21688                            var attaches;
21689
21690                            if ( document.documentMode ) {
21691                                attaches = dataPriv.get( this, delegateType ) - 1;
21692                                if ( !attaches ) {
21693                                    this.removeEventListener( delegateType, focusMappedHandler );
21694                                    dataPriv.remove( this, delegateType );
21695                                } else {
21696                                    dataPriv.set( this, delegateType, attaches );
21697                                }
21698                            } else {
21699
21700                                // Return false to indicate standard teardown should be applied
21701                                return false;
21702                            }
21703                        },
21704
21705                        // Suppress native focus or blur if we're currently inside
21706                        // a leveraged native-event stack
21707                        _default: function( event ) {
21708                            return dataPriv.get( event.target, type );
21709                        },
21710
21711                        delegateType: delegateType
21712                    };
21713
21714                    // Support: Firefox <=44
21715                    // Firefox doesn't have focus(in | out) events
21716                    // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
21717                    //
21718                    // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
21719                    // focus(in | out) events fire after focus & blur events,
21720                    // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
21721                    // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
21722                    //
21723                    // Support: IE 9 - 11+
21724                    // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
21725                    // attach a single handler for both events in IE.
21726                    jQuery.event.special[ delegateType ] = {
21727                        setup: function() {
21728
21729                            // Handle: regular nodes (via `this.ownerDocument`), window
21730                            // (via `this.document`) & document (via `this`).
21731                            var doc = this.ownerDocument || this.document || this,
21732                                dataHolder = document.documentMode ? this : doc,
21733                                attaches = dataPriv.get( dataHolder, delegateType );
21734
21735                            // Support: IE 9 - 11+
21736                            // We use the same native handler for focusin & focus (and focusout & blur)
21737                            // so we need to coordinate setup & teardown parts between those events.
21738                            // Use `delegateType` as the key as `type` is already used by `leverageNative`.
21739                            if ( !attaches ) {
21740                                if ( document.documentMode ) {
21741                                    this.addEventListener( delegateType, focusMappedHandler );
21742                                } else {
21743                                    doc.addEventListener( type, focusMappedHandler, true );
21744                                }
21745                            }
21746                            dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
21747                        },
21748                        teardown: function() {
21749                            var doc = this.ownerDocument || this.document || this,
21750                                dataHolder = document.documentMode ? this : doc,
21751                                attaches = dataPriv.get( dataHolder, delegateType ) - 1;
21752
21753                            if ( !attaches ) {
21754                                if ( document.documentMode ) {
21755                                    this.removeEventListener( delegateType, focusMappedHandler );
21756                                } else {
21757                                    doc.removeEventListener( type, focusMappedHandler, true );
21758                                }
21759                                dataPriv.remove( dataHolder, delegateType );
21760                            } else {
21761                                dataPriv.set( dataHolder, delegateType, attaches );
21762                            }
21763                        }
21764                    };
21765                } );
21766
21767// Create mouseenter/leave events using mouseover/out and event-time checks
21768// so that event delegation works in jQuery.
21769// Do the same for pointerenter/pointerleave and pointerover/pointerout
21770//
21771// Support: Safari 7 only
21772// Safari sends mouseenter too often; see:
21773// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
21774// for the description of the bug (it existed in older Chrome versions as well).
21775                jQuery.each( {
21776                    mouseenter: "mouseover",
21777                    mouseleave: "mouseout",
21778                    pointerenter: "pointerover",
21779                    pointerleave: "pointerout"
21780                }, function( orig, fix ) {
21781                    jQuery.event.special[ orig ] = {
21782                        delegateType: fix,
21783                        bindType: fix,
21784
21785                        handle: function( event ) {
21786                            var ret,
21787                                target = this,
21788                                related = event.relatedTarget,
21789                                handleObj = event.handleObj;
21790
21791                            // For mouseenter/leave call the handler if related is outside the target.
21792                            // NB: No relatedTarget if the mouse left/entered the browser window
21793                            if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
21794                                event.type = handleObj.origType;
21795                                ret = handleObj.handler.apply( this, arguments );
21796                                event.type = fix;
21797                            }
21798                            return ret;
21799                        }
21800                    };
21801                } );
21802
21803                jQuery.fn.extend( {
21804
21805                    on: function( types, selector, data, fn ) {
21806                        return on( this, types, selector, data, fn );
21807                    },
21808                    one: function( types, selector, data, fn ) {
21809                        return on( this, types, selector, data, fn, 1 );
21810                    },
21811                    off: function( types, selector, fn ) {
21812                        var handleObj, type;
21813                        if ( types && types.preventDefault && types.handleObj ) {
21814
21815                            // ( event )  dispatched jQuery.Event
21816                            handleObj = types.handleObj;
21817                            jQuery( types.delegateTarget ).off(
21818                                handleObj.namespace ?
21819                                    handleObj.origType + "." + handleObj.namespace :
21820                                    handleObj.origType,
21821                                handleObj.selector,
21822                                handleObj.handler
21823                            );
21824                            return this;
21825                        }
21826                        if ( typeof types === "object" ) {
21827
21828                            // ( types-object [, selector] )
21829                            for ( type in types ) {
21830                                this.off( type, selector, types[ type ] );
21831                            }
21832                            return this;
21833                        }
21834                        if ( selector === false || typeof selector === "function" ) {
21835
21836                            // ( types [, fn] )
21837                            fn = selector;
21838                            selector = undefined;
21839                        }
21840                        if ( fn === false ) {
21841                            fn = returnFalse;
21842                        }
21843                        return this.each( function() {
21844                            jQuery.event.remove( this, types, fn, selector );
21845                        } );
21846                    }
21847                } );
21848
21849
21850                var
21851
21852                    // Support: IE <=10 - 11, Edge 12 - 13 only
21853                    // In IE/Edge using regex groups here causes severe slowdowns.
21854                    // See https://connect.microsoft.com/IE/feedback/details/1736512/
21855                    rnoInnerhtml = /<script|<style|<link/i,
21856
21857                    // checked="checked" or checked
21858                    rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
21859
21860                    rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
21861
21862// Prefer a tbody over its parent table for containing new rows
21863                function manipulationTarget( elem, content ) {
21864                    if ( nodeName( elem, "table" ) &&
21865                        nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
21866
21867                        return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
21868                    }
21869
21870                    return elem;
21871                }
21872
21873// Replace/restore the type attribute of script elements for safe DOM manipulation
21874                function disableScript( elem ) {
21875                    elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
21876                    return elem;
21877                }
21878                function restoreScript( elem ) {
21879                    if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
21880                        elem.type = elem.type.slice( 5 );
21881                    } else {
21882                        elem.removeAttribute( "type" );
21883                    }
21884
21885                    return elem;
21886                }
21887
21888                function cloneCopyEvent( src, dest ) {
21889                    var i, l, type, pdataOld, udataOld, udataCur, events;
21890
21891                    if ( dest.nodeType !== 1 ) {
21892                        return;
21893                    }
21894
21895                    // 1. Copy private data: events, handlers, etc.
21896                    if ( dataPriv.hasData( src ) ) {
21897                        pdataOld = dataPriv.get( src );
21898                        events = pdataOld.events;
21899
21900                        if ( events ) {
21901                            dataPriv.remove( dest, "handle events" );
21902
21903                            for ( type in events ) {
21904                                for ( i = 0, l = events[ type ].length; i < l; i++ ) {
21905                                    jQuery.event.add( dest, type, events[ type ][ i ] );
21906                                }
21907                            }
21908                        }
21909                    }
21910
21911                    // 2. Copy user data
21912                    if ( dataUser.hasData( src ) ) {
21913                        udataOld = dataUser.access( src );
21914                        udataCur = jQuery.extend( {}, udataOld );
21915
21916                        dataUser.set( dest, udataCur );
21917                    }
21918                }
21919
21920// Fix IE bugs, see support tests
21921                function fixInput( src, dest ) {
21922                    var nodeName = dest.nodeName.toLowerCase();
21923
21924                    // Fails to persist the checked state of a cloned checkbox or radio button.
21925                    if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
21926                        dest.checked = src.checked;
21927
21928                        // Fails to return the selected option to the default selected state when cloning options
21929                    } else if ( nodeName === "input" || nodeName === "textarea" ) {
21930                        dest.defaultValue = src.defaultValue;
21931                    }
21932                }
21933
21934                function domManip( collection, args, callback, ignored ) {
21935
21936                    // Flatten any nested arrays
21937                    args = flat( args );
21938
21939                    var fragment, first, scripts, hasScripts, node, doc,
21940                        i = 0,
21941                        l = collection.length,
21942                        iNoClone = l - 1,
21943                        value = args[ 0 ],
21944                        valueIsFunction = isFunction( value );
21945
21946                    // We can't cloneNode fragments that contain checked, in WebKit
21947                    if ( valueIsFunction ||
21948                        ( l > 1 && typeof value === "string" &&
21949                            !support.checkClone && rchecked.test( value ) ) ) {
21950                        return collection.each( function( index ) {
21951                            var self = collection.eq( index );
21952                            if ( valueIsFunction ) {
21953                                args[ 0 ] = value.call( this, index, self.html() );
21954                            }
21955                            domManip( self, args, callback, ignored );
21956                        } );
21957                    }
21958
21959                    if ( l ) {
21960                        fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
21961                        first = fragment.firstChild;
21962
21963                        if ( fragment.childNodes.length === 1 ) {
21964                            fragment = first;
21965                        }
21966
21967                        // Require either new content or an interest in ignored elements to invoke the callback
21968                        if ( first || ignored ) {
21969                            scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
21970                            hasScripts = scripts.length;
21971
21972                            // Use the original fragment for the last item
21973                            // instead of the first because it can end up
21974                            // being emptied incorrectly in certain situations (trac-8070).
21975                            for ( ; i < l; i++ ) {
21976                                node = fragment;
21977
21978                                if ( i !== iNoClone ) {
21979                                    node = jQuery.clone( node, true, true );
21980
21981                                    // Keep references to cloned scripts for later restoration
21982                                    if ( hasScripts ) {
21983
21984                                        // Support: Android <=4.0 only, PhantomJS 1 only
21985                                        // push.apply(_, arraylike) throws on ancient WebKit
21986                                        jQuery.merge( scripts, getAll( node, "script" ) );
21987                                    }
21988                                }
21989
21990                                callback.call( collection[ i ], node, i );
21991                            }
21992
21993                            if ( hasScripts ) {
21994                                doc = scripts[ scripts.length - 1 ].ownerDocument;
21995
21996                                // Re-enable scripts
21997                                jQuery.map( scripts, restoreScript );
21998
21999                                // Evaluate executable scripts on first document insertion
22000                                for ( i = 0; i < hasScripts; i++ ) {
22001                                    node = scripts[ i ];
22002                                    if ( rscriptType.test( node.type || "" ) &&
22003                                        !dataPriv.access( node, "globalEval" ) &&
22004                                        jQuery.contains( doc, node ) ) {
22005
22006                                        if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
22007
22008                                            // Optional AJAX dependency, but won't run scripts if not present
22009                                            if ( jQuery._evalUrl && !node.noModule ) {
22010                                                jQuery._evalUrl( node.src, {
22011                                                    nonce: node.nonce || node.getAttribute( "nonce" )
22012                                                }, doc );
22013                                            }
22014                                        } else {
22015
22016                                            // Unwrap a CDATA section containing script contents. This shouldn't be
22017                                            // needed as in XML documents they're already not visible when
22018                                            // inspecting element contents and in HTML documents they have no
22019                                            // meaning but we're preserving that logic for backwards compatibility.
22020                                            // This will be removed completely in 4.0. See gh-4904.
22021                                            DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
22022                                        }
22023                                    }
22024                                }
22025                            }
22026                        }
22027                    }
22028
22029                    return collection;
22030                }
22031
22032                function remove( elem, selector, keepData ) {
22033                    var node,
22034                        nodes = selector ? jQuery.filter( selector, elem ) : elem,
22035                        i = 0;
22036
22037                    for ( ; ( node = nodes[ i ] ) != null; i++ ) {
22038                        if ( !keepData && node.nodeType === 1 ) {
22039                            jQuery.cleanData( getAll( node ) );
22040                        }
22041
22042                        if ( node.parentNode ) {
22043                            if ( keepData && isAttached( node ) ) {
22044                                setGlobalEval( getAll( node, "script" ) );
22045                            }
22046                            node.parentNode.removeChild( node );
22047                        }
22048                    }
22049
22050                    return elem;
22051                }
22052
22053                jQuery.extend( {
22054                    htmlPrefilter: function( html ) {
22055                        return html;
22056                    },
22057
22058                    clone: function( elem, dataAndEvents, deepDataAndEvents ) {
22059                        var i, l, srcElements, destElements,
22060                            clone = elem.cloneNode( true ),
22061                            inPage = isAttached( elem );
22062
22063                        // Fix IE cloning issues
22064                        if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
22065                            !jQuery.isXMLDoc( elem ) ) {
22066
22067                            // We eschew jQuery#find here for performance reasons:
22068                            // https://jsperf.com/getall-vs-sizzle/2
22069                            destElements = getAll( clone );
22070                            srcElements = getAll( elem );
22071
22072                            for ( i = 0, l = srcElements.length; i < l; i++ ) {
22073                                fixInput( srcElements[ i ], destElements[ i ] );
22074                            }
22075                        }
22076
22077                        // Copy the events from the original to the clone
22078                        if ( dataAndEvents ) {
22079                            if ( deepDataAndEvents ) {
22080                                srcElements = srcElements || getAll( elem );
22081                                destElements = destElements || getAll( clone );
22082
22083                                for ( i = 0, l = srcElements.length; i < l; i++ ) {
22084                                    cloneCopyEvent( srcElements[ i ], destElements[ i ] );
22085                                }
22086                            } else {
22087                                cloneCopyEvent( elem, clone );
22088                            }
22089                        }
22090
22091                        // Preserve script evaluation history
22092                        destElements = getAll( clone, "script" );
22093                        if ( destElements.length > 0 ) {
22094                            setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
22095                        }
22096
22097                        // Return the cloned set
22098                        return clone;
22099                    },
22100
22101                    cleanData: function( elems ) {
22102                        var data, elem, type,
22103                            special = jQuery.event.special,
22104                            i = 0;
22105
22106                        for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
22107                            if ( acceptData( elem ) ) {
22108                                if ( ( data = elem[ dataPriv.expando ] ) ) {
22109                                    if ( data.events ) {
22110                                        for ( type in data.events ) {
22111                                            if ( special[ type ] ) {
22112                                                jQuery.event.remove( elem, type );
22113
22114                                                // This is a shortcut to avoid jQuery.event.remove's overhead
22115                                            } else {
22116                                                jQuery.removeEvent( elem, type, data.handle );
22117                                            }
22118                                        }
22119                                    }
22120
22121                                    // Support: Chrome <=35 - 45+
22122                                    // Assign undefined instead of using delete, see Data#remove
22123                                    elem[ dataPriv.expando ] = undefined;
22124                                }
22125                                if ( elem[ dataUser.expando ] ) {
22126
22127                                    // Support: Chrome <=35 - 45+
22128                                    // Assign undefined instead of using delete, see Data#remove
22129                                    elem[ dataUser.expando ] = undefined;
22130                                }
22131                            }
22132                        }
22133                    }
22134                } );
22135
22136                jQuery.fn.extend( {
22137                    detach: function( selector ) {
22138                        return remove( this, selector, true );
22139                    },
22140
22141                    remove: function( selector ) {
22142                        return remove( this, selector );
22143                    },
22144
22145                    text: function( value ) {
22146                        return access( this, function( value ) {
22147                            return value === undefined ?
22148                                jQuery.text( this ) :
22149                                this.empty().each( function() {
22150                                    if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
22151                                        this.textContent = value;
22152                                    }
22153                                } );
22154                        }, null, value, arguments.length );
22155                    },
22156
22157                    append: function() {
22158                        return domManip( this, arguments, function( elem ) {
22159                            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
22160                                var target = manipulationTarget( this, elem );
22161                                target.appendChild( elem );
22162                            }
22163                        } );
22164                    },
22165
22166                    prepend: function() {
22167                        return domManip( this, arguments, function( elem ) {
22168                            if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
22169                                var target = manipulationTarget( this, elem );
22170                                target.insertBefore( elem, target.firstChild );
22171                            }
22172                        } );
22173                    },
22174
22175                    before: function() {
22176                        return domManip( this, arguments, function( elem ) {
22177                            if ( this.parentNode ) {
22178                                this.parentNode.insertBefore( elem, this );
22179                            }
22180                        } );
22181                    },
22182
22183                    after: function() {
22184                        return domManip( this, arguments, function( elem ) {
22185                            if ( this.parentNode ) {
22186                                this.parentNode.insertBefore( elem, this.nextSibling );
22187                            }
22188                        } );
22189                    },
22190
22191                    empty: function() {
22192                        var elem,
22193                            i = 0;
22194
22195                        for ( ; ( elem = this[ i ] ) != null; i++ ) {
22196                            if ( elem.nodeType === 1 ) {
22197
22198                                // Prevent memory leaks
22199                                jQuery.cleanData( getAll( elem, false ) );
22200
22201                                // Remove any remaining nodes
22202                                elem.textContent = "";
22203                            }
22204                        }
22205
22206                        return this;
22207                    },
22208
22209                    clone: function( dataAndEvents, deepDataAndEvents ) {
22210                        dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
22211                        deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
22212
22213                        return this.map( function() {
22214                            return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
22215                        } );
22216                    },
22217
22218                    html: function( value ) {
22219                        return access( this, function( value ) {
22220                            var elem = this[ 0 ] || {},
22221                                i = 0,
22222                                l = this.length;
22223
22224                            if ( value === undefined && elem.nodeType === 1 ) {
22225                                return elem.innerHTML;
22226                            }
22227
22228                            // See if we can take a shortcut and just use innerHTML
22229                            if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
22230                                !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
22231
22232                                value = jQuery.htmlPrefilter( value );
22233
22234                                try {
22235                                    for ( ; i < l; i++ ) {
22236                                        elem = this[ i ] || {};
22237
22238                                        // Remove element nodes and prevent memory leaks
22239                                        if ( elem.nodeType === 1 ) {
22240                                            jQuery.cleanData( getAll( elem, false ) );
22241                                            elem.innerHTML = value;
22242                                        }
22243                                    }
22244
22245                                    elem = 0;
22246
22247                                    // If using innerHTML throws an exception, use the fallback method
22248                                } catch ( e ) {}
22249                            }
22250
22251                            if ( elem ) {
22252                                this.empty().append( value );
22253                            }
22254                        }, null, value, arguments.length );
22255                    },
22256
22257                    replaceWith: function() {
22258                        var ignored = [];
22259
22260                        // Make the changes, replacing each non-ignored context element with the new content
22261                        return domManip( this, arguments, function( elem ) {
22262                            var parent = this.parentNode;
22263
22264                            if ( jQuery.inArray( this, ignored ) < 0 ) {
22265                                jQuery.cleanData( getAll( this ) );
22266                                if ( parent ) {
22267                                    parent.replaceChild( elem, this );
22268                                }
22269                            }
22270
22271                            // Force callback invocation
22272                        }, ignored );
22273                    }
22274                } );
22275
22276                jQuery.each( {
22277                    appendTo: "append",
22278                    prependTo: "prepend",
22279                    insertBefore: "before",
22280                    insertAfter: "after",
22281                    replaceAll: "replaceWith"
22282                }, function( name, original ) {
22283                    jQuery.fn[ name ] = function( selector ) {
22284                        var elems,
22285                            ret = [],
22286                            insert = jQuery( selector ),
22287                            last = insert.length - 1,
22288                            i = 0;
22289
22290                        for ( ; i <= last; i++ ) {
22291                            elems = i === last ? this : this.clone( true );
22292                            jQuery( insert[ i ] )[ original ]( elems );
22293
22294                            // Support: Android <=4.0 only, PhantomJS 1 only
22295                            // .get() because push.apply(_, arraylike) throws on ancient WebKit
22296                            push.apply( ret, elems.get() );
22297                        }
22298
22299                        return this.pushStack( ret );
22300                    };
22301                } );
22302                var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
22303
22304                var rcustomProp = /^--/;
22305
22306
22307                var getStyles = function( elem ) {
22308
22309                    // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
22310                    // IE throws on elements created in popups
22311                    // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
22312                    var view = elem.ownerDocument.defaultView;
22313
22314                    if ( !view || !view.opener ) {
22315                        view = window;
22316                    }
22317
22318                    return view.getComputedStyle( elem );
22319                };
22320
22321                var swap = function( elem, options, callback ) {
22322                    var ret, name,
22323                        old = {};
22324
22325                    // Remember the old values, and insert the new ones
22326                    for ( name in options ) {
22327                        old[ name ] = elem.style[ name ];
22328                        elem.style[ name ] = options[ name ];
22329                    }
22330
22331                    ret = callback.call( elem );
22332
22333                    // Revert the old values
22334                    for ( name in options ) {
22335                        elem.style[ name ] = old[ name ];
22336                    }
22337
22338                    return ret;
22339                };
22340
22341
22342                var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
22343
22344
22345
22346                ( function() {
22347
22348                    // Executing both pixelPosition & boxSizingReliable tests require only one layout
22349                    // so they're executed at the same time to save the second computation.
22350                    function computeStyleTests() {
22351
22352                        // This is a singleton, we need to execute it only once
22353                        if ( !div ) {
22354                            return;
22355                        }
22356
22357                        container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
22358                            "margin-top:1px;padding:0;border:0";
22359                        div.style.cssText =
22360                            "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
22361                            "margin:auto;border:1px;padding:1px;" +
22362                            "width:60%;top:1%";
22363                        documentElement.appendChild( container ).appendChild( div );
22364
22365                        var divStyle = window.getComputedStyle( div );
22366                        pixelPositionVal = divStyle.top !== "1%";
22367
22368                        // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
22369                        reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
22370
22371                        // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
22372                        // Some styles come back with percentage values, even though they shouldn't
22373                        div.style.right = "60%";
22374                        pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
22375
22376                        // Support: IE 9 - 11 only
22377                        // Detect misreporting of content dimensions for box-sizing:border-box elements
22378                        boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
22379
22380                        // Support: IE 9 only
22381                        // Detect overflow:scroll screwiness (gh-3699)
22382                        // Support: Chrome <=64
22383                        // Don't get tricked when zoom affects offsetWidth (gh-4029)
22384                        div.style.position = "absolute";
22385                        scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
22386
22387                        documentElement.removeChild( container );
22388
22389                        // Nullify the div so it wouldn't be stored in the memory and
22390                        // it will also be a sign that checks already performed
22391                        div = null;
22392                    }
22393
22394                    function roundPixelMeasures( measure ) {
22395                        return Math.round( parseFloat( measure ) );
22396                    }
22397
22398                    var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
22399                        reliableTrDimensionsVal, reliableMarginLeftVal,
22400                        container = document.createElement( "div" ),
22401                        div = document.createElement( "div" );
22402
22403                    // Finish early in limited (non-browser) environments
22404                    if ( !div.style ) {
22405                        return;
22406                    }
22407
22408                    // Support: IE <=9 - 11 only
22409                    // Style of cloned element affects source element cloned (trac-8908)
22410                    div.style.backgroundClip = "content-box";
22411                    div.cloneNode( true ).style.backgroundClip = "";
22412                    support.clearCloneStyle = div.style.backgroundClip === "content-box";
22413
22414                    jQuery.extend( support, {
22415                        boxSizingReliable: function() {
22416                            computeStyleTests();
22417                            return boxSizingReliableVal;
22418                        },
22419                        pixelBoxStyles: function() {
22420                            computeStyleTests();
22421                            return pixelBoxStylesVal;
22422                        },
22423                        pixelPosition: function() {
22424                            computeStyleTests();
22425                            return pixelPositionVal;
22426                        },
22427                        reliableMarginLeft: function() {
22428                            computeStyleTests();
22429                            return reliableMarginLeftVal;
22430                        },
22431                        scrollboxSize: function() {
22432                            computeStyleTests();
22433                            return scrollboxSizeVal;
22434                        },
22435
22436                        // Support: IE 9 - 11+, Edge 15 - 18+
22437                        // IE/Edge misreport `getComputedStyle` of table rows with width/height
22438                        // set in CSS while `offset*` properties report correct values.
22439                        // Behavior in IE 9 is more subtle than in newer versions & it passes
22440                        // some versions of this test; make sure not to make it pass there!
22441                        //
22442                        // Support: Firefox 70+
22443                        // Only Firefox includes border widths
22444                        // in computed dimensions. (gh-4529)
22445                        reliableTrDimensions: function() {
22446                            var table, tr, trChild, trStyle;
22447                            if ( reliableTrDimensionsVal == null ) {
22448                                table = document.createElement( "table" );
22449                                tr = document.createElement( "tr" );
22450                                trChild = document.createElement( "div" );
22451
22452                                table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
22453                                tr.style.cssText = "box-sizing:content-box;border:1px solid";
22454
22455                                // Support: Chrome 86+
22456                                // Height set through cssText does not get applied.
22457                                // Computed height then comes back as 0.
22458                                tr.style.height = "1px";
22459                                trChild.style.height = "9px";
22460
22461                                // Support: Android 8 Chrome 86+
22462                                // In our bodyBackground.html iframe,
22463                                // display for all div elements is set to "inline",
22464                                // which causes a problem only in Android 8 Chrome 86.
22465                                // Ensuring the div is `display: block`
22466                                // gets around this issue.
22467                                trChild.style.display = "block";
22468
22469                                documentElement
22470                                    .appendChild( table )
22471                                    .appendChild( tr )
22472                                    .appendChild( trChild );
22473
22474                                trStyle = window.getComputedStyle( tr );
22475                                reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
22476                                    parseInt( trStyle.borderTopWidth, 10 ) +
22477                                    parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
22478
22479                                documentElement.removeChild( table );
22480                            }
22481                            return reliableTrDimensionsVal;
22482                        }
22483                    } );
22484                } )();
22485
22486
22487                function curCSS( elem, name, computed ) {
22488                    var width, minWidth, maxWidth, ret,
22489                        isCustomProp = rcustomProp.test( name ),
22490
22491                        // Support: Firefox 51+
22492                        // Retrieving style before computed somehow
22493                        // fixes an issue with getting wrong values
22494                        // on detached elements
22495                        style = elem.style;
22496
22497                    computed = computed || getStyles( elem );
22498
22499                    // getPropertyValue is needed for:
22500                    //   .css('filter') (IE 9 only, trac-12537)
22501                    //   .css('--customProperty) (gh-3144)
22502                    if ( computed ) {
22503
22504                        // Support: IE <=9 - 11+
22505                        // IE only supports `"float"` in `getPropertyValue`; in computed styles
22506                        // it's only available as `"cssFloat"`. We no longer modify properties
22507                        // sent to `.css()` apart from camelCasing, so we need to check both.
22508                        // Normally, this would create difference in behavior: if
22509                        // `getPropertyValue` returns an empty string, the value returned
22510                        // by `.css()` would be `undefined`. This is usually the case for
22511                        // disconnected elements. However, in IE even disconnected elements
22512                        // with no styles return `"none"` for `getPropertyValue( "float" )`
22513                        ret = computed.getPropertyValue( name ) || computed[ name ];
22514
22515                        if ( isCustomProp && ret ) {
22516
22517                            // Support: Firefox 105+, Chrome <=105+
22518                            // Spec requires trimming whitespace for custom properties (gh-4926).
22519                            // Firefox only trims leading whitespace. Chrome just collapses
22520                            // both leading & trailing whitespace to a single space.
22521                            //
22522                            // Fall back to `undefined` if empty string returned.
22523                            // This collapses a missing definition with property defined
22524                            // and set to an empty string but there's no standard API
22525                            // allowing us to differentiate them without a performance penalty
22526                            // and returning `undefined` aligns with older jQuery.
22527                            //
22528                            // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
22529                            // as whitespace while CSS does not, but this is not a problem
22530                            // because CSS preprocessing replaces them with U+000A LINE FEED
22531                            // (which *is* CSS whitespace)
22532                            // https://www.w3.org/TR/css-syntax-3/#input-preprocessing
22533                            ret = ret.replace( rtrimCSS, "$1" ) || undefined;
22534                        }
22535
22536                        if ( ret === "" && !isAttached( elem ) ) {
22537                            ret = jQuery.style( elem, name );
22538                        }
22539
22540                        // A tribute to the "awesome hack by Dean Edwards"
22541                        // Android Browser returns percentage for some values,
22542                        // but width seems to be reliably pixels.
22543                        // This is against the CSSOM draft spec:
22544                        // https://drafts.csswg.org/cssom/#resolved-values
22545                        if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
22546
22547                            // Remember the original values
22548                            width = style.width;
22549                            minWidth = style.minWidth;
22550                            maxWidth = style.maxWidth;
22551
22552                            // Put in the new values to get a computed value out
22553                            style.minWidth = style.maxWidth = style.width = ret;
22554                            ret = computed.width;
22555
22556                            // Revert the changed values
22557                            style.width = width;
22558                            style.minWidth = minWidth;
22559                            style.maxWidth = maxWidth;
22560                        }
22561                    }
22562
22563                    return ret !== undefined ?
22564
22565                        // Support: IE <=9 - 11 only
22566                        // IE returns zIndex value as an integer.
22567                        ret + "" :
22568                        ret;
22569                }
22570
22571
22572                function addGetHookIf( conditionFn, hookFn ) {
22573
22574                    // Define the hook, we'll check on the first run if it's really needed.
22575                    return {
22576                        get: function() {
22577                            if ( conditionFn() ) {
22578
22579                                // Hook not needed (or it's not possible to use it due
22580                                // to missing dependency), remove it.
22581                                delete this.get;
22582                                return;
22583                            }
22584
22585                            // Hook needed; redefine it so that the support test is not executed again.
22586                            return ( this.get = hookFn ).apply( this, arguments );
22587                        }
22588                    };
22589                }
22590
22591
22592                var cssPrefixes = [ "Webkit", "Moz", "ms" ],
22593                    emptyStyle = document.createElement( "div" ).style,
22594                    vendorProps = {};
22595
22596// Return a vendor-prefixed property or undefined
22597                function vendorPropName( name ) {
22598
22599                    // Check for vendor prefixed names
22600                    var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
22601                        i = cssPrefixes.length;
22602
22603                    while ( i-- ) {
22604                        name = cssPrefixes[ i ] + capName;
22605                        if ( name in emptyStyle ) {
22606                            return name;
22607                        }
22608                    }
22609                }
22610
22611// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
22612                function finalPropName( name ) {
22613                    var final = jQuery.cssProps[ name ] || vendorProps[ name ];
22614
22615                    if ( final ) {
22616                        return final;
22617                    }
22618                    if ( name in emptyStyle ) {
22619                        return name;
22620                    }
22621                    return vendorProps[ name ] = vendorPropName( name ) || name;
22622                }
22623
22624
22625                var
22626
22627                    // Swappable if display is none or starts with table
22628                    // except "table", "table-cell", or "table-caption"
22629                    // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
22630                    rdisplayswap = /^(none|table(?!-c[ea]).+)/,
22631                    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
22632                    cssNormalTransform = {
22633                        letterSpacing: "0",
22634                        fontWeight: "400"
22635                    };
22636
22637                function setPositiveNumber( _elem, value, subtract ) {
22638
22639                    // Any relative (+/-) values have already been
22640                    // normalized at this point
22641                    var matches = rcssNum.exec( value );
22642                    return matches ?
22643
22644                        // Guard against undefined "subtract", e.g., when used as in cssHooks
22645                        Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
22646                        value;
22647                }
22648
22649                function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
22650                    var i = dimension === "width" ? 1 : 0,
22651                        extra = 0,
22652                        delta = 0,
22653                        marginDelta = 0;
22654
22655                    // Adjustment may not be necessary
22656                    if ( box === ( isBorderBox ? "border" : "content" ) ) {
22657                        return 0;
22658                    }
22659
22660                    for ( ; i < 4; i += 2 ) {
22661
22662                        // Both box models exclude margin
22663                        // Count margin delta separately to only add it after scroll gutter adjustment.
22664                        // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
22665                        if ( box === "margin" ) {
22666                            marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
22667                        }
22668
22669                        // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
22670                        if ( !isBorderBox ) {
22671
22672                            // Add padding
22673                            delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
22674
22675                            // For "border" or "margin", add border
22676                            if ( box !== "padding" ) {
22677                                delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
22678
22679                                // But still keep track of it otherwise
22680                            } else {
22681                                extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
22682                            }
22683
22684                            // If we get here with a border-box (content + padding + border), we're seeking "content" or
22685                            // "padding" or "margin"
22686                        } else {
22687
22688                            // For "content", subtract padding
22689                            if ( box === "content" ) {
22690                                delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
22691                            }
22692
22693                            // For "content" or "padding", subtract border
22694                            if ( box !== "margin" ) {
22695                                delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
22696                            }
22697                        }
22698                    }
22699
22700                    // Account for positive content-box scroll gutter when requested by providing computedVal
22701                    if ( !isBorderBox && computedVal >= 0 ) {
22702
22703                        // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
22704                        // Assuming integer scroll gutter, subtract the rest and round down
22705                        delta += Math.max( 0, Math.ceil(
22706                            elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
22707                            computedVal -
22708                            delta -
22709                            extra -
22710                            0.5
22711
22712                            // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
22713                            // Use an explicit zero to avoid NaN (gh-3964)
22714                        ) ) || 0;
22715                    }
22716
22717                    return delta + marginDelta;
22718                }
22719
22720                function getWidthOrHeight( elem, dimension, extra ) {
22721
22722                    // Start with computed style
22723                    var styles = getStyles( elem ),
22724
22725                        // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
22726                        // Fake content-box until we know it's needed to know the true value.
22727                        boxSizingNeeded = !support.boxSizingReliable() || extra,
22728                        isBorderBox = boxSizingNeeded &&
22729                            jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
22730                        valueIsBorderBox = isBorderBox,
22731
22732                        val = curCSS( elem, dimension, styles ),
22733                        offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
22734
22735                    // Support: Firefox <=54
22736                    // Return a confounding non-pixel value or feign ignorance, as appropriate.
22737                    if ( rnumnonpx.test( val ) ) {
22738                        if ( !extra ) {
22739                            return val;
22740                        }
22741                        val = "auto";
22742                    }
22743
22744
22745                    // Support: IE 9 - 11 only
22746                    // Use offsetWidth/offsetHeight for when box sizing is unreliable.
22747                    // In those cases, the computed value can be trusted to be border-box.
22748                    if ( ( !support.boxSizingReliable() && isBorderBox ||
22749
22750                            // Support: IE 10 - 11+, Edge 15 - 18+
22751                            // IE/Edge misreport `getComputedStyle` of table rows with width/height
22752                            // set in CSS while `offset*` properties report correct values.
22753                            // Interestingly, in some cases IE 9 doesn't suffer from this issue.
22754                            !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
22755
22756                            // Fall back to offsetWidth/offsetHeight when value is "auto"
22757                            // This happens for inline elements with no explicit setting (gh-3571)
22758                            val === "auto" ||
22759
22760                            // Support: Android <=4.1 - 4.3 only
22761                            // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
22762                            !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
22763
22764                        // Make sure the element is visible & connected
22765                        elem.getClientRects().length ) {
22766
22767                        isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
22768
22769                        // Where available, offsetWidth/offsetHeight approximate border box dimensions.
22770                        // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
22771                        // retrieved value as a content box dimension.
22772                        valueIsBorderBox = offsetProp in elem;
22773                        if ( valueIsBorderBox ) {
22774                            val = elem[ offsetProp ];
22775                        }
22776                    }
22777
22778                    // Normalize "" and auto
22779                    val = parseFloat( val ) || 0;
22780
22781                    // Adjust for the element's box model
22782                    return ( val +
22783                        boxModelAdjustment(
22784                            elem,
22785                            dimension,
22786                            extra || ( isBorderBox ? "border" : "content" ),
22787                            valueIsBorderBox,
22788                            styles,
22789
22790                            // Provide the current computed size to request scroll gutter calculation (gh-3589)
22791                            val
22792                        )
22793                    ) + "px";
22794                }
22795
22796                jQuery.extend( {
22797
22798                    // Add in style property hooks for overriding the default
22799                    // behavior of getting and setting a style property
22800                    cssHooks: {
22801                        opacity: {
22802                            get: function( elem, computed ) {
22803                                if ( computed ) {
22804
22805                                    // We should always get a number back from opacity
22806                                    var ret = curCSS( elem, "opacity" );
22807                                    return ret === "" ? "1" : ret;
22808                                }
22809                            }
22810                        }
22811                    },
22812
22813                    // Don't automatically add "px" to these possibly-unitless properties
22814                    cssNumber: {
22815                        animationIterationCount: true,
22816                        aspectRatio: true,
22817                        borderImageSlice: true,
22818                        columnCount: true,
22819                        flexGrow: true,
22820                        flexShrink: true,
22821                        fontWeight: true,
22822                        gridArea: true,
22823                        gridColumn: true,
22824                        gridColumnEnd: true,
22825                        gridColumnStart: true,
22826                        gridRow: true,
22827                        gridRowEnd: true,
22828                        gridRowStart: true,
22829                        lineHeight: true,
22830                        opacity: true,
22831                        order: true,
22832                        orphans: true,
22833                        scale: true,
22834                        widows: true,
22835                        zIndex: true,
22836                        zoom: true,
22837
22838                        // SVG-related
22839                        fillOpacity: true,
22840                        floodOpacity: true,
22841                        stopOpacity: true,
22842                        strokeMiterlimit: true,
22843                        strokeOpacity: true
22844                    },
22845
22846                    // Add in properties whose names you wish to fix before
22847                    // setting or getting the value
22848                    cssProps: {},
22849
22850                    // Get and set the style property on a DOM Node
22851                    style: function( elem, name, value, extra ) {
22852
22853                        // Don't set styles on text and comment nodes
22854                        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
22855                            return;
22856                        }
22857
22858                        // Make sure that we're working with the right name
22859                        var ret, type, hooks,
22860                            origName = camelCase( name ),
22861                            isCustomProp = rcustomProp.test( name ),
22862                            style = elem.style;
22863
22864                        // Make sure that we're working with the right name. We don't
22865                        // want to query the value if it is a CSS custom property
22866                        // since they are user-defined.
22867                        if ( !isCustomProp ) {
22868                            name = finalPropName( origName );
22869                        }
22870
22871                        // Gets hook for the prefixed version, then unprefixed version
22872                        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
22873
22874                        // Check if we're setting a value
22875                        if ( value !== undefined ) {
22876                            type = typeof value;
22877
22878                            // Convert "+=" or "-=" to relative numbers (trac-7345)
22879                            if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
22880                                value = adjustCSS( elem, name, ret );
22881
22882                                // Fixes bug trac-9237
22883                                type = "number";
22884                            }
22885
22886                            // Make sure that null and NaN values aren't set (trac-7116)
22887                            if ( value == null || value !== value ) {
22888                                return;
22889                            }
22890
22891                            // If a number was passed in, add the unit (except for certain CSS properties)
22892                            // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
22893                            // "px" to a few hardcoded values.
22894                            if ( type === "number" && !isCustomProp ) {
22895                                value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
22896                            }
22897
22898                            // background-* props affect original clone's values
22899                            if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
22900                                style[ name ] = "inherit";
22901                            }
22902
22903                            // If a hook was provided, use that value, otherwise just set the specified value
22904                            if ( !hooks || !( "set" in hooks ) ||
22905                                ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
22906
22907                                if ( isCustomProp ) {
22908                                    style.setProperty( name, value );
22909                                } else {
22910                                    style[ name ] = value;
22911                                }
22912                            }
22913
22914                        } else {
22915
22916                            // If a hook was provided get the non-computed value from there
22917                            if ( hooks && "get" in hooks &&
22918                                ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
22919
22920                                return ret;
22921                            }
22922
22923                            // Otherwise just get the value from the style object
22924                            return style[ name ];
22925                        }
22926                    },
22927
22928                    css: function( elem, name, extra, styles ) {
22929                        var val, num, hooks,
22930                            origName = camelCase( name ),
22931                            isCustomProp = rcustomProp.test( name );
22932
22933                        // Make sure that we're working with the right name. We don't
22934                        // want to modify the value if it is a CSS custom property
22935                        // since they are user-defined.
22936                        if ( !isCustomProp ) {
22937                            name = finalPropName( origName );
22938                        }
22939
22940                        // Try prefixed name followed by the unprefixed name
22941                        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
22942
22943                        // If a hook was provided get the computed value from there
22944                        if ( hooks && "get" in hooks ) {
22945                            val = hooks.get( elem, true, extra );
22946                        }
22947
22948                        // Otherwise, if a way to get the computed value exists, use that
22949                        if ( val === undefined ) {
22950                            val = curCSS( elem, name, styles );
22951                        }
22952
22953                        // Convert "normal" to computed value
22954                        if ( val === "normal" && name in cssNormalTransform ) {
22955                            val = cssNormalTransform[ name ];
22956                        }
22957
22958                        // Make numeric if forced or a qualifier was provided and val looks numeric
22959                        if ( extra === "" || extra ) {
22960                            num = parseFloat( val );
22961                            return extra === true || isFinite( num ) ? num || 0 : val;
22962                        }
22963
22964                        return val;
22965                    }
22966                } );
22967
22968                jQuery.each( [ "height", "width" ], function( _i, dimension ) {
22969                    jQuery.cssHooks[ dimension ] = {
22970                        get: function( elem, computed, extra ) {
22971                            if ( computed ) {
22972
22973                                // Certain elements can have dimension info if we invisibly show them
22974                                // but it must have a current display style that would benefit
22975                                return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
22976
22977                                // Support: Safari 8+
22978                                // Table columns in Safari have non-zero offsetWidth & zero
22979                                // getBoundingClientRect().width unless display is changed.
22980                                // Support: IE <=11 only
22981                                // Running getBoundingClientRect on a disconnected node
22982                                // in IE throws an error.
22983                                ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
22984                                    swap( elem, cssShow, function() {
22985                                        return getWidthOrHeight( elem, dimension, extra );
22986                                    } ) :
22987                                    getWidthOrHeight( elem, dimension, extra );
22988                            }
22989                        },
22990
22991                        set: function( elem, value, extra ) {
22992                            var matches,
22993                                styles = getStyles( elem ),
22994
22995                                // Only read styles.position if the test has a chance to fail
22996                                // to avoid forcing a reflow.
22997                                scrollboxSizeBuggy = !support.scrollboxSize() &&
22998                                    styles.position === "absolute",
22999
23000                                // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
23001                                boxSizingNeeded = scrollboxSizeBuggy || extra,
23002                                isBorderBox = boxSizingNeeded &&
23003                                    jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
23004                                subtract = extra ?
23005                                    boxModelAdjustment(
23006                                        elem,
23007                                        dimension,
23008                                        extra,
23009                                        isBorderBox,
23010                                        styles
23011                                    ) :
23012                                    0;
23013
23014                            // Account for unreliable border-box dimensions by comparing offset* to computed and
23015                            // faking a content-box to get border and padding (gh-3699)
23016                            if ( isBorderBox && scrollboxSizeBuggy ) {
23017                                subtract -= Math.ceil(
23018                                    elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
23019                                    parseFloat( styles[ dimension ] ) -
23020                                    boxModelAdjustment( elem, dimension, "border", false, styles ) -
23021                                    0.5
23022                                );
23023                            }
23024
23025                            // Convert to pixels if value adjustment is needed
23026                            if ( subtract && ( matches = rcssNum.exec( value ) ) &&
23027                                ( matches[ 3 ] || "px" ) !== "px" ) {
23028
23029                                elem.style[ dimension ] = value;
23030                                value = jQuery.css( elem, dimension );
23031                            }
23032
23033                            return setPositiveNumber( elem, value, subtract );
23034                        }
23035                    };
23036                } );
23037
23038                jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
23039                    function( elem, computed ) {
23040                        if ( computed ) {
23041                            return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
23042                                elem.getBoundingClientRect().left -
23043                                swap( elem, { marginLeft: 0 }, function() {
23044                                    return elem.getBoundingClientRect().left;
23045                                } )
23046                            ) + "px";
23047                        }
23048                    }
23049                );
23050
23051// These hooks are used by animate to expand properties
23052                jQuery.each( {
23053                    margin: "",
23054                    padding: "",
23055                    border: "Width"
23056                }, function( prefix, suffix ) {
23057                    jQuery.cssHooks[ prefix + suffix ] = {
23058                        expand: function( value ) {
23059                            var i = 0,
23060                                expanded = {},
23061
23062                                // Assumes a single number if not a string
23063                                parts = typeof value === "string" ? value.split( " " ) : [ value ];
23064
23065                            for ( ; i < 4; i++ ) {
23066                                expanded[ prefix + cssExpand[ i ] + suffix ] =
23067                                    parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
23068                            }
23069
23070                            return expanded;
23071                        }
23072                    };
23073
23074                    if ( prefix !== "margin" ) {
23075                        jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
23076                    }
23077                } );
23078
23079                jQuery.fn.extend( {
23080                    css: function( name, value ) {
23081                        return access( this, function( elem, name, value ) {
23082                            var styles, len,
23083                                map = {},
23084                                i = 0;
23085
23086                            if ( Array.isArray( name ) ) {
23087                                styles = getStyles( elem );
23088                                len = name.length;
23089
23090                                for ( ; i < len; i++ ) {
23091                                    map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
23092                                }
23093
23094                                return map;
23095                            }
23096
23097                            return value !== undefined ?
23098                                jQuery.style( elem, name, value ) :
23099                                jQuery.css( elem, name );
23100                        }, name, value, arguments.length > 1 );
23101                    }
23102                } );
23103
23104
23105                function Tween( elem, options, prop, end, easing ) {
23106                    return new Tween.prototype.init( elem, options, prop, end, easing );
23107                }
23108                jQuery.Tween = Tween;
23109
23110                Tween.prototype = {
23111                    constructor: Tween,
23112                    init: function( elem, options, prop, end, easing, unit ) {
23113                        this.elem = elem;
23114                        this.prop = prop;
23115                        this.easing = easing || jQuery.easing._default;
23116                        this.options = options;
23117                        this.start = this.now = this.cur();
23118                        this.end = end;
23119                        this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
23120                    },
23121                    cur: function() {
23122                        var hooks = Tween.propHooks[ this.prop ];
23123
23124                        return hooks && hooks.get ?
23125                            hooks.get( this ) :
23126                            Tween.propHooks._default.get( this );
23127                    },
23128                    run: function( percent ) {
23129                        var eased,
23130                            hooks = Tween.propHooks[ this.prop ];
23131
23132                        if ( this.options.duration ) {
23133                            this.pos = eased = jQuery.easing[ this.easing ](
23134                                percent, this.options.duration * percent, 0, 1, this.options.duration
23135                            );
23136                        } else {
23137                            this.pos = eased = percent;
23138                        }
23139                        this.now = ( this.end - this.start ) * eased + this.start;
23140
23141                        if ( this.options.step ) {
23142                            this.options.step.call( this.elem, this.now, this );
23143                        }
23144
23145                        if ( hooks && hooks.set ) {
23146                            hooks.set( this );
23147                        } else {
23148                            Tween.propHooks._default.set( this );
23149                        }
23150                        return this;
23151                    }
23152                };
23153
23154                Tween.prototype.init.prototype = Tween.prototype;
23155
23156                Tween.propHooks = {
23157                    _default: {
23158                        get: function( tween ) {
23159                            var result;
23160
23161                            // Use a property on the element directly when it is not a DOM element,
23162                            // or when there is no matching style property that exists.
23163                            if ( tween.elem.nodeType !== 1 ||
23164                                tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
23165                                return tween.elem[ tween.prop ];
23166                            }
23167
23168                            // Passing an empty string as a 3rd parameter to .css will automatically
23169                            // attempt a parseFloat and fallback to a string if the parse fails.
23170                            // Simple values such as "10px" are parsed to Float;
23171                            // complex values such as "rotate(1rad)" are returned as-is.
23172                            result = jQuery.css( tween.elem, tween.prop, "" );
23173
23174                            // Empty strings, null, undefined and "auto" are converted to 0.
23175                            return !result || result === "auto" ? 0 : result;
23176                        },
23177                        set: function( tween ) {
23178
23179                            // Use step hook for back compat.
23180                            // Use cssHook if its there.
23181                            // Use .style if available and use plain properties where available.
23182                            if ( jQuery.fx.step[ tween.prop ] ) {
23183                                jQuery.fx.step[ tween.prop ]( tween );
23184                            } else if ( tween.elem.nodeType === 1 && (
23185                                jQuery.cssHooks[ tween.prop ] ||
23186                                tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
23187                                jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
23188                            } else {
23189                                tween.elem[ tween.prop ] = tween.now;
23190                            }
23191                        }
23192                    }
23193                };
23194
23195// Support: IE <=9 only
23196// Panic based approach to setting things on disconnected nodes
23197                Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
23198                    set: function( tween ) {
23199                        if ( tween.elem.nodeType && tween.elem.parentNode ) {
23200                            tween.elem[ tween.prop ] = tween.now;
23201                        }
23202                    }
23203                };
23204
23205                jQuery.easing = {
23206                    linear: function( p ) {
23207                        return p;
23208                    },
23209                    swing: function( p ) {
23210                        return 0.5 - Math.cos( p * Math.PI ) / 2;
23211                    },
23212                    _default: "swing"
23213                };
23214
23215                jQuery.fx = Tween.prototype.init;
23216
23217// Back compat <1.8 extension point
23218                jQuery.fx.step = {};
23219
23220
23221
23222
23223                var
23224                    fxNow, inProgress,
23225                    rfxtypes = /^(?:toggle|show|hide)$/,
23226                    rrun = /queueHooks$/;
23227
23228                function schedule() {
23229                    if ( inProgress ) {
23230                        if ( document.hidden === false && window.requestAnimationFrame ) {
23231                            window.requestAnimationFrame( schedule );
23232                        } else {
23233                            window.setTimeout( schedule, jQuery.fx.interval );
23234                        }
23235
23236                        jQuery.fx.tick();
23237                    }
23238                }
23239
23240// Animations created synchronously will run synchronously
23241                function createFxNow() {
23242                    window.setTimeout( function() {
23243                        fxNow = undefined;
23244                    } );
23245                    return ( fxNow = Date.now() );
23246                }
23247
23248// Generate parameters to create a standard animation
23249                function genFx( type, includeWidth ) {
23250                    var which,
23251                        i = 0,
23252                        attrs = { height: type };
23253
23254                    // If we include width, step value is 1 to do all cssExpand values,
23255                    // otherwise step value is 2 to skip over Left and Right
23256                    includeWidth = includeWidth ? 1 : 0;
23257                    for ( ; i < 4; i += 2 - includeWidth ) {
23258                        which = cssExpand[ i ];
23259                        attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
23260                    }
23261
23262                    if ( includeWidth ) {
23263                        attrs.opacity = attrs.width = type;
23264                    }
23265
23266                    return attrs;
23267                }
23268
23269                function createTween( value, prop, animation ) {
23270                    var tween,
23271                        collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
23272                        index = 0,
23273                        length = collection.length;
23274                    for ( ; index < length; index++ ) {
23275                        if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
23276
23277                            // We're done with this property
23278                            return tween;
23279                        }
23280                    }
23281                }
23282
23283                function defaultPrefilter( elem, props, opts ) {
23284                    var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
23285                        isBox = "width" in props || "height" in props,
23286                        anim = this,
23287                        orig = {},
23288                        style = elem.style,
23289                        hidden = elem.nodeType && isHiddenWithinTree( elem ),
23290                        dataShow = dataPriv.get( elem, "fxshow" );
23291
23292                    // Queue-skipping animations hijack the fx hooks
23293                    if ( !opts.queue ) {
23294                        hooks = jQuery._queueHooks( elem, "fx" );
23295                        if ( hooks.unqueued == null ) {
23296                            hooks.unqueued = 0;
23297                            oldfire = hooks.empty.fire;
23298                            hooks.empty.fire = function() {
23299                                if ( !hooks.unqueued ) {
23300                                    oldfire();
23301                                }
23302                            };
23303                        }
23304                        hooks.unqueued++;
23305
23306                        anim.always( function() {
23307
23308                            // Ensure the complete handler is called before this completes
23309                            anim.always( function() {
23310                                hooks.unqueued--;
23311                                if ( !jQuery.queue( elem, "fx" ).length ) {
23312                                    hooks.empty.fire();
23313                                }
23314                            } );
23315                        } );
23316                    }
23317
23318                    // Detect show/hide animations
23319                    for ( prop in props ) {
23320                        value = props[ prop ];
23321                        if ( rfxtypes.test( value ) ) {
23322                            delete props[ prop ];
23323                            toggle = toggle || value === "toggle";
23324                            if ( value === ( hidden ? "hide" : "show" ) ) {
23325
23326                                // Pretend to be hidden if this is a "show" and
23327                                // there is still data from a stopped show/hide
23328                                if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
23329                                    hidden = true;
23330
23331                                    // Ignore all other no-op show/hide data
23332                                } else {
23333                                    continue;
23334                                }
23335                            }
23336                            orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
23337                        }
23338                    }
23339
23340                    // Bail out if this is a no-op like .hide().hide()
23341                    propTween = !jQuery.isEmptyObject( props );
23342                    if ( !propTween && jQuery.isEmptyObject( orig ) ) {
23343                        return;
23344                    }
23345
23346                    // Restrict "overflow" and "display" styles during box animations
23347                    if ( isBox && elem.nodeType === 1 ) {
23348
23349                        // Support: IE <=9 - 11, Edge 12 - 15
23350                        // Record all 3 overflow attributes because IE does not infer the shorthand
23351                        // from identically-valued overflowX and overflowY and Edge just mirrors
23352                        // the overflowX value there.
23353                        opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
23354
23355                        // Identify a display type, preferring old show/hide data over the CSS cascade
23356                        restoreDisplay = dataShow && dataShow.display;
23357                        if ( restoreDisplay == null ) {
23358                            restoreDisplay = dataPriv.get( elem, "display" );
23359                        }
23360                        display = jQuery.css( elem, "display" );
23361                        if ( display === "none" ) {
23362                            if ( restoreDisplay ) {
23363                                display = restoreDisplay;
23364                            } else {
23365
23366                                // Get nonempty value(s) by temporarily forcing visibility
23367                                showHide( [ elem ], true );
23368                                restoreDisplay = elem.style.display || restoreDisplay;
23369                                display = jQuery.css( elem, "display" );
23370                                showHide( [ elem ] );
23371                            }
23372                        }
23373
23374                        // Animate inline elements as inline-block
23375                        if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
23376                            if ( jQuery.css( elem, "float" ) === "none" ) {
23377
23378                                // Restore the original display value at the end of pure show/hide animations
23379                                if ( !propTween ) {
23380                                    anim.done( function() {
23381                                        style.display = restoreDisplay;
23382                                    } );
23383                                    if ( restoreDisplay == null ) {
23384                                        display = style.display;
23385                                        restoreDisplay = display === "none" ? "" : display;
23386                                    }
23387                                }
23388                                style.display = "inline-block";
23389                            }
23390                        }
23391                    }
23392
23393                    if ( opts.overflow ) {
23394                        style.overflow = "hidden";
23395                        anim.always( function() {
23396                            style.overflow = opts.overflow[ 0 ];
23397                            style.overflowX = opts.overflow[ 1 ];
23398                            style.overflowY = opts.overflow[ 2 ];
23399                        } );
23400                    }
23401
23402                    // Implement show/hide animations
23403                    propTween = false;
23404                    for ( prop in orig ) {
23405
23406                        // General show/hide setup for this element animation
23407                        if ( !propTween ) {
23408                            if ( dataShow ) {
23409                                if ( "hidden" in dataShow ) {
23410                                    hidden = dataShow.hidden;
23411                                }
23412                            } else {
23413                                dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
23414                            }
23415
23416                            // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
23417                            if ( toggle ) {
23418                                dataShow.hidden = !hidden;
23419                            }
23420
23421                            // Show elements before animating them
23422                            if ( hidden ) {
23423                                showHide( [ elem ], true );
23424                            }
23425
23426                            /* eslint-disable no-loop-func */
23427
23428                            anim.done( function() {
23429
23430                                /* eslint-enable no-loop-func */
23431
23432                                // The final step of a "hide" animation is actually hiding the element
23433                                if ( !hidden ) {
23434                                    showHide( [ elem ] );
23435                                }
23436                                dataPriv.remove( elem, "fxshow" );
23437                                for ( prop in orig ) {
23438                                    jQuery.style( elem, prop, orig[ prop ] );
23439                                }
23440                            } );
23441                        }
23442
23443                        // Per-property setup
23444                        propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
23445                        if ( !( prop in dataShow ) ) {
23446                            dataShow[ prop ] = propTween.start;
23447                            if ( hidden ) {
23448                                propTween.end = propTween.start;
23449                                propTween.start = 0;
23450                            }
23451                        }
23452                    }
23453                }
23454
23455                function propFilter( props, specialEasing ) {
23456                    var index, name, easing, value, hooks;
23457
23458                    // camelCase, specialEasing and expand cssHook pass
23459                    for ( index in props ) {
23460                        name = camelCase( index );
23461                        easing = specialEasing[ name ];
23462                        value = props[ index ];
23463                        if ( Array.isArray( value ) ) {
23464                            easing = value[ 1 ];
23465                            value = props[ index ] = value[ 0 ];
23466                        }
23467
23468                        if ( index !== name ) {
23469                            props[ name ] = value;
23470                            delete props[ index ];
23471                        }
23472
23473                        hooks = jQuery.cssHooks[ name ];
23474                        if ( hooks && "expand" in hooks ) {
23475                            value = hooks.expand( value );
23476                            delete props[ name ];
23477
23478                            // Not quite $.extend, this won't overwrite existing keys.
23479                            // Reusing 'index' because we have the correct "name"
23480                            for ( index in value ) {
23481                                if ( !( index in props ) ) {
23482                                    props[ index ] = value[ index ];
23483                                    specialEasing[ index ] = easing;
23484                                }
23485                            }
23486                        } else {
23487                            specialEasing[ name ] = easing;
23488                        }
23489                    }
23490                }
23491
23492                function Animation( elem, properties, options ) {
23493                    var result,
23494                        stopped,
23495                        index = 0,
23496                        length = Animation.prefilters.length,
23497                        deferred = jQuery.Deferred().always( function() {
23498
23499                            // Don't match elem in the :animated selector
23500                            delete tick.elem;
23501                        } ),
23502                        tick = function() {
23503                            if ( stopped ) {
23504                                return false;
23505                            }
23506                            var currentTime = fxNow || createFxNow(),
23507                                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
23508
23509                                // Support: Android 2.3 only
23510                                // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
23511                                temp = remaining / animation.duration || 0,
23512                                percent = 1 - temp,
23513                                index = 0,
23514                                length = animation.tweens.length;
23515
23516                            for ( ; index < length; index++ ) {
23517                                animation.tweens[ index ].run( percent );
23518                            }
23519
23520                            deferred.notifyWith( elem, [ animation, percent, remaining ] );
23521
23522                            // If there's more to do, yield
23523                            if ( percent < 1 && length ) {
23524                                return remaining;
23525                            }
23526
23527                            // If this was an empty animation, synthesize a final progress notification
23528                            if ( !length ) {
23529                                deferred.notifyWith( elem, [ animation, 1, 0 ] );
23530                            }
23531
23532                            // Resolve the animation and report its conclusion
23533                            deferred.resolveWith( elem, [ animation ] );
23534                            return false;
23535                        },
23536                        animation = deferred.promise( {
23537                            elem: elem,
23538                            props: jQuery.extend( {}, properties ),
23539                            opts: jQuery.extend( true, {
23540                                specialEasing: {},
23541                                easing: jQuery.easing._default
23542                            }, options ),
23543                            originalProperties: properties,
23544                            originalOptions: options,
23545                            startTime: fxNow || createFxNow(),
23546                            duration: options.duration,
23547                            tweens: [],
23548                            createTween: function( prop, end ) {
23549                                var tween = jQuery.Tween( elem, animation.opts, prop, end,
23550                                    animation.opts.specialEasing[ prop ] || animation.opts.easing );
23551                                animation.tweens.push( tween );
23552                                return tween;
23553                            },
23554                            stop: function( gotoEnd ) {
23555                                var index = 0,
23556
23557                                    // If we are going to the end, we want to run all the tweens
23558                                    // otherwise we skip this part
23559                                    length = gotoEnd ? animation.tweens.length : 0;
23560                                if ( stopped ) {
23561                                    return this;
23562                                }
23563                                stopped = true;
23564                                for ( ; index < length; index++ ) {
23565                                    animation.tweens[ index ].run( 1 );
23566                                }
23567
23568                                // Resolve when we played the last frame; otherwise, reject
23569                                if ( gotoEnd ) {
23570                                    deferred.notifyWith( elem, [ animation, 1, 0 ] );
23571                                    deferred.resolveWith( elem, [ animation, gotoEnd ] );
23572                                } else {
23573                                    deferred.rejectWith( elem, [ animation, gotoEnd ] );
23574                                }
23575                                return this;
23576                            }
23577                        } ),
23578                        props = animation.props;
23579
23580                    propFilter( props, animation.opts.specialEasing );
23581
23582                    for ( ; index < length; index++ ) {
23583                        result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
23584                        if ( result ) {
23585                            if ( isFunction( result.stop ) ) {
23586                                jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
23587                                    result.stop.bind( result );
23588                            }
23589                            return result;
23590                        }
23591                    }
23592
23593                    jQuery.map( props, createTween, animation );
23594
23595                    if ( isFunction( animation.opts.start ) ) {
23596                        animation.opts.start.call( elem, animation );
23597                    }
23598
23599                    // Attach callbacks from options
23600                    animation
23601                        .progress( animation.opts.progress )
23602                        .done( animation.opts.done, animation.opts.complete )
23603                        .fail( animation.opts.fail )
23604                        .always( animation.opts.always );
23605
23606                    jQuery.fx.timer(
23607                        jQuery.extend( tick, {
23608                            elem: elem,
23609                            anim: animation,
23610                            queue: animation.opts.queue
23611                        } )
23612                    );
23613
23614                    return animation;
23615                }
23616
23617                jQuery.Animation = jQuery.extend( Animation, {
23618
23619                    tweeners: {
23620                        "*": [ function( prop, value ) {
23621                            var tween = this.createTween( prop, value );
23622                            adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
23623                            return tween;
23624                        } ]
23625                    },
23626
23627                    tweener: function( props, callback ) {
23628                        if ( isFunction( props ) ) {
23629                            callback = props;
23630                            props = [ "*" ];
23631                        } else {
23632                            props = props.match( rnothtmlwhite );
23633                        }
23634
23635                        var prop,
23636                            index = 0,
23637                            length = props.length;
23638
23639                        for ( ; index < length; index++ ) {
23640                            prop = props[ index ];
23641                            Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
23642                            Animation.tweeners[ prop ].unshift( callback );
23643                        }
23644                    },
23645
23646                    prefilters: [ defaultPrefilter ],
23647
23648                    prefilter: function( callback, prepend ) {
23649                        if ( prepend ) {
23650                            Animation.prefilters.unshift( callback );
23651                        } else {
23652                            Animation.prefilters.push( callback );
23653                        }
23654                    }
23655                } );
23656
23657                jQuery.speed = function( speed, easing, fn ) {
23658                    var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
23659                        complete: fn || !fn && easing ||
23660                            isFunction( speed ) && speed,
23661                        duration: speed,
23662                        easing: fn && easing || easing && !isFunction( easing ) && easing
23663                    };
23664
23665                    // Go to the end state if fx are off
23666                    if ( jQuery.fx.off ) {
23667                        opt.duration = 0;
23668
23669                    } else {
23670                        if ( typeof opt.duration !== "number" ) {
23671                            if ( opt.duration in jQuery.fx.speeds ) {
23672                                opt.duration = jQuery.fx.speeds[ opt.duration ];
23673
23674                            } else {
23675                                opt.duration = jQuery.fx.speeds._default;
23676                            }
23677                        }
23678                    }
23679
23680                    // Normalize opt.queue - true/undefined/null -> "fx"
23681                    if ( opt.queue == null || opt.queue === true ) {
23682                        opt.queue = "fx";
23683                    }
23684
23685                    // Queueing
23686                    opt.old = opt.complete;
23687
23688                    opt.complete = function() {
23689                        if ( isFunction( opt.old ) ) {
23690                            opt.old.call( this );
23691                        }
23692
23693                        if ( opt.queue ) {
23694                            jQuery.dequeue( this, opt.queue );
23695                        }
23696                    };
23697
23698                    return opt;
23699                };
23700
23701                jQuery.fn.extend( {
23702                    fadeTo: function( speed, to, easing, callback ) {
23703
23704                        // Show any hidden elements after setting opacity to 0
23705                        return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
23706
23707                            // Animate to the value specified
23708                            .end().animate( { opacity: to }, speed, easing, callback );
23709                    },
23710                    animate: function( prop, speed, easing, callback ) {
23711                        var empty = jQuery.isEmptyObject( prop ),
23712                            optall = jQuery.speed( speed, easing, callback ),
23713                            doAnimation = function() {
23714
23715                                // Operate on a copy of prop so per-property easing won't be lost
23716                                var anim = Animation( this, jQuery.extend( {}, prop ), optall );
23717
23718                                // Empty animations, or finishing resolves immediately
23719                                if ( empty || dataPriv.get( this, "finish" ) ) {
23720                                    anim.stop( true );
23721                                }
23722                            };
23723
23724                        doAnimation.finish = doAnimation;
23725
23726                        return empty || optall.queue === false ?
23727                            this.each( doAnimation ) :
23728                            this.queue( optall.queue, doAnimation );
23729                    },
23730                    stop: function( type, clearQueue, gotoEnd ) {
23731                        var stopQueue = function( hooks ) {
23732                            var stop = hooks.stop;
23733                            delete hooks.stop;
23734                            stop( gotoEnd );
23735                        };
23736
23737                        if ( typeof type !== "string" ) {
23738                            gotoEnd = clearQueue;
23739                            clearQueue = type;
23740                            type = undefined;
23741                        }
23742                        if ( clearQueue ) {
23743                            this.queue( type || "fx", [] );
23744                        }
23745
23746                        return this.each( function() {
23747                            var dequeue = true,
23748                                index = type != null && type + "queueHooks",
23749                                timers = jQuery.timers,
23750                                data = dataPriv.get( this );
23751
23752                            if ( index ) {
23753                                if ( data[ index ] && data[ index ].stop ) {
23754                                    stopQueue( data[ index ] );
23755                                }
23756                            } else {
23757                                for ( index in data ) {
23758                                    if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
23759                                        stopQueue( data[ index ] );
23760                                    }
23761                                }
23762                            }
23763
23764                            for ( index = timers.length; index--; ) {
23765                                if ( timers[ index ].elem === this &&
23766                                    ( type == null || timers[ index ].queue === type ) ) {
23767
23768                                    timers[ index ].anim.stop( gotoEnd );
23769                                    dequeue = false;
23770                                    timers.splice( index, 1 );
23771                                }
23772                            }
23773
23774                            // Start the next in the queue if the last step wasn't forced.
23775                            // Timers currently will call their complete callbacks, which
23776                            // will dequeue but only if they were gotoEnd.
23777                            if ( dequeue || !gotoEnd ) {
23778                                jQuery.dequeue( this, type );
23779                            }
23780                        } );
23781                    },
23782                    finish: function( type ) {
23783                        if ( type !== false ) {
23784                            type = type || "fx";
23785                        }
23786                        return this.each( function() {
23787                            var index,
23788                                data = dataPriv.get( this ),
23789                                queue = data[ type + "queue" ],
23790                                hooks = data[ type + "queueHooks" ],
23791                                timers = jQuery.timers,
23792                                length = queue ? queue.length : 0;
23793
23794                            // Enable finishing flag on private data
23795                            data.finish = true;
23796
23797                            // Empty the queue first
23798                            jQuery.queue( this, type, [] );
23799
23800                            if ( hooks && hooks.stop ) {
23801                                hooks.stop.call( this, true );
23802                            }
23803
23804                            // Look for any active animations, and finish them
23805                            for ( index = timers.length; index--; ) {
23806                                if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
23807                                    timers[ index ].anim.stop( true );
23808                                    timers.splice( index, 1 );
23809                                }
23810                            }
23811
23812                            // Look for any animations in the old queue and finish them
23813                            for ( index = 0; index < length; index++ ) {
23814                                if ( queue[ index ] && queue[ index ].finish ) {
23815                                    queue[ index ].finish.call( this );
23816                                }
23817                            }
23818
23819                            // Turn off finishing flag
23820                            delete data.finish;
23821                        } );
23822                    }
23823                } );
23824
23825                jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
23826                    var cssFn = jQuery.fn[ name ];
23827                    jQuery.fn[ name ] = function( speed, easing, callback ) {
23828                        return speed == null || typeof speed === "boolean" ?
23829                            cssFn.apply( this, arguments ) :
23830                            this.animate( genFx( name, true ), speed, easing, callback );
23831                    };
23832                } );
23833
23834// Generate shortcuts for custom animations
23835                jQuery.each( {
23836                    slideDown: genFx( "show" ),
23837                    slideUp: genFx( "hide" ),
23838                    slideToggle: genFx( "toggle" ),
23839                    fadeIn: { opacity: "show" },
23840                    fadeOut: { opacity: "hide" },
23841                    fadeToggle: { opacity: "toggle" }
23842                }, function( name, props ) {
23843                    jQuery.fn[ name ] = function( speed, easing, callback ) {
23844                        return this.animate( props, speed, easing, callback );
23845                    };
23846                } );
23847
23848                jQuery.timers = [];
23849                jQuery.fx.tick = function() {
23850                    var timer,
23851                        i = 0,
23852                        timers = jQuery.timers;
23853
23854                    fxNow = Date.now();
23855
23856                    for ( ; i < timers.length; i++ ) {
23857                        timer = timers[ i ];
23858
23859                        // Run the timer and safely remove it when done (allowing for external removal)
23860                        if ( !timer() && timers[ i ] === timer ) {
23861                            timers.splice( i--, 1 );
23862                        }
23863                    }
23864
23865                    if ( !timers.length ) {
23866                        jQuery.fx.stop();
23867                    }
23868                    fxNow = undefined;
23869                };
23870
23871                jQuery.fx.timer = function( timer ) {
23872                    jQuery.timers.push( timer );
23873                    jQuery.fx.start();
23874                };
23875
23876                jQuery.fx.interval = 13;
23877                jQuery.fx.start = function() {
23878                    if ( inProgress ) {
23879                        return;
23880                    }
23881
23882                    inProgress = true;
23883                    schedule();
23884                };
23885
23886                jQuery.fx.stop = function() {
23887                    inProgress = null;
23888                };
23889
23890                jQuery.fx.speeds = {
23891                    slow: 600,
23892                    fast: 200,
23893
23894                    // Default speed
23895                    _default: 400
23896                };
23897
23898
23899// Based off of the plugin by Clint Helfers, with permission.
23900                jQuery.fn.delay = function( time, type ) {
23901                    time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
23902                    type = type || "fx";
23903
23904                    return this.queue( type, function( next, hooks ) {
23905                        var timeout = window.setTimeout( next, time );
23906                        hooks.stop = function() {
23907                            window.clearTimeout( timeout );
23908                        };
23909                    } );
23910                };
23911
23912
23913                ( function() {
23914                    var input = document.createElement( "input" ),
23915                        select = document.createElement( "select" ),
23916                        opt = select.appendChild( document.createElement( "option" ) );
23917
23918                    input.type = "checkbox";
23919
23920                    // Support: Android <=4.3 only
23921                    // Default value for a checkbox should be "on"
23922                    support.checkOn = input.value !== "";
23923
23924                    // Support: IE <=11 only
23925                    // Must access selectedIndex to make default options select
23926                    support.optSelected = opt.selected;
23927
23928                    // Support: IE <=11 only
23929                    // An input loses its value after becoming a radio
23930                    input = document.createElement( "input" );
23931                    input.value = "t";
23932                    input.type = "radio";
23933                    support.radioValue = input.value === "t";
23934                } )();
23935
23936
23937                var boolHook,
23938                    attrHandle = jQuery.expr.attrHandle;
23939
23940                jQuery.fn.extend( {
23941                    attr: function( name, value ) {
23942                        return access( this, jQuery.attr, name, value, arguments.length > 1 );
23943                    },
23944
23945                    removeAttr: function( name ) {
23946                        return this.each( function() {
23947                            jQuery.removeAttr( this, name );
23948                        } );
23949                    }
23950                } );
23951
23952                jQuery.extend( {
23953                    attr: function( elem, name, value ) {
23954                        var ret, hooks,
23955                            nType = elem.nodeType;
23956
23957                        // Don't get/set attributes on text, comment and attribute nodes
23958                        if ( nType === 3 || nType === 8 || nType === 2 ) {
23959                            return;
23960                        }
23961
23962                        // Fallback to prop when attributes are not supported
23963                        if ( typeof elem.getAttribute === "undefined" ) {
23964                            return jQuery.prop( elem, name, value );
23965                        }
23966
23967                        // Attribute hooks are determined by the lowercase version
23968                        // Grab necessary hook if one is defined
23969                        if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
23970                            hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
23971                                ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
23972                        }
23973
23974                        if ( value !== undefined ) {
23975                            if ( value === null ) {
23976                                jQuery.removeAttr( elem, name );
23977                                return;
23978                            }
23979
23980                            if ( hooks && "set" in hooks &&
23981                                ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
23982                                return ret;
23983                            }
23984
23985                            elem.setAttribute( name, value + "" );
23986                            return value;
23987                        }
23988
23989                        if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
23990                            return ret;
23991                        }
23992
23993                        ret = jQuery.find.attr( elem, name );
23994
23995                        // Non-existent attributes return null, we normalize to undefined
23996                        return ret == null ? undefined : ret;
23997                    },
23998
23999                    attrHooks: {
24000                        type: {
24001                            set: function( elem, value ) {
24002                                if ( !support.radioValue && value === "radio" &&
24003                                    nodeName( elem, "input" ) ) {
24004                                    var val = elem.value;
24005                                    elem.setAttribute( "type", value );
24006                                    if ( val ) {
24007                                        elem.value = val;
24008                                    }
24009                                    return value;
24010                                }
24011                            }
24012                        }
24013                    },
24014
24015                    removeAttr: function( elem, value ) {
24016                        var name,
24017                            i = 0,
24018
24019                            // Attribute names can contain non-HTML whitespace characters
24020                            // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
24021                            attrNames = value && value.match( rnothtmlwhite );
24022
24023                        if ( attrNames && elem.nodeType === 1 ) {
24024                            while ( ( name = attrNames[ i++ ] ) ) {
24025                                elem.removeAttribute( name );
24026                            }
24027                        }
24028                    }
24029                } );
24030
24031// Hooks for boolean attributes
24032                boolHook = {
24033                    set: function( elem, value, name ) {
24034                        if ( value === false ) {
24035
24036                            // Remove boolean attributes when set to false
24037                            jQuery.removeAttr( elem, name );
24038                        } else {
24039                            elem.setAttribute( name, name );
24040                        }
24041                        return name;
24042                    }
24043                };
24044
24045                jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
24046                    var getter = attrHandle[ name ] || jQuery.find.attr;
24047
24048                    attrHandle[ name ] = function( elem, name, isXML ) {
24049                        var ret, handle,
24050                            lowercaseName = name.toLowerCase();
24051
24052                        if ( !isXML ) {
24053
24054                            // Avoid an infinite loop by temporarily removing this function from the getter
24055                            handle = attrHandle[ lowercaseName ];
24056                            attrHandle[ lowercaseName ] = ret;
24057                            ret = getter( elem, name, isXML ) != null ?
24058                                lowercaseName :
24059                                null;
24060                            attrHandle[ lowercaseName ] = handle;
24061                        }
24062                        return ret;
24063                    };
24064                } );
24065
24066
24067
24068
24069                var rfocusable = /^(?:input|select|textarea|button)$/i,
24070                    rclickable = /^(?:a|area)$/i;
24071
24072                jQuery.fn.extend( {
24073                    prop: function( name, value ) {
24074                        return access( this, jQuery.prop, name, value, arguments.length > 1 );
24075                    },
24076
24077                    removeProp: function( name ) {
24078                        return this.each( function() {
24079                            delete this[ jQuery.propFix[ name ] || name ];
24080                        } );
24081                    }
24082                } );
24083
24084                jQuery.extend( {
24085                    prop: function( elem, name, value ) {
24086                        var ret, hooks,
24087                            nType = elem.nodeType;
24088
24089                        // Don't get/set properties on text, comment and attribute nodes
24090                        if ( nType === 3 || nType === 8 || nType === 2 ) {
24091                            return;
24092                        }
24093
24094                        if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
24095
24096                            // Fix name and attach hooks
24097                            name = jQuery.propFix[ name ] || name;
24098                            hooks = jQuery.propHooks[ name ];
24099                        }
24100
24101                        if ( value !== undefined ) {
24102                            if ( hooks && "set" in hooks &&
24103                                ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
24104                                return ret;
24105                            }
24106
24107                            return ( elem[ name ] = value );
24108                        }
24109
24110                        if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
24111                            return ret;
24112                        }
24113
24114                        return elem[ name ];
24115                    },
24116
24117                    propHooks: {
24118                        tabIndex: {
24119                            get: function( elem ) {
24120
24121                                // Support: IE <=9 - 11 only
24122                                // elem.tabIndex doesn't always return the
24123                                // correct value when it hasn't been explicitly set
24124                                // Use proper attribute retrieval (trac-12072)
24125                                var tabindex = jQuery.find.attr( elem, "tabindex" );
24126
24127                                if ( tabindex ) {
24128                                    return parseInt( tabindex, 10 );
24129                                }
24130
24131                                if (
24132                                    rfocusable.test( elem.nodeName ) ||
24133                                    rclickable.test( elem.nodeName ) &&
24134                                    elem.href
24135                                ) {
24136                                    return 0;
24137                                }
24138
24139                                return -1;
24140                            }
24141                        }
24142                    },
24143
24144                    propFix: {
24145                        "for": "htmlFor",
24146                        "class": "className"
24147                    }
24148                } );
24149
24150// Support: IE <=11 only
24151// Accessing the selectedIndex property
24152// forces the browser to respect setting selected
24153// on the option
24154// The getter ensures a default option is selected
24155// when in an optgroup
24156// eslint rule "no-unused-expressions" is disabled for this code
24157// since it considers such accessions noop
24158                if ( !support.optSelected ) {
24159                    jQuery.propHooks.selected = {
24160                        get: function( elem ) {
24161
24162                            /* eslint no-unused-expressions: "off" */
24163
24164                            var parent = elem.parentNode;
24165                            if ( parent && parent.parentNode ) {
24166                                parent.parentNode.selectedIndex;
24167                            }
24168                            return null;
24169                        },
24170                        set: function( elem ) {
24171
24172                            /* eslint no-unused-expressions: "off" */
24173
24174                            var parent = elem.parentNode;
24175                            if ( parent ) {
24176                                parent.selectedIndex;
24177
24178                                if ( parent.parentNode ) {
24179                                    parent.parentNode.selectedIndex;
24180                                }
24181                            }
24182                        }
24183                    };
24184                }
24185
24186                jQuery.each( [
24187                    "tabIndex",
24188                    "readOnly",
24189                    "maxLength",
24190                    "cellSpacing",
24191                    "cellPadding",
24192                    "rowSpan",
24193                    "colSpan",
24194                    "useMap",
24195                    "frameBorder",
24196                    "contentEditable"
24197                ], function() {
24198                    jQuery.propFix[ this.toLowerCase() ] = this;
24199                } );
24200
24201
24202
24203
24204                // Strip and collapse whitespace according to HTML spec
24205                // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
24206                function stripAndCollapse( value ) {
24207                    var tokens = value.match( rnothtmlwhite ) || [];
24208                    return tokens.join( " " );
24209                }
24210
24211
24212                function getClass( elem ) {
24213                    return elem.getAttribute && elem.getAttribute( "class" ) || "";
24214                }
24215
24216                function classesToArray( value ) {
24217                    if ( Array.isArray( value ) ) {
24218                        return value;
24219                    }
24220                    if ( typeof value === "string" ) {
24221                        return value.match( rnothtmlwhite ) || [];
24222                    }
24223                    return [];
24224                }
24225
24226                jQuery.fn.extend( {
24227                    addClass: function( value ) {
24228                        var classNames, cur, curValue, className, i, finalValue;
24229
24230                        if ( isFunction( value ) ) {
24231                            return this.each( function( j ) {
24232                                jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
24233                            } );
24234                        }
24235
24236                        classNames = classesToArray( value );
24237
24238                        if ( classNames.length ) {
24239                            return this.each( function() {
24240                                curValue = getClass( this );
24241                                cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
24242
24243                                if ( cur ) {
24244                                    for ( i = 0; i < classNames.length; i++ ) {
24245                                        className = classNames[ i ];
24246                                        if ( cur.indexOf( " " + className + " " ) < 0 ) {
24247                                            cur += className + " ";
24248                                        }
24249                                    }
24250
24251                                    // Only assign if different to avoid unneeded rendering.
24252                                    finalValue = stripAndCollapse( cur );
24253                                    if ( curValue !== finalValue ) {
24254                                        this.setAttribute( "class", finalValue );
24255                                    }
24256                                }
24257                            } );
24258                        }
24259
24260                        return this;
24261                    },
24262
24263                    removeClass: function( value ) {
24264                        var classNames, cur, curValue, className, i, finalValue;
24265
24266                        if ( isFunction( value ) ) {
24267                            return this.each( function( j ) {
24268                                jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
24269                            } );
24270                        }
24271
24272                        if ( !arguments.length ) {
24273                            return this.attr( "class", "" );
24274                        }
24275
24276                        classNames = classesToArray( value );
24277
24278                        if ( classNames.length ) {
24279                            return this.each( function() {
24280                                curValue = getClass( this );
24281
24282                                // This expression is here for better compressibility (see addClass)
24283                                cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
24284
24285                                if ( cur ) {
24286                                    for ( i = 0; i < classNames.length; i++ ) {
24287                                        className = classNames[ i ];
24288
24289                                        // Remove *all* instances
24290                                        while ( cur.indexOf( " " + className + " " ) > -1 ) {
24291                                            cur = cur.replace( " " + className + " ", " " );
24292                                        }
24293                                    }
24294
24295                                    // Only assign if different to avoid unneeded rendering.
24296                                    finalValue = stripAndCollapse( cur );
24297                                    if ( curValue !== finalValue ) {
24298                                        this.setAttribute( "class", finalValue );
24299                                    }
24300                                }
24301                            } );
24302                        }
24303
24304                        return this;
24305                    },
24306
24307                    toggleClass: function( value, stateVal ) {
24308                        var classNames, className, i, self,
24309                            type = typeof value,
24310                            isValidValue = type === "string" || Array.isArray( value );
24311
24312                        if ( isFunction( value ) ) {
24313                            return this.each( function( i ) {
24314                                jQuery( this ).toggleClass(
24315                                    value.call( this, i, getClass( this ), stateVal ),
24316                                    stateVal
24317                                );
24318                            } );
24319                        }
24320
24321                        if ( typeof stateVal === "boolean" && isValidValue ) {
24322                            return stateVal ? this.addClass( value ) : this.removeClass( value );
24323                        }
24324
24325                        classNames = classesToArray( value );
24326
24327                        return this.each( function() {
24328                            if ( isValidValue ) {
24329
24330                                // Toggle individual class names
24331                                self = jQuery( this );
24332
24333                                for ( i = 0; i < classNames.length; i++ ) {
24334                                    className = classNames[ i ];
24335
24336                                    // Check each className given, space separated list
24337                                    if ( self.hasClass( className ) ) {
24338                                        self.removeClass( className );
24339                                    } else {
24340                                        self.addClass( className );
24341                                    }
24342                                }
24343
24344                                // Toggle whole class name
24345                            } else if ( value === undefined || type === "boolean" ) {
24346                                className = getClass( this );
24347                                if ( className ) {
24348
24349                                    // Store className if set
24350                                    dataPriv.set( this, "__className__", className );
24351                                }
24352
24353                                // If the element has a class name or if we're passed `false`,
24354                                // then remove the whole classname (if there was one, the above saved it).
24355                                // Otherwise bring back whatever was previously saved (if anything),
24356                                // falling back to the empty string if nothing was stored.
24357                                if ( this.setAttribute ) {
24358                                    this.setAttribute( "class",
24359                                        className || value === false ?
24360                                            "" :
24361                                            dataPriv.get( this, "__className__" ) || ""
24362                                    );
24363                                }
24364                            }
24365                        } );
24366                    },
24367
24368                    hasClass: function( selector ) {
24369                        var className, elem,
24370                            i = 0;
24371
24372                        className = " " + selector + " ";
24373                        while ( ( elem = this[ i++ ] ) ) {
24374                            if ( elem.nodeType === 1 &&
24375                                ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
24376                                return true;
24377                            }
24378                        }
24379
24380                        return false;
24381                    }
24382                } );
24383
24384
24385
24386
24387                var rreturn = /\r/g;
24388
24389                jQuery.fn.extend( {
24390                    val: function( value ) {
24391                        var hooks, ret, valueIsFunction,
24392                            elem = this[ 0 ];
24393
24394                        if ( !arguments.length ) {
24395                            if ( elem ) {
24396                                hooks = jQuery.valHooks[ elem.type ] ||
24397                                    jQuery.valHooks[ elem.nodeName.toLowerCase() ];
24398
24399                                if ( hooks &&
24400                                    "get" in hooks &&
24401                                    ( ret = hooks.get( elem, "value" ) ) !== undefined
24402                                ) {
24403                                    return ret;
24404                                }
24405
24406                                ret = elem.value;
24407
24408                                // Handle most common string cases
24409                                if ( typeof ret === "string" ) {
24410                                    return ret.replace( rreturn, "" );
24411                                }
24412
24413                                // Handle cases where value is null/undef or number
24414                                return ret == null ? "" : ret;
24415                            }
24416
24417                            return;
24418                        }
24419
24420                        valueIsFunction = isFunction( value );
24421
24422                        return this.each( function( i ) {
24423                            var val;
24424
24425                            if ( this.nodeType !== 1 ) {
24426                                return;
24427                            }
24428
24429                            if ( valueIsFunction ) {
24430                                val = value.call( this, i, jQuery( this ).val() );
24431                            } else {
24432                                val = value;
24433                            }
24434
24435                            // Treat null/undefined as ""; convert numbers to string
24436                            if ( val == null ) {
24437                                val = "";
24438
24439                            } else if ( typeof val === "number" ) {
24440                                val += "";
24441
24442                            } else if ( Array.isArray( val ) ) {
24443                                val = jQuery.map( val, function( value ) {
24444                                    return value == null ? "" : value + "";
24445                                } );
24446                            }
24447
24448                            hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
24449
24450                            // If set returns undefined, fall back to normal setting
24451                            if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
24452                                this.value = val;
24453                            }
24454                        } );
24455                    }
24456                } );
24457
24458                jQuery.extend( {
24459                    valHooks: {
24460                        option: {
24461                            get: function( elem ) {
24462
24463                                var val = jQuery.find.attr( elem, "value" );
24464                                return val != null ?
24465                                    val :
24466
24467                                    // Support: IE <=10 - 11 only
24468                                    // option.text throws exceptions (trac-14686, trac-14858)
24469                                    // Strip and collapse whitespace
24470                                    // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
24471                                    stripAndCollapse( jQuery.text( elem ) );
24472                            }
24473                        },
24474                        select: {
24475                            get: function( elem ) {
24476                                var value, option, i,
24477                                    options = elem.options,
24478                                    index = elem.selectedIndex,
24479                                    one = elem.type === "select-one",
24480                                    values = one ? null : [],
24481                                    max = one ? index + 1 : options.length;
24482
24483                                if ( index < 0 ) {
24484                                    i = max;
24485
24486                                } else {
24487                                    i = one ? index : 0;
24488                                }
24489
24490                                // Loop through all the selected options
24491                                for ( ; i < max; i++ ) {
24492                                    option = options[ i ];
24493
24494                                    // Support: IE <=9 only
24495                                    // IE8-9 doesn't update selected after form reset (trac-2551)
24496                                    if ( ( option.selected || i === index ) &&
24497
24498                                        // Don't return options that are disabled or in a disabled optgroup
24499                                        !option.disabled &&
24500                                        ( !option.parentNode.disabled ||
24501                                            !nodeName( option.parentNode, "optgroup" ) ) ) {
24502
24503                                        // Get the specific value for the option
24504                                        value = jQuery( option ).val();
24505
24506                                        // We don't need an array for one selects
24507                                        if ( one ) {
24508                                            return value;
24509                                        }
24510
24511                                        // Multi-Selects return an array
24512                                        values.push( value );
24513                                    }
24514                                }
24515
24516                                return values;
24517                            },
24518
24519                            set: function( elem, value ) {
24520                                var optionSet, option,
24521                                    options = elem.options,
24522                                    values = jQuery.makeArray( value ),
24523                                    i = options.length;
24524
24525                                while ( i-- ) {
24526                                    option = options[ i ];
24527
24528                                    /* eslint-disable no-cond-assign */
24529
24530                                    if ( option.selected =
24531                                        jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
24532                                    ) {
24533                                        optionSet = true;
24534                                    }
24535
24536                                    /* eslint-enable no-cond-assign */
24537                                }
24538
24539                                // Force browsers to behave consistently when non-matching value is set
24540                                if ( !optionSet ) {
24541                                    elem.selectedIndex = -1;
24542                                }
24543                                return values;
24544                            }
24545                        }
24546                    }
24547                } );
24548
24549// Radios and checkboxes getter/setter
24550                jQuery.each( [ "radio", "checkbox" ], function() {
24551                    jQuery.valHooks[ this ] = {
24552                        set: function( elem, value ) {
24553                            if ( Array.isArray( value ) ) {
24554                                return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
24555                            }
24556                        }
24557                    };
24558                    if ( !support.checkOn ) {
24559                        jQuery.valHooks[ this ].get = function( elem ) {
24560                            return elem.getAttribute( "value" ) === null ? "on" : elem.value;
24561                        };
24562                    }
24563                } );
24564
24565
24566
24567
24568// Return jQuery for attributes-only inclusion
24569                var location = window.location;
24570
24571                var nonce = { guid: Date.now() };
24572
24573                var rquery = ( /\?/ );
24574
24575
24576
24577// Cross-browser xml parsing
24578                jQuery.parseXML = function( data ) {
24579                    var xml, parserErrorElem;
24580                    if ( !data || typeof data !== "string" ) {
24581                        return null;
24582                    }
24583
24584                    // Support: IE 9 - 11 only
24585                    // IE throws on parseFromString with invalid input.
24586                    try {
24587                        xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
24588                    } catch ( e ) {}
24589
24590                    parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
24591                    if ( !xml || parserErrorElem ) {
24592                        jQuery.error( "Invalid XML: " + (
24593                            parserErrorElem ?
24594                                jQuery.map( parserErrorElem.childNodes, function( el ) {
24595                                    return el.textContent;
24596                                } ).join( "\n" ) :
24597                                data
24598                        ) );
24599                    }
24600                    return xml;
24601                };
24602
24603
24604                var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
24605                    stopPropagationCallback = function( e ) {
24606                        e.stopPropagation();
24607                    };
24608
24609                jQuery.extend( jQuery.event, {
24610
24611                    trigger: function( event, data, elem, onlyHandlers ) {
24612
24613                        var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
24614                            eventPath = [ elem || document ],
24615                            type = hasOwn.call( event, "type" ) ? event.type : event,
24616                            namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
24617
24618                        cur = lastElement = tmp = elem = elem || document;
24619
24620                        // Don't do events on text and comment nodes
24621                        if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
24622                            return;
24623                        }
24624
24625                        // focus/blur morphs to focusin/out; ensure we're not firing them right now
24626                        if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
24627                            return;
24628                        }
24629
24630                        if ( type.indexOf( "." ) > -1 ) {
24631
24632                            // Namespaced trigger; create a regexp to match event type in handle()
24633                            namespaces = type.split( "." );
24634                            type = namespaces.shift();
24635                            namespaces.sort();
24636                        }
24637                        ontype = type.indexOf( ":" ) < 0 && "on" + type;
24638
24639                        // Caller can pass in a jQuery.Event object, Object, or just an event type string
24640                        event = event[ jQuery.expando ] ?
24641                            event :
24642                            new jQuery.Event( type, typeof event === "object" && event );
24643
24644                        // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
24645                        event.isTrigger = onlyHandlers ? 2 : 3;
24646                        event.namespace = namespaces.join( "." );
24647                        event.rnamespace = event.namespace ?
24648                            new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
24649                            null;
24650
24651                        // Clean up the event in case it is being reused
24652                        event.result = undefined;
24653                        if ( !event.target ) {
24654                            event.target = elem;
24655                        }
24656
24657                        // Clone any incoming data and prepend the event, creating the handler arg list
24658                        data = data == null ?
24659                            [ event ] :
24660                            jQuery.makeArray( data, [ event ] );
24661
24662                        // Allow special events to draw outside the lines
24663                        special = jQuery.event.special[ type ] || {};
24664                        if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
24665                            return;
24666                        }
24667
24668                        // Determine event propagation path in advance, per W3C events spec (trac-9951)
24669                        // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
24670                        if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
24671
24672                            bubbleType = special.delegateType || type;
24673                            if ( !rfocusMorph.test( bubbleType + type ) ) {
24674                                cur = cur.parentNode;
24675                            }
24676                            for ( ; cur; cur = cur.parentNode ) {
24677                                eventPath.push( cur );
24678                                tmp = cur;
24679                            }
24680
24681                            // Only add window if we got to document (e.g., not plain obj or detached DOM)
24682                            if ( tmp === ( elem.ownerDocument || document ) ) {
24683                                eventPath.push( tmp.defaultView || tmp.parentWindow || window );
24684                            }
24685                        }
24686
24687                        // Fire handlers on the event path
24688                        i = 0;
24689                        while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
24690                            lastElement = cur;
24691                            event.type = i > 1 ?
24692                                bubbleType :
24693                                special.bindType || type;
24694
24695                            // jQuery handler
24696                            handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
24697                                dataPriv.get( cur, "handle" );
24698                            if ( handle ) {
24699                                handle.apply( cur, data );
24700                            }
24701
24702                            // Native handler
24703                            handle = ontype && cur[ ontype ];
24704                            if ( handle && handle.apply && acceptData( cur ) ) {
24705                                event.result = handle.apply( cur, data );
24706                                if ( event.result === false ) {
24707                                    event.preventDefault();
24708                                }
24709                            }
24710                        }
24711                        event.type = type;
24712
24713                        // If nobody prevented the default action, do it now
24714                        if ( !onlyHandlers && !event.isDefaultPrevented() ) {
24715
24716                            if ( ( !special._default ||
24717                                    special._default.apply( eventPath.pop(), data ) === false ) &&
24718                                acceptData( elem ) ) {
24719
24720                                // Call a native DOM method on the target with the same name as the event.
24721                                // Don't do default actions on window, that's where global variables be (trac-6170)
24722                                if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
24723
24724                                    // Don't re-trigger an onFOO event when we call its FOO() method
24725                                    tmp = elem[ ontype ];
24726
24727                                    if ( tmp ) {
24728                                        elem[ ontype ] = null;
24729                                    }
24730
24731                                    // Prevent re-triggering of the same event, since we already bubbled it above
24732                                    jQuery.event.triggered = type;
24733
24734                                    if ( event.isPropagationStopped() ) {
24735                                        lastElement.addEventListener( type, stopPropagationCallback );
24736                                    }
24737
24738                                    elem[ type ]();
24739
24740                                    if ( event.isPropagationStopped() ) {
24741                                        lastElement.removeEventListener( type, stopPropagationCallback );
24742                                    }
24743
24744                                    jQuery.event.triggered = undefined;
24745
24746                                    if ( tmp ) {
24747                                        elem[ ontype ] = tmp;
24748                                    }
24749                                }
24750                            }
24751                        }
24752
24753                        return event.result;
24754                    },
24755
24756                    // Piggyback on a donor event to simulate a different one
24757                    // Used only for `focus(in | out)` events
24758                    simulate: function( type, elem, event ) {
24759                        var e = jQuery.extend(
24760                            new jQuery.Event(),
24761                            event,
24762                            {
24763                                type: type,
24764                                isSimulated: true
24765                            }
24766                        );
24767
24768                        jQuery.event.trigger( e, null, elem );
24769                    }
24770
24771                } );
24772
24773                jQuery.fn.extend( {
24774
24775                    trigger: function( type, data ) {
24776                        return this.each( function() {
24777                            jQuery.event.trigger( type, data, this );
24778                        } );
24779                    },
24780                    triggerHandler: function( type, data ) {
24781                        var elem = this[ 0 ];
24782                        if ( elem ) {
24783                            return jQuery.event.trigger( type, data, elem, true );
24784                        }
24785                    }
24786                } );
24787
24788
24789                var
24790                    rbracket = /\[\]$/,
24791                    rCRLF = /\r?\n/g,
24792                    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
24793                    rsubmittable = /^(?:input|select|textarea|keygen)/i;
24794
24795                function buildParams( prefix, obj, traditional, add ) {
24796                    var name;
24797
24798                    if ( Array.isArray( obj ) ) {
24799
24800                        // Serialize array item.
24801                        jQuery.each( obj, function( i, v ) {
24802                            if ( traditional || rbracket.test( prefix ) ) {
24803
24804                                // Treat each array item as a scalar.
24805                                add( prefix, v );
24806
24807                            } else {
24808
24809                                // Item is non-scalar (array or object), encode its numeric index.
24810                                buildParams(
24811                                    prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
24812                                    v,
24813                                    traditional,
24814                                    add
24815                                );
24816                            }
24817                        } );
24818
24819                    } else if ( !traditional && toType( obj ) === "object" ) {
24820
24821                        // Serialize object item.
24822                        for ( name in obj ) {
24823                            buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
24824                        }
24825
24826                    } else {
24827
24828                        // Serialize scalar item.
24829                        add( prefix, obj );
24830                    }
24831                }
24832
24833// Serialize an array of form elements or a set of
24834// key/values into a query string
24835                jQuery.param = function( a, traditional ) {
24836                    var prefix,
24837                        s = [],
24838                        add = function( key, valueOrFunction ) {
24839
24840                            // If value is a function, invoke it and use its return value
24841                            var value = isFunction( valueOrFunction ) ?
24842                                valueOrFunction() :
24843                                valueOrFunction;
24844
24845                            s[ s.length ] = encodeURIComponent( key ) + "=" +
24846                                encodeURIComponent( value == null ? "" : value );
24847                        };
24848
24849                    if ( a == null ) {
24850                        return "";
24851                    }
24852
24853                    // If an array was passed in, assume that it is an array of form elements.
24854                    if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
24855
24856                        // Serialize the form elements
24857                        jQuery.each( a, function() {
24858                            add( this.name, this.value );
24859                        } );
24860
24861                    } else {
24862
24863                        // If traditional, encode the "old" way (the way 1.3.2 or older
24864                        // did it), otherwise encode params recursively.
24865                        for ( prefix in a ) {
24866                            buildParams( prefix, a[ prefix ], traditional, add );
24867                        }
24868                    }
24869
24870                    // Return the resulting serialization
24871                    return s.join( "&" );
24872                };
24873
24874                jQuery.fn.extend( {
24875                    serialize: function() {
24876                        return jQuery.param( this.serializeArray() );
24877                    },
24878                    serializeArray: function() {
24879                        return this.map( function() {
24880
24881                            // Can add propHook for "elements" to filter or add form elements
24882                            var elements = jQuery.prop( this, "elements" );
24883                            return elements ? jQuery.makeArray( elements ) : this;
24884                        } ).filter( function() {
24885                            var type = this.type;
24886
24887                            // Use .is( ":disabled" ) so that fieldset[disabled] works
24888                            return this.name && !jQuery( this ).is( ":disabled" ) &&
24889                                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
24890                                ( this.checked || !rcheckableType.test( type ) );
24891                        } ).map( function( _i, elem ) {
24892                            var val = jQuery( this ).val();
24893
24894                            if ( val == null ) {
24895                                return null;
24896                            }
24897
24898                            if ( Array.isArray( val ) ) {
24899                                return jQuery.map( val, function( val ) {
24900                                    return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
24901                                } );
24902                            }
24903
24904                            return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
24905                        } ).get();
24906                    }
24907                } );
24908
24909
24910                var
24911                    r20 = /%20/g,
24912                    rhash = /#.*$/,
24913                    rantiCache = /([?&])_=[^&]*/,
24914                    rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
24915
24916                    // trac-7653, trac-8125, trac-8152: local protocol detection
24917                    rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
24918                    rnoContent = /^(?:GET|HEAD)$/,
24919                    rprotocol = /^\/\//,
24920
24921                    /* Prefilters
24922	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
24923	 * 2) These are called:
24924	 *    - BEFORE asking for a transport
24925	 *    - AFTER param serialization (s.data is a string if s.processData is true)
24926	 * 3) key is the dataType
24927	 * 4) the catchall symbol "*" can be used
24928	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
24929	 */
24930                    prefilters = {},
24931
24932                    /* Transports bindings
24933	 * 1) key is the dataType
24934	 * 2) the catchall symbol "*" can be used
24935	 * 3) selection will start with transport dataType and THEN go to "*" if needed
24936	 */
24937                    transports = {},
24938
24939                    // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
24940                    allTypes = "*/".concat( "*" ),
24941
24942                    // Anchor tag for parsing the document origin
24943                    originAnchor = document.createElement( "a" );
24944
24945                originAnchor.href = location.href;
24946
24947// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
24948                function addToPrefiltersOrTransports( structure ) {
24949
24950                    // dataTypeExpression is optional and defaults to "*"
24951                    return function( dataTypeExpression, func ) {
24952
24953                        if ( typeof dataTypeExpression !== "string" ) {
24954                            func = dataTypeExpression;
24955                            dataTypeExpression = "*";
24956                        }
24957
24958                        var dataType,
24959                            i = 0,
24960                            dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
24961
24962                        if ( isFunction( func ) ) {
24963
24964                            // For each dataType in the dataTypeExpression
24965                            while ( ( dataType = dataTypes[ i++ ] ) ) {
24966
24967                                // Prepend if requested
24968                                if ( dataType[ 0 ] === "+" ) {
24969                                    dataType = dataType.slice( 1 ) || "*";
24970                                    ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
24971
24972                                    // Otherwise append
24973                                } else {
24974                                    ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
24975                                }
24976                            }
24977                        }
24978                    };
24979                }
24980
24981// Base inspection function for prefilters and transports
24982                function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
24983
24984                    var inspected = {},
24985                        seekingTransport = ( structure === transports );
24986
24987                    function inspect( dataType ) {
24988                        var selected;
24989                        inspected[ dataType ] = true;
24990                        jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
24991                            var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
24992                            if ( typeof dataTypeOrTransport === "string" &&
24993                                !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
24994
24995                                options.dataTypes.unshift( dataTypeOrTransport );
24996                                inspect( dataTypeOrTransport );
24997                                return false;
24998                            } else if ( seekingTransport ) {
24999                                return !( selected = dataTypeOrTransport );
25000                            }
25001                        } );
25002                        return selected;
25003                    }
25004
25005                    return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
25006                }
25007
25008// A special extend for ajax options
25009// that takes "flat" options (not to be deep extended)
25010// Fixes trac-9887
25011                function ajaxExtend( target, src ) {
25012                    var key, deep,
25013                        flatOptions = jQuery.ajaxSettings.flatOptions || {};
25014
25015                    for ( key in src ) {
25016                        if ( src[ key ] !== undefined ) {
25017                            ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
25018                        }
25019                    }
25020                    if ( deep ) {
25021                        jQuery.extend( true, target, deep );
25022                    }
25023
25024                    return target;
25025                }
25026
25027                /* Handles responses to an ajax request:
25028 * - finds the right dataType (mediates between content-type and expected dataType)
25029 * - returns the corresponding response
25030 */
25031                function ajaxHandleResponses( s, jqXHR, responses ) {
25032
25033                    var ct, type, finalDataType, firstDataType,
25034                        contents = s.contents,
25035                        dataTypes = s.dataTypes;
25036
25037                    // Remove auto dataType and get content-type in the process
25038                    while ( dataTypes[ 0 ] === "*" ) {
25039                        dataTypes.shift();
25040                        if ( ct === undefined ) {
25041                            ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
25042                        }
25043                    }
25044
25045                    // Check if we're dealing with a known content-type
25046                    if ( ct ) {
25047                        for ( type in contents ) {
25048                            if ( contents[ type ] && contents[ type ].test( ct ) ) {
25049                                dataTypes.unshift( type );
25050                                break;
25051                            }
25052                        }
25053                    }
25054
25055                    // Check to see if we have a response for the expected dataType
25056                    if ( dataTypes[ 0 ] in responses ) {
25057                        finalDataType = dataTypes[ 0 ];
25058                    } else {
25059
25060                        // Try convertible dataTypes
25061                        for ( type in responses ) {
25062                            if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
25063                                finalDataType = type;
25064                                break;
25065                            }
25066                            if ( !firstDataType ) {
25067                                firstDataType = type;
25068                            }
25069                        }
25070
25071                        // Or just use first one
25072                        finalDataType = finalDataType || firstDataType;
25073                    }
25074
25075                    // If we found a dataType
25076                    // We add the dataType to the list if needed
25077                    // and return the corresponding response
25078                    if ( finalDataType ) {
25079                        if ( finalDataType !== dataTypes[ 0 ] ) {
25080                            dataTypes.unshift( finalDataType );
25081                        }
25082                        return responses[ finalDataType ];
25083                    }
25084                }
25085
25086                /* Chain conversions given the request and the original response
25087 * Also sets the responseXXX fields on the jqXHR instance
25088 */
25089                function ajaxConvert( s, response, jqXHR, isSuccess ) {
25090                    var conv2, current, conv, tmp, prev,
25091                        converters = {},
25092
25093                        // Work with a copy of dataTypes in case we need to modify it for conversion
25094                        dataTypes = s.dataTypes.slice();
25095
25096                    // Create converters map with lowercased keys
25097                    if ( dataTypes[ 1 ] ) {
25098                        for ( conv in s.converters ) {
25099                            converters[ conv.toLowerCase() ] = s.converters[ conv ];
25100                        }
25101                    }
25102
25103                    current = dataTypes.shift();
25104
25105                    // Convert to each sequential dataType
25106                    while ( current ) {
25107
25108                        if ( s.responseFields[ current ] ) {
25109                            jqXHR[ s.responseFields[ current ] ] = response;
25110                        }
25111
25112                        // Apply the dataFilter if provided
25113                        if ( !prev && isSuccess && s.dataFilter ) {
25114                            response = s.dataFilter( response, s.dataType );
25115                        }
25116
25117                        prev = current;
25118                        current = dataTypes.shift();
25119
25120                        if ( current ) {
25121
25122                            // There's only work to do if current dataType is non-auto
25123                            if ( current === "*" ) {
25124
25125                                current = prev;
25126
25127                                // Convert response if prev dataType is non-auto and differs from current
25128                            } else if ( prev !== "*" && prev !== current ) {
25129
25130                                // Seek a direct converter
25131                                conv = converters[ prev + " " + current ] || converters[ "* " + current ];
25132
25133                                // If none found, seek a pair
25134                                if ( !conv ) {
25135                                    for ( conv2 in converters ) {
25136
25137                                        // If conv2 outputs current
25138                                        tmp = conv2.split( " " );
25139                                        if ( tmp[ 1 ] === current ) {
25140
25141                                            // If prev can be converted to accepted input
25142                                            conv = converters[ prev + " " + tmp[ 0 ] ] ||
25143                                                converters[ "* " + tmp[ 0 ] ];
25144                                            if ( conv ) {
25145
25146                                                // Condense equivalence converters
25147                                                if ( conv === true ) {
25148                                                    conv = converters[ conv2 ];
25149
25150                                                    // Otherwise, insert the intermediate dataType
25151                                                } else if ( converters[ conv2 ] !== true ) {
25152                                                    current = tmp[ 0 ];
25153                                                    dataTypes.unshift( tmp[ 1 ] );
25154                                                }
25155                                                break;
25156                                            }
25157                                        }
25158                                    }
25159                                }
25160
25161                                // Apply converter (if not an equivalence)
25162                                if ( conv !== true ) {
25163
25164                                    // Unless errors are allowed to bubble, catch and return them
25165                                    if ( conv && s.throws ) {
25166                                        response = conv( response );
25167                                    } else {
25168                                        try {
25169                                            response = conv( response );
25170                                        } catch ( e ) {
25171                                            return {
25172                                                state: "parsererror",
25173                                                error: conv ? e : "No conversion from " + prev + " to " + current
25174                                            };
25175                                        }
25176                                    }
25177                                }
25178                            }
25179                        }
25180                    }
25181
25182                    return { state: "success", data: response };
25183                }
25184
25185                jQuery.extend( {
25186
25187                    // Counter for holding the number of active queries
25188                    active: 0,
25189
25190                    // Last-Modified header cache for next request
25191                    lastModified: {},
25192                    etag: {},
25193
25194                    ajaxSettings: {
25195                        url: location.href,
25196                        type: "GET",
25197                        isLocal: rlocalProtocol.test( location.protocol ),
25198                        global: true,
25199                        processData: true,
25200                        async: true,
25201                        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
25202
25203                        /*
25204		timeout: 0,
25205		data: null,
25206		dataType: null,
25207		username: null,
25208		password: null,
25209		cache: null,
25210		throws: false,
25211		traditional: false,
25212		headers: {},
25213		*/
25214
25215                        accepts: {
25216                            "*": allTypes,
25217                            text: "text/plain",
25218                            html: "text/html",
25219                            xml: "application/xml, text/xml",
25220                            json: "application/json, text/javascript"
25221                        },
25222
25223                        contents: {
25224                            xml: /\bxml\b/,
25225                            html: /\bhtml/,
25226                            json: /\bjson\b/
25227                        },
25228
25229                        responseFields: {
25230                            xml: "responseXML",
25231                            text: "responseText",
25232                            json: "responseJSON"
25233                        },
25234
25235                        // Data converters
25236                        // Keys separate source (or catchall "*") and destination types with a single space
25237                        converters: {
25238
25239                            // Convert anything to text
25240                            "* text": String,
25241
25242                            // Text to html (true = no transformation)
25243                            "text html": true,
25244
25245                            // Evaluate text as a json expression
25246                            "text json": JSON.parse,
25247
25248                            // Parse text as xml
25249                            "text xml": jQuery.parseXML
25250                        },
25251
25252                        // For options that shouldn't be deep extended:
25253                        // you can add your own custom options here if
25254                        // and when you create one that shouldn't be
25255                        // deep extended (see ajaxExtend)
25256                        flatOptions: {
25257                            url: true,
25258                            context: true
25259                        }
25260                    },
25261
25262                    // Creates a full fledged settings object into target
25263                    // with both ajaxSettings and settings fields.
25264                    // If target is omitted, writes into ajaxSettings.
25265                    ajaxSetup: function( target, settings ) {
25266                        return settings ?
25267
25268                            // Building a settings object
25269                            ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
25270
25271                            // Extending ajaxSettings
25272                            ajaxExtend( jQuery.ajaxSettings, target );
25273                    },
25274
25275                    ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
25276                    ajaxTransport: addToPrefiltersOrTransports( transports ),
25277
25278                    // Main method
25279                    ajax: function( url, options ) {
25280
25281                        // If url is an object, simulate pre-1.5 signature
25282                        if ( typeof url === "object" ) {
25283                            options = url;
25284                            url = undefined;
25285                        }
25286
25287                        // Force options to be an object
25288                        options = options || {};
25289
25290                        var transport,
25291
25292                            // URL without anti-cache param
25293                            cacheURL,
25294
25295                            // Response headers
25296                            responseHeadersString,
25297                            responseHeaders,
25298
25299                            // timeout handle
25300                            timeoutTimer,
25301
25302                            // Url cleanup var
25303                            urlAnchor,
25304
25305                            // Request state (becomes false upon send and true upon completion)
25306                            completed,
25307
25308                            // To know if global events are to be dispatched
25309                            fireGlobals,
25310
25311                            // Loop variable
25312                            i,
25313
25314                            // uncached part of the url
25315                            uncached,
25316
25317                            // Create the final options object
25318                            s = jQuery.ajaxSetup( {}, options ),
25319
25320                            // Callbacks context
25321                            callbackContext = s.context || s,
25322
25323                            // Context for global events is callbackContext if it is a DOM node or jQuery collection
25324                            globalEventContext = s.context &&
25325                            ( callbackContext.nodeType || callbackContext.jquery ) ?
25326                                jQuery( callbackContext ) :
25327                                jQuery.event,
25328
25329                            // Deferreds
25330                            deferred = jQuery.Deferred(),
25331                            completeDeferred = jQuery.Callbacks( "once memory" ),
25332
25333                            // Status-dependent callbacks
25334                            statusCode = s.statusCode || {},
25335
25336                            // Headers (they are sent all at once)
25337                            requestHeaders = {},
25338                            requestHeadersNames = {},
25339
25340                            // Default abort message
25341                            strAbort = "canceled",
25342
25343                            // Fake xhr
25344                            jqXHR = {
25345                                readyState: 0,
25346
25347                                // Builds headers hashtable if needed
25348                                getResponseHeader: function( key ) {
25349                                    var match;
25350                                    if ( completed ) {
25351                                        if ( !responseHeaders ) {
25352                                            responseHeaders = {};
25353                                            while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
25354                                                responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
25355                                                    ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
25356                                                        .concat( match[ 2 ] );
25357                                            }
25358                                        }
25359                                        match = responseHeaders[ key.toLowerCase() + " " ];
25360                                    }
25361                                    return match == null ? null : match.join( ", " );
25362                                },
25363
25364                                // Raw string
25365                                getAllResponseHeaders: function() {
25366                                    return completed ? responseHeadersString : null;
25367                                },
25368
25369                                // Caches the header
25370                                setRequestHeader: function( name, value ) {
25371                                    if ( completed == null ) {
25372                                        name = requestHeadersNames[ name.toLowerCase() ] =
25373                                            requestHeadersNames[ name.toLowerCase() ] || name;
25374                                        requestHeaders[ name ] = value;
25375                                    }
25376                                    return this;
25377                                },
25378
25379                                // Overrides response content-type header
25380                                overrideMimeType: function( type ) {
25381                                    if ( completed == null ) {
25382                                        s.mimeType = type;
25383                                    }
25384                                    return this;
25385                                },
25386
25387                                // Status-dependent callbacks
25388                                statusCode: function( map ) {
25389                                    var code;
25390                                    if ( map ) {
25391                                        if ( completed ) {
25392
25393                                            // Execute the appropriate callbacks
25394                                            jqXHR.always( map[ jqXHR.status ] );
25395                                        } else {
25396
25397                                            // Lazy-add the new callbacks in a way that preserves old ones
25398                                            for ( code in map ) {
25399                                                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
25400                                            }
25401                                        }
25402                                    }
25403                                    return this;
25404                                },
25405
25406                                // Cancel the request
25407                                abort: function( statusText ) {
25408                                    var finalText = statusText || strAbort;
25409                                    if ( transport ) {
25410                                        transport.abort( finalText );
25411                                    }
25412                                    done( 0, finalText );
25413                                    return this;
25414                                }
25415                            };
25416
25417                        // Attach deferreds
25418                        deferred.promise( jqXHR );
25419
25420                        // Add protocol if not provided (prefilters might expect it)
25421                        // Handle falsy url in the settings object (trac-10093: consistency with old signature)
25422                        // We also use the url parameter if available
25423                        s.url = ( ( url || s.url || location.href ) + "" )
25424                            .replace( rprotocol, location.protocol + "//" );
25425
25426                        // Alias method option to type as per ticket trac-12004
25427                        s.type = options.method || options.type || s.method || s.type;
25428
25429                        // Extract dataTypes list
25430                        s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
25431
25432                        // A cross-domain request is in order when the origin doesn't match the current origin.
25433                        if ( s.crossDomain == null ) {
25434                            urlAnchor = document.createElement( "a" );
25435
25436                            // Support: IE <=8 - 11, Edge 12 - 15
25437                            // IE throws exception on accessing the href property if url is malformed,
25438                            // e.g. http://example.com:80x/
25439                            try {
25440                                urlAnchor.href = s.url;
25441
25442                                // Support: IE <=8 - 11 only
25443                                // Anchor's host property isn't correctly set when s.url is relative
25444                                urlAnchor.href = urlAnchor.href;
25445                                s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
25446                                    urlAnchor.protocol + "//" + urlAnchor.host;
25447                            } catch ( e ) {
25448
25449                                // If there is an error parsing the URL, assume it is crossDomain,
25450                                // it can be rejected by the transport if it is invalid
25451                                s.crossDomain = true;
25452                            }
25453                        }
25454
25455                        // Convert data if not already a string
25456                        if ( s.data && s.processData && typeof s.data !== "string" ) {
25457                            s.data = jQuery.param( s.data, s.traditional );
25458                        }
25459
25460                        // Apply prefilters
25461                        inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
25462
25463                        // If request was aborted inside a prefilter, stop there
25464                        if ( completed ) {
25465                            return jqXHR;
25466                        }
25467
25468                        // We can fire global events as of now if asked to
25469                        // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
25470                        fireGlobals = jQuery.event && s.global;
25471
25472                        // Watch for a new set of requests
25473                        if ( fireGlobals && jQuery.active++ === 0 ) {
25474                            jQuery.event.trigger( "ajaxStart" );
25475                        }
25476
25477                        // Uppercase the type
25478                        s.type = s.type.toUpperCase();
25479
25480                        // Determine if request has content
25481                        s.hasContent = !rnoContent.test( s.type );
25482
25483                        // Save the URL in case we're toying with the If-Modified-Since
25484                        // and/or If-None-Match header later on
25485                        // Remove hash to simplify url manipulation
25486                        cacheURL = s.url.replace( rhash, "" );
25487
25488                        // More options handling for requests with no content
25489                        if ( !s.hasContent ) {
25490
25491                            // Remember the hash so we can put it back
25492                            uncached = s.url.slice( cacheURL.length );
25493
25494                            // If data is available and should be processed, append data to url
25495                            if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
25496                                cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
25497
25498                                // trac-9682: remove data so that it's not used in an eventual retry
25499                                delete s.data;
25500                            }
25501
25502                            // Add or update anti-cache param if needed
25503                            if ( s.cache === false ) {
25504                                cacheURL = cacheURL.replace( rantiCache, "$1" );
25505                                uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
25506                                    uncached;
25507                            }
25508
25509                            // Put hash and anti-cache on the URL that will be requested (gh-1732)
25510                            s.url = cacheURL + uncached;
25511
25512                            // Change '%20' to '+' if this is encoded form body content (gh-2658)
25513                        } else if ( s.data && s.processData &&
25514                            ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
25515                            s.data = s.data.replace( r20, "+" );
25516                        }
25517
25518                        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
25519                        if ( s.ifModified ) {
25520                            if ( jQuery.lastModified[ cacheURL ] ) {
25521                                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
25522                            }
25523                            if ( jQuery.etag[ cacheURL ] ) {
25524                                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
25525                            }
25526                        }
25527
25528                        // Set the correct header, if data is being sent
25529                        if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
25530                            jqXHR.setRequestHeader( "Content-Type", s.contentType );
25531                        }
25532
25533                        // Set the Accepts header for the server, depending on the dataType
25534                        jqXHR.setRequestHeader(
25535                            "Accept",
25536                            s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
25537                                s.accepts[ s.dataTypes[ 0 ] ] +
25538                                ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
25539                                s.accepts[ "*" ]
25540                        );
25541
25542                        // Check for headers option
25543                        for ( i in s.headers ) {
25544                            jqXHR.setRequestHeader( i, s.headers[ i ] );
25545                        }
25546
25547                        // Allow custom headers/mimetypes and early abort
25548                        if ( s.beforeSend &&
25549                            ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
25550
25551                            // Abort if not done already and return
25552                            return jqXHR.abort();
25553                        }
25554
25555                        // Aborting is no longer a cancellation
25556                        strAbort = "abort";
25557
25558                        // Install callbacks on deferreds
25559                        completeDeferred.add( s.complete );
25560                        jqXHR.done( s.success );
25561                        jqXHR.fail( s.error );
25562
25563                        // Get transport
25564                        transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
25565
25566                        // If no transport, we auto-abort
25567                        if ( !transport ) {
25568                            done( -1, "No Transport" );
25569                        } else {
25570                            jqXHR.readyState = 1;
25571
25572                            // Send global event
25573                            if ( fireGlobals ) {
25574                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
25575                            }
25576
25577                            // If request was aborted inside ajaxSend, stop there
25578                            if ( completed ) {
25579                                return jqXHR;
25580                            }
25581
25582                            // Timeout
25583                            if ( s.async && s.timeout > 0 ) {
25584                                timeoutTimer = window.setTimeout( function() {
25585                                    jqXHR.abort( "timeout" );
25586                                }, s.timeout );
25587                            }
25588
25589                            try {
25590                                completed = false;
25591                                transport.send( requestHeaders, done );
25592                            } catch ( e ) {
25593
25594                                // Rethrow post-completion exceptions
25595                                if ( completed ) {
25596                                    throw e;
25597                                }
25598
25599                                // Propagate others as results
25600                                done( -1, e );
25601                            }
25602                        }
25603
25604                        // Callback for when everything is done
25605                        function done( status, nativeStatusText, responses, headers ) {
25606                            var isSuccess, success, error, response, modified,
25607                                statusText = nativeStatusText;
25608
25609                            // Ignore repeat invocations
25610                            if ( completed ) {
25611                                return;
25612                            }
25613
25614                            completed = true;
25615
25616                            // Clear timeout if it exists
25617                            if ( timeoutTimer ) {
25618                                window.clearTimeout( timeoutTimer );
25619                            }
25620
25621                            // Dereference transport for early garbage collection
25622                            // (no matter how long the jqXHR object will be used)
25623                            transport = undefined;
25624
25625                            // Cache response headers
25626                            responseHeadersString = headers || "";
25627
25628                            // Set readyState
25629                            jqXHR.readyState = status > 0 ? 4 : 0;
25630
25631                            // Determine if successful
25632                            isSuccess = status >= 200 && status < 300 || status === 304;
25633
25634                            // Get response data
25635                            if ( responses ) {
25636                                response = ajaxHandleResponses( s, jqXHR, responses );
25637                            }
25638
25639                            // Use a noop converter for missing script but not if jsonp
25640                            if ( !isSuccess &&
25641                                jQuery.inArray( "script", s.dataTypes ) > -1 &&
25642                                jQuery.inArray( "json", s.dataTypes ) < 0 ) {
25643                                s.converters[ "text script" ] = function() {};
25644                            }
25645
25646                            // Convert no matter what (that way responseXXX fields are always set)
25647                            response = ajaxConvert( s, response, jqXHR, isSuccess );
25648
25649                            // If successful, handle type chaining
25650                            if ( isSuccess ) {
25651
25652                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
25653                                if ( s.ifModified ) {
25654                                    modified = jqXHR.getResponseHeader( "Last-Modified" );
25655                                    if ( modified ) {
25656                                        jQuery.lastModified[ cacheURL ] = modified;
25657                                    }
25658                                    modified = jqXHR.getResponseHeader( "etag" );
25659                                    if ( modified ) {
25660                                        jQuery.etag[ cacheURL ] = modified;
25661                                    }
25662                                }
25663
25664                                // if no content
25665                                if ( status === 204 || s.type === "HEAD" ) {
25666                                    statusText = "nocontent";
25667
25668                                    // if not modified
25669                                } else if ( status === 304 ) {
25670                                    statusText = "notmodified";
25671
25672                                    // If we have data, let's convert it
25673                                } else {
25674                                    statusText = response.state;
25675                                    success = response.data;
25676                                    error = response.error;
25677                                    isSuccess = !error;
25678                                }
25679                            } else {
25680
25681                                // Extract error from statusText and normalize for non-aborts
25682                                error = statusText;
25683                                if ( status || !statusText ) {
25684                                    statusText = "error";
25685                                    if ( status < 0 ) {
25686                                        status = 0;
25687                                    }
25688                                }
25689                            }
25690
25691                            // Set data for the fake xhr object
25692                            jqXHR.status = status;
25693                            jqXHR.statusText = ( nativeStatusText || statusText ) + "";
25694
25695                            // Success/Error
25696                            if ( isSuccess ) {
25697                                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
25698                            } else {
25699                                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
25700                            }
25701
25702                            // Status-dependent callbacks
25703                            jqXHR.statusCode( statusCode );
25704                            statusCode = undefined;
25705
25706                            if ( fireGlobals ) {
25707                                globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
25708                                    [ jqXHR, s, isSuccess ? success : error ] );
25709                            }
25710
25711                            // Complete
25712                            completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
25713
25714                            if ( fireGlobals ) {
25715                                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
25716
25717                                // Handle the global AJAX counter
25718                                if ( !( --jQuery.active ) ) {
25719                                    jQuery.event.trigger( "ajaxStop" );
25720                                }
25721                            }
25722                        }
25723
25724                        return jqXHR;
25725                    },
25726
25727                    getJSON: function( url, data, callback ) {
25728                        return jQuery.get( url, data, callback, "json" );
25729                    },
25730
25731                    getScript: function( url, callback ) {
25732                        return jQuery.get( url, undefined, callback, "script" );
25733                    }
25734                } );
25735
25736                jQuery.each( [ "get", "post" ], function( _i, method ) {
25737                    jQuery[ method ] = function( url, data, callback, type ) {
25738
25739                        // Shift arguments if data argument was omitted
25740                        if ( isFunction( data ) ) {
25741                            type = type || callback;
25742                            callback = data;
25743                            data = undefined;
25744                        }
25745
25746                        // The url can be an options object (which then must have .url)
25747                        return jQuery.ajax( jQuery.extend( {
25748                            url: url,
25749                            type: method,
25750                            dataType: type,
25751                            data: data,
25752                            success: callback
25753                        }, jQuery.isPlainObject( url ) && url ) );
25754                    };
25755                } );
25756
25757                jQuery.ajaxPrefilter( function( s ) {
25758                    var i;
25759                    for ( i in s.headers ) {
25760                        if ( i.toLowerCase() === "content-type" ) {
25761                            s.contentType = s.headers[ i ] || "";
25762                        }
25763                    }
25764                } );
25765
25766
25767                jQuery._evalUrl = function( url, options, doc ) {
25768                    return jQuery.ajax( {
25769                        url: url,
25770
25771                        // Make this explicit, since user can override this through ajaxSetup (trac-11264)
25772                        type: "GET",
25773                        dataType: "script",
25774                        cache: true,
25775                        async: false,
25776                        global: false,
25777
25778                        // Only evaluate the response if it is successful (gh-4126)
25779                        // dataFilter is not invoked for failure responses, so using it instead
25780                        // of the default converter is kludgy but it works.
25781                        converters: {
25782                            "text script": function() {}
25783                        },
25784                        dataFilter: function( response ) {
25785                            jQuery.globalEval( response, options, doc );
25786                        }
25787                    } );
25788                };
25789
25790
25791                jQuery.fn.extend( {
25792                    wrapAll: function( html ) {
25793                        var wrap;
25794
25795                        if ( this[ 0 ] ) {
25796                            if ( isFunction( html ) ) {
25797                                html = html.call( this[ 0 ] );
25798                            }
25799
25800                            // The elements to wrap the target around
25801                            wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
25802
25803                            if ( this[ 0 ].parentNode ) {
25804                                wrap.insertBefore( this[ 0 ] );
25805                            }
25806
25807                            wrap.map( function() {
25808                                var elem = this;
25809
25810                                while ( elem.firstElementChild ) {
25811                                    elem = elem.firstElementChild;
25812                                }
25813
25814                                return elem;
25815                            } ).append( this );
25816                        }
25817
25818                        return this;
25819                    },
25820
25821                    wrapInner: function( html ) {
25822                        if ( isFunction( html ) ) {
25823                            return this.each( function( i ) {
25824                                jQuery( this ).wrapInner( html.call( this, i ) );
25825                            } );
25826                        }
25827
25828                        return this.each( function() {
25829                            var self = jQuery( this ),
25830                                contents = self.contents();
25831
25832                            if ( contents.length ) {
25833                                contents.wrapAll( html );
25834
25835                            } else {
25836                                self.append( html );
25837                            }
25838                        } );
25839                    },
25840
25841                    wrap: function( html ) {
25842                        var htmlIsFunction = isFunction( html );
25843
25844                        return this.each( function( i ) {
25845                            jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
25846                        } );
25847                    },
25848
25849                    unwrap: function( selector ) {
25850                        this.parent( selector ).not( "body" ).each( function() {
25851                            jQuery( this ).replaceWith( this.childNodes );
25852                        } );
25853                        return this;
25854                    }
25855                } );
25856
25857
25858                jQuery.expr.pseudos.hidden = function( elem ) {
25859                    return !jQuery.expr.pseudos.visible( elem );
25860                };
25861                jQuery.expr.pseudos.visible = function( elem ) {
25862                    return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
25863                };
25864
25865
25866
25867
25868                jQuery.ajaxSettings.xhr = function() {
25869                    try {
25870                        return new window.XMLHttpRequest();
25871                    } catch ( e ) {}
25872                };
25873
25874                var xhrSuccessStatus = {
25875
25876                        // File protocol always yields status code 0, assume 200
25877                        0: 200,
25878
25879                        // Support: IE <=9 only
25880                        // trac-1450: sometimes IE returns 1223 when it should be 204
25881                        1223: 204
25882                    },
25883                    xhrSupported = jQuery.ajaxSettings.xhr();
25884
25885                support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
25886                support.ajax = xhrSupported = !!xhrSupported;
25887
25888                jQuery.ajaxTransport( function( options ) {
25889                    var callback, errorCallback;
25890
25891                    // Cross domain only allowed if supported through XMLHttpRequest
25892                    if ( support.cors || xhrSupported && !options.crossDomain ) {
25893                        return {
25894                            send: function( headers, complete ) {
25895                                var i,
25896                                    xhr = options.xhr();
25897
25898                                xhr.open(
25899                                    options.type,
25900                                    options.url,
25901                                    options.async,
25902                                    options.username,
25903                                    options.password
25904                                );
25905
25906                                // Apply custom fields if provided
25907                                if ( options.xhrFields ) {
25908                                    for ( i in options.xhrFields ) {
25909                                        xhr[ i ] = options.xhrFields[ i ];
25910                                    }
25911                                }
25912
25913                                // Override mime type if needed
25914                                if ( options.mimeType && xhr.overrideMimeType ) {
25915                                    xhr.overrideMimeType( options.mimeType );
25916                                }
25917
25918                                // X-Requested-With header
25919                                // For cross-domain requests, seeing as conditions for a preflight are
25920                                // akin to a jigsaw puzzle, we simply never set it to be sure.
25921                                // (it can always be set on a per-request basis or even using ajaxSetup)
25922                                // For same-domain requests, won't change header if already provided.
25923                                if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
25924                                    headers[ "X-Requested-With" ] = "XMLHttpRequest";
25925                                }
25926
25927                                // Set headers
25928                                for ( i in headers ) {
25929                                    xhr.setRequestHeader( i, headers[ i ] );
25930                                }
25931
25932                                // Callback
25933                                callback = function( type ) {
25934                                    return function() {
25935                                        if ( callback ) {
25936                                            callback = errorCallback = xhr.onload =
25937                                                xhr.onerror = xhr.onabort = xhr.ontimeout =
25938                                                    xhr.onreadystatechange = null;
25939
25940                                            if ( type === "abort" ) {
25941                                                xhr.abort();
25942                                            } else if ( type === "error" ) {
25943
25944                                                // Support: IE <=9 only
25945                                                // On a manual native abort, IE9 throws
25946                                                // errors on any property access that is not readyState
25947                                                if ( typeof xhr.status !== "number" ) {
25948                                                    complete( 0, "error" );
25949                                                } else {
25950                                                    complete(
25951
25952                                                        // File: protocol always yields status 0; see trac-8605, trac-14207
25953                                                        xhr.status,
25954                                                        xhr.statusText
25955                                                    );
25956                                                }
25957                                            } else {
25958                                                complete(
25959                                                    xhrSuccessStatus[ xhr.status ] || xhr.status,
25960                                                    xhr.statusText,
25961
25962                                                    // Support: IE <=9 only
25963                                                    // IE9 has no XHR2 but throws on binary (trac-11426)
25964                                                    // For XHR2 non-text, let the caller handle it (gh-2498)
25965                                                    ( xhr.responseType || "text" ) !== "text"  ||
25966                                                    typeof xhr.responseText !== "string" ?
25967                                                        { binary: xhr.response } :
25968                                                        { text: xhr.responseText },
25969                                                    xhr.getAllResponseHeaders()
25970                                                );
25971                                            }
25972                                        }
25973                                    };
25974                                };
25975
25976                                // Listen to events
25977                                xhr.onload = callback();
25978                                errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
25979
25980                                // Support: IE 9 only
25981                                // Use onreadystatechange to replace onabort
25982                                // to handle uncaught aborts
25983                                if ( xhr.onabort !== undefined ) {
25984                                    xhr.onabort = errorCallback;
25985                                } else {
25986                                    xhr.onreadystatechange = function() {
25987
25988                                        // Check readyState before timeout as it changes
25989                                        if ( xhr.readyState === 4 ) {
25990
25991                                            // Allow onerror to be called first,
25992                                            // but that will not handle a native abort
25993                                            // Also, save errorCallback to a variable
25994                                            // as xhr.onerror cannot be accessed
25995                                            window.setTimeout( function() {
25996                                                if ( callback ) {
25997                                                    errorCallback();
25998                                                }
25999                                            } );
26000                                        }
26001                                    };
26002                                }
26003
26004                                // Create the abort callback
26005                                callback = callback( "abort" );
26006
26007                                try {
26008
26009                                    // Do send the request (this may raise an exception)
26010                                    xhr.send( options.hasContent && options.data || null );
26011                                } catch ( e ) {
26012
26013                                    // trac-14683: Only rethrow if this hasn't been notified as an error yet
26014                                    if ( callback ) {
26015                                        throw e;
26016                                    }
26017                                }
26018                            },
26019
26020                            abort: function() {
26021                                if ( callback ) {
26022                                    callback();
26023                                }
26024                            }
26025                        };
26026                    }
26027                } );
26028
26029
26030
26031
26032// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
26033                jQuery.ajaxPrefilter( function( s ) {
26034                    if ( s.crossDomain ) {
26035                        s.contents.script = false;
26036                    }
26037                } );
26038
26039// Install script dataType
26040                jQuery.ajaxSetup( {
26041                    accepts: {
26042                        script: "text/javascript, application/javascript, " +
26043                            "application/ecmascript, application/x-ecmascript"
26044                    },
26045                    contents: {
26046                        script: /\b(?:java|ecma)script\b/
26047                    },
26048                    converters: {
26049                        "text script": function( text ) {
26050                            jQuery.globalEval( text );
26051                            return text;
26052                        }
26053                    }
26054                } );
26055
26056// Handle cache's special case and crossDomain
26057                jQuery.ajaxPrefilter( "script", function( s ) {
26058                    if ( s.cache === undefined ) {
26059                        s.cache = false;
26060                    }
26061                    if ( s.crossDomain ) {
26062                        s.type = "GET";
26063                    }
26064                } );
26065
26066// Bind script tag hack transport
26067                jQuery.ajaxTransport( "script", function( s ) {
26068
26069                    // This transport only deals with cross domain or forced-by-attrs requests
26070                    if ( s.crossDomain || s.scriptAttrs ) {
26071                        var script, callback;
26072                        return {
26073                            send: function( _, complete ) {
26074                                script = jQuery( "<script>" )
26075                                    .attr( s.scriptAttrs || {} )
26076                                    .prop( { charset: s.scriptCharset, src: s.url } )
26077                                    .on( "load error", callback = function( evt ) {
26078                                        script.remove();
26079                                        callback = null;
26080                                        if ( evt ) {
26081                                            complete( evt.type === "error" ? 404 : 200, evt.type );
26082                                        }
26083                                    } );
26084
26085                                // Use native DOM manipulation to avoid our domManip AJAX trickery
26086                                document.head.appendChild( script[ 0 ] );
26087                            },
26088                            abort: function() {
26089                                if ( callback ) {
26090                                    callback();
26091                                }
26092                            }
26093                        };
26094                    }
26095                } );
26096
26097
26098
26099
26100                var oldCallbacks = [],
26101                    rjsonp = /(=)\?(?=&|$)|\?\?/;
26102
26103// Default jsonp settings
26104                jQuery.ajaxSetup( {
26105                    jsonp: "callback",
26106                    jsonpCallback: function() {
26107                        var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
26108                        this[ callback ] = true;
26109                        return callback;
26110                    }
26111                } );
26112
26113// Detect, normalize options and install callbacks for jsonp requests
26114                jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
26115
26116                    var callbackName, overwritten, responseContainer,
26117                        jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
26118                                "url" :
26119                                typeof s.data === "string" &&
26120                                ( s.contentType || "" )
26121                                    .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
26122                                rjsonp.test( s.data ) && "data"
26123                        );
26124
26125                    // Handle iff the expected data type is "jsonp" or we have a parameter to set
26126                    if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
26127
26128                        // Get callback name, remembering preexisting value associated with it
26129                        callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
26130                            s.jsonpCallback() :
26131                            s.jsonpCallback;
26132
26133                        // Insert callback into url or form data
26134                        if ( jsonProp ) {
26135                            s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
26136                        } else if ( s.jsonp !== false ) {
26137                            s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
26138                        }
26139
26140                        // Use data converter to retrieve json after script execution
26141                        s.converters[ "script json" ] = function() {
26142                            if ( !responseContainer ) {
26143                                jQuery.error( callbackName + " was not called" );
26144                            }
26145                            return responseContainer[ 0 ];
26146                        };
26147
26148                        // Force json dataType
26149                        s.dataTypes[ 0 ] = "json";
26150
26151                        // Install callback
26152                        overwritten = window[ callbackName ];
26153                        window[ callbackName ] = function() {
26154                            responseContainer = arguments;
26155                        };
26156
26157                        // Clean-up function (fires after converters)
26158                        jqXHR.always( function() {
26159
26160                            // If previous value didn't exist - remove it
26161                            if ( overwritten === undefined ) {
26162                                jQuery( window ).removeProp( callbackName );
26163
26164                                // Otherwise restore preexisting value
26165                            } else {
26166                                window[ callbackName ] = overwritten;
26167                            }
26168
26169                            // Save back as free
26170                            if ( s[ callbackName ] ) {
26171
26172                                // Make sure that re-using the options doesn't screw things around
26173                                s.jsonpCallback = originalSettings.jsonpCallback;
26174
26175                                // Save the callback name for future use
26176                                oldCallbacks.push( callbackName );
26177                            }
26178
26179                            // Call if it was a function and we have a response
26180                            if ( responseContainer && isFunction( overwritten ) ) {
26181                                overwritten( responseContainer[ 0 ] );
26182                            }
26183
26184                            responseContainer = overwritten = undefined;
26185                        } );
26186
26187                        // Delegate to script
26188                        return "script";
26189                    }
26190                } );
26191
26192
26193
26194
26195// Support: Safari 8 only
26196// In Safari 8 documents created via document.implementation.createHTMLDocument
26197// collapse sibling forms: the second one becomes a child of the first one.
26198// Because of that, this security measure has to be disabled in Safari 8.
26199// https://bugs.webkit.org/show_bug.cgi?id=137337
26200                support.createHTMLDocument = ( function() {
26201                    var body = document.implementation.createHTMLDocument( "" ).body;
26202                    body.innerHTML = "<form></form><form></form>";
26203                    return body.childNodes.length === 2;
26204                } )();
26205
26206
26207// Argument "data" should be string of html
26208// context (optional): If specified, the fragment will be created in this context,
26209// defaults to document
26210// keepScripts (optional): If true, will include scripts passed in the html string
26211                jQuery.parseHTML = function( data, context, keepScripts ) {
26212                    if ( typeof data !== "string" ) {
26213                        return [];
26214                    }
26215                    if ( typeof context === "boolean" ) {
26216                        keepScripts = context;
26217                        context = false;
26218                    }
26219
26220                    var base, parsed, scripts;
26221
26222                    if ( !context ) {
26223
26224                        // Stop scripts or inline event handlers from being executed immediately
26225                        // by using document.implementation
26226                        if ( support.createHTMLDocument ) {
26227                            context = document.implementation.createHTMLDocument( "" );
26228
26229                            // Set the base href for the created document
26230                            // so any parsed elements with URLs
26231                            // are based on the document's URL (gh-2965)
26232                            base = context.createElement( "base" );
26233                            base.href = document.location.href;
26234                            context.head.appendChild( base );
26235                        } else {
26236                            context = document;
26237                        }
26238                    }
26239
26240                    parsed = rsingleTag.exec( data );
26241                    scripts = !keepScripts && [];
26242
26243                    // Single tag
26244                    if ( parsed ) {
26245                        return [ context.createElement( parsed[ 1 ] ) ];
26246                    }
26247
26248                    parsed = buildFragment( [ data ], context, scripts );
26249
26250                    if ( scripts && scripts.length ) {
26251                        jQuery( scripts ).remove();
26252                    }
26253
26254                    return jQuery.merge( [], parsed.childNodes );
26255                };
26256
26257
26258                /**
26259                 * Load a url into a page
26260                 */
26261                jQuery.fn.load = function( url, params, callback ) {
26262                    var selector, type, response,
26263                        self = this,
26264                        off = url.indexOf( " " );
26265
26266                    if ( off > -1 ) {
26267                        selector = stripAndCollapse( url.slice( off ) );
26268                        url = url.slice( 0, off );
26269                    }
26270
26271                    // If it's a function
26272                    if ( isFunction( params ) ) {
26273
26274                        // We assume that it's the callback
26275                        callback = params;
26276                        params = undefined;
26277
26278                        // Otherwise, build a param string
26279                    } else if ( params && typeof params === "object" ) {
26280                        type = "POST";
26281                    }
26282
26283                    // If we have elements to modify, make the request
26284                    if ( self.length > 0 ) {
26285                        jQuery.ajax( {
26286                            url: url,
26287
26288                            // If "type" variable is undefined, then "GET" method will be used.
26289                            // Make value of this field explicit since
26290                            // user can override it through ajaxSetup method
26291                            type: type || "GET",
26292                            dataType: "html",
26293                            data: params
26294                        } ).done( function( responseText ) {
26295
26296                            // Save response for use in complete callback
26297                            response = arguments;
26298
26299                            self.html( selector ?
26300
26301                                // If a selector was specified, locate the right elements in a dummy div
26302                                // Exclude scripts to avoid IE 'Permission Denied' errors
26303                                jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
26304
26305                                // Otherwise use the full result
26306                                responseText );
26307
26308                            // If the request succeeds, this function gets "data", "status", "jqXHR"
26309                            // but they are ignored because response was set above.
26310                            // If it fails, this function gets "jqXHR", "status", "error"
26311                        } ).always( callback && function( jqXHR, status ) {
26312                            self.each( function() {
26313                                callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
26314                            } );
26315                        } );
26316                    }
26317
26318                    return this;
26319                };
26320
26321
26322
26323
26324                jQuery.expr.pseudos.animated = function( elem ) {
26325                    return jQuery.grep( jQuery.timers, function( fn ) {
26326                        return elem === fn.elem;
26327                    } ).length;
26328                };
26329
26330
26331
26332
26333                jQuery.offset = {
26334                    setOffset: function( elem, options, i ) {
26335                        var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
26336                            position = jQuery.css( elem, "position" ),
26337                            curElem = jQuery( elem ),
26338                            props = {};
26339
26340                        // Set position first, in-case top/left are set even on static elem
26341                        if ( position === "static" ) {
26342                            elem.style.position = "relative";
26343                        }
26344
26345                        curOffset = curElem.offset();
26346                        curCSSTop = jQuery.css( elem, "top" );
26347                        curCSSLeft = jQuery.css( elem, "left" );
26348                        calculatePosition = ( position === "absolute" || position === "fixed" ) &&
26349                            ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
26350
26351                        // Need to be able to calculate position if either
26352                        // top or left is auto and position is either absolute or fixed
26353                        if ( calculatePosition ) {
26354                            curPosition = curElem.position();
26355                            curTop = curPosition.top;
26356                            curLeft = curPosition.left;
26357
26358                        } else {
26359                            curTop = parseFloat( curCSSTop ) || 0;
26360                            curLeft = parseFloat( curCSSLeft ) || 0;
26361                        }
26362
26363                        if ( isFunction( options ) ) {
26364
26365                            // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
26366                            options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
26367                        }
26368
26369                        if ( options.top != null ) {
26370                            props.top = ( options.top - curOffset.top ) + curTop;
26371                        }
26372                        if ( options.left != null ) {
26373                            props.left = ( options.left - curOffset.left ) + curLeft;
26374                        }
26375
26376                        if ( "using" in options ) {
26377                            options.using.call( elem, props );
26378
26379                        } else {
26380                            curElem.css( props );
26381                        }
26382                    }
26383                };
26384
26385                jQuery.fn.extend( {
26386
26387                    // offset() relates an element's border box to the document origin
26388                    offset: function( options ) {
26389
26390                        // Preserve chaining for setter
26391                        if ( arguments.length ) {
26392                            return options === undefined ?
26393                                this :
26394                                this.each( function( i ) {
26395                                    jQuery.offset.setOffset( this, options, i );
26396                                } );
26397                        }
26398
26399                        var rect, win,
26400                            elem = this[ 0 ];
26401
26402                        if ( !elem ) {
26403                            return;
26404                        }
26405
26406                        // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
26407                        // Support: IE <=11 only
26408                        // Running getBoundingClientRect on a
26409                        // disconnected node in IE throws an error
26410                        if ( !elem.getClientRects().length ) {
26411                            return { top: 0, left: 0 };
26412                        }
26413
26414                        // Get document-relative position by adding viewport scroll to viewport-relative gBCR
26415                        rect = elem.getBoundingClientRect();
26416                        win = elem.ownerDocument.defaultView;
26417                        return {
26418                            top: rect.top + win.pageYOffset,
26419                            left: rect.left + win.pageXOffset
26420                        };
26421                    },
26422
26423                    // position() relates an element's margin box to its offset parent's padding box
26424                    // This corresponds to the behavior of CSS absolute positioning
26425                    position: function() {
26426                        if ( !this[ 0 ] ) {
26427                            return;
26428                        }
26429
26430                        var offsetParent, offset, doc,
26431                            elem = this[ 0 ],
26432                            parentOffset = { top: 0, left: 0 };
26433
26434                        // position:fixed elements are offset from the viewport, which itself always has zero offset
26435                        if ( jQuery.css( elem, "position" ) === "fixed" ) {
26436
26437                            // Assume position:fixed implies availability of getBoundingClientRect
26438                            offset = elem.getBoundingClientRect();
26439
26440                        } else {
26441                            offset = this.offset();
26442
26443                            // Account for the *real* offset parent, which can be the document or its root element
26444                            // when a statically positioned element is identified
26445                            doc = elem.ownerDocument;
26446                            offsetParent = elem.offsetParent || doc.documentElement;
26447                            while ( offsetParent &&
26448                            ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
26449                            jQuery.css( offsetParent, "position" ) === "static" ) {
26450
26451                                offsetParent = offsetParent.parentNode;
26452                            }
26453                            if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
26454
26455                                // Incorporate borders into its offset, since they are outside its content origin
26456                                parentOffset = jQuery( offsetParent ).offset();
26457                                parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
26458                                parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
26459                            }
26460                        }
26461
26462                        // Subtract parent offsets and element margins
26463                        return {
26464                            top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
26465                            left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
26466                        };
26467                    },
26468
26469                    // This method will return documentElement in the following cases:
26470                    // 1) For the element inside the iframe without offsetParent, this method will return
26471                    //    documentElement of the parent window
26472                    // 2) For the hidden or detached element
26473                    // 3) For body or html element, i.e. in case of the html node - it will return itself
26474                    //
26475                    // but those exceptions were never presented as a real life use-cases
26476                    // and might be considered as more preferable results.
26477                    //
26478                    // This logic, however, is not guaranteed and can change at any point in the future
26479                    offsetParent: function() {
26480                        return this.map( function() {
26481                            var offsetParent = this.offsetParent;
26482
26483                            while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
26484                                offsetParent = offsetParent.offsetParent;
26485                            }
26486
26487                            return offsetParent || documentElement;
26488                        } );
26489                    }
26490                } );
26491
26492// Create scrollLeft and scrollTop methods
26493                jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
26494                    var top = "pageYOffset" === prop;
26495
26496                    jQuery.fn[ method ] = function( val ) {
26497                        return access( this, function( elem, method, val ) {
26498
26499                            // Coalesce documents and windows
26500                            var win;
26501                            if ( isWindow( elem ) ) {
26502                                win = elem;
26503                            } else if ( elem.nodeType === 9 ) {
26504                                win = elem.defaultView;
26505                            }
26506
26507                            if ( val === undefined ) {
26508                                return win ? win[ prop ] : elem[ method ];
26509                            }
26510
26511                            if ( win ) {
26512                                win.scrollTo(
26513                                    !top ? val : win.pageXOffset,
26514                                    top ? val : win.pageYOffset
26515                                );
26516
26517                            } else {
26518                                elem[ method ] = val;
26519                            }
26520                        }, method, val, arguments.length );
26521                    };
26522                } );
26523
26524// Support: Safari <=7 - 9.1, Chrome <=37 - 49
26525// Add the top/left cssHooks using jQuery.fn.position
26526// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
26527// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
26528// getComputedStyle returns percent when specified for top/left/bottom/right;
26529// rather than make the css module depend on the offset module, just check for it here
26530                jQuery.each( [ "top", "left" ], function( _i, prop ) {
26531                    jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
26532                        function( elem, computed ) {
26533                            if ( computed ) {
26534                                computed = curCSS( elem, prop );
26535
26536                                // If curCSS returns percentage, fallback to offset
26537                                return rnumnonpx.test( computed ) ?
26538                                    jQuery( elem ).position()[ prop ] + "px" :
26539                                    computed;
26540                            }
26541                        }
26542                    );
26543                } );
26544
26545
26546// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
26547                jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
26548                    jQuery.each( {
26549                        padding: "inner" + name,
26550                        content: type,
26551                        "": "outer" + name
26552                    }, function( defaultExtra, funcName ) {
26553
26554                        // Margin is only for outerHeight, outerWidth
26555                        jQuery.fn[ funcName ] = function( margin, value ) {
26556                            var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
26557                                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
26558
26559                            return access( this, function( elem, type, value ) {
26560                                var doc;
26561
26562                                if ( isWindow( elem ) ) {
26563
26564                                    // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
26565                                    return funcName.indexOf( "outer" ) === 0 ?
26566                                        elem[ "inner" + name ] :
26567                                        elem.document.documentElement[ "client" + name ];
26568                                }
26569
26570                                // Get document width or height
26571                                if ( elem.nodeType === 9 ) {
26572                                    doc = elem.documentElement;
26573
26574                                    // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
26575                                    // whichever is greatest
26576                                    return Math.max(
26577                                        elem.body[ "scroll" + name ], doc[ "scroll" + name ],
26578                                        elem.body[ "offset" + name ], doc[ "offset" + name ],
26579                                        doc[ "client" + name ]
26580                                    );
26581                                }
26582
26583                                return value === undefined ?
26584
26585                                    // Get width or height on the element, requesting but not forcing parseFloat
26586                                    jQuery.css( elem, type, extra ) :
26587
26588                                    // Set width or height on the element
26589                                    jQuery.style( elem, type, value, extra );
26590                            }, type, chainable ? margin : undefined, chainable );
26591                        };
26592                    } );
26593                } );
26594
26595
26596                jQuery.each( [
26597                    "ajaxStart",
26598                    "ajaxStop",
26599                    "ajaxComplete",
26600                    "ajaxError",
26601                    "ajaxSuccess",
26602                    "ajaxSend"
26603                ], function( _i, type ) {
26604                    jQuery.fn[ type ] = function( fn ) {
26605                        return this.on( type, fn );
26606                    };
26607                } );
26608
26609
26610
26611
26612                jQuery.fn.extend( {
26613
26614                    bind: function( types, data, fn ) {
26615                        return this.on( types, null, data, fn );
26616                    },
26617                    unbind: function( types, fn ) {
26618                        return this.off( types, null, fn );
26619                    },
26620
26621                    delegate: function( selector, types, data, fn ) {
26622                        return this.on( types, selector, data, fn );
26623                    },
26624                    undelegate: function( selector, types, fn ) {
26625
26626                        // ( namespace ) or ( selector, types [, fn] )
26627                        return arguments.length === 1 ?
26628                            this.off( selector, "**" ) :
26629                            this.off( types, selector || "**", fn );
26630                    },
26631
26632                    hover: function( fnOver, fnOut ) {
26633                        return this
26634                            .on( "mouseenter", fnOver )
26635                            .on( "mouseleave", fnOut || fnOver );
26636                    }
26637                } );
26638
26639                jQuery.each(
26640                    ( "blur focus focusin focusout resize scroll click dblclick " +
26641                        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
26642                        "change select submit keydown keypress keyup contextmenu" ).split( " " ),
26643                    function( _i, name ) {
26644
26645                        // Handle event binding
26646                        jQuery.fn[ name ] = function( data, fn ) {
26647                            return arguments.length > 0 ?
26648                                this.on( name, null, data, fn ) :
26649                                this.trigger( name );
26650                        };
26651                    }
26652                );
26653
26654
26655
26656
26657// Support: Android <=4.0 only
26658// Make sure we trim BOM and NBSP
26659// Require that the "whitespace run" starts from a non-whitespace
26660// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
26661                var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
26662
26663// Bind a function to a context, optionally partially applying any
26664// arguments.
26665// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
26666// However, it is not slated for removal any time soon
26667                jQuery.proxy = function( fn, context ) {
26668                    var tmp, args, proxy;
26669
26670                    if ( typeof context === "string" ) {
26671                        tmp = fn[ context ];
26672                        context = fn;
26673                        fn = tmp;
26674                    }
26675
26676                    // Quick check to determine if target is callable, in the spec
26677                    // this throws a TypeError, but we will just return undefined.
26678                    if ( !isFunction( fn ) ) {
26679                        return undefined;
26680                    }
26681
26682                    // Simulated bind
26683                    args = slice.call( arguments, 2 );
26684                    proxy = function() {
26685                        return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
26686                    };
26687
26688                    // Set the guid of unique handler to the same of original handler, so it can be removed
26689                    proxy.guid = fn.guid = fn.guid || jQuery.guid++;
26690
26691                    return proxy;
26692                };
26693
26694                jQuery.holdReady = function( hold ) {
26695                    if ( hold ) {
26696                        jQuery.readyWait++;
26697                    } else {
26698                        jQuery.ready( true );
26699                    }
26700                };
26701                jQuery.isArray = Array.isArray;
26702                jQuery.parseJSON = JSON.parse;
26703                jQuery.nodeName = nodeName;
26704                jQuery.isFunction = isFunction;
26705                jQuery.isWindow = isWindow;
26706                jQuery.camelCase = camelCase;
26707                jQuery.type = toType;
26708
26709                jQuery.now = Date.now;
26710
26711                jQuery.isNumeric = function( obj ) {
26712
26713                    // As of jQuery 3.0, isNumeric is limited to
26714                    // strings and numbers (primitives or objects)
26715                    // that can be coerced to finite numbers (gh-2662)
26716                    var type = jQuery.type( obj );
26717                    return ( type === "number" || type === "string" ) &&
26718
26719                        // parseFloat NaNs numeric-cast false positives ("")
26720                        // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
26721                        // subtraction forces infinities to NaN
26722                        !isNaN( obj - parseFloat( obj ) );
26723                };
26724
26725                jQuery.trim = function( text ) {
26726                    return text == null ?
26727                        "" :
26728                        ( text + "" ).replace( rtrim, "$1" );
26729                };
26730
26731
26732
26733// Register as a named AMD module, since jQuery can be concatenated with other
26734// files that may use define, but not via a proper concatenation script that
26735// understands anonymous AMD modules. A named AMD is safest and most robust
26736// way to register. Lowercase jquery is used because AMD module names are
26737// derived from file names, and jQuery is normally delivered in a lowercase
26738// file name. Do this after creating the global so that if an AMD module wants
26739// to call noConflict to hide this version of jQuery, it will work.
26740
26741// Note that for maximum portability, libraries that are not jQuery should
26742// declare themselves as anonymous modules, and avoid setting a global if an
26743// AMD loader is present. jQuery is a special case. For more information, see
26744// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
26745
26746                if ( true ) {
26747                    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {
26748                        return jQuery;
26749                    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
26750                    __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
26751                }
26752
26753
26754
26755
26756                var
26757
26758                    // Map over jQuery in case of overwrite
26759                    _jQuery = window.jQuery,
26760
26761                    // Map over the $ in case of overwrite
26762                    _$ = window.$;
26763
26764                jQuery.noConflict = function( deep ) {
26765                    if ( window.$ === jQuery ) {
26766                        window.$ = _$;
26767                    }
26768
26769                    if ( deep && window.jQuery === jQuery ) {
26770                        window.jQuery = _jQuery;
26771                    }
26772
26773                    return jQuery;
26774                };
26775
26776// Expose jQuery and $ identifiers, even in AMD
26777// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
26778// and CommonJS for browser emulators (trac-13566)
26779                if ( typeof noGlobal === "undefined" ) {
26780                    window.jQuery = window.$ = jQuery;
26781                }
26782
26783
26784
26785
26786                return jQuery;
26787            } );
26788
26789
26790            /***/ }),
26791
26792        
26792/***/ "./src/js/app.js":
26793        /*!***********************!*\
26794  !*** ./src/js/app.js ***!
26795  \***********************/
26796        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
26797
26798            "use strict";
26799            __webpack_require__.r(__webpack_exports__);
26800            /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
26801            /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
26802            /* harmony import */ var aos__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! aos */ "./node_modules/aos/dist/aos.js");
26803            /* harmony import */ var aos__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(aos__WEBPACK_IMPORTED_MODULE_1__);
26804            /* harmony import */ var owl_carousel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! owl.carousel */ "./node_modules/owl.carousel/dist/owl.carousel.js");
26805            /* harmony import */ var owl_carousel__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(owl_carousel__WEBPACK_IMPORTED_MODULE_2__);
26806            /* harmony import */ var _fancyapps_fancybox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fancyapps/fancybox */ "./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js");
26807            /* harmony import */ var _fancyapps_fancybox__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_fancyapps_fancybox__WEBPACK_IMPORTED_MODULE_3__);
26808            /* harmony import */ var bootstrap_js_dist_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! bootstrap/js/dist/button */ "./node_modules/bootstrap/js/dist/button.js");
26809            /* harmony import */ var bootstrap_js_dist_button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_button__WEBPACK_IMPORTED_MODULE_4__);
26810            /* harmony import */ var bootstrap_js_dist_dropdown__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! bootstrap/js/dist/dropdown */ "./node_modules/bootstrap/js/dist/dropdown.js");
26811            /* harmony import */ var bootstrap_js_dist_dropdown__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_dropdown__WEBPACK_IMPORTED_MODULE_5__);
26812            /* harmony import */ var bootstrap_js_dist_scrollspy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! bootstrap/js/dist/scrollspy */ "./node_modules/bootstrap/js/dist/scrollspy.js");
26813            /* harmony import */ var bootstrap_js_dist_scrollspy__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_scrollspy__WEBPACK_IMPORTED_MODULE_6__);
26814            /* harmony import */ var bootstrap_js_dist_tab__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! bootstrap/js/dist/tab */ "./node_modules/bootstrap/js/dist/tab.js");
26815            /* harmony import */ var bootstrap_js_dist_tab__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_tab__WEBPACK_IMPORTED_MODULE_7__);
26816            /* harmony import */ var bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! bootstrap/js/dist/tooltip */ "./node_modules/bootstrap/js/dist/tooltip.js");
26817            /* harmony import */ var bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8__);
26818            /* harmony import */ var _modules_validate_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/_validate.mjs */ "./src/js/modules/_validate.mjs");
26819            /* harmony import */ var _modules_serviceWorker_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/_serviceWorker.mjs */ "./src/js/modules/_serviceWorker.mjs");
26820            /* harmony import */ var _modules_header_mjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/_header.mjs */ "./src/js/modules/_header.mjs");
26821            /* harmony import */ var _modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/_navbar.mjs */ "./src/js/modules/_navbar.mjs");
26822            /* harmony import */ var _modules_animations_mjs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/_animations.mjs */ "./src/js/modules/_animations.mjs");
26823            /* harmony import */ var _modules_carousels_mjs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./modules/_carousels.mjs */ "./src/js/modules/_carousels.mjs");
26824            /* harmony import */ var _modules_clipboard_mjs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./modules/_clipboard.mjs */ "./src/js/modules/_clipboard.mjs");
26825            /* harmony import */ var _modules_mobile_filters_sidebar_mjs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./modules/_mobile-filters-sidebar.mjs */ "./src/js/modules/_mobile-filters-sidebar.mjs");
26826            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
26827            /**Load External Libraries**/
26828
26829
26830
26831
26832
26833// import fontawesome
26834//import "@fortawesome/fontawesome-free/js/all";
26835
26836            /**Load Bootstrap Javascript**/
26837//import "bootstrap/js/dist/alert";
26838
26839//import "bootstrap/js/dist/carousel";
26840//import "bootstrap/js/dist/collapse";
26841
26842//import "bootstrap/js/dist/modal";
26843//import "bootstrap/js/dist/offcanvas";
26844//import "bootstrap/js/dist/popover";
26845
26846
26847//import "bootstrap/js/dist/toast";
26848
26849
26850            /**Additional libraries**/
26851            window._ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
26852            window.axios = __webpack_require__(/*! axios */ "./node_modules/axios/index.js"); //axios is only required for forms that have an input[type=file] field.
26853            window.Popper = (__webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js")["default"]); //Popper is only required for Bootstrap Dropdowns, Popovers and Tooltips
26854
26855            /**Local Includes**/
26856
26857
26858
26859
26860
26861
26862
26863
26864
26865            /**Initialize Functions**/
26866            $(document).ready(function () {
26867                aos__WEBPACK_IMPORTED_MODULE_1___default().init();
26868                (0,_modules_validate_mjs__WEBPACK_IMPORTED_MODULE_9__.validate)();
26869                //serviceWorker();
26870                //jarallax(document.querySelectorAll('.jarallax'), { speed: 0.8 });
26871                //jarallaxVideo();
26872                //searchbar();
26873                (0,_modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__.navbar)();
26874                (0,_modules_animations_mjs__WEBPACK_IMPORTED_MODULE_13__.animateInView)();
26875                (0,_modules_carousels_mjs__WEBPACK_IMPORTED_MODULE_14__.owl)();
26876                //copyToClipboard();
26877                //mobileFilterbar();
26878                //toggleMobileFilterbar();
26879                (0,_modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__.mobileNav)();
26880            });
26881
26882// load window
26883            $(window).on("load", function () {
26884                $(".hero, .home-hero, .home-hero-logo-right, .home-hero-logo-left, .headerlogo-link, .header-right, .home-hero-cta, .scroll-indicator").addClass("loaded");
26885            });
26886            $('.btn-more').on('click touchstart', function (e) {
26887                var link = $(this).attr('href');
26888                if (link == "#") {
26889                    e.preventDefault();
26890                    $('html, body').animate({
26891                        scrollTop: $(this).offset().top
26892                    }, 500); // for all browsers
26893                }
26894            });
26895            let lastScrollTop = 0;
26896
26897            $(window).scroll(function () {
26898                var scroll = $(window).scrollTop();
26899
26900                // Add/remove 'scroll' class based on threshold
26901                if (scroll >= 50) {
26902                    $("body").addClass("scroll");
26903                } else {
26904                    $("body").removeClass("scroll");
26905                }
26906
26907                $('.full-menu').hide();
26908                $('.backdrop').removeClass('active');
26909
26910                // Detect scroll direction only if difference is >= 10px
26911                if (Math.abs(scroll - lastScrollTop) >= 10) {
26912                    if (scroll > lastScrollTop) {
26913                        $("body").removeClass("up").addClass("down");
26914                    } else {
26915                        $("body").removeClass("down").addClass("up");
26916                    }
26917                    lastScrollTop = scroll;
26918                }
26919            });
26920            $('[name=filter]').on('change', function () {
26921                var val = $(this).val();
26922                if (val == '') {
26923                    $('.categorie-item').show();
26924                } else {
26925                    $('.categorie-item').hide();
26926                    $('.' + val).show();
26927                }
26928            });
26929            $('[name=artikelen-filter]').on('change', function () {
26930                var val = $(this).val();
26931                if (val == '') {
26932                    $('.artikelen').show();
26933                } else {
26934                    $('.artikelen').hide();
26935                    $('.' + val).show();
26936                }
26937            });
26938            $(".icon").on('click touchstart', function (e) {
26939                $('body').toggleClass('no-scroll');
26940                $('html').toggleClass('no-scroll');
26941                $('body').toggleClass('open-nav');
26942                $('.mobile-nav').toggleClass('active');
26943                $('header nav ul').hide();
26944                e.preventDefault();
26945            });
26946            $('.nav-back').on('click touchstart', function (e) {
26947                $('.mobile-nav').removeClass('showPage2');
26948                e.preventDefault();
26949            });
26950
26951// window scroll
26952            $(window).on("scroll", function () {
26953                (0,_modules_navbar_mjs__WEBPACK_IMPORTED_MODULE_12__.navbar)();
26954                (0,_modules_animations_mjs__WEBPACK_IMPORTED_MODULE_13__.animateInView)();
26955            });
26956
26957// resize window
26958            $(window).on("resize", function () {
26959                (0,_modules_mobile_filters_sidebar_mjs__WEBPACK_IMPORTED_MODULE_16__.mobileFilterbar)();
26960            });
26961
26962// Default Settings
26963            window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
26964            $.fancybox.defaults.hash = false;
26965
26966// document.addEventListener("touchstart", onTouchStart, { passive: true });
26967
26968            var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
26969            var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
26970                return new (bootstrap_js_dist_tooltip__WEBPACK_IMPORTED_MODULE_8___default())(tooltipTriggerEl);
26971            });
26972            $.expr[':'].external = function (obj) {
26973                return !obj.href.match(/^mailto\:/) && obj.hostname != location.hostname && !obj.href.match(/^javascript\:/) && !obj.href.match(/^$/);
26974            };
26975            $('a:external').attr('target', '_blank');
26976
26977            /***/ }),
26978
26979        
vendor: 814,663 bytes, lines 26979-44191
26979/***/ "./node_modules/lodash/lodash.js":
26980        /*!***************************************!*\
26981  !*** ./node_modules/lodash/lodash.js ***!
26982  \***************************************/
26983        /***/ (function(module, exports, __webpack_require__) {
26984
26985            /* module decorator */ module = __webpack_require__.nmd(module);
26986            var __WEBPACK_AMD_DEFINE_RESULT__;/**
26987             * @license
26988             * Lodash <https://lodash.com/>
26989             * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
26990             * Released under MIT license <https://lodash.com/license>
26991             * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
26992             * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
26993             */
26994            ;(function() {
26995
26996                /** Used as a safe reference for `undefined` in pre-ES5 environments. */
26997                var undefined;
26998
26999                /** Used as the semantic version number. */
27000                var VERSION = '4.17.21';
27001
27002                /** Used as the size to enable large array optimizations. */
27003                var LARGE_ARRAY_SIZE = 200;
27004
27005                /** Error message constants. */
27006                var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
27007                    FUNC_ERROR_TEXT = 'Expected a function',
27008                    INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';
27009
27010                /** Used to stand-in for `undefined` hash values. */
27011                var HASH_UNDEFINED = '__lodash_hash_undefined__';
27012
27013                /** Used as the maximum memoize cache size. */
27014                var MAX_MEMOIZE_SIZE = 500;
27015
27016                /** Used as the internal argument placeholder. */
27017                var PLACEHOLDER = '__lodash_placeholder__';
27018
27019                /** Used to compose bitmasks for cloning. */
27020                var CLONE_DEEP_FLAG = 1,
27021                    CLONE_FLAT_FLAG = 2,
27022                    CLONE_SYMBOLS_FLAG = 4;
27023
27024                /** Used to compose bitmasks for value comparisons. */
27025                var COMPARE_PARTIAL_FLAG = 1,
27026                    COMPARE_UNORDERED_FLAG = 2;
27027
27028                /** Used to compose bitmasks for function metadata. */
27029                var WRAP_BIND_FLAG = 1,
27030                    WRAP_BIND_KEY_FLAG = 2,
27031                    WRAP_CURRY_BOUND_FLAG = 4,
27032                    WRAP_CURRY_FLAG = 8,
27033                    WRAP_CURRY_RIGHT_FLAG = 16,
27034                    WRAP_PARTIAL_FLAG = 32,
27035                    WRAP_PARTIAL_RIGHT_FLAG = 64,
27036                    WRAP_ARY_FLAG = 128,
27037                    WRAP_REARG_FLAG = 256,
27038                    WRAP_FLIP_FLAG = 512;
27039
27040                /** Used as default options for `_.truncate`. */
27041                var DEFAULT_TRUNC_LENGTH = 30,
27042                    DEFAULT_TRUNC_OMISSION = '...';
27043
27044                /** Used to detect hot functions by number of calls within a span of milliseconds. */
27045                var HOT_COUNT = 800,
27046                    HOT_SPAN = 16;
27047
27048                /** Used to indicate the type of lazy iteratees. */
27049                var LAZY_FILTER_FLAG = 1,
27050                    LAZY_MAP_FLAG = 2,
27051                    LAZY_WHILE_FLAG = 3;
27052
27053                /** Used as references for various `Number` constants. */
27054                var INFINITY = 1 / 0,
27055                    MAX_SAFE_INTEGER = 9007199254740991,
27056                    MAX_INTEGER = 1.7976931348623157e+308,
27057                    NAN = 0 / 0;
27058
27059                /** Used as references for the maximum length and index of an array. */
27060                var MAX_ARRAY_LENGTH = 4294967295,
27061                    MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
27062                    HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
27063
27064                /** Used to associate wrap methods with their bit flags. */
27065                var wrapFlags = [
27066                    ['ary', WRAP_ARY_FLAG],
27067                    ['bind', WRAP_BIND_FLAG],
27068                    ['bindKey', WRAP_BIND_KEY_FLAG],
27069                    ['curry', WRAP_CURRY_FLAG],
27070                    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
27071                    ['flip', WRAP_FLIP_FLAG],
27072                    ['partial', WRAP_PARTIAL_FLAG],
27073                    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
27074                    ['rearg', WRAP_REARG_FLAG]
27075                ];
27076
27077                /** `Object#toString` result references. */
27078                var argsTag = '[object Arguments]',
27079                    arrayTag = '[object Array]',
27080                    asyncTag = '[object AsyncFunction]',
27081                    boolTag = '[object Boolean]',
27082                    dateTag = '[object Date]',
27083                    domExcTag = '[object DOMException]',
27084                    errorTag = '[object Error]',
27085                    funcTag = '[object Function]',
27086                    genTag = '[object GeneratorFunction]',
27087                    mapTag = '[object Map]',
27088                    numberTag = '[object Number]',
27089                    nullTag = '[object Null]',
27090                    objectTag = '[object Object]',
27091                    promiseTag = '[object Promise]',
27092                    proxyTag = '[object Proxy]',
27093                    regexpTag = '[object RegExp]',
27094                    setTag = '[object Set]',
27095                    stringTag = '[object String]',
27096                    symbolTag = '[object Symbol]',
27097                    undefinedTag = '[object Undefined]',
27098                    weakMapTag = '[object WeakMap]',
27099                    weakSetTag = '[object WeakSet]';
27100
27101                var arrayBufferTag = '[object ArrayBuffer]',
27102                    dataViewTag = '[object DataView]',
27103                    float32Tag = '[object Float32Array]',
27104                    float64Tag = '[object Float64Array]',
27105                    int8Tag = '[object Int8Array]',
27106                    int16Tag = '[object Int16Array]',
27107                    int32Tag = '[object Int32Array]',
27108                    uint8Tag = '[object Uint8Array]',
27109                    uint8ClampedTag = '[object Uint8ClampedArray]',
27110                    uint16Tag = '[object Uint16Array]',
27111                    uint32Tag = '[object Uint32Array]';
27112
27113                /** Used to match empty string literals in compiled template source. */
27114                var reEmptyStringLeading = /\b__p \+= '';/g,
27115                    reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
27116                    reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
27117
27118                /** Used to match HTML entities and HTML characters. */
27119                var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
27120                    reUnescapedHtml = /[&<>"']/g,
27121                    reHasEscapedHtml = RegExp(reEscapedHtml.source),
27122                    reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
27123
27124                /** Used to match template delimiters. */
27125                var reEscape = /<%-([\s\S]+?)%>/g,
27126                    reEvaluate = /<%([\s\S]+?)%>/g,
27127                    reInterpolate = /<%=([\s\S]+?)%>/g;
27128
27129                /** Used to match property names within property paths. */
27130                var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
27131                    reIsPlainProp = /^\w*$/,
27132                    rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
27133
27134                /**
27135                 * Used to match `RegExp`
27136                 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
27137                 */
27138                var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
27139                    reHasRegExpChar = RegExp(reRegExpChar.source);
27140
27141                /** Used to match leading whitespace. */
27142                var reTrimStart = /^\s+/;
27143
27144                /** Used to match a single whitespace character. */
27145                var reWhitespace = /\s/;
27146
27147                /** Used to match wrap detail comments. */
27148                var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
27149                    reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
27150                    reSplitDetails = /,? & /;
27151
27152                /** Used to match words composed of alphanumeric characters. */
27153                var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
27154
27155                /**
27156                 * Used to validate the `validate` option in `_.template` variable.
27157                 *
27158                 * Forbids characters which could potentially change the meaning of the function argument definition:
27159                 * - "()," (modification of function parameters)
27160                 * - "=" (default value)
27161                 * - "[]{}" (destructuring of function parameters)
27162                 * - "/" (beginning of a comment)
27163                 * - whitespace
27164                 */
27165                var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
27166
27167                /** Used to match backslashes in property paths. */
27168                var reEscapeChar = /\\(\\)?/g;
27169
27170                /**
27171                 * Used to match
27172                 * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
27173                 */
27174                var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
27175
27176                /** Used to match `RegExp` flags from their coerced string values. */
27177                var reFlags = /\w*$/;
27178
27179                /** Used to detect bad signed hexadecimal string values. */
27180                var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
27181
27182                /** Used to detect binary string values. */
27183                var reIsBinary = /^0b[01]+$/i;
27184
27185                /** Used to detect host constructors (Safari). */
27186                var reIsHostCtor = /^\[object .+?Constructor\]$/;
27187
27188                /** Used to detect octal string values. */
27189                var reIsOctal = /^0o[0-7]+$/i;
27190
27191                /** Used to detect unsigned integer values. */
27192                var reIsUint = /^(?:0|[1-9]\d*)$/;
27193
27194                /** Used to match Latin Unicode letters (excluding mathematical operators). */
27195                var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
27196
27197                /** Used to ensure capturing order of template delimiters. */
27198                var reNoMatch = /($^)/;
27199
27200                /** Used to match unescaped characters in compiled string literals. */
27201                var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
27202
27203                /** Used to compose unicode character classes. */
27204                var rsAstralRange = '\\ud800-\\udfff',
27205                    rsComboMarksRange = '\\u0300-\\u036f',
27206                    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
27207                    rsComboSymbolsRange = '\\u20d0-\\u20ff',
27208                    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
27209                    rsDingbatRange = '\\u2700-\\u27bf',
27210                    rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
27211                    rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
27212                    rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
27213                    rsPunctuationRange = '\\u2000-\\u206f',
27214                    rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
27215                    rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
27216                    rsVarRange = '\\ufe0e\\ufe0f',
27217                    rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
27218
27219                /** Used to compose unicode capture groups. */
27220                var rsApos = "['\u2019]",
27221                    rsAstral = '[' + rsAstralRange + ']',
27222                    rsBreak = '[' + rsBreakRange + ']',
27223                    rsCombo = '[' + rsComboRange + ']',
27224                    rsDigits = '\\d+',
27225                    rsDingbat = '[' + rsDingbatRange + ']',
27226                    rsLower = '[' + rsLowerRange + ']',
27227                    rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
27228                    rsFitz = '\\ud83c[\\udffb-\\udfff]',
27229                    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
27230                    rsNonAstral = '[^' + rsAstralRange + ']',
27231                    rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
27232                    rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
27233                    rsUpper = '[' + rsUpperRange + ']',
27234                    rsZWJ = '\\u200d';
27235
27236                /** Used to compose unicode regexes. */
27237                var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
27238                    rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
27239                    rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
27240                    rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
27241                    reOptMod = rsModifier + '?',
27242                    rsOptVar = '[' + rsVarRange + ']?',
27243                    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
27244                    rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
27245                    rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
27246                    rsSeq = rsOptVar + reOptMod + rsOptJoin,
27247                    rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
27248                    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
27249
27250                /** Used to match apostrophes. */
27251                var reApos = RegExp(rsApos, 'g');
27252
27253                /**
27254                 * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
27255                 * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
27256                 */
27257                var reComboMark = RegExp(rsCombo, 'g');
27258
27259                /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
27260                var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
27261
27262                /** Used to match complex or compound words. */
27263                var reUnicodeWord = RegExp([
27264                    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
27265                    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
27266                    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
27267                    rsUpper + '+' + rsOptContrUpper,
27268                    rsOrdUpper,
27269                    rsOrdLower,
27270                    rsDigits,
27271                    rsEmoji
27272                ].join('|'), 'g');
27273
27274                /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
27275                var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
27276
27277                /** Used to detect strings that need a more robust regexp to match words. */
27278                var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
27279
27280                /** Used to assign default `context` object properties. */
27281                var contextProps = [
27282                    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
27283                    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
27284                    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
27285                    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
27286                    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
27287                ];
27288
27289                /** Used to make template sourceURLs easier to identify. */
27290                var templateCounter = -1;
27291
27292                /** Used to identify `toStringTag` values of typed arrays. */
27293                var typedArrayTags = {};
27294                typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
27295                    typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
27296                        typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
27297                            typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
27298                                typedArrayTags[uint32Tag] = true;
27299                typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
27300                    typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
27301                        typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
27302                            typedArrayTags[errorTag] = typedArrayTags[funcTag] =
27303                                typedArrayTags[mapTag] = typedArrayTags[numberTag] =
27304                                    typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
27305                                        typedArrayTags[setTag] = typedArrayTags[stringTag] =
27306                                            typedArrayTags[weakMapTag] = false;
27307
27308                /** Used to identify `toStringTag` values supported by `_.clone`. */
27309                var cloneableTags = {};
27310                cloneableTags[argsTag] = cloneableTags[arrayTag] =
27311                    cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
27312                        cloneableTags[boolTag] = cloneableTags[dateTag] =
27313                            cloneableTags[float32Tag] = cloneableTags[float64Tag] =
27314                                cloneableTags[int8Tag] = cloneableTags[int16Tag] =
27315                                    cloneableTags[int32Tag] = cloneableTags[mapTag] =
27316                                        cloneableTags[numberTag] = cloneableTags[objectTag] =
27317                                            cloneableTags[regexpTag] = cloneableTags[setTag] =
27318                                                cloneableTags[stringTag] = cloneableTags[symbolTag] =
27319                                                    cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
27320                                                        cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
27321                cloneableTags[errorTag] = cloneableTags[funcTag] =
27322                    cloneableTags[weakMapTag] = false;
27323
27324                /** Used to map Latin Unicode letters to basic Latin letters. */
27325                var deburredLetters = {
27326                    // Latin-1 Supplement block.
27327                    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
27328                    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
27329                    '\xc7': 'C',  '\xe7': 'c',
27330                    '\xd0': 'D',  '\xf0': 'd',
27331                    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
27332                    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
27333                    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
27334                    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
27335                    '\xd1': 'N',  '\xf1': 'n',
27336                    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
27337                    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
27338                    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
27339                    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
27340                    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
27341                    '\xc6': 'Ae', '\xe6': 'ae',
27342                    '\xde': 'Th', '\xfe': 'th',
27343                    '\xdf': 'ss',
27344                    // Latin Extended-A block.
27345                    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
27346                    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
27347                    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
27348                    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
27349                    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
27350                    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
27351                    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
27352                    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
27353                    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
27354                    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
27355                    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
27356                    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
27357                    '\u0134': 'J',  '\u0135': 'j',
27358                    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
27359                    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
27360                    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
27361                    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
27362                    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
27363                    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
27364                    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
27365                    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
27366                    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
27367                    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
27368                    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
27369                    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
27370                    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
27371                    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
27372                    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
27373                    '\u0174': 'W',  '\u0175': 'w',
27374                    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
27375                    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
27376                    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
27377                    '\u0132': 'IJ', '\u0133': 'ij',
27378                    '\u0152': 'Oe', '\u0153': 'oe',
27379                    '\u0149': "'n", '\u017f': 's'
27380                };
27381
27382                /** Used to map characters to HTML entities. */
27383                var htmlEscapes = {
27384                    '&': '&amp;',
27385                    '<': '&lt;',
27386                    '>': '&gt;',
27387                    '"': '&quot;',
27388                    "'": '&#39;'
27389                };
27390
27391                /** Used to map HTML entities to characters. */
27392                var htmlUnescapes = {
27393                    '&amp;': '&',
27394                    '&lt;': '<',
27395                    '&gt;': '>',
27396                    '&quot;': '"',
27397                    '&#39;': "'"
27398                };
27399
27400                /** Used to escape characters for inclusion in compiled string literals. */
27401                var stringEscapes = {
27402                    '\\': '\\',
27403                    "'": "'",
27404                    '\n': 'n',
27405                    '\r': 'r',
27406                    '\u2028': 'u2028',
27407                    '\u2029': 'u2029'
27408                };
27409
27410                /** Built-in method references without a dependency on `root`. */
27411                var freeParseFloat = parseFloat,
27412                    freeParseInt = parseInt;
27413
27414                /** Detect free variable `global` from Node.js. */
27415                var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
27416
27417                /** Detect free variable `self`. */
27418                var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
27419
27420                /** Used as a reference to the global object. */
27421                var root = freeGlobal || freeSelf || Function('return this')();
27422
27423                /** Detect free variable `exports`. */
27424                var freeExports =  true && exports && !exports.nodeType && exports;
27425
27426                /** Detect free variable `module`. */
27427                var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module;
27428
27429                /** Detect the popular CommonJS extension `module.exports`. */
27430                var moduleExports = freeModule && freeModule.exports === freeExports;
27431
27432                /** Detect free variable `process` from Node.js. */
27433                var freeProcess = moduleExports && freeGlobal.process;
27434
27435                /** Used to access faster Node.js helpers. */
27436                var nodeUtil = (function() {
27437                    try {
27438                        // Use `util.types` for Node.js 10+.
27439                        var types = freeModule && freeModule.require && freeModule.require('util').types;
27440
27441                        if (types) {
27442                            return types;
27443                        }
27444
27445                        // Legacy `process.binding('util')` for Node.js < 10.
27446                        return freeProcess && freeProcess.binding && freeProcess.binding('util');
27447                    } catch (e) {}
27448                }());
27449
27450                /* Node.js helper references. */
27451                var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
27452                    nodeIsDate = nodeUtil && nodeUtil.isDate,
27453                    nodeIsMap = nodeUtil && nodeUtil.isMap,
27454                    nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
27455                    nodeIsSet = nodeUtil && nodeUtil.isSet,
27456                    nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
27457
27458                /*--------------------------------------------------------------------------*/
27459
27460                /**
27461                 * A faster alternative to `Function#apply`, this function invokes `func`
27462                 * with the `this` binding of `thisArg` and the arguments of `args`.
27463                 *
27464                 * @private
27465                 * @param {Function} func The function to invoke.
27466                 * @param {*} thisArg The `this` binding of `func`.
27467                 * @param {Array} args The arguments to invoke `func` with.
27468                 * @returns {*} Returns the result of `func`.
27469                 */
27470                function apply(func, thisArg, args) {
27471                    switch (args.length) {
27472                        case 0: return func.call(thisArg);
27473                        case 1: return func.call(thisArg, args[0]);
27474                        case 2: return func.call(thisArg, args[0], args[1]);
27475                        case 3: return func.call(thisArg, args[0], args[1], args[2]);
27476                    }
27477                    return func.apply(thisArg, args);
27478                }
27479
27480                /**
27481                 * A specialized version of `baseAggregator` for arrays.
27482                 *
27483                 * @private
27484                 * @param {Array} [array] The array to iterate over.
27485                 * @param {Function} setter The function to set `accumulator` values.
27486                 * @param {Function} iteratee The iteratee to transform keys.
27487                 * @param {Object} accumulator The initial aggregated object.
27488                 * @returns {Function} Returns `accumulator`.
27489                 */
27490                function arrayAggregator(array, setter, iteratee, accumulator) {
27491                    var index = -1,
27492                        length = array == null ? 0 : array.length;
27493
27494                    while (++index < length) {
27495                        var value = array[index];
27496                        setter(accumulator, value, iteratee(value), array);
27497                    }
27498                    return accumulator;
27499                }
27500
27501                /**
27502                 * A specialized version of `_.forEach` for arrays without support for
27503                 * iteratee shorthands.
27504                 *
27505                 * @private
27506                 * @param {Array} [array] The array to iterate over.
27507                 * @param {Function} iteratee The function invoked per iteration.
27508                 * @returns {Array} Returns `array`.
27509                 */
27510                function arrayEach(array, iteratee) {
27511                    var index = -1,
27512                        length = array == null ? 0 : array.length;
27513
27514                    while (++index < length) {
27515                        if (iteratee(array[index], index, array) === false) {
27516                            break;
27517                        }
27518                    }
27519                    return array;
27520                }
27521
27522                /**
27523                 * A specialized version of `_.forEachRight` for arrays without support for
27524                 * iteratee shorthands.
27525                 *
27526                 * @private
27527                 * @param {Array} [array] The array to iterate over.
27528                 * @param {Function} iteratee The function invoked per iteration.
27529                 * @returns {Array} Returns `array`.
27530                 */
27531                function arrayEachRight(array, iteratee) {
27532                    var length = array == null ? 0 : array.length;
27533
27534                    while (length--) {
27535                        if (iteratee(array[length], length, array) === false) {
27536                            break;
27537                        }
27538                    }
27539                    return array;
27540                }
27541
27542                /**
27543                 * A specialized version of `_.every` for arrays without support for
27544                 * iteratee shorthands.
27545                 *
27546                 * @private
27547                 * @param {Array} [array] The array to iterate over.
27548                 * @param {Function} predicate The function invoked per iteration.
27549                 * @returns {boolean} Returns `true` if all elements pass the predicate check,
27550                 *  else `false`.
27551                 */
27552                function arrayEvery(array, predicate) {
27553                    var index = -1,
27554                        length = array == null ? 0 : array.length;
27555
27556                    while (++index < length) {
27557                        if (!predicate(array[index], index, array)) {
27558                            return false;
27559                        }
27560                    }
27561                    return true;
27562                }
27563
27564                /**
27565                 * A specialized version of `_.filter` for arrays without support for
27566                 * iteratee shorthands.
27567                 *
27568                 * @private
27569                 * @param {Array} [array] The array to iterate over.
27570                 * @param {Function} predicate The function invoked per iteration.
27571                 * @returns {Array} Returns the new filtered array.
27572                 */
27573                function arrayFilter(array, predicate) {
27574                    var index = -1,
27575                        length = array == null ? 0 : array.length,
27576                        resIndex = 0,
27577                        result = [];
27578
27579                    while (++index < length) {
27580                        var value = array[index];
27581                        if (predicate(value, index, array)) {
27582                            result[resIndex++] = value;
27583                        }
27584                    }
27585                    return result;
27586                }
27587
27588                /**
27589                 * A specialized version of `_.includes` for arrays without support for
27590                 * specifying an index to search from.
27591                 *
27592                 * @private
27593                 * @param {Array} [array] The array to inspect.
27594                 * @param {*} target The value to search for.
27595                 * @returns {boolean} Returns `true` if `target` is found, else `false`.
27596                 */
27597                function arrayIncludes(array, value) {
27598                    var length = array == null ? 0 : array.length;
27599                    return !!length && baseIndexOf(array, value, 0) > -1;
27600                }
27601
27602                /**
27603                 * This function is like `arrayIncludes` except that it accepts a comparator.
27604                 *
27605                 * @private
27606                 * @param {Array} [array] The array to inspect.
27607                 * @param {*} target The value to search for.
27608                 * @param {Function} comparator The comparator invoked per element.
27609                 * @returns {boolean} Returns `true` if `target` is found, else `false`.
27610                 */
27611                function arrayIncludesWith(array, value, comparator) {
27612                    var index = -1,
27613                        length = array == null ? 0 : array.length;
27614
27615                    while (++index < length) {
27616                        if (comparator(value, array[index])) {
27617                            return true;
27618                        }
27619                    }
27620                    return false;
27621                }
27622
27623                /**
27624                 * A specialized version of `_.map` for arrays without support for iteratee
27625                 * shorthands.
27626                 *
27627                 * @private
27628                 * @param {Array} [array] The array to iterate over.
27629                 * @param {Function} iteratee The function invoked per iteration.
27630                 * @returns {Array} Returns the new mapped array.
27631                 */
27632                function arrayMap(array, iteratee) {
27633                    var index = -1,
27634                        length = array == null ? 0 : array.length,
27635                        result = Array(length);
27636
27637                    while (++index < length) {
27638                        result[index] = iteratee(array[index], index, array);
27639                    }
27640                    return result;
27641                }
27642
27643                /**
27644                 * Appends the elements of `values` to `array`.
27645                 *
27646                 * @private
27647                 * @param {Array} array The array to modify.
27648                 * @param {Array} values The values to append.
27649                 * @returns {Array} Returns `array`.
27650                 */
27651                function arrayPush(array, values) {
27652                    var index = -1,
27653                        length = values.length,
27654                        offset = array.length;
27655
27656                    while (++index < length) {
27657                        array[offset + index] = values[index];
27658                    }
27659                    return array;
27660                }
27661
27662                /**
27663                 * A specialized version of `_.reduce` for arrays without support for
27664                 * iteratee shorthands.
27665                 *
27666                 * @private
27667                 * @param {Array} [array] The array to iterate over.
27668                 * @param {Function} iteratee The function invoked per iteration.
27669                 * @param {*} [accumulator] The initial value.
27670                 * @param {boolean} [initAccum] Specify using the first element of `array` as
27671                 *  the initial value.
27672                 * @returns {*} Returns the accumulated value.
27673                 */
27674                function arrayReduce(array, iteratee, accumulator, initAccum) {
27675                    var index = -1,
27676                        length = array == null ? 0 : array.length;
27677
27678                    if (initAccum && length) {
27679                        accumulator = array[++index];
27680                    }
27681                    while (++index < length) {
27682                        accumulator = iteratee(accumulator, array[index], index, array);
27683                    }
27684                    return accumulator;
27685                }
27686
27687                /**
27688                 * A specialized version of `_.reduceRight` for arrays without support for
27689                 * iteratee shorthands.
27690                 *
27691                 * @private
27692                 * @param {Array} [array] The array to iterate over.
27693                 * @param {Function} iteratee The function invoked per iteration.
27694                 * @param {*} [accumulator] The initial value.
27695                 * @param {boolean} [initAccum] Specify using the last element of `array` as
27696                 *  the initial value.
27697                 * @returns {*} Returns the accumulated value.
27698                 */
27699                function arrayReduceRight(array, iteratee, accumulator, initAccum) {
27700                    var length = array == null ? 0 : array.length;
27701                    if (initAccum && length) {
27702                        accumulator = array[--length];
27703                    }
27704                    while (length--) {
27705                        accumulator = iteratee(accumulator, array[length], length, array);
27706                    }
27707                    return accumulator;
27708                }
27709
27710                /**
27711                 * A specialized version of `_.some` for arrays without support for iteratee
27712                 * shorthands.
27713                 *
27714                 * @private
27715                 * @param {Array} [array] The array to iterate over.
27716                 * @param {Function} predicate The function invoked per iteration.
27717                 * @returns {boolean} Returns `true` if any element passes the predicate check,
27718                 *  else `false`.
27719                 */
27720                function arraySome(array, predicate) {
27721                    var index = -1,
27722                        length = array == null ? 0 : array.length;
27723
27724                    while (++index < length) {
27725                        if (predicate(array[index], index, array)) {
27726                            return true;
27727                        }
27728                    }
27729                    return false;
27730                }
27731
27732                /**
27733                 * Gets the size of an ASCII `string`.
27734                 *
27735                 * @private
27736                 * @param {string} string The string inspect.
27737                 * @returns {number} Returns the string size.
27738                 */
27739                var asciiSize = baseProperty('length');
27740
27741                /**
27742                 * Converts an ASCII `string` to an array.
27743                 *
27744                 * @private
27745                 * @param {string} string The string to convert.
27746                 * @returns {Array} Returns the converted array.
27747                 */
27748                function asciiToArray(string) {
27749                    return string.split('');
27750                }
27751
27752                /**
27753                 * Splits an ASCII `string` into an array of its words.
27754                 *
27755                 * @private
27756                 * @param {string} The string to inspect.
27757                 * @returns {Array} Returns the words of `string`.
27758                 */
27759                function asciiWords(string) {
27760                    return string.match(reAsciiWord) || [];
27761                }
27762
27763                /**
27764                 * The base implementation of methods like `_.findKey` and `_.findLastKey`,
27765                 * without support for iteratee shorthands, which iterates over `collection`
27766                 * using `eachFunc`.
27767                 *
27768                 * @private
27769                 * @param {Array|Object} collection The collection to inspect.
27770                 * @param {Function} predicate The function invoked per iteration.
27771                 * @param {Function} eachFunc The function to iterate over `collection`.
27772                 * @returns {*} Returns the found element or its key, else `undefined`.
27773                 */
27774                function baseFindKey(collection, predicate, eachFunc) {
27775                    var result;
27776                    eachFunc(collection, function(value, key, collection) {
27777                        if (predicate(value, key, collection)) {
27778                            result = key;
27779                            return false;
27780                        }
27781                    });
27782                    return result;
27783                }
27784
27785                /**
27786                 * The base implementation of `_.findIndex` and `_.findLastIndex` without
27787                 * support for iteratee shorthands.
27788                 *
27789                 * @private
27790                 * @param {Array} array The array to inspect.
27791                 * @param {Function} predicate The function invoked per iteration.
27792                 * @param {number} fromIndex The index to search from.
27793                 * @param {boolean} [fromRight] Specify iterating from right to left.
27794                 * @returns {number} Returns the index of the matched value, else `-1`.
27795                 */
27796                function baseFindIndex(array, predicate, fromIndex, fromRight) {
27797                    var length = array.length,
27798                        index = fromIndex + (fromRight ? 1 : -1);
27799
27800                    while ((fromRight ? index-- : ++index < length)) {
27801                        if (predicate(array[index], index, array)) {
27802                            return index;
27803                        }
27804                    }
27805                    return -1;
27806                }
27807
27808                /**
27809                 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
27810                 *
27811                 * @private
27812                 * @param {Array} array The array to inspect.
27813                 * @param {*} value The value to search for.
27814                 * @param {number} fromIndex The index to search from.
27815                 * @returns {number} Returns the index of the matched value, else `-1`.
27816                 */
27817                function baseIndexOf(array, value, fromIndex) {
27818                    return value === value
27819                        ? strictIndexOf(array, value, fromIndex)
27820                        : baseFindIndex(array, baseIsNaN, fromIndex);
27821                }
27822
27823                /**
27824                 * This function is like `baseIndexOf` except that it accepts a comparator.
27825                 *
27826                 * @private
27827                 * @param {Array} array The array to inspect.
27828                 * @param {*} value The value to search for.
27829                 * @param {number} fromIndex The index to search from.
27830                 * @param {Function} comparator The comparator invoked per element.
27831                 * @returns {number} Returns the index of the matched value, else `-1`.
27832                 */
27833                function baseIndexOfWith(array, value, fromIndex, comparator) {
27834                    var index = fromIndex - 1,
27835                        length = array.length;
27836
27837                    while (++index < length) {
27838                        if (comparator(array[index], value)) {
27839                            return index;
27840                        }
27841                    }
27842                    return -1;
27843                }
27844
27845                /**
27846                 * The base implementation of `_.isNaN` without support for number objects.
27847                 *
27848                 * @private
27849                 * @param {*} value The value to check.
27850                 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
27851                 */
27852                function baseIsNaN(value) {
27853                    return value !== value;
27854                }
27855
27856                /**
27857                 * The base implementation of `_.mean` and `_.meanBy` without support for
27858                 * iteratee shorthands.
27859                 *
27860                 * @private
27861                 * @param {Array} array The array to iterate over.
27862                 * @param {Function} iteratee The function invoked per iteration.
27863                 * @returns {number} Returns the mean.
27864                 */
27865                function baseMean(array, iteratee) {
27866                    var length = array == null ? 0 : array.length;
27867                    return length ? (baseSum(array, iteratee) / length) : NAN;
27868                }
27869
27870                /**
27871                 * The base implementation of `_.property` without support for deep paths.
27872                 *
27873                 * @private
27874                 * @param {string} key The key of the property to get.
27875                 * @returns {Function} Returns the new accessor function.
27876                 */
27877                function baseProperty(key) {
27878                    return function(object) {
27879                        return object == null ? undefined : object[key];
27880                    };
27881                }
27882
27883                /**
27884                 * The base implementation of `_.propertyOf` without support for deep paths.
27885                 *
27886                 * @private
27887                 * @param {Object} object The object to query.
27888                 * @returns {Function} Returns the new accessor function.
27889                 */
27890                function basePropertyOf(object) {
27891                    return function(key) {
27892                        return object == null ? undefined : object[key];
27893                    };
27894                }
27895
27896                /**
27897                 * The base implementation of `_.reduce` and `_.reduceRight`, without support
27898                 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
27899                 *
27900                 * @private
27901                 * @param {Array|Object} collection The collection to iterate over.
27902                 * @param {Function} iteratee The function invoked per iteration.
27903                 * @param {*} accumulator The initial value.
27904                 * @param {boolean} initAccum Specify using the first or last element of
27905                 *  `collection` as the initial value.
27906                 * @param {Function} eachFunc The function to iterate over `collection`.
27907                 * @returns {*} Returns the accumulated value.
27908                 */
27909                function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
27910                    eachFunc(collection, function(value, index, collection) {
27911                        accumulator = initAccum
27912                            ? (initAccum = false, value)
27913                            : iteratee(accumulator, value, index, collection);
27914                    });
27915                    return accumulator;
27916                }
27917
27918                /**
27919                 * The base implementation of `_.sortBy` which uses `comparer` to define the
27920                 * sort order of `array` and replaces criteria objects with their corresponding
27921                 * values.
27922                 *
27923                 * @private
27924                 * @param {Array} array The array to sort.
27925                 * @param {Function} comparer The function to define sort order.
27926                 * @returns {Array} Returns `array`.
27927                 */
27928                function baseSortBy(array, comparer) {
27929                    var length = array.length;
27930
27931                    array.sort(comparer);
27932                    while (length--) {
27933                        array[length] = array[length].value;
27934                    }
27935                    return array;
27936                }
27937
27938                /**
27939                 * The base implementation of `_.sum` and `_.sumBy` without support for
27940                 * iteratee shorthands.
27941                 *
27942                 * @private
27943                 * @param {Array} array The array to iterate over.
27944                 * @param {Function} iteratee The function invoked per iteration.
27945                 * @returns {number} Returns the sum.
27946                 */
27947                function baseSum(array, iteratee) {
27948                    var result,
27949                        index = -1,
27950                        length = array.length;
27951
27952                    while (++index < length) {
27953                        var current = iteratee(array[index]);
27954                        if (current !== undefined) {
27955                            result = result === undefined ? current : (result + current);
27956                        }
27957                    }
27958                    return result;
27959                }
27960
27961                /**
27962                 * The base implementation of `_.times` without support for iteratee shorthands
27963                 * or max array length checks.
27964                 *
27965                 * @private
27966                 * @param {number} n The number of times to invoke `iteratee`.
27967                 * @param {Function} iteratee The function invoked per iteration.
27968                 * @returns {Array} Returns the array of results.
27969                 */
27970                function baseTimes(n, iteratee) {
27971                    var index = -1,
27972                        result = Array(n);
27973
27974                    while (++index < n) {
27975                        result[index] = iteratee(index);
27976                    }
27977                    return result;
27978                }
27979
27980                /**
27981                 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
27982                 * of key-value pairs for `object` corresponding to the property names of `props`.
27983                 *
27984                 * @private
27985                 * @param {Object} object The object to query.
27986                 * @param {Array} props The property names to get values for.
27987                 * @returns {Object} Returns the key-value pairs.
27988                 */
27989                function baseToPairs(object, props) {
27990                    return arrayMap(props, function(key) {
27991                        return [key, object[key]];
27992                    });
27993                }
27994
27995                /**
27996                 * The base implementation of `_.trim`.
27997                 *
27998                 * @private
27999                 * @param {string} string The string to trim.
28000                 * @returns {string} Returns the trimmed string.
28001                 */
28002                function baseTrim(string) {
28003                    return string
28004                        ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
28005                        : string;
28006                }
28007
28008                /**
28009                 * The base implementation of `_.unary` without support for storing metadata.
28010                 *
28011                 * @private
28012                 * @param {Function} func The function to cap arguments for.
28013                 * @returns {Function} Returns the new capped function.
28014                 */
28015                function baseUnary(func) {
28016                    return function(value) {
28017                        return func(value);
28018                    };
28019                }
28020
28021                /**
28022                 * The base implementation of `_.values` and `_.valuesIn` which creates an
28023                 * array of `object` property values corresponding to the property names
28024                 * of `props`.
28025                 *
28026                 * @private
28027                 * @param {Object} object The object to query.
28028                 * @param {Array} props The property names to get values for.
28029                 * @returns {Object} Returns the array of property values.
28030                 */
28031                function baseValues(object, props) {
28032                    return arrayMap(props, function(key) {
28033                        return object[key];
28034                    });
28035                }
28036
28037                /**
28038                 * Checks if a `cache` value for `key` exists.
28039                 *
28040                 * @private
28041                 * @param {Object} cache The cache to query.
28042                 * @param {string} key The key of the entry to check.
28043                 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
28044                 */
28045                function cacheHas(cache, key) {
28046                    return cache.has(key);
28047                }
28048
28049                /**
28050                 * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
28051                 * that is not found in the character symbols.
28052                 *
28053                 * @private
28054                 * @param {Array} strSymbols The string symbols to inspect.
28055                 * @param {Array} chrSymbols The character symbols to find.
28056                 * @returns {number} Returns the index of the first unmatched string symbol.
28057                 */
28058                function charsStartIndex(strSymbols, chrSymbols) {
28059                    var index = -1,
28060                        length = strSymbols.length;
28061
28062                    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
28063                    return index;
28064                }
28065
28066                /**
28067                 * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
28068                 * that is not found in the character symbols.
28069                 *
28070                 * @private
28071                 * @param {Array} strSymbols The string symbols to inspect.
28072                 * @param {Array} chrSymbols The character symbols to find.
28073                 * @returns {number} Returns the index of the last unmatched string symbol.
28074                 */
28075                function charsEndIndex(strSymbols, chrSymbols) {
28076                    var index = strSymbols.length;
28077
28078                    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
28079                    return index;
28080                }
28081
28082                /**
28083                 * Gets the number of `placeholder` occurrences in `array`.
28084                 *
28085                 * @private
28086                 * @param {Array} array The array to inspect.
28087                 * @param {*} placeholder The placeholder to search for.
28088                 * @returns {number} Returns the placeholder count.
28089                 */
28090                function countHolders(array, placeholder) {
28091                    var length = array.length,
28092                        result = 0;
28093
28094                    while (length--) {
28095                        if (array[length] === placeholder) {
28096                            ++result;
28097                        }
28098                    }
28099                    return result;
28100                }
28101
28102                /**
28103                 * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
28104                 * letters to basic Latin letters.
28105                 *
28106                 * @private
28107                 * @param {string} letter The matched letter to deburr.
28108                 * @returns {string} Returns the deburred letter.
28109                 */
28110                var deburrLetter = basePropertyOf(deburredLetters);
28111
28112                /**
28113                 * Used by `_.escape` to convert characters to HTML entities.
28114                 *
28115                 * @private
28116                 * @param {string} chr The matched character to escape.
28117                 * @returns {string} Returns the escaped character.
28118                 */
28119                var escapeHtmlChar = basePropertyOf(htmlEscapes);
28120
28121                /**
28122                 * Used by `_.template` to escape characters for inclusion in compiled string literals.
28123                 *
28124                 * @private
28125                 * @param {string} chr The matched character to escape.
28126                 * @returns {string} Returns the escaped character.
28127                 */
28128                function escapeStringChar(chr) {
28129                    return '\\' + stringEscapes[chr];
28130                }
28131
28132                /**
28133                 * Gets the value at `key` of `object`.
28134                 *
28135                 * @private
28136                 * @param {Object} [object] The object to query.
28137                 * @param {string} key The key of the property to get.
28138                 * @returns {*} Returns the property value.
28139                 */
28140                function getValue(object, key) {
28141                    return object == null ? undefined : object[key];
28142                }
28143
28144                /**
28145                 * Checks if `string` contains Unicode symbols.
28146                 *
28147                 * @private
28148                 * @param {string} string The string to inspect.
28149                 * @returns {boolean} Returns `true` if a symbol is found, else `false`.
28150                 */
28151                function hasUnicode(string) {
28152                    return reHasUnicode.test(string);
28153                }
28154
28155                /**
28156                 * Checks if `string` contains a word composed of Unicode symbols.
28157                 *
28158                 * @private
28159                 * @param {string} string The string to inspect.
28160                 * @returns {boolean} Returns `true` if a word is found, else `false`.
28161                 */
28162                function hasUnicodeWord(string) {
28163                    return reHasUnicodeWord.test(string);
28164                }
28165
28166                /**
28167                 * Converts `iterator` to an array.
28168                 *
28169                 * @private
28170                 * @param {Object} iterator The iterator to convert.
28171                 * @returns {Array} Returns the converted array.
28172                 */
28173                function iteratorToArray(iterator) {
28174                    var data,
28175                        result = [];
28176
28177                    while (!(data = iterator.next()).done) {
28178                        result.push(data.value);
28179                    }
28180                    return result;
28181                }
28182
28183                /**
28184                 * Converts `map` to its key-value pairs.
28185                 *
28186                 * @private
28187                 * @param {Object} map The map to convert.
28188                 * @returns {Array} Returns the key-value pairs.
28189                 */
28190                function mapToArray(map) {
28191                    var index = -1,
28192                        result = Array(map.size);
28193
28194                    map.forEach(function(value, key) {
28195                        result[++index] = [key, value];
28196                    });
28197                    return result;
28198                }
28199
28200                /**
28201                 * Creates a unary function that invokes `func` with its argument transformed.
28202                 *
28203                 * @private
28204                 * @param {Function} func The function to wrap.
28205                 * @param {Function} transform The argument transform.
28206                 * @returns {Function} Returns the new function.
28207                 */
28208                function overArg(func, transform) {
28209                    return function(arg) {
28210                        return func(transform(arg));
28211                    };
28212                }
28213
28214                /**
28215                 * Replaces all `placeholder` elements in `array` with an internal placeholder
28216                 * and returns an array of their indexes.
28217                 *
28218                 * @private
28219                 * @param {Array} array The array to modify.
28220                 * @param {*} placeholder The placeholder to replace.
28221                 * @returns {Array} Returns the new array of placeholder indexes.
28222                 */
28223                function replaceHolders(array, placeholder) {
28224                    var index = -1,
28225                        length = array.length,
28226                        resIndex = 0,
28227                        result = [];
28228
28229                    while (++index < length) {
28230                        var value = array[index];
28231                        if (value === placeholder || value === PLACEHOLDER) {
28232                            array[index] = PLACEHOLDER;
28233                            result[resIndex++] = index;
28234                        }
28235                    }
28236                    return result;
28237                }
28238
28239                /**
28240                 * Converts `set` to an array of its values.
28241                 *
28242                 * @private
28243                 * @param {Object} set The set to convert.
28244                 * @returns {Array} Returns the values.
28245                 */
28246                function setToArray(set) {
28247                    var index = -1,
28248                        result = Array(set.size);
28249
28250                    set.forEach(function(value) {
28251                        result[++index] = value;
28252                    });
28253                    return result;
28254                }
28255
28256                /**
28257                 * Converts `set` to its value-value pairs.
28258                 *
28259                 * @private
28260                 * @param {Object} set The set to convert.
28261                 * @returns {Array} Returns the value-value pairs.
28262                 */
28263                function setToPairs(set) {
28264                    var index = -1,
28265                        result = Array(set.size);
28266
28267                    set.forEach(function(value) {
28268                        result[++index] = [value, value];
28269                    });
28270                    return result;
28271                }
28272
28273                /**
28274                 * A specialized version of `_.indexOf` which performs strict equality
28275                 * comparisons of values, i.e. `===`.
28276                 *
28277                 * @private
28278                 * @param {Array} array The array to inspect.
28279                 * @param {*} value The value to search for.
28280                 * @param {number} fromIndex The index to search from.
28281                 * @returns {number} Returns the index of the matched value, else `-1`.
28282                 */
28283                function strictIndexOf(array, value, fromIndex) {
28284                    var index = fromIndex - 1,
28285                        length = array.length;
28286
28287                    while (++index < length) {
28288                        if (array[index] === value) {
28289                            return index;
28290                        }
28291                    }
28292                    return -1;
28293                }
28294
28295                /**
28296                 * A specialized version of `_.lastIndexOf` which performs strict equality
28297                 * comparisons of values, i.e. `===`.
28298                 *
28299                 * @private
28300                 * @param {Array} array The array to inspect.
28301                 * @param {*} value The value to search for.
28302                 * @param {number} fromIndex The index to search from.
28303                 * @returns {number} Returns the index of the matched value, else `-1`.
28304                 */
28305                function strictLastIndexOf(array, value, fromIndex) {
28306                    var index = fromIndex + 1;
28307                    while (index--) {
28308                        if (array[index] === value) {
28309                            return index;
28310                        }
28311                    }
28312                    return index;
28313                }
28314
28315                /**
28316                 * Gets the number of symbols in `string`.
28317                 *
28318                 * @private
28319                 * @param {string} string The string to inspect.
28320                 * @returns {number} Returns the string size.
28321                 */
28322                function stringSize(string) {
28323                    return hasUnicode(string)
28324                        ? unicodeSize(string)
28325                        : asciiSize(string);
28326                }
28327
28328                /**
28329                 * Converts `string` to an array.
28330                 *
28331                 * @private
28332                 * @param {string} string The string to convert.
28333                 * @returns {Array} Returns the converted array.
28334                 */
28335                function stringToArray(string) {
28336                    return hasUnicode(string)
28337                        ? unicodeToArray(string)
28338                        : asciiToArray(string);
28339                }
28340
28341                /**
28342                 * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
28343                 * character of `string`.
28344                 *
28345                 * @private
28346                 * @param {string} string The string to inspect.
28347                 * @returns {number} Returns the index of the last non-whitespace character.
28348                 */
28349                function trimmedEndIndex(string) {
28350                    var index = string.length;
28351
28352                    while (index-- && reWhitespace.test(string.charAt(index))) {}
28353                    return index;
28354                }
28355
28356                /**
28357                 * Used by `_.unescape` to convert HTML entities to characters.
28358                 *
28359                 * @private
28360                 * @param {string} chr The matched character to unescape.
28361                 * @returns {string} Returns the unescaped character.
28362                 */
28363                var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
28364
28365                /**
28366                 * Gets the size of a Unicode `string`.
28367                 *
28368                 * @private
28369                 * @param {string} string The string inspect.
28370                 * @returns {number} Returns the string size.
28371                 */
28372                function unicodeSize(string) {
28373                    var result = reUnicode.lastIndex = 0;
28374                    while (reUnicode.test(string)) {
28375                        ++result;
28376                    }
28377                    return result;
28378                }
28379
28380                /**
28381                 * Converts a Unicode `string` to an array.
28382                 *
28383                 * @private
28384                 * @param {string} string The string to convert.
28385                 * @returns {Array} Returns the converted array.
28386                 */
28387                function unicodeToArray(string) {
28388                    return string.match(reUnicode) || [];
28389                }
28390
28391                /**
28392                 * Splits a Unicode `string` into an array of its words.
28393                 *
28394                 * @private
28395                 * @param {string} The string to inspect.
28396                 * @returns {Array} Returns the words of `string`.
28397                 */
28398                function unicodeWords(string) {
28399                    return string.match(reUnicodeWord) || [];
28400                }
28401
28402                /*--------------------------------------------------------------------------*/
28403
28404                /**
28405                 * Create a new pristine `lodash` function using the `context` object.
28406                 *
28407                 * @static
28408                 * @memberOf _
28409                 * @since 1.1.0
28410                 * @category Util
28411                 * @param {Object} [context=root] The context object.
28412                 * @returns {Function} Returns a new `lodash` function.
28413                 * @example
28414                 *
28415                 * _.mixin({ 'foo': _.constant('foo') });
28416                 *
28417                 * var lodash = _.runInContext();
28418                 * lodash.mixin({ 'bar': lodash.constant('bar') });
28419                 *
28420                 * _.isFunction(_.foo);
28421                 * // => true
28422                 * _.isFunction(_.bar);
28423                 * // => false
28424                 *
28425                 * lodash.isFunction(lodash.foo);
28426                 * // => false
28427                 * lodash.isFunction(lodash.bar);
28428                 * // => true
28429                 *
28430                 * // Create a suped-up `defer` in Node.js.
28431                 * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
28432                 */
28433                var runInContext = (function runInContext(context) {
28434                    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
28435
28436                    /** Built-in constructor references. */
28437                    var Array = context.Array,
28438                        Date = context.Date,
28439                        Error = context.Error,
28440                        Function = context.Function,
28441                        Math = context.Math,
28442                        Object = context.Object,
28443                        RegExp = context.RegExp,
28444                        String = context.String,
28445                        TypeError = context.TypeError;
28446
28447                    /** Used for built-in method references. */
28448                    var arrayProto = Array.prototype,
28449                        funcProto = Function.prototype,
28450                        objectProto = Object.prototype;
28451
28452                    /** Used to detect overreaching core-js shims. */
28453                    var coreJsData = context['__core-js_shared__'];
28454
28455                    /** Used to resolve the decompiled source of functions. */
28456                    var funcToString = funcProto.toString;
28457
28458                    /** Used to check objects for own properties. */
28459                    var hasOwnProperty = objectProto.hasOwnProperty;
28460
28461                    /** Used to generate unique IDs. */
28462                    var idCounter = 0;
28463
28464                    /** Used to detect methods masquerading as native. */
28465                    var maskSrcKey = (function() {
28466                        var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
28467                        return uid ? ('Symbol(src)_1.' + uid) : '';
28468                    }());
28469
28470                    /**
28471                     * Used to resolve the
28472                     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
28473                     * of values.
28474                     */
28475                    var nativeObjectToString = objectProto.toString;
28476
28477                    /** Used to infer the `Object` constructor. */
28478                    var objectCtorString = funcToString.call(Object);
28479
28480                    /** Used to restore the original `_` reference in `_.noConflict`. */
28481                    var oldDash = root._;
28482
28483                    /** Used to detect if a method is native. */
28484                    var reIsNative = RegExp('^' +
28485                        funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
28486                            .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
28487                    );
28488
28489                    /** Built-in value references. */
28490                    var Buffer = moduleExports ? context.Buffer : undefined,
28491                        Symbol = context.Symbol,
28492                        Uint8Array = context.Uint8Array,
28493                        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
28494                        getPrototype = overArg(Object.getPrototypeOf, Object),
28495                        objectCreate = Object.create,
28496                        propertyIsEnumerable = objectProto.propertyIsEnumerable,
28497                        splice = arrayProto.splice,
28498                        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
28499                        symIterator = Symbol ? Symbol.iterator : undefined,
28500                        symToStringTag = Symbol ? Symbol.toStringTag : undefined;
28501
28502                    var defineProperty = (function() {
28503                        try {
28504                            var func = getNative(Object, 'defineProperty');
28505                            func({}, '', {});
28506                            return func;
28507                        } catch (e) {}
28508                    }());
28509
28510                    /** Mocked built-ins. */
28511                    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
28512                        ctxNow = Date && Date.now !== root.Date.now && Date.now,
28513                        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
28514
28515                    /* Built-in method references for those with the same name as other `lodash` methods. */
28516                    var nativeCeil = Math.ceil,
28517                        nativeFloor = Math.floor,
28518                        nativeGetSymbols = Object.getOwnPropertySymbols,
28519                        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
28520                        nativeIsFinite = context.isFinite,
28521                        nativeJoin = arrayProto.join,
28522                        nativeKeys = overArg(Object.keys, Object),
28523                        nativeMax = Math.max,
28524                        nativeMin = Math.min,
28525                        nativeNow = Date.now,
28526                        nativeParseInt = context.parseInt,
28527                        nativeRandom = Math.random,
28528                        nativeReverse = arrayProto.reverse;
28529
28530                    /* Built-in method references that are verified to be native. */
28531                    var DataView = getNative(context, 'DataView'),
28532                        Map = getNative(context, 'Map'),
28533                        Promise = getNative(context, 'Promise'),
28534                        Set = getNative(context, 'Set'),
28535                        WeakMap = getNative(context, 'WeakMap'),
28536                        nativeCreate = getNative(Object, 'create');
28537
28538                    /** Used to store function metadata. */
28539                    var metaMap = WeakMap && new WeakMap;
28540
28541                    /** Used to lookup unminified function names. */
28542                    var realNames = {};
28543
28544                    /** Used to detect maps, sets, and weakmaps. */
28545                    var dataViewCtorString = toSource(DataView),
28546                        mapCtorString = toSource(Map),
28547                        promiseCtorString = toSource(Promise),
28548                        setCtorString = toSource(Set),
28549                        weakMapCtorString = toSource(WeakMap);
28550
28551                    /** Used to convert symbols to primitives and strings. */
28552                    var symbolProto = Symbol ? Symbol.prototype : undefined,
28553                        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
28554                        symbolToString = symbolProto ? symbolProto.toString : undefined;
28555
28556                    /*------------------------------------------------------------------------*/
28557
28558                    /**
28559                     * Creates a `lodash` object which wraps `value` to enable implicit method
28560                     * chain sequences. Methods that operate on and return arrays, collections,
28561                     * and functions can be chained together. Methods that retrieve a single value
28562                     * or may return a primitive value will automatically end the chain sequence
28563                     * and return the unwrapped value. Otherwise, the value must be unwrapped
28564                     * with `_#value`.
28565                     *
28566                     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
28567                     * enabled using `_.chain`.
28568                     *
28569                     * The execution of chained methods is lazy, that is, it's deferred until
28570                     * `_#value` is implicitly or explicitly called.
28571                     *
28572                     * Lazy evaluation allows several methods to support shortcut fusion.
28573                     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
28574                     * the creation of intermediate arrays and can greatly reduce the number of
28575                     * iteratee executions. Sections of a chain sequence qualify for shortcut
28576                     * fusion if the section is applied to an array and iteratees accept only
28577                     * one argument. The heuristic for whether a section qualifies for shortcut
28578                     * fusion is subject to change.
28579                     *
28580                     * Chaining is supported in custom builds as long as the `_#value` method is
28581                     * directly or indirectly included in the build.
28582                     *
28583                     * In addition to lodash methods, wrappers have `Array` and `String` methods.
28584                     *
28585                     * The wrapper `Array` methods are:
28586                     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
28587                     *
28588                     * The wrapper `String` methods are:
28589                     * `replace` and `split`
28590                     *
28591                     * The wrapper methods that support shortcut fusion are:
28592                     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
28593                     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
28594                     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
28595                     *
28596                     * The chainable wrapper methods are:
28597                     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
28598                     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
28599                     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
28600                     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
28601                     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
28602                     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
28603                     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
28604                     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
28605                     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
28606                     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
28607                     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
28608                     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
28609                     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
28610                     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
28611                     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
28612                     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
28613                     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
28614                     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
28615                     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
28616                     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
28617                     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
28618                     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
28619                     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
28620                     * `zipObject`, `zipObjectDeep`, and `zipWith`
28621                     *
28622                     * The wrapper methods that are **not** chainable by default are:
28623                     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
28624                     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
28625                     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
28626                     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
28627                     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
28628                     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
28629                     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
28630                     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
28631                     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
28632                     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
28633                     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
28634                     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
28635                     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
28636                     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
28637                     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
28638                     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
28639                     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
28640                     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
28641                     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
28642                     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
28643                     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
28644                     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
28645                     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
28646                     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
28647                     * `upperFirst`, `value`, and `words`
28648                     *
28649                     * @name _
28650                     * @constructor
28651                     * @category Seq
28652                     * @param {*} value The value to wrap in a `lodash` instance.
28653                     * @returns {Object} Returns the new `lodash` wrapper instance.
28654                     * @example
28655                     *
28656                     * function square(n) {
28657                     *   return n * n;
28658                     * }
28659                     *
28660                     * var wrapped = _([1, 2, 3]);
28661                     *
28662                     * // Returns an unwrapped value.
28663                     * wrapped.reduce(_.add);
28664                     * // => 6
28665                     *
28666                     * // Returns a wrapped value.
28667                     * var squares = wrapped.map(square);
28668                     *
28669                     * _.isArray(squares);
28670                     * // => false
28671                     *
28672                     * _.isArray(squares.value());
28673                     * // => true
28674                     */
28675                    function lodash(value) {
28676                        if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
28677                            if (value instanceof LodashWrapper) {
28678                                return value;
28679                            }
28680                            if (hasOwnProperty.call(value, '__wrapped__')) {
28681                                return wrapperClone(value);
28682                            }
28683                        }
28684                        return new LodashWrapper(value);
28685                    }
28686
28687                    /**
28688                     * The base implementation of `_.create` without support for assigning
28689                     * properties to the created object.
28690                     *
28691                     * @private
28692                     * @param {Object} proto The object to inherit from.
28693                     * @returns {Object} Returns the new object.
28694                     */
28695                    var baseCreate = (function() {
28696                        function object() {}
28697                        return function(proto) {
28698                            if (!isObject(proto)) {
28699                                return {};
28700                            }
28701                            if (objectCreate) {
28702                                return objectCreate(proto);
28703                            }
28704                            object.prototype = proto;
28705                            var result = new object;
28706                            object.prototype = undefined;
28707                            return result;
28708                        };
28709                    }());
28710
28711                    /**
28712                     * The function whose prototype chain sequence wrappers inherit from.
28713                     *
28714                     * @private
28715                     */
28716                    function baseLodash() {
28717                        // No operation performed.
28718                    }
28719
28720                    /**
28721                     * The base constructor for creating `lodash` wrapper objects.
28722                     *
28723                     * @private
28724                     * @param {*} value The value to wrap.
28725                     * @param {boolean} [chainAll] Enable explicit method chain sequences.
28726                     */
28727                    function LodashWrapper(value, chainAll) {
28728                        this.__wrapped__ = value;
28729                        this.__actions__ = [];
28730                        this.__chain__ = !!chainAll;
28731                        this.__index__ = 0;
28732                        this.__values__ = undefined;
28733                    }
28734
28735                    /**
28736                     * By default, the template delimiters used by lodash are like those in
28737                     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
28738                     * following template settings to use alternative delimiters.
28739                     *
28740                     * @static
28741                     * @memberOf _
28742                     * @type {Object}
28743                     */
28744                    lodash.templateSettings = {
28745
28746                        /**
28747                         * Used to detect `data` property values to be HTML-escaped.
28748                         *
28749                         * @memberOf _.templateSettings
28750                         * @type {RegExp}
28751                         */
28752                        'escape': reEscape,
28753
28754                        /**
28755                         * Used to detect code to be evaluated.
28756                         *
28757                         * @memberOf _.templateSettings
28758                         * @type {RegExp}
28759                         */
28760                        'evaluate': reEvaluate,
28761
28762                        /**
28763                         * Used to detect `data` property values to inject.
28764                         *
28765                         * @memberOf _.templateSettings
28766                         * @type {RegExp}
28767                         */
28768                        'interpolate': reInterpolate,
28769
28770                        /**
28771                         * Used to reference the data object in the template text.
28772                         *
28773                         * @memberOf _.templateSettings
28774                         * @type {string}
28775                         */
28776                        'variable': '',
28777
28778                        /**
28779                         * Used to import variables into the compiled template.
28780                         *
28781                         * @memberOf _.templateSettings
28782                         * @type {Object}
28783                         */
28784                        'imports': {
28785
28786                            /**
28787                             * A reference to the `lodash` function.
28788                             *
28789                             * @memberOf _.templateSettings.imports
28790                             * @type {Function}
28791                             */
28792                            '_': lodash
28793                        }
28794                    };
28795
28796                    // Ensure wrappers are instances of `baseLodash`.
28797                    lodash.prototype = baseLodash.prototype;
28798                    lodash.prototype.constructor = lodash;
28799
28800                    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
28801                    LodashWrapper.prototype.constructor = LodashWrapper;
28802
28803                    /*------------------------------------------------------------------------*/
28804
28805                    /**
28806                     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
28807                     *
28808                     * @private
28809                     * @constructor
28810                     * @param {*} value The value to wrap.
28811                     */
28812                    function LazyWrapper(value) {
28813                        this.__wrapped__ = value;
28814                        this.__actions__ = [];
28815                        this.__dir__ = 1;
28816                        this.__filtered__ = false;
28817                        this.__iteratees__ = [];
28818                        this.__takeCount__ = MAX_ARRAY_LENGTH;
28819                        this.__views__ = [];
28820                    }
28821
28822                    /**
28823                     * Creates a clone of the lazy wrapper object.
28824                     *
28825                     * @private
28826                     * @name clone
28827                     * @memberOf LazyWrapper
28828                     * @returns {Object} Returns the cloned `LazyWrapper` object.
28829                     */
28830                    function lazyClone() {
28831                        var result = new LazyWrapper(this.__wrapped__);
28832                        result.__actions__ = copyArray(this.__actions__);
28833                        result.__dir__ = this.__dir__;
28834                        result.__filtered__ = this.__filtered__;
28835                        result.__iteratees__ = copyArray(this.__iteratees__);
28836                        result.__takeCount__ = this.__takeCount__;
28837                        result.__views__ = copyArray(this.__views__);
28838                        return result;
28839                    }
28840
28841                    /**
28842                     * Reverses the direction of lazy iteration.
28843                     *
28844                     * @private
28845                     * @name reverse
28846                     * @memberOf LazyWrapper
28847                     * @returns {Object} Returns the new reversed `LazyWrapper` object.
28848                     */
28849                    function lazyReverse() {
28850                        if (this.__filtered__) {
28851                            var result = new LazyWrapper(this);
28852                            result.__dir__ = -1;
28853                            result.__filtered__ = true;
28854                        } else {
28855                            result = this.clone();
28856                            result.__dir__ *= -1;
28857                        }
28858                        return result;
28859                    }
28860
28861                    /**
28862                     * Extracts the unwrapped value from its lazy wrapper.
28863                     *
28864                     * @private
28865                     * @name value
28866                     * @memberOf LazyWrapper
28867                     * @returns {*} Returns the unwrapped value.
28868                     */
28869                    function lazyValue() {
28870                        var array = this.__wrapped__.value(),
28871                            dir = this.__dir__,
28872                            isArr = isArray(array),
28873                            isRight = dir < 0,
28874                            arrLength = isArr ? array.length : 0,
28875                            view = getView(0, arrLength, this.__views__),
28876                            start = view.start,
28877                            end = view.end,
28878                            length = end - start,
28879                            index = isRight ? end : (start - 1),
28880                            iteratees = this.__iteratees__,
28881                            iterLength = iteratees.length,
28882                            resIndex = 0,
28883                            takeCount = nativeMin(length, this.__takeCount__);
28884
28885                        if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
28886                            return baseWrapperValue(array, this.__actions__);
28887                        }
28888                        var result = [];
28889
28890                        outer:
28891                            while (length-- && resIndex < takeCount) {
28892                                index += dir;
28893
28894                                var iterIndex = -1,
28895                                    value = array[index];
28896
28897                                while (++iterIndex < iterLength) {
28898                                    var data = iteratees[iterIndex],
28899                                        iteratee = data.iteratee,
28900                                        type = data.type,
28901                                        computed = iteratee(value);
28902
28903                                    if (type == LAZY_MAP_FLAG) {
28904                                        value = computed;
28905                                    } else if (!computed) {
28906                                        if (type == LAZY_FILTER_FLAG) {
28907                                            continue outer;
28908                                        } else {
28909                                            break outer;
28910                                        }
28911                                    }
28912                                }
28913                                result[resIndex++] = value;
28914                            }
28915                        return result;
28916                    }
28917
28918                    // Ensure `LazyWrapper` is an instance of `baseLodash`.
28919                    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
28920                    LazyWrapper.prototype.constructor = LazyWrapper;
28921
28922                    /*------------------------------------------------------------------------*/
28923
28924                    /**
28925                     * Creates a hash object.
28926                     *
28927                     * @private
28928                     * @constructor
28929                     * @param {Array} [entries] The key-value pairs to cache.
28930                     */
28931                    function Hash(entries) {
28932                        var index = -1,
28933                            length = entries == null ? 0 : entries.length;
28934
28935                        this.clear();
28936                        while (++index < length) {
28937                            var entry = entries[index];
28938                            this.set(entry[0], entry[1]);
28939                        }
28940                    }
28941
28942                    /**
28943                     * Removes all key-value entries from the hash.
28944                     *
28945                     * @private
28946                     * @name clear
28947                     * @memberOf Hash
28948                     */
28949                    function hashClear() {
28950                        this.__data__ = nativeCreate ? nativeCreate(null) : {};
28951                        this.size = 0;
28952                    }
28953
28954                    /**
28955                     * Removes `key` and its value from the hash.
28956                     *
28957                     * @private
28958                     * @name delete
28959                     * @memberOf Hash
28960                     * @param {Object} hash The hash to modify.
28961                     * @param {string} key The key of the value to remove.
28962                     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
28963                     */
28964                    function hashDelete(key) {
28965                        var result = this.has(key) && delete this.__data__[key];
28966                        this.size -= result ? 1 : 0;
28967                        return result;
28968                    }
28969
28970                    /**
28971                     * Gets the hash value for `key`.
28972                     *
28973                     * @private
28974                     * @name get
28975                     * @memberOf Hash
28976                     * @param {string} key The key of the value to get.
28977                     * @returns {*} Returns the entry value.
28978                     */
28979                    function hashGet(key) {
28980                        var data = this.__data__;
28981                        if (nativeCreate) {
28982                            var result = data[key];
28983                            return result === HASH_UNDEFINED ? undefined : result;
28984                        }
28985                        return hasOwnProperty.call(data, key) ? data[key] : undefined;
28986                    }
28987
28988                    /**
28989                     * Checks if a hash value for `key` exists.
28990                     *
28991                     * @private
28992                     * @name has
28993                     * @memberOf Hash
28994                     * @param {string} key The key of the entry to check.
28995                     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
28996                     */
28997                    function hashHas(key) {
28998                        var data = this.__data__;
28999                        return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
29000                    }
29001
29002                    /**
29003                     * Sets the hash `key` to `value`.
29004                     *
29005                     * @private
29006                     * @name set
29007                     * @memberOf Hash
29008                     * @param {string} key The key of the value to set.
29009                     * @param {*} value The value to set.
29010                     * @returns {Object} Returns the hash instance.
29011                     */
29012                    function hashSet(key, value) {
29013                        var data = this.__data__;
29014                        this.size += this.has(key) ? 0 : 1;
29015                        data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
29016                        return this;
29017                    }
29018
29019                    // Add methods to `Hash`.
29020                    Hash.prototype.clear = hashClear;
29021                    Hash.prototype['delete'] = hashDelete;
29022                    Hash.prototype.get = hashGet;
29023                    Hash.prototype.has = hashHas;
29024                    Hash.prototype.set = hashSet;
29025
29026                    /*------------------------------------------------------------------------*/
29027
29028                    /**
29029                     * Creates an list cache object.
29030                     *
29031                     * @private
29032                     * @constructor
29033                     * @param {Array} [entries] The key-value pairs to cache.
29034                     */
29035                    function ListCache(entries) {
29036                        var index = -1,
29037                            length = entries == null ? 0 : entries.length;
29038
29039                        this.clear();
29040                        while (++index < length) {
29041                            var entry = entries[index];
29042                            this.set(entry[0], entry[1]);
29043                        }
29044                    }
29045
29046                    /**
29047                     * Removes all key-value entries from the list cache.
29048                     *
29049                     * @private
29050                     * @name clear
29051                     * @memberOf ListCache
29052                     */
29053                    function listCacheClear() {
29054                        this.__data__ = [];
29055                        this.size = 0;
29056                    }
29057
29058                    /**
29059                     * Removes `key` and its value from the list cache.
29060                     *
29061                     * @private
29062                     * @name delete
29063                     * @memberOf ListCache
29064                     * @param {string} key The key of the value to remove.
29065                     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
29066                     */
29067                    function listCacheDelete(key) {
29068                        var data = this.__data__,
29069                            index = assocIndexOf(data, key);
29070
29071                        if (index < 0) {
29072                            return false;
29073                        }
29074                        var lastIndex = data.length - 1;
29075                        if (index == lastIndex) {
29076                            data.pop();
29077                        } else {
29078                            splice.call(data, index, 1);
29079                        }
29080                        --this.size;
29081                        return true;
29082                    }
29083
29084                    /**
29085                     * Gets the list cache value for `key`.
29086                     *
29087                     * @private
29088                     * @name get
29089                     * @memberOf ListCache
29090                     * @param {string} key The key of the value to get.
29091                     * @returns {*} Returns the entry value.
29092                     */
29093                    function listCacheGet(key) {
29094                        var data = this.__data__,
29095                            index = assocIndexOf(data, key);
29096
29097                        return index < 0 ? undefined : data[index][1];
29098                    }
29099
29100                    /**
29101                     * Checks if a list cache value for `key` exists.
29102                     *
29103                     * @private
29104                     * @name has
29105                     * @memberOf ListCache
29106                     * @param {string} key The key of the entry to check.
29107                     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
29108                     */
29109                    function listCacheHas(key) {
29110                        return assocIndexOf(this.__data__, key) > -1;
29111                    }
29112
29113                    /**
29114                     * Sets the list cache `key` to `value`.
29115                     *
29116                     * @private
29117                     * @name set
29118                     * @memberOf ListCache
29119                     * @param {string} key The key of the value to set.
29120                     * @param {*} value The value to set.
29121                     * @returns {Object} Returns the list cache instance.
29122                     */
29123                    function listCacheSet(key, value) {
29124                        var data = this.__data__,
29125                            index = assocIndexOf(data, key);
29126
29127                        if (index < 0) {
29128                            ++this.size;
29129                            data.push([key, value]);
29130                        } else {
29131                            data[index][1] = value;
29132                        }
29133                        return this;
29134                    }
29135
29136                    // Add methods to `ListCache`.
29137                    ListCache.prototype.clear = listCacheClear;
29138                    ListCache.prototype['delete'] = listCacheDelete;
29139                    ListCache.prototype.get = listCacheGet;
29140                    ListCache.prototype.has = listCacheHas;
29141                    ListCache.prototype.set = listCacheSet;
29142
29143                    /*------------------------------------------------------------------------*/
29144
29145                    /**
29146                     * Creates a map cache object to store key-value pairs.
29147                     *
29148                     * @private
29149                     * @constructor
29150                     * @param {Array} [entries] The key-value pairs to cache.
29151                     */
29152                    function MapCache(entries) {
29153                        var index = -1,
29154                            length = entries == null ? 0 : entries.length;
29155
29156                        this.clear();
29157                        while (++index < length) {
29158                            var entry = entries[index];
29159                            this.set(entry[0], entry[1]);
29160                        }
29161                    }
29162
29163                    /**
29164                     * Removes all key-value entries from the map.
29165                     *
29166                     * @private
29167                     * @name clear
29168                     * @memberOf MapCache
29169                     */
29170                    function mapCacheClear() {
29171                        this.size = 0;
29172                        this.__data__ = {
29173                            'hash': new Hash,
29174                            'map': new (Map || ListCache),
29175                            'string': new Hash
29176                        };
29177                    }
29178
29179                    /**
29180                     * Removes `key` and its value from the map.
29181                     *
29182                     * @private
29183                     * @name delete
29184                     * @memberOf MapCache
29185                     * @param {string} key The key of the value to remove.
29186                     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
29187                     */
29188                    function mapCacheDelete(key) {
29189                        var result = getMapData(this, key)['delete'](key);
29190                        this.size -= result ? 1 : 0;
29191                        return result;
29192                    }
29193
29194                    /**
29195                     * Gets the map value for `key`.
29196                     *
29197                     * @private
29198                     * @name get
29199                     * @memberOf MapCache
29200                     * @param {string} key The key of the value to get.
29201                     * @returns {*} Returns the entry value.
29202                     */
29203                    function mapCacheGet(key) {
29204                        return getMapData(this, key).get(key);
29205                    }
29206
29207                    /**
29208                     * Checks if a map value for `key` exists.
29209                     *
29210                     * @private
29211                     * @name has
29212                     * @memberOf MapCache
29213                     * @param {string} key The key of the entry to check.
29214                     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
29215                     */
29216                    function mapCacheHas(key) {
29217                        return getMapData(this, key).has(key);
29218                    }
29219
29220                    /**
29221                     * Sets the map `key` to `value`.
29222                     *
29223                     * @private
29224                     * @name set
29225                     * @memberOf MapCache
29226                     * @param {string} key The key of the value to set.
29227                     * @param {*} value The value to set.
29228                     * @returns {Object} Returns the map cache instance.
29229                     */
29230                    function mapCacheSet(key, value) {
29231                        var data = getMapData(this, key),
29232                            size = data.size;
29233
29234                        data.set(key, value);
29235                        this.size += data.size == size ? 0 : 1;
29236                        return this;
29237                    }
29238
29239                    // Add methods to `MapCache`.
29240                    MapCache.prototype.clear = mapCacheClear;
29241                    MapCache.prototype['delete'] = mapCacheDelete;
29242                    MapCache.prototype.get = mapCacheGet;
29243                    MapCache.prototype.has = mapCacheHas;
29244                    MapCache.prototype.set = mapCacheSet;
29245
29246                    /*------------------------------------------------------------------------*/
29247
29248                    /**
29249                     *
29250                     * Creates an array cache object to store unique values.
29251                     *
29252                     * @private
29253                     * @constructor
29254                     * @param {Array} [values] The values to cache.
29255                     */
29256                    function SetCache(values) {
29257                        var index = -1,
29258                            length = values == null ? 0 : values.length;
29259
29260                        this.__data__ = new MapCache;
29261                        while (++index < length) {
29262                            this.add(values[index]);
29263                        }
29264                    }
29265
29266                    /**
29267                     * Adds `value` to the array cache.
29268                     *
29269                     * @private
29270                     * @name add
29271                     * @memberOf SetCache
29272                     * @alias push
29273                     * @param {*} value The value to cache.
29274                     * @returns {Object} Returns the cache instance.
29275                     */
29276                    function setCacheAdd(value) {
29277                        this.__data__.set(value, HASH_UNDEFINED);
29278                        return this;
29279                    }
29280
29281                    /**
29282                     * Checks if `value` is in the array cache.
29283                     *
29284                     * @private
29285                     * @name has
29286                     * @memberOf SetCache
29287                     * @param {*} value The value to search for.
29288                     * @returns {number} Returns `true` if `value` is found, else `false`.
29289                     */
29290                    function setCacheHas(value) {
29291                        return this.__data__.has(value);
29292                    }
29293
29294                    // Add methods to `SetCache`.
29295                    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
29296                    SetCache.prototype.has = setCacheHas;
29297
29298                    /*------------------------------------------------------------------------*/
29299
29300                    /**
29301                     * Creates a stack cache object to store key-value pairs.
29302                     *
29303                     * @private
29304                     * @constructor
29305                     * @param {Array} [entries] The key-value pairs to cache.
29306                     */
29307                    function Stack(entries) {
29308                        var data = this.__data__ = new ListCache(entries);
29309                        this.size = data.size;
29310                    }
29311
29312                    /**
29313                     * Removes all key-value entries from the stack.
29314                     *
29315                     * @private
29316                     * @name clear
29317                     * @memberOf Stack
29318                     */
29319                    function stackClear() {
29320                        this.__data__ = new ListCache;
29321                        this.size = 0;
29322                    }
29323
29324                    /**
29325                     * Removes `key` and its value from the stack.
29326                     *
29327                     * @private
29328                     * @name delete
29329                     * @memberOf Stack
29330                     * @param {string} key The key of the value to remove.
29331                     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
29332                     */
29333                    function stackDelete(key) {
29334                        var data = this.__data__,
29335                            result = data['delete'](key);
29336
29337                        this.size = data.size;
29338                        return result;
29339                    }
29340
29341                    /**
29342                     * Gets the stack value for `key`.
29343                     *
29344                     * @private
29345                     * @name get
29346                     * @memberOf Stack
29347                     * @param {string} key The key of the value to get.
29348                     * @returns {*} Returns the entry value.
29349                     */
29350                    function stackGet(key) {
29351                        return this.__data__.get(key);
29352                    }
29353
29354                    /**
29355                     * Checks if a stack value for `key` exists.
29356                     *
29357                     * @private
29358                     * @name has
29359                     * @memberOf Stack
29360                     * @param {string} key The key of the entry to check.
29361                     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
29362                     */
29363                    function stackHas(key) {
29364                        return this.__data__.has(key);
29365                    }
29366
29367                    /**
29368                     * Sets the stack `key` to `value`.
29369                     *
29370                     * @private
29371                     * @name set
29372                     * @memberOf Stack
29373                     * @param {string} key The key of the value to set.
29374                     * @param {*} value The value to set.
29375                     * @returns {Object} Returns the stack cache instance.
29376                     */
29377                    function stackSet(key, value) {
29378                        var data = this.__data__;
29379                        if (data instanceof ListCache) {
29380                            var pairs = data.__data__;
29381                            if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
29382                                pairs.push([key, value]);
29383                                this.size = ++data.size;
29384                                return this;
29385                            }
29386                            data = this.__data__ = new MapCache(pairs);
29387                        }
29388                        data.set(key, value);
29389                        this.size = data.size;
29390                        return this;
29391                    }
29392
29393                    // Add methods to `Stack`.
29394                    Stack.prototype.clear = stackClear;
29395                    Stack.prototype['delete'] = stackDelete;
29396                    Stack.prototype.get = stackGet;
29397                    Stack.prototype.has = stackHas;
29398                    Stack.prototype.set = stackSet;
29399
29400                    /*------------------------------------------------------------------------*/
29401
29402                    /**
29403                     * Creates an array of the enumerable property names of the array-like `value`.
29404                     *
29405                     * @private
29406                     * @param {*} value The value to query.
29407                     * @param {boolean} inherited Specify returning inherited property names.
29408                     * @returns {Array} Returns the array of property names.
29409                     */
29410                    function arrayLikeKeys(value, inherited) {
29411                        var isArr = isArray(value),
29412                            isArg = !isArr && isArguments(value),
29413                            isBuff = !isArr && !isArg && isBuffer(value),
29414                            isType = !isArr && !isArg && !isBuff && isTypedArray(value),
29415                            skipIndexes = isArr || isArg || isBuff || isType,
29416                            result = skipIndexes ? baseTimes(value.length, String) : [],
29417                            length = result.length;
29418
29419                        for (var key in value) {
29420                            if ((inherited || hasOwnProperty.call(value, key)) &&
29421                                !(skipIndexes && (
29422                                    // Safari 9 has enumerable `arguments.length` in strict mode.
29423                                    key == 'length' ||
29424                                    // Node.js 0.10 has enumerable non-index properties on buffers.
29425                                    (isBuff && (key == 'offset' || key == 'parent')) ||
29426                                    // PhantomJS 2 has enumerable non-index properties on typed arrays.
29427                                    (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
29428                                    // Skip index properties.
29429                                    isIndex(key, length)
29430                                ))) {
29431                                result.push(key);
29432                            }
29433                        }
29434                        return result;
29435                    }
29436
29437                    /**
29438                     * A specialized version of `_.sample` for arrays.
29439                     *
29440                     * @private
29441                     * @param {Array} array The array to sample.
29442                     * @returns {*} Returns the random element.
29443                     */
29444                    function arraySample(array) {
29445                        var length = array.length;
29446                        return length ? array[baseRandom(0, length - 1)] : undefined;
29447                    }
29448
29449                    /**
29450                     * A specialized version of `_.sampleSize` for arrays.
29451                     *
29452                     * @private
29453                     * @param {Array} array The array to sample.
29454                     * @param {number} n The number of elements to sample.
29455                     * @returns {Array} Returns the random elements.
29456                     */
29457                    function arraySampleSize(array, n) {
29458                        return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
29459                    }
29460
29461                    /**
29462                     * A specialized version of `_.shuffle` for arrays.
29463                     *
29464                     * @private
29465                     * @param {Array} array The array to shuffle.
29466                     * @returns {Array} Returns the new shuffled array.
29467                     */
29468                    function arrayShuffle(array) {
29469                        return shuffleSelf(copyArray(array));
29470                    }
29471
29472                    /**
29473                     * This function is like `assignValue` except that it doesn't assign
29474                     * `undefined` values.
29475                     *
29476                     * @private
29477                     * @param {Object} object The object to modify.
29478                     * @param {string} key The key of the property to assign.
29479                     * @param {*} value The value to assign.
29480                     */
29481                    function assignMergeValue(object, key, value) {
29482                        if ((value !== undefined && !eq(object[key], value)) ||
29483                            (value === undefined && !(key in object))) {
29484                            baseAssignValue(object, key, value);
29485                        }
29486                    }
29487
29488                    /**
29489                     * Assigns `value` to `key` of `object` if the existing value is not equivalent
29490                     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
29491                     * for equality comparisons.
29492                     *
29493                     * @private
29494                     * @param {Object} object The object to modify.
29495                     * @param {string} key The key of the property to assign.
29496                     * @param {*} value The value to assign.
29497                     */
29498                    function assignValue(object, key, value) {
29499                        var objValue = object[key];
29500                        if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
29501                            (value === undefined && !(key in object))) {
29502                            baseAssignValue(object, key, value);
29503                        }
29504                    }
29505
29506                    /**
29507                     * Gets the index at which the `key` is found in `array` of key-value pairs.
29508                     *
29509                     * @private
29510                     * @param {Array} array The array to inspect.
29511                     * @param {*} key The key to search for.
29512                     * @returns {number} Returns the index of the matched value, else `-1`.
29513                     */
29514                    function assocIndexOf(array, key) {
29515                        var length = array.length;
29516                        while (length--) {
29517                            if (eq(array[length][0], key)) {
29518                                return length;
29519                            }
29520                        }
29521                        return -1;
29522                    }
29523
29524                    /**
29525                     * Aggregates elements of `collection` on `accumulator` with keys transformed
29526                     * by `iteratee` and values set by `setter`.
29527                     *
29528                     * @private
29529                     * @param {Array|Object} collection The collection to iterate over.
29530                     * @param {Function} setter The function to set `accumulator` values.
29531                     * @param {Function} iteratee The iteratee to transform keys.
29532                     * @param {Object} accumulator The initial aggregated object.
29533                     * @returns {Function} Returns `accumulator`.
29534                     */
29535                    function baseAggregator(collection, setter, iteratee, accumulator) {
29536                        baseEach(collection, function(value, key, collection) {
29537                            setter(accumulator, value, iteratee(value), collection);
29538                        });
29539                        return accumulator;
29540                    }
29541
29542                    /**
29543                     * The base implementation of `_.assign` without support for multiple sources
29544                     * or `customizer` functions.
29545                     *
29546                     * @private
29547                     * @param {Object} object The destination object.
29548                     * @param {Object} source The source object.
29549                     * @returns {Object} Returns `object`.
29550                     */
29551                    function baseAssign(object, source) {
29552                        return object && copyObject(source, keys(source), object);
29553                    }
29554
29555                    /**
29556                     * The base implementation of `_.assignIn` without support for multiple sources
29557                     * or `customizer` functions.
29558                     *
29559                     * @private
29560                     * @param {Object} object The destination object.
29561                     * @param {Object} source The source object.
29562                     * @returns {Object} Returns `object`.
29563                     */
29564                    function baseAssignIn(object, source) {
29565                        return object && copyObject(source, keysIn(source), object);
29566                    }
29567
29568                    /**
29569                     * The base implementation of `assignValue` and `assignMergeValue` without
29570                     * value checks.
29571                     *
29572                     * @private
29573                     * @param {Object} object The object to modify.
29574                     * @param {string} key The key of the property to assign.
29575                     * @param {*} value The value to assign.
29576                     */
29577                    function baseAssignValue(object, key, value) {
29578                        if (key == '__proto__' && defineProperty) {
29579                            defineProperty(object, key, {
29580                                'configurable': true,
29581                                'enumerable': true,
29582                                'value': value,
29583                                'writable': true
29584                            });
29585                        } else {
29586                            object[key] = value;
29587                        }
29588                    }
29589
29590                    /**
29591                     * The base implementation of `_.at` without support for individual paths.
29592                     *
29593                     * @private
29594                     * @param {Object} object The object to iterate over.
29595                     * @param {string[]} paths The property paths to pick.
29596                     * @returns {Array} Returns the picked elements.
29597                     */
29598                    function baseAt(object, paths) {
29599                        var index = -1,
29600                            length = paths.length,
29601                            result = Array(length),
29602                            skip = object == null;
29603
29604                        while (++index < length) {
29605                            result[index] = skip ? undefined : get(object, paths[index]);
29606                        }
29607                        return result;
29608                    }
29609
29610                    /**
29611                     * The base implementation of `_.clamp` which doesn't coerce arguments.
29612                     *
29613                     * @private
29614                     * @param {number} number The number to clamp.
29615                     * @param {number} [lower] The lower bound.
29616                     * @param {number} upper The upper bound.
29617                     * @returns {number} Returns the clamped number.
29618                     */
29619                    function baseClamp(number, lower, upper) {
29620                        if (number === number) {
29621                            if (upper !== undefined) {
29622                                number = number <= upper ? number : upper;
29623                            }
29624                            if (lower !== undefined) {
29625                                number = number >= lower ? number : lower;
29626                            }
29627                        }
29628                        return number;
29629                    }
29630
29631                    /**
29632                     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
29633                     * traversed objects.
29634                     *
29635                     * @private
29636                     * @param {*} value The value to clone.
29637                     * @param {boolean} bitmask The bitmask flags.
29638                     *  1 - Deep clone
29639                     *  2 - Flatten inherited properties
29640                     *  4 - Clone symbols
29641                     * @param {Function} [customizer] The function to customize cloning.
29642                     * @param {string} [key] The key of `value`.
29643                     * @param {Object} [object] The parent object of `value`.
29644                     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
29645                     * @returns {*} Returns the cloned value.
29646                     */
29647                    function baseClone(value, bitmask, customizer, key, object, stack) {
29648                        var result,
29649                            isDeep = bitmask & CLONE_DEEP_FLAG,
29650                            isFlat = bitmask & CLONE_FLAT_FLAG,
29651                            isFull = bitmask & CLONE_SYMBOLS_FLAG;
29652
29653                        if (customizer) {
29654                            result = object ? customizer(value, key, object, stack) : customizer(value);
29655                        }
29656                        if (result !== undefined) {
29657                            return result;
29658                        }
29659                        if (!isObject(value)) {
29660                            return value;
29661                        }
29662                        var isArr = isArray(value);
29663                        if (isArr) {
29664                            result = initCloneArray(value);
29665                            if (!isDeep) {
29666                                return copyArray(value, result);
29667                            }
29668                        } else {
29669                            var tag = getTag(value),
29670                                isFunc = tag == funcTag || tag == genTag;
29671
29672                            if (isBuffer(value)) {
29673                                return cloneBuffer(value, isDeep);
29674                            }
29675                            if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
29676                                result = (isFlat || isFunc) ? {} : initCloneObject(value);
29677                                if (!isDeep) {
29678                                    return isFlat
29679                                        ? copySymbolsIn(value, baseAssignIn(result, value))
29680                                        : copySymbols(value, baseAssign(result, value));
29681                                }
29682                            } else {
29683                                if (!cloneableTags[tag]) {
29684                                    return object ? value : {};
29685                                }
29686                                result = initCloneByTag(value, tag, isDeep);
29687                            }
29688                        }
29689                        // Check for circular references and return its corresponding clone.
29690                        stack || (stack = new Stack);
29691                        var stacked = stack.get(value);
29692                        if (stacked) {
29693                            return stacked;
29694                        }
29695                        stack.set(value, result);
29696
29697                        if (isSet(value)) {
29698                            value.forEach(function(subValue) {
29699                                result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
29700                            });
29701                        } else if (isMap(value)) {
29702                            value.forEach(function(subValue, key) {
29703                                result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
29704                            });
29705                        }
29706
29707                        var keysFunc = isFull
29708                            ? (isFlat ? getAllKeysIn : getAllKeys)
29709                            : (isFlat ? keysIn : keys);
29710
29711                        var props = isArr ? undefined : keysFunc(value);
29712                        arrayEach(props || value, function(subValue, key) {
29713                            if (props) {
29714                                key = subValue;
29715                                subValue = value[key];
29716                            }
29717                            // Recursively populate clone (susceptible to call stack limits).
29718                            assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
29719                        });
29720                        return result;
29721                    }
29722
29723                    /**
29724                     * The base implementation of `_.conforms` which doesn't clone `source`.
29725                     *
29726                     * @private
29727                     * @param {Object} source The object of property predicates to conform to.
29728                     * @returns {Function} Returns the new spec function.
29729                     */
29730                    function baseConforms(source) {
29731                        var props = keys(source);
29732                        return function(object) {
29733                            return baseConformsTo(object, source, props);
29734                        };
29735                    }
29736
29737                    /**
29738                     * The base implementation of `_.conformsTo` which accepts `props` to check.
29739                     *
29740                     * @private
29741                     * @param {Object} object The object to inspect.
29742                     * @param {Object} source The object of property predicates to conform to.
29743                     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
29744                     */
29745                    function baseConformsTo(object, source, props) {
29746                        var length = props.length;
29747                        if (object == null) {
29748                            return !length;
29749                        }
29750                        object = Object(object);
29751                        while (length--) {
29752                            var key = props[length],
29753                                predicate = source[key],
29754                                value = object[key];
29755
29756                            if ((value === undefined && !(key in object)) || !predicate(value)) {
29757                                return false;
29758                            }
29759                        }
29760                        return true;
29761                    }
29762
29763                    /**
29764                     * The base implementation of `_.delay` and `_.defer` which accepts `args`
29765                     * to provide to `func`.
29766                     *
29767                     * @private
29768                     * @param {Function} func The function to delay.
29769                     * @param {number} wait The number of milliseconds to delay invocation.
29770                     * @param {Array} args The arguments to provide to `func`.
29771                     * @returns {number|Object} Returns the timer id or timeout object.
29772                     */
29773                    function baseDelay(func, wait, args) {
29774                        if (typeof func != 'function') {
29775                            throw new TypeError(FUNC_ERROR_TEXT);
29776                        }
29777                        return setTimeout(function() { func.apply(undefined, args); }, wait);
29778                    }
29779
29780                    /**
29781                     * The base implementation of methods like `_.difference` without support
29782                     * for excluding multiple arrays or iteratee shorthands.
29783                     *
29784                     * @private
29785                     * @param {Array} array The array to inspect.
29786                     * @param {Array} values The values to exclude.
29787                     * @param {Function} [iteratee] The iteratee invoked per element.
29788                     * @param {Function} [comparator] The comparator invoked per element.
29789                     * @returns {Array} Returns the new array of filtered values.
29790                     */
29791                    function baseDifference(array, values, iteratee, comparator) {
29792                        var index = -1,
29793                            includes = arrayIncludes,
29794                            isCommon = true,
29795                            length = array.length,
29796                            result = [],
29797                            valuesLength = values.length;
29798
29799                        if (!length) {
29800                            return result;
29801                        }
29802                        if (iteratee) {
29803                            values = arrayMap(values, baseUnary(iteratee));
29804                        }
29805                        if (comparator) {
29806                            includes = arrayIncludesWith;
29807                            isCommon = false;
29808                        }
29809                        else if (values.length >= LARGE_ARRAY_SIZE) {
29810                            includes = cacheHas;
29811                            isCommon = false;
29812                            values = new SetCache(values);
29813                        }
29814                        outer:
29815                            while (++index < length) {
29816                                var value = array[index],
29817                                    computed = iteratee == null ? value : iteratee(value);
29818
29819                                value = (comparator || value !== 0) ? value : 0;
29820                                if (isCommon && computed === computed) {
29821                                    var valuesIndex = valuesLength;
29822                                    while (valuesIndex--) {
29823                                        if (values[valuesIndex] === computed) {
29824                                            continue outer;
29825                                        }
29826                                    }
29827                                    result.push(value);
29828                                }
29829                                else if (!includes(values, computed, comparator)) {
29830                                    result.push(value);
29831                                }
29832                            }
29833                        return result;
29834                    }
29835
29836                    /**
29837                     * The base implementation of `_.forEach` without support for iteratee shorthands.
29838                     *
29839                     * @private
29840                     * @param {Array|Object} collection The collection to iterate over.
29841                     * @param {Function} iteratee The function invoked per iteration.
29842                     * @returns {Array|Object} Returns `collection`.
29843                     */
29844                    var baseEach = createBaseEach(baseForOwn);
29845
29846                    /**
29847                     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
29848                     *
29849                     * @private
29850                     * @param {Array|Object} collection The collection to iterate over.
29851                     * @param {Function} iteratee The function invoked per iteration.
29852                     * @returns {Array|Object} Returns `collection`.
29853                     */
29854                    var baseEachRight = createBaseEach(baseForOwnRight, true);
29855
29856                    /**
29857                     * The base implementation of `_.every` without support for iteratee shorthands.
29858                     *
29859                     * @private
29860                     * @param {Array|Object} collection The collection to iterate over.
29861                     * @param {Function} predicate The function invoked per iteration.
29862                     * @returns {boolean} Returns `true` if all elements pass the predicate check,
29863                     *  else `false`
29864                     */
29865                    function baseEvery(collection, predicate) {
29866                        var result = true;
29867                        baseEach(collection, function(value, index, collection) {
29868                            result = !!predicate(value, index, collection);
29869                            return result;
29870                        });
29871                        return result;
29872                    }
29873
29874                    /**
29875                     * The base implementation of methods like `_.max` and `_.min` which accepts a
29876                     * `comparator` to determine the extremum value.
29877                     *
29878                     * @private
29879                     * @param {Array} array The array to iterate over.
29880                     * @param {Function} iteratee The iteratee invoked per iteration.
29881                     * @param {Function} comparator The comparator used to compare values.
29882                     * @returns {*} Returns the extremum value.
29883                     */
29884                    function baseExtremum(array, iteratee, comparator) {
29885                        var index = -1,
29886                            length = array.length;
29887
29888                        while (++index < length) {
29889                            var value = array[index],
29890                                current = iteratee(value);
29891
29892                            if (current != null && (computed === undefined
29893                                    ? (current === current && !isSymbol(current))
29894                                    : comparator(current, computed)
29895                            )) {
29896                                var computed = current,
29897                                    result = value;
29898                            }
29899                        }
29900                        return result;
29901                    }
29902
29903                    /**
29904                     * The base implementation of `_.fill` without an iteratee call guard.
29905                     *
29906                     * @private
29907                     * @param {Array} array The array to fill.
29908                     * @param {*} value The value to fill `array` with.
29909                     * @param {number} [start=0] The start position.
29910                     * @param {number} [end=array.length] The end position.
29911                     * @returns {Array} Returns `array`.
29912                     */
29913                    function baseFill(array, value, start, end) {
29914                        var length = array.length;
29915
29916                        start = toInteger(start);
29917                        if (start < 0) {
29918                            start = -start > length ? 0 : (length + start);
29919                        }
29920                        end = (end === undefined || end > length) ? length : toInteger(end);
29921                        if (end < 0) {
29922                            end += length;
29923                        }
29924                        end = start > end ? 0 : toLength(end);
29925                        while (start < end) {
29926                            array[start++] = value;
29927                        }
29928                        return array;
29929                    }
29930
29931                    /**
29932                     * The base implementation of `_.filter` without support for iteratee shorthands.
29933                     *
29934                     * @private
29935                     * @param {Array|Object} collection The collection to iterate over.
29936                     * @param {Function} predicate The function invoked per iteration.
29937                     * @returns {Array} Returns the new filtered array.
29938                     */
29939                    function baseFilter(collection, predicate) {
29940                        var result = [];
29941                        baseEach(collection, function(value, index, collection) {
29942                            if (predicate(value, index, collection)) {
29943                                result.push(value);
29944                            }
29945                        });
29946                        return result;
29947                    }
29948
29949                    /**
29950                     * The base implementation of `_.flatten` with support for restricting flattening.
29951                     *
29952                     * @private
29953                     * @param {Array} array The array to flatten.
29954                     * @param {number} depth The maximum recursion depth.
29955                     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
29956                     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
29957                     * @param {Array} [result=[]] The initial result value.
29958                     * @returns {Array} Returns the new flattened array.
29959                     */
29960                    function baseFlatten(array, depth, predicate, isStrict, result) {
29961                        var index = -1,
29962                            length = array.length;
29963
29964                        predicate || (predicate = isFlattenable);
29965                        result || (result = []);
29966
29967                        while (++index < length) {
29968                            var value = array[index];
29969                            if (depth > 0 && predicate(value)) {
29970                                if (depth > 1) {
29971                                    // Recursively flatten arrays (susceptible to call stack limits).
29972                                    baseFlatten(value, depth - 1, predicate, isStrict, result);
29973                                } else {
29974                                    arrayPush(result, value);
29975                                }
29976                            } else if (!isStrict) {
29977                                result[result.length] = value;
29978                            }
29979                        }
29980                        return result;
29981                    }
29982
29983                    /**
29984                     * The base implementation of `baseForOwn` which iterates over `object`
29985                     * properties returned by `keysFunc` and invokes `iteratee` for each property.
29986                     * Iteratee functions may exit iteration early by explicitly returning `false`.
29987                     *
29988                     * @private
29989                     * @param {Object} object The object to iterate over.
29990                     * @param {Function} iteratee The function invoked per iteration.
29991                     * @param {Function} keysFunc The function to get the keys of `object`.
29992                     * @returns {Object} Returns `object`.
29993                     */
29994                    var baseFor = createBaseFor();
29995
29996                    /**
29997                     * This function is like `baseFor` except that it iterates over properties
29998                     * in the opposite order.
29999                     *
30000                     * @private
30001                     * @param {Object} object The object to iterate over.
30002                     * @param {Function} iteratee The function invoked per iteration.
30003                     * @param {Function} keysFunc The function to get the keys of `object`.
30004                     * @returns {Object} Returns `object`.
30005                     */
30006                    var baseForRight = createBaseFor(true);
30007
30008                    /**
30009                     * The base implementation of `_.forOwn` without support for iteratee shorthands.
30010                     *
30011                     * @private
30012                     * @param {Object} object The object to iterate over.
30013                     * @param {Function} iteratee The function invoked per iteration.
30014                     * @returns {Object} Returns `object`.
30015                     */
30016                    function baseForOwn(object, iteratee) {
30017                        return object && baseFor(object, iteratee, keys);
30018                    }
30019
30020                    /**
30021                     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
30022                     *
30023                     * @private
30024                     * @param {Object} object The object to iterate over.
30025                     * @param {Function} iteratee The function invoked per iteration.
30026                     * @returns {Object} Returns `object`.
30027                     */
30028                    function baseForOwnRight(object, iteratee) {
30029                        return object && baseForRight(object, iteratee, keys);
30030                    }
30031
30032                    /**
30033                     * The base implementation of `_.functions` which creates an array of
30034                     * `object` function property names filtered from `props`.
30035                     *
30036                     * @private
30037                     * @param {Object} object The object to inspect.
30038                     * @param {Array} props The property names to filter.
30039                     * @returns {Array} Returns the function names.
30040                     */
30041                    function baseFunctions(object, props) {
30042                        return arrayFilter(props, function(key) {
30043                            return isFunction(object[key]);
30044                        });
30045                    }
30046
30047                    /**
30048                     * The base implementation of `_.get` without support for default values.
30049                     *
30050                     * @private
30051                     * @param {Object} object The object to query.
30052                     * @param {Array|string} path The path of the property to get.
30053                     * @returns {*} Returns the resolved value.
30054                     */
30055                    function baseGet(object, path) {
30056                        path = castPath(path, object);
30057
30058                        var index = 0,
30059                            length = path.length;
30060
30061                        while (object != null && index < length) {
30062                            object = object[toKey(path[index++])];
30063                        }
30064                        return (index && index == length) ? object : undefined;
30065                    }
30066
30067                    /**
30068                     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
30069                     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
30070                     * symbols of `object`.
30071                     *
30072                     * @private
30073                     * @param {Object} object The object to query.
30074                     * @param {Function} keysFunc The function to get the keys of `object`.
30075                     * @param {Function} symbolsFunc The function to get the symbols of `object`.
30076                     * @returns {Array} Returns the array of property names and symbols.
30077                     */
30078                    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
30079                        var result = keysFunc(object);
30080                        return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
30081                    }
30082
30083                    /**
30084                     * The base implementation of `getTag` without fallbacks for buggy environments.
30085                     *
30086                     * @private
30087                     * @param {*} value The value to query.
30088                     * @returns {string} Returns the `toStringTag`.
30089                     */
30090                    function baseGetTag(value) {
30091                        if (value == null) {
30092                            return value === undefined ? undefinedTag : nullTag;
30093                        }
30094                        return (symToStringTag && symToStringTag in Object(value))
30095                            ? getRawTag(value)
30096                            : objectToString(value);
30097                    }
30098
30099                    /**
30100                     * The base implementation of `_.gt` which doesn't coerce arguments.
30101                     *
30102                     * @private
30103                     * @param {*} value The value to compare.
30104                     * @param {*} other The other value to compare.
30105                     * @returns {boolean} Returns `true` if `value` is greater than `other`,
30106                     *  else `false`.
30107                     */
30108                    function baseGt(value, other) {
30109                        return value > other;
30110                    }
30111
30112                    /**
30113                     * The base implementation of `_.has` without support for deep paths.
30114                     *
30115                     * @private
30116                     * @param {Object} [object] The object to query.
30117                     * @param {Array|string} key The key to check.
30118                     * @returns {boolean} Returns `true` if `key` exists, else `false`.
30119                     */
30120                    function baseHas(object, key) {
30121                        return object != null && hasOwnProperty.call(object, key);
30122                    }
30123
30124                    /**
30125                     * The base implementation of `_.hasIn` without support for deep paths.
30126                     *
30127                     * @private
30128                     * @param {Object} [object] The object to query.
30129                     * @param {Array|string} key The key to check.
30130                     * @returns {boolean} Returns `true` if `key` exists, else `false`.
30131                     */
30132                    function baseHasIn(object, key) {
30133                        return object != null && key in Object(object);
30134                    }
30135
30136                    /**
30137                     * The base implementation of `_.inRange` which doesn't coerce arguments.
30138                     *
30139                     * @private
30140                     * @param {number} number The number to check.
30141                     * @param {number} start The start of the range.
30142                     * @param {number} end The end of the range.
30143                     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
30144                     */
30145                    function baseInRange(number, start, end) {
30146                        return number >= nativeMin(start, end) && number < nativeMax(start, end);
30147                    }
30148
30149                    /**
30150                     * The base implementation of methods like `_.intersection`, without support
30151                     * for iteratee shorthands, that accepts an array of arrays to inspect.
30152                     *
30153                     * @private
30154                     * @param {Array} arrays The arrays to inspect.
30155                     * @param {Function} [iteratee] The iteratee invoked per element.
30156                     * @param {Function} [comparator] The comparator invoked per element.
30157                     * @returns {Array} Returns the new array of shared values.
30158                     */
30159                    function baseIntersection(arrays, iteratee, comparator) {
30160                        var includes = comparator ? arrayIncludesWith : arrayIncludes,
30161                            length = arrays[0].length,
30162                            othLength = arrays.length,
30163                            othIndex = othLength,
30164                            caches = Array(othLength),
30165                            maxLength = Infinity,
30166                            result = [];
30167
30168                        while (othIndex--) {
30169                            var array = arrays[othIndex];
30170                            if (othIndex && iteratee) {
30171                                array = arrayMap(array, baseUnary(iteratee));
30172                            }
30173                            maxLength = nativeMin(array.length, maxLength);
30174                            caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
30175                                ? new SetCache(othIndex && array)
30176                                : undefined;
30177                        }
30178                        array = arrays[0];
30179
30180                        var index = -1,
30181                            seen = caches[0];
30182
30183                        outer:
30184                            while (++index < length && result.length < maxLength) {
30185                                var value = array[index],
30186                                    computed = iteratee ? iteratee(value) : value;
30187
30188                                value = (comparator || value !== 0) ? value : 0;
30189                                if (!(seen
30190                                        ? cacheHas(seen, computed)
30191                                        : includes(result, computed, comparator)
30192                                )) {
30193                                    othIndex = othLength;
30194                                    while (--othIndex) {
30195                                        var cache = caches[othIndex];
30196                                        if (!(cache
30197                                            ? cacheHas(cache, computed)
30198                                            : includes(arrays[othIndex], computed, comparator))
30199                                        ) {
30200                                            continue outer;
30201                                        }
30202                                    }
30203                                    if (seen) {
30204                                        seen.push(computed);
30205                                    }
30206                                    result.push(value);
30207                                }
30208                            }
30209                        return result;
30210                    }
30211
30212                    /**
30213                     * The base implementation of `_.invert` and `_.invertBy` which inverts
30214                     * `object` with values transformed by `iteratee` and set by `setter`.
30215                     *
30216                     * @private
30217                     * @param {Object} object The object to iterate over.
30218                     * @param {Function} setter The function to set `accumulator` values.
30219                     * @param {Function} iteratee The iteratee to transform values.
30220                     * @param {Object} accumulator The initial inverted object.
30221                     * @returns {Function} Returns `accumulator`.
30222                     */
30223                    function baseInverter(object, setter, iteratee, accumulator) {
30224                        baseForOwn(object, function(value, key, object) {
30225                            setter(accumulator, iteratee(value), key, object);
30226                        });
30227                        return accumulator;
30228                    }
30229
30230                    /**
30231                     * The base implementation of `_.invoke` without support for individual
30232                     * method arguments.
30233                     *
30234                     * @private
30235                     * @param {Object} object The object to query.
30236                     * @param {Array|string} path The path of the method to invoke.
30237                     * @param {Array} args The arguments to invoke the method with.
30238                     * @returns {*} Returns the result of the invoked method.
30239                     */
30240                    function baseInvoke(object, path, args) {
30241                        path = castPath(path, object);
30242                        object = parent(object, path);
30243                        var func = object == null ? object : object[toKey(last(path))];
30244                        return func == null ? undefined : apply(func, object, args);
30245                    }
30246
30247                    /**
30248                     * The base implementation of `_.isArguments`.
30249                     *
30250                     * @private
30251                     * @param {*} value The value to check.
30252                     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
30253                     */
30254                    function baseIsArguments(value) {
30255                        return isObjectLike(value) && baseGetTag(value) == argsTag;
30256                    }
30257
30258                    /**
30259                     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
30260                     *
30261                     * @private
30262                     * @param {*} value The value to check.
30263                     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
30264                     */
30265                    function baseIsArrayBuffer(value) {
30266                        return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
30267                    }
30268
30269                    /**
30270                     * The base implementation of `_.isDate` without Node.js optimizations.
30271                     *
30272                     * @private
30273                     * @param {*} value The value to check.
30274                     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
30275                     */
30276                    function baseIsDate(value) {
30277                        return isObjectLike(value) && baseGetTag(value) == dateTag;
30278                    }
30279
30280                    /**
30281                     * The base implementation of `_.isEqual` which supports partial comparisons
30282                     * and tracks traversed objects.
30283                     *
30284                     * @private
30285                     * @param {*} value The value to compare.
30286                     * @param {*} other The other value to compare.
30287                     * @param {boolean} bitmask The bitmask flags.
30288                     *  1 - Unordered comparison
30289                     *  2 - Partial comparison
30290                     * @param {Function} [customizer] The function to customize comparisons.
30291                     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
30292                     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
30293                     */
30294                    function baseIsEqual(value, other, bitmask, customizer, stack) {
30295                        if (value === other) {
30296                            return true;
30297                        }
30298                        if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
30299                            return value !== value && other !== other;
30300                        }
30301                        return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
30302                    }
30303
30304                    /**
30305                     * A specialized version of `baseIsEqual` for arrays and objects which performs
30306                     * deep comparisons and tracks traversed objects enabling objects with circular
30307                     * references to be compared.
30308                     *
30309                     * @private
30310                     * @param {Object} object The object to compare.
30311                     * @param {Object} other The other object to compare.
30312                     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
30313                     * @param {Function} customizer The function to customize comparisons.
30314                     * @param {Function} equalFunc The function to determine equivalents of values.
30315                     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
30316                     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
30317                     */
30318                    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
30319                        var objIsArr = isArray(object),
30320                            othIsArr = isArray(other),
30321                            objTag = objIsArr ? arrayTag : getTag(object),
30322                            othTag = othIsArr ? arrayTag : getTag(other);
30323
30324                        objTag = objTag == argsTag ? objectTag : objTag;
30325                        othTag = othTag == argsTag ? objectTag : othTag;
30326
30327                        var objIsObj = objTag == objectTag,
30328                            othIsObj = othTag == objectTag,
30329                            isSameTag = objTag == othTag;
30330
30331                        if (isSameTag && isBuffer(object)) {
30332                            if (!isBuffer(other)) {
30333                                return false;
30334                            }
30335                            objIsArr = true;
30336                            objIsObj = false;
30337                        }
30338                        if (isSameTag && !objIsObj) {
30339                            stack || (stack = new Stack);
30340                            return (objIsArr || isTypedArray(object))
30341                                ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
30342                                : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
30343                        }
30344                        if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
30345                            var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
30346                                othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
30347
30348                            if (objIsWrapped || othIsWrapped) {
30349                                var objUnwrapped = objIsWrapped ? object.value() : object,
30350                                    othUnwrapped = othIsWrapped ? other.value() : other;
30351
30352                                stack || (stack = new Stack);
30353                                return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
30354                            }
30355                        }
30356                        if (!isSameTag) {
30357                            return false;
30358                        }
30359                        stack || (stack = new Stack);
30360                        return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
30361                    }
30362
30363                    /**
30364                     * The base implementation of `_.isMap` without Node.js optimizations.
30365                     *
30366                     * @private
30367                     * @param {*} value The value to check.
30368                     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
30369                     */
30370                    function baseIsMap(value) {
30371                        return isObjectLike(value) && getTag(value) == mapTag;
30372                    }
30373
30374                    /**
30375                     * The base implementation of `_.isMatch` without support for iteratee shorthands.
30376                     *
30377                     * @private
30378                     * @param {Object} object The object to inspect.
30379                     * @param {Object} source The object of property values to match.
30380                     * @param {Array} matchData The property names, values, and compare flags to match.
30381                     * @param {Function} [customizer] The function to customize comparisons.
30382                     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
30383                     */
30384                    function baseIsMatch(object, source, matchData, customizer) {
30385                        var index = matchData.length,
30386                            length = index,
30387                            noCustomizer = !customizer;
30388
30389                        if (object == null) {
30390                            return !length;
30391                        }
30392                        object = Object(object);
30393                        while (index--) {
30394                            var data = matchData[index];
30395                            if ((noCustomizer && data[2])
30396                                ? data[1] !== object[data[0]]
30397                                : !(data[0] in object)
30398                            ) {
30399                                return false;
30400                            }
30401                        }
30402                        while (++index < length) {
30403                            data = matchData[index];
30404                            var key = data[0],
30405                                objValue = object[key],
30406                                srcValue = data[1];
30407
30408                            if (noCustomizer && data[2]) {
30409                                if (objValue === undefined && !(key in object)) {
30410                                    return false;
30411                                }
30412                            } else {
30413                                var stack = new Stack;
30414                                if (customizer) {
30415                                    var result = customizer(objValue, srcValue, key, object, source, stack);
30416                                }
30417                                if (!(result === undefined
30418                                        ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
30419                                        : result
30420                                )) {
30421                                    return false;
30422                                }
30423                            }
30424                        }
30425                        return true;
30426                    }
30427
30428                    /**
30429                     * The base implementation of `_.isNative` without bad shim checks.
30430                     *
30431                     * @private
30432                     * @param {*} value The value to check.
30433                     * @returns {boolean} Returns `true` if `value` is a native function,
30434                     *  else `false`.
30435                     */
30436                    function baseIsNative(value) {
30437                        if (!isObject(value) || isMasked(value)) {
30438                            return false;
30439                        }
30440                        var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
30441                        return pattern.test(toSource(value));
30442                    }
30443
30444                    /**
30445                     * The base implementation of `_.isRegExp` without Node.js optimizations.
30446                     *
30447                     * @private
30448                     * @param {*} value The value to check.
30449                     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
30450                     */
30451                    function baseIsRegExp(value) {
30452                        return isObjectLike(value) && baseGetTag(value) == regexpTag;
30453                    }
30454
30455                    /**
30456                     * The base implementation of `_.isSet` without Node.js optimizations.
30457                     *
30458                     * @private
30459                     * @param {*} value The value to check.
30460                     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
30461                     */
30462                    function baseIsSet(value) {
30463                        return isObjectLike(value) && getTag(value) == setTag;
30464                    }
30465
30466                    /**
30467                     * The base implementation of `_.isTypedArray` without Node.js optimizations.
30468                     *
30469                     * @private
30470                     * @param {*} value The value to check.
30471                     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
30472                     */
30473                    function baseIsTypedArray(value) {
30474                        return isObjectLike(value) &&
30475                            isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
30476                    }
30477
30478                    /**
30479                     * The base implementation of `_.iteratee`.
30480                     *
30481                     * @private
30482                     * @param {*} [value=_.identity] The value to convert to an iteratee.
30483                     * @returns {Function} Returns the iteratee.
30484                     */
30485                    function baseIteratee(value) {
30486                        // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
30487                        // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
30488                        if (typeof value == 'function') {
30489                            return value;
30490                        }
30491                        if (value == null) {
30492                            return identity;
30493                        }
30494                        if (typeof value == 'object') {
30495                            return isArray(value)
30496                                ? baseMatchesProperty(value[0], value[1])
30497                                : baseMatches(value);
30498                        }
30499                        return property(value);
30500                    }
30501
30502                    /**
30503                     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
30504                     *
30505                     * @private
30506                     * @param {Object} object The object to query.
30507                     * @returns {Array} Returns the array of property names.
30508                     */
30509                    function baseKeys(object) {
30510                        if (!isPrototype(object)) {
30511                            return nativeKeys(object);
30512                        }
30513                        var result = [];
30514                        for (var key in Object(object)) {
30515                            if (hasOwnProperty.call(object, key) && key != 'constructor') {
30516                                result.push(key);
30517                            }
30518                        }
30519                        return result;
30520                    }
30521
30522                    /**
30523                     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
30524                     *
30525                     * @private
30526                     * @param {Object} object The object to query.
30527                     * @returns {Array} Returns the array of property names.
30528                     */
30529                    function baseKeysIn(object) {
30530                        if (!isObject(object)) {
30531                            return nativeKeysIn(object);
30532                        }
30533                        var isProto = isPrototype(object),
30534                            result = [];
30535
30536                        for (var key in object) {
30537                            if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
30538                                result.push(key);
30539                            }
30540                        }
30541                        return result;
30542                    }
30543
30544                    /**
30545                     * The base implementation of `_.lt` which doesn't coerce arguments.
30546                     *
30547                     * @private
30548                     * @param {*} value The value to compare.
30549                     * @param {*} other The other value to compare.
30550                     * @returns {boolean} Returns `true` if `value` is less than `other`,
30551                     *  else `false`.
30552                     */
30553                    function baseLt(value, other) {
30554                        return value < other;
30555                    }
30556
30557                    /**
30558                     * The base implementation of `_.map` without support for iteratee shorthands.
30559                     *
30560                     * @private
30561                     * @param {Array|Object} collection The collection to iterate over.
30562                     * @param {Function} iteratee The function invoked per iteration.
30563                     * @returns {Array} Returns the new mapped array.
30564                     */
30565                    function baseMap(collection, iteratee) {
30566                        var index = -1,
30567                            result = isArrayLike(collection) ? Array(collection.length) : [];
30568
30569                        baseEach(collection, function(value, key, collection) {
30570                            result[++index] = iteratee(value, key, collection);
30571                        });
30572                        return result;
30573                    }
30574
30575                    /**
30576                     * The base implementation of `_.matches` which doesn't clone `source`.
30577                     *
30578                     * @private
30579                     * @param {Object} source The object of property values to match.
30580                     * @returns {Function} Returns the new spec function.
30581                     */
30582                    function baseMatches(source) {
30583                        var matchData = getMatchData(source);
30584                        if (matchData.length == 1 && matchData[0][2]) {
30585                            return matchesStrictComparable(matchData[0][0], matchData[0][1]);
30586                        }
30587                        return function(object) {
30588                            return object === source || baseIsMatch(object, source, matchData);
30589                        };
30590                    }
30591
30592                    /**
30593                     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
30594                     *
30595                     * @private
30596                     * @param {string} path The path of the property to get.
30597                     * @param {*} srcValue The value to match.
30598                     * @returns {Function} Returns the new spec function.
30599                     */
30600                    function baseMatchesProperty(path, srcValue) {
30601                        if (isKey(path) && isStrictComparable(srcValue)) {
30602                            return matchesStrictComparable(toKey(path), srcValue);
30603                        }
30604                        return function(object) {
30605                            var objValue = get(object, path);
30606                            return (objValue === undefined && objValue === srcValue)
30607                                ? hasIn(object, path)
30608                                : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
30609                        };
30610                    }
30611
30612                    /**
30613                     * The base implementation of `_.merge` without support for multiple sources.
30614                     *
30615                     * @private
30616                     * @param {Object} object The destination object.
30617                     * @param {Object} source The source object.
30618                     * @param {number} srcIndex The index of `source`.
30619                     * @param {Function} [customizer] The function to customize merged values.
30620                     * @param {Object} [stack] Tracks traversed source values and their merged
30621                     *  counterparts.
30622                     */
30623                    function baseMerge(object, source, srcIndex, customizer, stack) {
30624                        if (object === source) {
30625                            return;
30626                        }
30627                        baseFor(source, function(srcValue, key) {
30628                            stack || (stack = new Stack);
30629                            if (isObject(srcValue)) {
30630                                baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
30631                            }
30632                            else {
30633                                var newValue = customizer
30634                                    ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
30635                                    : undefined;
30636
30637                                if (newValue === undefined) {
30638                                    newValue = srcValue;
30639                                }
30640                                assignMergeValue(object, key, newValue);
30641                            }
30642                        }, keysIn);
30643                    }
30644
30645                    /**
30646                     * A specialized version of `baseMerge` for arrays and objects which performs
30647                     * deep merges and tracks traversed objects enabling objects with circular
30648                     * references to be merged.
30649                     *
30650                     * @private
30651                     * @param {Object} object The destination object.
30652                     * @param {Object} source The source object.
30653                     * @param {string} key The key of the value to merge.
30654                     * @param {number} srcIndex The index of `source`.
30655                     * @param {Function} mergeFunc The function to merge values.
30656                     * @param {Function} [customizer] The function to customize assigned values.
30657                     * @param {Object} [stack] Tracks traversed source values and their merged
30658                     *  counterparts.
30659                     */
30660                    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
30661                        var objValue = safeGet(object, key),
30662                            srcValue = safeGet(source, key),
30663                            stacked = stack.get(srcValue);
30664
30665                        if (stacked) {
30666                            assignMergeValue(object, key, stacked);
30667                            return;
30668                        }
30669                        var newValue = customizer
30670                            ? customizer(objValue, srcValue, (key + ''), object, source, stack)
30671                            : undefined;
30672
30673                        var isCommon = newValue === undefined;
30674
30675                        if (isCommon) {
30676                            var isArr = isArray(srcValue),
30677                                isBuff = !isArr && isBuffer(srcValue),
30678                                isTyped = !isArr && !isBuff && isTypedArray(srcValue);
30679
30680                            newValue = srcValue;
30681                            if (isArr || isBuff || isTyped) {
30682                                if (isArray(objValue)) {
30683                                    newValue = objValue;
30684                                }
30685                                else if (isArrayLikeObject(objValue)) {
30686                                    newValue = copyArray(objValue);
30687                                }
30688                                else if (isBuff) {
30689                                    isCommon = false;
30690                                    newValue = cloneBuffer(srcValue, true);
30691                                }
30692                                else if (isTyped) {
30693                                    isCommon = false;
30694                                    newValue = cloneTypedArray(srcValue, true);
30695                                }
30696                                else {
30697                                    newValue = [];
30698                                }
30699                            }
30700                            else if (isPlainObject(srcValue) || isArguments(srcValue)) {
30701                                newValue = objValue;
30702                                if (isArguments(objValue)) {
30703                                    newValue = toPlainObject(objValue);
30704                                }
30705                                else if (!isObject(objValue) || isFunction(objValue)) {
30706                                    newValue = initCloneObject(srcValue);
30707                                }
30708                            }
30709                            else {
30710                                isCommon = false;
30711                            }
30712                        }
30713                        if (isCommon) {
30714                            // Recursively merge objects and arrays (susceptible to call stack limits).
30715                            stack.set(srcValue, newValue);
30716                            mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
30717                            stack['delete'](srcValue);
30718                        }
30719                        assignMergeValue(object, key, newValue);
30720                    }
30721
30722                    /**
30723                     * The base implementation of `_.nth` which doesn't coerce arguments.
30724                     *
30725                     * @private
30726                     * @param {Array} array The array to query.
30727                     * @param {number} n The index of the element to return.
30728                     * @returns {*} Returns the nth element of `array`.
30729                     */
30730                    function baseNth(array, n) {
30731                        var length = array.length;
30732                        if (!length) {
30733                            return;
30734                        }
30735                        n += n < 0 ? length : 0;
30736                        return isIndex(n, length) ? array[n] : undefined;
30737                    }
30738
30739                    /**
30740                     * The base implementation of `_.orderBy` without param guards.
30741                     *
30742                     * @private
30743                     * @param {Array|Object} collection The collection to iterate over.
30744                     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
30745                     * @param {string[]} orders The sort orders of `iteratees`.
30746                     * @returns {Array} Returns the new sorted array.
30747                     */
30748                    function baseOrderBy(collection, iteratees, orders) {
30749                        if (iteratees.length) {
30750                            iteratees = arrayMap(iteratees, function(iteratee) {
30751                                if (isArray(iteratee)) {
30752                                    return function(value) {
30753                                        return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
30754                                    }
30755                                }
30756                                return iteratee;
30757                            });
30758                        } else {
30759                            iteratees = [identity];
30760                        }
30761
30762                        var index = -1;
30763                        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
30764
30765                        var result = baseMap(collection, function(value, key, collection) {
30766                            var criteria = arrayMap(iteratees, function(iteratee) {
30767                                return iteratee(value);
30768                            });
30769                            return { 'criteria': criteria, 'index': ++index, 'value': value };
30770                        });
30771
30772                        return baseSortBy(result, function(object, other) {
30773                            return compareMultiple(object, other, orders);
30774                        });
30775                    }
30776
30777                    /**
30778                     * The base implementation of `_.pick` without support for individual
30779                     * property identifiers.
30780                     *
30781                     * @private
30782                     * @param {Object} object The source object.
30783                     * @param {string[]} paths The property paths to pick.
30784                     * @returns {Object} Returns the new object.
30785                     */
30786                    function basePick(object, paths) {
30787                        return basePickBy(object, paths, function(value, path) {
30788                            return hasIn(object, path);
30789                        });
30790                    }
30791
30792                    /**
30793                     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
30794                     *
30795                     * @private
30796                     * @param {Object} object The source object.
30797                     * @param {string[]} paths The property paths to pick.
30798                     * @param {Function} predicate The function invoked per property.
30799                     * @returns {Object} Returns the new object.
30800                     */
30801                    function basePickBy(object, paths, predicate) {
30802                        var index = -1,
30803                            length = paths.length,
30804                            result = {};
30805
30806                        while (++index < length) {
30807                            var path = paths[index],
30808                                value = baseGet(object, path);
30809
30810                            if (predicate(value, path)) {
30811                                baseSet(result, castPath(path, object), value);
30812                            }
30813                        }
30814                        return result;
30815                    }
30816
30817                    /**
30818                     * A specialized version of `baseProperty` which supports deep paths.
30819                     *
30820                     * @private
30821                     * @param {Array|string} path The path of the property to get.
30822                     * @returns {Function} Returns the new accessor function.
30823                     */
30824                    function basePropertyDeep(path) {
30825                        return function(object) {
30826                            return baseGet(object, path);
30827                        };
30828                    }
30829
30830                    /**
30831                     * The base implementation of `_.pullAllBy` without support for iteratee
30832                     * shorthands.
30833                     *
30834                     * @private
30835                     * @param {Array} array The array to modify.
30836                     * @param {Array} values The values to remove.
30837                     * @param {Function} [iteratee] The iteratee invoked per element.
30838                     * @param {Function} [comparator] The comparator invoked per element.
30839                     * @returns {Array} Returns `array`.
30840                     */
30841                    function basePullAll(array, values, iteratee, comparator) {
30842                        var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
30843                            index = -1,
30844                            length = values.length,
30845                            seen = array;
30846
30847                        if (array === values) {
30848                            values = copyArray(values);
30849                        }
30850                        if (iteratee) {
30851                            seen = arrayMap(array, baseUnary(iteratee));
30852                        }
30853                        while (++index < length) {
30854                            var fromIndex = 0,
30855                                value = values[index],
30856                                computed = iteratee ? iteratee(value) : value;
30857
30858                            while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
30859                                if (seen !== array) {
30860                                    splice.call(seen, fromIndex, 1);
30861                                }
30862                                splice.call(array, fromIndex, 1);
30863                            }
30864                        }
30865                        return array;
30866                    }
30867
30868                    /**
30869                     * The base implementation of `_.pullAt` without support for individual
30870                     * indexes or capturing the removed elements.
30871                     *
30872                     * @private
30873                     * @param {Array} array The array to modify.
30874                     * @param {number[]} indexes The indexes of elements to remove.
30875                     * @returns {Array} Returns `array`.
30876                     */
30877                    function basePullAt(array, indexes) {
30878                        var length = array ? indexes.length : 0,
30879                            lastIndex = length - 1;
30880
30881                        while (length--) {
30882                            var index = indexes[length];
30883                            if (length == lastIndex || index !== previous) {
30884                                var previous = index;
30885                                if (isIndex(index)) {
30886                                    splice.call(array, index, 1);
30887                                } else {
30888                                    baseUnset(array, index);
30889                                }
30890                            }
30891                        }
30892                        return array;
30893                    }
30894
30895                    /**
30896                     * The base implementation of `_.random` without support for returning
30897                     * floating-point numbers.
30898                     *
30899                     * @private
30900                     * @param {number} lower The lower bound.
30901                     * @param {number} upper The upper bound.
30902                     * @returns {number} Returns the random number.
30903                     */
30904                    function baseRandom(lower, upper) {
30905                        return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
30906                    }
30907
30908                    /**
30909                     * The base implementation of `_.range` and `_.rangeRight` which doesn't
30910                     * coerce arguments.
30911                     *
30912                     * @private
30913                     * @param {number} start The start of the range.
30914                     * @param {number} end The end of the range.
30915                     * @param {number} step The value to increment or decrement by.
30916                     * @param {boolean} [fromRight] Specify iterating from right to left.
30917                     * @returns {Array} Returns the range of numbers.
30918                     */
30919                    function baseRange(start, end, step, fromRight) {
30920                        var index = -1,
30921                            length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
30922                            result = Array(length);
30923
30924                        while (length--) {
30925                            result[fromRight ? length : ++index] = start;
30926                            start += step;
30927                        }
30928                        return result;
30929                    }
30930
30931                    /**
30932                     * The base implementation of `_.repeat` which doesn't coerce arguments.
30933                     *
30934                     * @private
30935                     * @param {string} string The string to repeat.
30936                     * @param {number} n The number of times to repeat the string.
30937                     * @returns {string} Returns the repeated string.
30938                     */
30939                    function baseRepeat(string, n) {
30940                        var result = '';
30941                        if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
30942                            return result;
30943                        }
30944                        // Leverage the exponentiation by squaring algorithm for a faster repeat.
30945                        // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
30946                        do {
30947                            if (n % 2) {
30948                                result += string;
30949                            }
30950                            n = nativeFloor(n / 2);
30951                            if (n) {
30952                                string += string;
30953                            }
30954                        } while (n);
30955
30956                        return result;
30957                    }
30958
30959                    /**
30960                     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
30961                     *
30962                     * @private
30963                     * @param {Function} func The function to apply a rest parameter to.
30964                     * @param {number} [start=func.length-1] The start position of the rest parameter.
30965                     * @returns {Function} Returns the new function.
30966                     */
30967                    function baseRest(func, start) {
30968                        return setToString(overRest(func, start, identity), func + '');
30969                    }
30970
30971                    /**
30972                     * The base implementation of `_.sample`.
30973                     *
30974                     * @private
30975                     * @param {Array|Object} collection The collection to sample.
30976                     * @returns {*} Returns the random element.
30977                     */
30978                    function baseSample(collection) {
30979                        return arraySample(values(collection));
30980                    }
30981
30982                    /**
30983                     * The base implementation of `_.sampleSize` without param guards.
30984                     *
30985                     * @private
30986                     * @param {Array|Object} collection The collection to sample.
30987                     * @param {number} n The number of elements to sample.
30988                     * @returns {Array} Returns the random elements.
30989                     */
30990                    function baseSampleSize(collection, n) {
30991                        var array = values(collection);
30992                        return shuffleSelf(array, baseClamp(n, 0, array.length));
30993                    }
30994
30995                    /**
30996                     * The base implementation of `_.set`.
30997                     *
30998                     * @private
30999                     * @param {Object} object The object to modify.
31000                     * @param {Array|string} path The path of the property to set.
31001                     * @param {*} value The value to set.
31002                     * @param {Function} [customizer] The function to customize path creation.
31003                     * @returns {Object} Returns `object`.
31004                     */
31005                    function baseSet(object, path, value, customizer) {
31006                        if (!isObject(object)) {
31007                            return object;
31008                        }
31009                        path = castPath(path, object);
31010
31011                        var index = -1,
31012                            length = path.length,
31013                            lastIndex = length - 1,
31014                            nested = object;
31015
31016                        while (nested != null && ++index < length) {
31017                            var key = toKey(path[index]),
31018                                newValue = value;
31019
31020                            if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
31021                                return object;
31022                            }
31023
31024                            if (index != lastIndex) {
31025                                var objValue = nested[key];
31026                                newValue = customizer ? customizer(objValue, key, nested) : undefined;
31027                                if (newValue === undefined) {
31028                                    newValue = isObject(objValue)
31029                                        ? objValue
31030                                        : (isIndex(path[index + 1]) ? [] : {});
31031                                }
31032                            }
31033                            assignValue(nested, key, newValue);
31034                            nested = nested[key];
31035                        }
31036                        return object;
31037                    }
31038
31039                    /**
31040                     * The base implementation of `setData` without support for hot loop shorting.
31041                     *
31042                     * @private
31043                     * @param {Function} func The function to associate metadata with.
31044                     * @param {*} data The metadata.
31045                     * @returns {Function} Returns `func`.
31046                     */
31047                    var baseSetData = !metaMap ? identity : function(func, data) {
31048                        metaMap.set(func, data);
31049                        return func;
31050                    };
31051
31052                    /**
31053                     * The base implementation of `setToString` without support for hot loop shorting.
31054                     *
31055                     * @private
31056                     * @param {Function} func The function to modify.
31057                     * @param {Function} string The `toString` result.
31058                     * @returns {Function} Returns `func`.
31059                     */
31060                    var baseSetToString = !defineProperty ? identity : function(func, string) {
31061                        return defineProperty(func, 'toString', {
31062                            'configurable': true,
31063                            'enumerable': false,
31064                            'value': constant(string),
31065                            'writable': true
31066                        });
31067                    };
31068
31069                    /**
31070                     * The base implementation of `_.shuffle`.
31071                     *
31072                     * @private
31073                     * @param {Array|Object} collection The collection to shuffle.
31074                     * @returns {Array} Returns the new shuffled array.
31075                     */
31076                    function baseShuffle(collection) {
31077                        return shuffleSelf(values(collection));
31078                    }
31079
31080                    /**
31081                     * The base implementation of `_.slice` without an iteratee call guard.
31082                     *
31083                     * @private
31084                     * @param {Array} array The array to slice.
31085                     * @param {number} [start=0] The start position.
31086                     * @param {number} [end=array.length] The end position.
31087                     * @returns {Array} Returns the slice of `array`.
31088                     */
31089                    function baseSlice(array, start, end) {
31090                        var index = -1,
31091                            length = array.length;
31092
31093                        if (start < 0) {
31094                            start = -start > length ? 0 : (length + start);
31095                        }
31096                        end = end > length ? length : end;
31097                        if (end < 0) {
31098                            end += length;
31099                        }
31100                        length = start > end ? 0 : ((end - start) >>> 0);
31101                        start >>>= 0;
31102
31103                        var result = Array(length);
31104                        while (++index < length) {
31105                            result[index] = array[index + start];
31106                        }
31107                        return result;
31108                    }
31109
31110                    /**
31111                     * The base implementation of `_.some` without support for iteratee shorthands.
31112                     *
31113                     * @private
31114                     * @param {Array|Object} collection The collection to iterate over.
31115                     * @param {Function} predicate The function invoked per iteration.
31116                     * @returns {boolean} Returns `true` if any element passes the predicate check,
31117                     *  else `false`.
31118                     */
31119                    function baseSome(collection, predicate) {
31120                        var result;
31121
31122                        baseEach(collection, function(value, index, collection) {
31123                            result = predicate(value, index, collection);
31124                            return !result;
31125                        });
31126                        return !!result;
31127                    }
31128
31129                    /**
31130                     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
31131                     * performs a binary search of `array` to determine the index at which `value`
31132                     * should be inserted into `array` in order to maintain its sort order.
31133                     *
31134                     * @private
31135                     * @param {Array} array The sorted array to inspect.
31136                     * @param {*} value The value to evaluate.
31137                     * @param {boolean} [retHighest] Specify returning the highest qualified index.
31138                     * @returns {number} Returns the index at which `value` should be inserted
31139                     *  into `array`.
31140                     */
31141                    function baseSortedIndex(array, value, retHighest) {
31142                        var low = 0,
31143                            high = array == null ? low : array.length;
31144
31145                        if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
31146                            while (low < high) {
31147                                var mid = (low + high) >>> 1,
31148                                    computed = array[mid];
31149
31150                                if (computed !== null && !isSymbol(computed) &&
31151                                    (retHighest ? (computed <= value) : (computed < value))) {
31152                                    low = mid + 1;
31153                                } else {
31154                                    high = mid;
31155                                }
31156                            }
31157                            return high;
31158                        }
31159                        return baseSortedIndexBy(array, value, identity, retHighest);
31160                    }
31161
31162                    /**
31163                     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
31164                     * which invokes `iteratee` for `value` and each element of `array` to compute
31165                     * their sort ranking. The iteratee is invoked with one argument; (value).
31166                     *
31167                     * @private
31168                     * @param {Array} array The sorted array to inspect.
31169                     * @param {*} value The value to evaluate.
31170                     * @param {Function} iteratee The iteratee invoked per element.
31171                     * @param {boolean} [retHighest] Specify returning the highest qualified index.
31172                     * @returns {number} Returns the index at which `value` should be inserted
31173                     *  into `array`.
31174                     */
31175                    function baseSortedIndexBy(array, value, iteratee, retHighest) {
31176                        var low = 0,
31177                            high = array == null ? 0 : array.length;
31178                        if (high === 0) {
31179                            return 0;
31180                        }
31181
31182                        value = iteratee(value);
31183                        var valIsNaN = value !== value,
31184                            valIsNull = value === null,
31185                            valIsSymbol = isSymbol(value),
31186                            valIsUndefined = value === undefined;
31187
31188                        while (low < high) {
31189                            var mid = nativeFloor((low + high) / 2),
31190                                computed = iteratee(array[mid]),
31191                                othIsDefined = computed !== undefined,
31192                                othIsNull = computed === null,
31193                                othIsReflexive = computed === computed,
31194                                othIsSymbol = isSymbol(computed);
31195
31196                            if (valIsNaN) {
31197                                var setLow = retHighest || othIsReflexive;
31198                            } else if (valIsUndefined) {
31199                                setLow = othIsReflexive && (retHighest || othIsDefined);
31200                            } else if (valIsNull) {
31201                                setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
31202                            } else if (valIsSymbol) {
31203                                setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
31204                            } else if (othIsNull || othIsSymbol) {
31205                                setLow = false;
31206                            } else {
31207                                setLow = retHighest ? (computed <= value) : (computed < value);
31208                            }
31209                            if (setLow) {
31210                                low = mid + 1;
31211                            } else {
31212                                high = mid;
31213                            }
31214                        }
31215                        return nativeMin(high, MAX_ARRAY_INDEX);
31216                    }
31217
31218                    /**
31219                     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
31220                     * support for iteratee shorthands.
31221                     *
31222                     * @private
31223                     * @param {Array} array The array to inspect.
31224                     * @param {Function} [iteratee] The iteratee invoked per element.
31225                     * @returns {Array} Returns the new duplicate free array.
31226                     */
31227                    function baseSortedUniq(array, iteratee) {
31228                        var index = -1,
31229                            length = array.length,
31230                            resIndex = 0,
31231                            result = [];
31232
31233                        while (++index < length) {
31234                            var value = array[index],
31235                                computed = iteratee ? iteratee(value) : value;
31236
31237                            if (!index || !eq(computed, seen)) {
31238                                var seen = computed;
31239                                result[resIndex++] = value === 0 ? 0 : value;
31240                            }
31241                        }
31242                        return result;
31243                    }
31244
31245                    /**
31246                     * The base implementation of `_.toNumber` which doesn't ensure correct
31247                     * conversions of binary, hexadecimal, or octal string values.
31248                     *
31249                     * @private
31250                     * @param {*} value The value to process.
31251                     * @returns {number} Returns the number.
31252                     */
31253                    function baseToNumber(value) {
31254                        if (typeof value == 'number') {
31255                            return value;
31256                        }
31257                        if (isSymbol(value)) {
31258                            return NAN;
31259                        }
31260                        return +value;
31261                    }
31262
31263                    /**
31264                     * The base implementation of `_.toString` which doesn't convert nullish
31265                     * values to empty strings.
31266                     *
31267                     * @private
31268                     * @param {*} value The value to process.
31269                     * @returns {string} Returns the string.
31270                     */
31271                    function baseToString(value) {
31272                        // Exit early for strings to avoid a performance hit in some environments.
31273                        if (typeof value == 'string') {
31274                            return value;
31275                        }
31276                        if (isArray(value)) {
31277                            // Recursively convert values (susceptible to call stack limits).
31278                            return arrayMap(value, baseToString) + '';
31279                        }
31280                        if (isSymbol(value)) {
31281                            return symbolToString ? symbolToString.call(value) : '';
31282                        }
31283                        var result = (value + '');
31284                        return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
31285                    }
31286
31287                    /**
31288                     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
31289                     *
31290                     * @private
31291                     * @param {Array} array The array to inspect.
31292                     * @param {Function} [iteratee] The iteratee invoked per element.
31293                     * @param {Function} [comparator] The comparator invoked per element.
31294                     * @returns {Array} Returns the new duplicate free array.
31295                     */
31296                    function baseUniq(array, iteratee, comparator) {
31297                        var index = -1,
31298                            includes = arrayIncludes,
31299                            length = array.length,
31300                            isCommon = true,
31301                            result = [],
31302                            seen = result;
31303
31304                        if (comparator) {
31305                            isCommon = false;
31306                            includes = arrayIncludesWith;
31307                        }
31308                        else if (length >= LARGE_ARRAY_SIZE) {
31309                            var set = iteratee ? null : createSet(array);
31310                            if (set) {
31311                                return setToArray(set);
31312                            }
31313                            isCommon = false;
31314                            includes = cacheHas;
31315                            seen = new SetCache;
31316                        }
31317                        else {
31318                            seen = iteratee ? [] : result;
31319                        }
31320                        outer:
31321                            while (++index < length) {
31322                                var value = array[index],
31323                                    computed = iteratee ? iteratee(value) : value;
31324
31325                                value = (comparator || value !== 0) ? value : 0;
31326                                if (isCommon && computed === computed) {
31327                                    var seenIndex = seen.length;
31328                                    while (seenIndex--) {
31329                                        if (seen[seenIndex] === computed) {
31330                                            continue outer;
31331                                        }
31332                                    }
31333                                    if (iteratee) {
31334                                        seen.push(computed);
31335                                    }
31336                                    result.push(value);
31337                                }
31338                                else if (!includes(seen, computed, comparator)) {
31339                                    if (seen !== result) {
31340                                        seen.push(computed);
31341                                    }
31342                                    result.push(value);
31343                                }
31344                            }
31345                        return result;
31346                    }
31347
31348                    /**
31349                     * The base implementation of `_.unset`.
31350                     *
31351                     * @private
31352                     * @param {Object} object The object to modify.
31353                     * @param {Array|string} path The property path to unset.
31354                     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
31355                     */
31356                    function baseUnset(object, path) {
31357                        path = castPath(path, object);
31358                        object = parent(object, path);
31359                        return object == null || delete object[toKey(last(path))];
31360                    }
31361
31362                    /**
31363                     * The base implementation of `_.update`.
31364                     *
31365                     * @private
31366                     * @param {Object} object The object to modify.
31367                     * @param {Array|string} path The path of the property to update.
31368                     * @param {Function} updater The function to produce the updated value.
31369                     * @param {Function} [customizer] The function to customize path creation.
31370                     * @returns {Object} Returns `object`.
31371                     */
31372                    function baseUpdate(object, path, updater, customizer) {
31373                        return baseSet(object, path, updater(baseGet(object, path)), customizer);
31374                    }
31375
31376                    /**
31377                     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
31378                     * without support for iteratee shorthands.
31379                     *
31380                     * @private
31381                     * @param {Array} array The array to query.
31382                     * @param {Function} predicate The function invoked per iteration.
31383                     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
31384                     * @param {boolean} [fromRight] Specify iterating from right to left.
31385                     * @returns {Array} Returns the slice of `array`.
31386                     */
31387                    function baseWhile(array, predicate, isDrop, fromRight) {
31388                        var length = array.length,
31389                            index = fromRight ? length : -1;
31390
31391                        while ((fromRight ? index-- : ++index < length) &&
31392                        predicate(array[index], index, array)) {}
31393
31394                        return isDrop
31395                            ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
31396                            : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
31397                    }
31398
31399                    /**
31400                     * The base implementation of `wrapperValue` which returns the result of
31401                     * performing a sequence of actions on the unwrapped `value`, where each
31402                     * successive action is supplied the return value of the previous.
31403                     *
31404                     * @private
31405                     * @param {*} value The unwrapped value.
31406                     * @param {Array} actions Actions to perform to resolve the unwrapped value.
31407                     * @returns {*} Returns the resolved value.
31408                     */
31409                    function baseWrapperValue(value, actions) {
31410                        var result = value;
31411                        if (result instanceof LazyWrapper) {
31412                            result = result.value();
31413                        }
31414                        return arrayReduce(actions, function(result, action) {
31415                            return action.func.apply(action.thisArg, arrayPush([result], action.args));
31416                        }, result);
31417                    }
31418
31419                    /**
31420                     * The base implementation of methods like `_.xor`, without support for
31421                     * iteratee shorthands, that accepts an array of arrays to inspect.
31422                     *
31423                     * @private
31424                     * @param {Array} arrays The arrays to inspect.
31425                     * @param {Function} [iteratee] The iteratee invoked per element.
31426                     * @param {Function} [comparator] The comparator invoked per element.
31427                     * @returns {Array} Returns the new array of values.
31428                     */
31429                    function baseXor(arrays, iteratee, comparator) {
31430                        var length = arrays.length;
31431                        if (length < 2) {
31432                            return length ? baseUniq(arrays[0]) : [];
31433                        }
31434                        var index = -1,
31435                            result = Array(length);
31436
31437                        while (++index < length) {
31438                            var array = arrays[index],
31439                                othIndex = -1;
31440
31441                            while (++othIndex < length) {
31442                                if (othIndex != index) {
31443                                    result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
31444                                }
31445                            }
31446                        }
31447                        return baseUniq(baseFlatten(result, 1), iteratee, comparator);
31448                    }
31449
31450                    /**
31451                     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
31452                     *
31453                     * @private
31454                     * @param {Array} props The property identifiers.
31455                     * @param {Array} values The property values.
31456                     * @param {Function} assignFunc The function to assign values.
31457                     * @returns {Object} Returns the new object.
31458                     */
31459                    function baseZipObject(props, values, assignFunc) {
31460                        var index = -1,
31461                            length = props.length,
31462                            valsLength = values.length,
31463                            result = {};
31464
31465                        while (++index < length) {
31466                            var value = index < valsLength ? values[index] : undefined;
31467                            assignFunc(result, props[index], value);
31468                        }
31469                        return result;
31470                    }
31471
31472                    /**
31473                     * Casts `value` to an empty array if it's not an array like object.
31474                     *
31475                     * @private
31476                     * @param {*} value The value to inspect.
31477                     * @returns {Array|Object} Returns the cast array-like object.
31478                     */
31479                    function castArrayLikeObject(value) {
31480                        return isArrayLikeObject(value) ? value : [];
31481                    }
31482
31483                    /**
31484                     * Casts `value` to `identity` if it's not a function.
31485                     *
31486                     * @private
31487                     * @param {*} value The value to inspect.
31488                     * @returns {Function} Returns cast function.
31489                     */
31490                    function castFunction(value) {
31491                        return typeof value == 'function' ? value : identity;
31492                    }
31493
31494                    /**
31495                     * Casts `value` to a path array if it's not one.
31496                     *
31497                     * @private
31498                     * @param {*} value The value to inspect.
31499                     * @param {Object} [object] The object to query keys on.
31500                     * @returns {Array} Returns the cast property path array.
31501                     */
31502                    function castPath(value, object) {
31503                        if (isArray(value)) {
31504                            return value;
31505                        }
31506                        return isKey(value, object) ? [value] : stringToPath(toString(value));
31507                    }
31508
31509                    /**
31510                     * A `baseRest` alias which can be replaced with `identity` by module
31511                     * replacement plugins.
31512                     *
31513                     * @private
31514                     * @type {Function}
31515                     * @param {Function} func The function to apply a rest parameter to.
31516                     * @returns {Function} Returns the new function.
31517                     */
31518                    var castRest = baseRest;
31519
31520                    /**
31521                     * Casts `array` to a slice if it's needed.
31522                     *
31523                     * @private
31524                     * @param {Array} array The array to inspect.
31525                     * @param {number} start The start position.
31526                     * @param {number} [end=array.length] The end position.
31527                     * @returns {Array} Returns the cast slice.
31528                     */
31529                    function castSlice(array, start, end) {
31530                        var length = array.length;
31531                        end = end === undefined ? length : end;
31532                        return (!start && end >= length) ? array : baseSlice(array, start, end);
31533                    }
31534
31535                    /**
31536                     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
31537                     *
31538                     * @private
31539                     * @param {number|Object} id The timer id or timeout object of the timer to clear.
31540                     */
31541                    var clearTimeout = ctxClearTimeout || function(id) {
31542                        return root.clearTimeout(id);
31543                    };
31544
31545                    /**
31546                     * Creates a clone of  `buffer`.
31547                     *
31548                     * @private
31549                     * @param {Buffer} buffer The buffer to clone.
31550                     * @param {boolean} [isDeep] Specify a deep clone.
31551                     * @returns {Buffer} Returns the cloned buffer.
31552                     */
31553                    function cloneBuffer(buffer, isDeep) {
31554                        if (isDeep) {
31555                            return buffer.slice();
31556                        }
31557                        var length = buffer.length,
31558                            result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
31559
31560                        buffer.copy(result);
31561                        return result;
31562                    }
31563
31564                    /**
31565                     * Creates a clone of `arrayBuffer`.
31566                     *
31567                     * @private
31568                     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
31569                     * @returns {ArrayBuffer} Returns the cloned array buffer.
31570                     */
31571                    function cloneArrayBuffer(arrayBuffer) {
31572                        var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
31573                        new Uint8Array(result).set(new Uint8Array(arrayBuffer));
31574                        return result;
31575                    }
31576
31577                    /**
31578                     * Creates a clone of `dataView`.
31579                     *
31580                     * @private
31581                     * @param {Object} dataView The data view to clone.
31582                     * @param {boolean} [isDeep] Specify a deep clone.
31583                     * @returns {Object} Returns the cloned data view.
31584                     */
31585                    function cloneDataView(dataView, isDeep) {
31586                        var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
31587                        return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
31588                    }
31589
31590                    /**
31591                     * Creates a clone of `regexp`.
31592                     *
31593                     * @private
31594                     * @param {Object} regexp The regexp to clone.
31595                     * @returns {Object} Returns the cloned regexp.
31596                     */
31597                    function cloneRegExp(regexp) {
31598                        var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
31599                        result.lastIndex = regexp.lastIndex;
31600                        return result;
31601                    }
31602
31603                    /**
31604                     * Creates a clone of the `symbol` object.
31605                     *
31606                     * @private
31607                     * @param {Object} symbol The symbol object to clone.
31608                     * @returns {Object} Returns the cloned symbol object.
31609                     */
31610                    function cloneSymbol(symbol) {
31611                        return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
31612                    }
31613
31614                    /**
31615                     * Creates a clone of `typedArray`.
31616                     *
31617                     * @private
31618                     * @param {Object} typedArray The typed array to clone.
31619                     * @param {boolean} [isDeep] Specify a deep clone.
31620                     * @returns {Object} Returns the cloned typed array.
31621                     */
31622                    function cloneTypedArray(typedArray, isDeep) {
31623                        var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
31624                        return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
31625                    }
31626
31627                    /**
31628                     * Compares values to sort them in ascending order.
31629                     *
31630                     * @private
31631                     * @param {*} value The value to compare.
31632                     * @param {*} other The other value to compare.
31633                     * @returns {number} Returns the sort order indicator for `value`.
31634                     */
31635                    function compareAscending(value, other) {
31636                        if (value !== other) {
31637                            var valIsDefined = value !== undefined,
31638                                valIsNull = value === null,
31639                                valIsReflexive = value === value,
31640                                valIsSymbol = isSymbol(value);
31641
31642                            var othIsDefined = other !== undefined,
31643                                othIsNull = other === null,
31644                                othIsReflexive = other === other,
31645                                othIsSymbol = isSymbol(other);
31646
31647                            if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
31648                                (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
31649                                (valIsNull && othIsDefined && othIsReflexive) ||
31650                                (!valIsDefined && othIsReflexive) ||
31651                                !valIsReflexive) {
31652                                return 1;
31653                            }
31654                            if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
31655                                (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
31656                                (othIsNull && valIsDefined && valIsReflexive) ||
31657                                (!othIsDefined && valIsReflexive) ||
31658                                !othIsReflexive) {
31659                                return -1;
31660                            }
31661                        }
31662                        return 0;
31663                    }
31664
31665                    /**
31666                     * Used by `_.orderBy` to compare multiple properties of a value to another
31667                     * and stable sort them.
31668                     *
31669                     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
31670                     * specify an order of "desc" for descending or "asc" for ascending sort order
31671                     * of corresponding values.
31672                     *
31673                     * @private
31674                     * @param {Object} object The object to compare.
31675                     * @param {Object} other The other object to compare.
31676                     * @param {boolean[]|string[]} orders The order to sort by for each property.
31677                     * @returns {number} Returns the sort order indicator for `object`.
31678                     */
31679                    function compareMultiple(object, other, orders) {
31680                        var index = -1,
31681                            objCriteria = object.criteria,
31682                            othCriteria = other.criteria,
31683                            length = objCriteria.length,
31684                            ordersLength = orders.length;
31685
31686                        while (++index < length) {
31687                            var result = compareAscending(objCriteria[index], othCriteria[index]);
31688                            if (result) {
31689                                if (index >= ordersLength) {
31690                                    return result;
31691                                }
31692                                var order = orders[index];
31693                                return result * (order == 'desc' ? -1 : 1);
31694                            }
31695                        }
31696                        // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
31697                        // that causes it, under certain circumstances, to provide the same value for
31698                        // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
31699                        // for more details.
31700                        //
31701                        // This also ensures a stable sort in V8 and other engines.
31702                        // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
31703                        return object.index - other.index;
31704                    }
31705
31706                    /**
31707                     * Creates an array that is the composition of partially applied arguments,
31708                     * placeholders, and provided arguments into a single array of arguments.
31709                     *
31710                     * @private
31711                     * @param {Array} args The provided arguments.
31712                     * @param {Array} partials The arguments to prepend to those provided.
31713                     * @param {Array} holders The `partials` placeholder indexes.
31714                     * @params {boolean} [isCurried] Specify composing for a curried function.
31715                     * @returns {Array} Returns the new array of composed arguments.
31716                     */
31717                    function composeArgs(args, partials, holders, isCurried) {
31718                        var argsIndex = -1,
31719                            argsLength = args.length,
31720                            holdersLength = holders.length,
31721                            leftIndex = -1,
31722                            leftLength = partials.length,
31723                            rangeLength = nativeMax(argsLength - holdersLength, 0),
31724                            result = Array(leftLength + rangeLength),
31725                            isUncurried = !isCurried;
31726
31727                        while (++leftIndex < leftLength) {
31728                            result[leftIndex] = partials[leftIndex];
31729                        }
31730                        while (++argsIndex < holdersLength) {
31731                            if (isUncurried || argsIndex < argsLength) {
31732                                result[holders[argsIndex]] = args[argsIndex];
31733                            }
31734                        }
31735                        while (rangeLength--) {
31736                            result[leftIndex++] = args[argsIndex++];
31737                        }
31738                        return result;
31739                    }
31740
31741                    /**
31742                     * This function is like `composeArgs` except that the arguments composition
31743                     * is tailored for `_.partialRight`.
31744                     *
31745                     * @private
31746                     * @param {Array} args The provided arguments.
31747                     * @param {Array} partials The arguments to append to those provided.
31748                     * @param {Array} holders The `partials` placeholder indexes.
31749                     * @params {boolean} [isCurried] Specify composing for a curried function.
31750                     * @returns {Array} Returns the new array of composed arguments.
31751                     */
31752                    function composeArgsRight(args, partials, holders, isCurried) {
31753                        var argsIndex = -1,
31754                            argsLength = args.length,
31755                            holdersIndex = -1,
31756                            holdersLength = holders.length,
31757                            rightIndex = -1,
31758                            rightLength = partials.length,
31759                            rangeLength = nativeMax(argsLength - holdersLength, 0),
31760                            result = Array(rangeLength + rightLength),
31761                            isUncurried = !isCurried;
31762
31763                        while (++argsIndex < rangeLength) {
31764                            result[argsIndex] = args[argsIndex];
31765                        }
31766                        var offset = argsIndex;
31767                        while (++rightIndex < rightLength) {
31768                            result[offset + rightIndex] = partials[rightIndex];
31769                        }
31770                        while (++holdersIndex < holdersLength) {
31771                            if (isUncurried || argsIndex < argsLength) {
31772                                result[offset + holders[holdersIndex]] = args[argsIndex++];
31773                            }
31774                        }
31775                        return result;
31776                    }
31777
31778                    /**
31779                     * Copies the values of `source` to `array`.
31780                     *
31781                     * @private
31782                     * @param {Array} source The array to copy values from.
31783                     * @param {Array} [array=[]] The array to copy values to.
31784                     * @returns {Array} Returns `array`.
31785                     */
31786                    function copyArray(source, array) {
31787                        var index = -1,
31788                            length = source.length;
31789
31790                        array || (array = Array(length));
31791                        while (++index < length) {
31792                            array[index] = source[index];
31793                        }
31794                        return array;
31795                    }
31796
31797                    /**
31798                     * Copies properties of `source` to `object`.
31799                     *
31800                     * @private
31801                     * @param {Object} source The object to copy properties from.
31802                     * @param {Array} props The property identifiers to copy.
31803                     * @param {Object} [object={}] The object to copy properties to.
31804                     * @param {Function} [customizer] The function to customize copied values.
31805                     * @returns {Object} Returns `object`.
31806                     */
31807                    function copyObject(source, props, object, customizer) {
31808                        var isNew = !object;
31809                        object || (object = {});
31810
31811                        var index = -1,
31812                            length = props.length;
31813
31814                        while (++index < length) {
31815                            var key = props[index];
31816
31817                            var newValue = customizer
31818                                ? customizer(object[key], source[key], key, object, source)
31819                                : undefined;
31820
31821                            if (newValue === undefined) {
31822                                newValue = source[key];
31823                            }
31824                            if (isNew) {
31825                                baseAssignValue(object, key, newValue);
31826                            } else {
31827                                assignValue(object, key, newValue);
31828                            }
31829                        }
31830                        return object;
31831                    }
31832
31833                    /**
31834                     * Copies own symbols of `source` to `object`.
31835                     *
31836                     * @private
31837                     * @param {Object} source The object to copy symbols from.
31838                     * @param {Object} [object={}] The object to copy symbols to.
31839                     * @returns {Object} Returns `object`.
31840                     */
31841                    function copySymbols(source, object) {
31842                        return copyObject(source, getSymbols(source), object);
31843                    }
31844
31845                    /**
31846                     * Copies own and inherited symbols of `source` to `object`.
31847                     *
31848                     * @private
31849                     * @param {Object} source The object to copy symbols from.
31850                     * @param {Object} [object={}] The object to copy symbols to.
31851                     * @returns {Object} Returns `object`.
31852                     */
31853                    function copySymbolsIn(source, object) {
31854                        return copyObject(source, getSymbolsIn(source), object);
31855                    }
31856
31857                    /**
31858                     * Creates a function like `_.groupBy`.
31859                     *
31860                     * @private
31861                     * @param {Function} setter The function to set accumulator values.
31862                     * @param {Function} [initializer] The accumulator object initializer.
31863                     * @returns {Function} Returns the new aggregator function.
31864                     */
31865                    function createAggregator(setter, initializer) {
31866                        return function(collection, iteratee) {
31867                            var func = isArray(collection) ? arrayAggregator : baseAggregator,
31868                                accumulator = initializer ? initializer() : {};
31869
31870                            return func(collection, setter, getIteratee(iteratee, 2), accumulator);
31871                        };
31872                    }
31873
31874                    /**
31875                     * Creates a function like `_.assign`.
31876                     *
31877                     * @private
31878                     * @param {Function} assigner The function to assign values.
31879                     * @returns {Function} Returns the new assigner function.
31880                     */
31881                    function createAssigner(assigner) {
31882                        return baseRest(function(object, sources) {
31883                            var index = -1,
31884                                length = sources.length,
31885                                customizer = length > 1 ? sources[length - 1] : undefined,
31886                                guard = length > 2 ? sources[2] : undefined;
31887
31888                            customizer = (assigner.length > 3 && typeof customizer == 'function')
31889                                ? (length--, customizer)
31890                                : undefined;
31891
31892                            if (guard && isIterateeCall(sources[0], sources[1], guard)) {
31893                                customizer = length < 3 ? undefined : customizer;
31894                                length = 1;
31895                            }
31896                            object = Object(object);
31897                            while (++index < length) {
31898                                var source = sources[index];
31899                                if (source) {
31900                                    assigner(object, source, index, customizer);
31901                                }
31902                            }
31903                            return object;
31904                        });
31905                    }
31906
31907                    /**
31908                     * Creates a `baseEach` or `baseEachRight` function.
31909                     *
31910                     * @private
31911                     * @param {Function} eachFunc The function to iterate over a collection.
31912                     * @param {boolean} [fromRight] Specify iterating from right to left.
31913                     * @returns {Function} Returns the new base function.
31914                     */
31915                    function createBaseEach(eachFunc, fromRight) {
31916                        return function(collection, iteratee) {
31917                            if (collection == null) {
31918                                return collection;
31919                            }
31920                            if (!isArrayLike(collection)) {
31921                                return eachFunc(collection, iteratee);
31922                            }
31923                            var length = collection.length,
31924                                index = fromRight ? length : -1,
31925                                iterable = Object(collection);
31926
31927                            while ((fromRight ? index-- : ++index < length)) {
31928                                if (iteratee(iterable[index], index, iterable) === false) {
31929                                    break;
31930                                }
31931                            }
31932                            return collection;
31933                        };
31934                    }
31935
31936                    /**
31937                     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
31938                     *
31939                     * @private
31940                     * @param {boolean} [fromRight] Specify iterating from right to left.
31941                     * @returns {Function} Returns the new base function.
31942                     */
31943                    function createBaseFor(fromRight) {
31944                        return function(object, iteratee, keysFunc) {
31945                            var index = -1,
31946                                iterable = Object(object),
31947                                props = keysFunc(object),
31948                                length = props.length;
31949
31950                            while (length--) {
31951                                var key = props[fromRight ? length : ++index];
31952                                if (iteratee(iterable[key], key, iterable) === false) {
31953                                    break;
31954                                }
31955                            }
31956                            return object;
31957                        };
31958                    }
31959
31960                    /**
31961                     * Creates a function that wraps `func` to invoke it with the optional `this`
31962                     * binding of `thisArg`.
31963                     *
31964                     * @private
31965                     * @param {Function} func The function to wrap.
31966                     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
31967                     * @param {*} [thisArg] The `this` binding of `func`.
31968                     * @returns {Function} Returns the new wrapped function.
31969                     */
31970                    function createBind(func, bitmask, thisArg) {
31971                        var isBind = bitmask & WRAP_BIND_FLAG,
31972                            Ctor = createCtor(func);
31973
31974                        function wrapper() {
31975                            var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
31976                            return fn.apply(isBind ? thisArg : this, arguments);
31977                        }
31978                        return wrapper;
31979                    }
31980
31981                    /**
31982                     * Creates a function like `_.lowerFirst`.
31983                     *
31984                     * @private
31985                     * @param {string} methodName The name of the `String` case method to use.
31986                     * @returns {Function} Returns the new case function.
31987                     */
31988                    function createCaseFirst(methodName) {
31989                        return function(string) {
31990                            string = toString(string);
31991
31992                            var strSymbols = hasUnicode(string)
31993                                ? stringToArray(string)
31994                                : undefined;
31995
31996                            var chr = strSymbols
31997                                ? strSymbols[0]
31998                                : string.charAt(0);
31999
32000                            var trailing = strSymbols
32001                                ? castSlice(strSymbols, 1).join('')
32002                                : string.slice(1);
32003
32004                            return chr[methodName]() + trailing;
32005                        };
32006                    }
32007
32008                    /**
32009                     * Creates a function like `_.camelCase`.
32010                     *
32011                     * @private
32012                     * @param {Function} callback The function to combine each word.
32013                     * @returns {Function} Returns the new compounder function.
32014                     */
32015                    function createCompounder(callback) {
32016                        return function(string) {
32017                            return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
32018                        };
32019                    }
32020
32021                    /**
32022                     * Creates a function that produces an instance of `Ctor` regardless of
32023                     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
32024                     *
32025                     * @private
32026                     * @param {Function} Ctor The constructor to wrap.
32027                     * @returns {Function} Returns the new wrapped function.
32028                     */
32029                    function createCtor(Ctor) {
32030                        return function() {
32031                            // Use a `switch` statement to work with class constructors. See
32032                            // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
32033                            // for more details.
32034                            var args = arguments;
32035                            switch (args.length) {
32036                                case 0: return new Ctor;
32037                                case 1: return new Ctor(args[0]);
32038                                case 2: return new Ctor(args[0], args[1]);
32039                                case 3: return new Ctor(args[0], args[1], args[2]);
32040                                case 4: return new Ctor(args[0], args[1], args[2], args[3]);
32041                                case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
32042                                case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
32043                                case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
32044                            }
32045                            var thisBinding = baseCreate(Ctor.prototype),
32046                                result = Ctor.apply(thisBinding, args);
32047
32048                            // Mimic the constructor's `return` behavior.
32049                            // See https://es5.github.io/#x13.2.2 for more details.
32050                            return isObject(result) ? result : thisBinding;
32051                        };
32052                    }
32053
32054                    /**
32055                     * Creates a function that wraps `func` to enable currying.
32056                     *
32057                     * @private
32058                     * @param {Function} func The function to wrap.
32059                     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
32060                     * @param {number} arity The arity of `func`.
32061                     * @returns {Function} Returns the new wrapped function.
32062                     */
32063                    function createCurry(func, bitmask, arity) {
32064                        var Ctor = createCtor(func);
32065
32066                        function wrapper() {
32067                            var length = arguments.length,
32068                                args = Array(length),
32069                                index = length,
32070                                placeholder = getHolder(wrapper);
32071
32072                            while (index--) {
32073                                args[index] = arguments[index];
32074                            }
32075                            var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
32076                                ? []
32077                                : replaceHolders(args, placeholder);
32078
32079                            length -= holders.length;
32080                            if (length < arity) {
32081                                return createRecurry(
32082                                    func, bitmask, createHybrid, wrapper.placeholder, undefined,
32083                                    args, holders, undefined, undefined, arity - length);
32084                            }
32085                            var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
32086                            return apply(fn, this, args);
32087                        }
32088                        return wrapper;
32089                    }
32090
32091                    /**
32092                     * Creates a `_.find` or `_.findLast` function.
32093                     *
32094                     * @private
32095                     * @param {Function} findIndexFunc The function to find the collection index.
32096                     * @returns {Function} Returns the new find function.
32097                     */
32098                    function createFind(findIndexFunc) {
32099                        return function(collection, predicate, fromIndex) {
32100                            var iterable = Object(collection);
32101                            if (!isArrayLike(collection)) {
32102                                var iteratee = getIteratee(predicate, 3);
32103                                collection = keys(collection);
32104                                predicate = function(key) { return iteratee(iterable[key], key, iterable); };
32105                            }
32106                            var index = findIndexFunc(collection, predicate, fromIndex);
32107                            return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
32108                        };
32109                    }
32110
32111                    /**
32112                     * Creates a `_.flow` or `_.flowRight` function.
32113                     *
32114                     * @private
32115                     * @param {boolean} [fromRight] Specify iterating from right to left.
32116                     * @returns {Function} Returns the new flow function.
32117                     */
32118                    function createFlow(fromRight) {
32119                        return flatRest(function(funcs) {
32120                            var length = funcs.length,
32121                                index = length,
32122                                prereq = LodashWrapper.prototype.thru;
32123
32124                            if (fromRight) {
32125                                funcs.reverse();
32126                            }
32127                            while (index--) {
32128                                var func = funcs[index];
32129                                if (typeof func != 'function') {
32130                                    throw new TypeError(FUNC_ERROR_TEXT);
32131                                }
32132                                if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
32133                                    var wrapper = new LodashWrapper([], true);
32134                                }
32135                            }
32136                            index = wrapper ? index : length;
32137                            while (++index < length) {
32138                                func = funcs[index];
32139
32140                                var funcName = getFuncName(func),
32141                                    data = funcName == 'wrapper' ? getData(func) : undefined;
32142
32143                                if (data && isLaziable(data[0]) &&
32144                                    data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
32145                                    !data[4].length && data[9] == 1
32146                                ) {
32147                                    wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
32148                                } else {
32149                                    wrapper = (func.length == 1 && isLaziable(func))
32150                                        ? wrapper[funcName]()
32151                                        : wrapper.thru(func);
32152                                }
32153                            }
32154                            return function() {
32155                                var args = arguments,
32156                                    value = args[0];
32157
32158                                if (wrapper && args.length == 1 && isArray(value)) {
32159                                    return wrapper.plant(value).value();
32160                                }
32161                                var index = 0,
32162                                    result = length ? funcs[index].apply(this, args) : value;
32163
32164                                while (++index < length) {
32165                                    result = funcs[index].call(this, result);
32166                                }
32167                                return result;
32168                            };
32169                        });
32170                    }
32171
32172                    /**
32173                     * Creates a function that wraps `func` to invoke it with optional `this`
32174                     * binding of `thisArg`, partial application, and currying.
32175                     *
32176                     * @private
32177                     * @param {Function|string} func The function or method name to wrap.
32178                     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
32179                     * @param {*} [thisArg] The `this` binding of `func`.
32180                     * @param {Array} [partials] The arguments to prepend to those provided to
32181                     *  the new function.
32182                     * @param {Array} [holders] The `partials` placeholder indexes.
32183                     * @param {Array} [partialsRight] The arguments to append to those provided
32184                     *  to the new function.
32185                     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
32186                     * @param {Array} [argPos] The argument positions of the new function.
32187                     * @param {number} [ary] The arity cap of `func`.
32188                     * @param {number} [arity] The arity of `func`.
32189                     * @returns {Function} Returns the new wrapped function.
32190                     */
32191                    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
32192                        var isAry = bitmask & WRAP_ARY_FLAG,
32193                            isBind = bitmask & WRAP_BIND_FLAG,
32194                            isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
32195                            isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
32196                            isFlip = bitmask & WRAP_FLIP_FLAG,
32197                            Ctor = isBindKey ? undefined : createCtor(func);
32198
32199                        function wrapper() {
32200                            var length = arguments.length,
32201                                args = Array(length),
32202                                index = length;
32203
32204                            while (index--) {
32205                                args[index] = arguments[index];
32206                            }
32207                            if (isCurried) {
32208                                var placeholder = getHolder(wrapper),
32209                                    holdersCount = countHolders(args, placeholder);
32210                            }
32211                            if (partials) {
32212                                args = composeArgs(args, partials, holders, isCurried);
32213                            }
32214                            if (partialsRight) {
32215                                args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
32216                            }
32217                            length -= holdersCount;
32218                            if (isCurried && length < arity) {
32219                                var newHolders = replaceHolders(args, placeholder);
32220                                return createRecurry(
32221                                    func, bitmask, createHybrid, wrapper.placeholder, thisArg,
32222                                    args, newHolders, argPos, ary, arity - length
32223                                );
32224                            }
32225                            var thisBinding = isBind ? thisArg : this,
32226                                fn = isBindKey ? thisBinding[func] : func;
32227
32228                            length = args.length;
32229                            if (argPos) {
32230                                args = reorder(args, argPos);
32231                            } else if (isFlip && length > 1) {
32232                                args.reverse();
32233                            }
32234                            if (isAry && ary < length) {
32235                                args.length = ary;
32236                            }
32237                            if (this && this !== root && this instanceof wrapper) {
32238                                fn = Ctor || createCtor(fn);
32239                            }
32240                            return fn.apply(thisBinding, args);
32241                        }
32242                        return wrapper;
32243                    }
32244
32245                    /**
32246                     * Creates a function like `_.invertBy`.
32247                     *
32248                     * @private
32249                     * @param {Function} setter The function to set accumulator values.
32250                     * @param {Function} toIteratee The function to resolve iteratees.
32251                     * @returns {Function} Returns the new inverter function.
32252                     */
32253                    function createInverter(setter, toIteratee) {
32254                        return function(object, iteratee) {
32255                            return baseInverter(object, setter, toIteratee(iteratee), {});
32256                        };
32257                    }
32258
32259                    /**
32260                     * Creates a function that performs a mathematical operation on two values.
32261                     *
32262                     * @private
32263                     * @param {Function} operator The function to perform the operation.
32264                     * @param {number} [defaultValue] The value used for `undefined` arguments.
32265                     * @returns {Function} Returns the new mathematical operation function.
32266                     */
32267                    function createMathOperation(operator, defaultValue) {
32268                        return function(value, other) {
32269                            var result;
32270                            if (value === undefined && other === undefined) {
32271                                return defaultValue;
32272                            }
32273                            if (value !== undefined) {
32274                                result = value;
32275                            }
32276                            if (other !== undefined) {
32277                                if (result === undefined) {
32278                                    return other;
32279                                }
32280                                if (typeof value == 'string' || typeof other == 'string') {
32281                                    value = baseToString(value);
32282                                    other = baseToString(other);
32283                                } else {
32284                                    value = baseToNumber(value);
32285                                    other = baseToNumber(other);
32286                                }
32287                                result = operator(value, other);
32288                            }
32289                            return result;
32290                        };
32291                    }
32292
32293                    /**
32294                     * Creates a function like `_.over`.
32295                     *
32296                     * @private
32297                     * @param {Function} arrayFunc The function to iterate over iteratees.
32298                     * @returns {Function} Returns the new over function.
32299                     */
32300                    function createOver(arrayFunc) {
32301                        return flatRest(function(iteratees) {
32302                            iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
32303                            return baseRest(function(args) {
32304                                var thisArg = this;
32305                                return arrayFunc(iteratees, function(iteratee) {
32306                                    return apply(iteratee, thisArg, args);
32307                                });
32308                            });
32309                        });
32310                    }
32311
32312                    /**
32313                     * Creates the padding for `string` based on `length`. The `chars` string
32314                     * is truncated if the number of characters exceeds `length`.
32315                     *
32316                     * @private
32317                     * @param {number} length The padding length.
32318                     * @param {string} [chars=' '] The string used as padding.
32319                     * @returns {string} Returns the padding for `string`.
32320                     */
32321                    function createPadding(length, chars) {
32322                        chars = chars === undefined ? ' ' : baseToString(chars);
32323
32324                        var charsLength = chars.length;
32325                        if (charsLength < 2) {
32326                            return charsLength ? baseRepeat(chars, length) : chars;
32327                        }
32328                        var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
32329                        return hasUnicode(chars)
32330                            ? castSlice(stringToArray(result), 0, length).join('')
32331                            : result.slice(0, length);
32332                    }
32333
32334                    /**
32335                     * Creates a function that wraps `func` to invoke it with the `this` binding
32336                     * of `thisArg` and `partials` prepended to the arguments it receives.
32337                     *
32338                     * @private
32339                     * @param {Function} func The function to wrap.
32340                     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
32341                     * @param {*} thisArg The `this` binding of `func`.
32342                     * @param {Array} partials The arguments to prepend to those provided to
32343                     *  the new function.
32344                     * @returns {Function} Returns the new wrapped function.
32345                     */
32346                    function createPartial(func, bitmask, thisArg, partials) {
32347                        var isBind = bitmask & WRAP_BIND_FLAG,
32348                            Ctor = createCtor(func);
32349
32350                        function wrapper() {
32351                            var argsIndex = -1,
32352                                argsLength = arguments.length,
32353                                leftIndex = -1,
32354                                leftLength = partials.length,
32355                                args = Array(leftLength + argsLength),
32356                                fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
32357
32358                            while (++leftIndex < leftLength) {
32359                                args[leftIndex] = partials[leftIndex];
32360                            }
32361                            while (argsLength--) {
32362                                args[leftIndex++] = arguments[++argsIndex];
32363                            }
32364                            return apply(fn, isBind ? thisArg : this, args);
32365                        }
32366                        return wrapper;
32367                    }
32368
32369                    /**
32370                     * Creates a `_.range` or `_.rangeRight` function.
32371                     *
32372                     * @private
32373                     * @param {boolean} [fromRight] Specify iterating from right to left.
32374                     * @returns {Function} Returns the new range function.
32375                     */
32376                    function createRange(fromRight) {
32377                        return function(start, end, step) {
32378                            if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
32379                                end = step = undefined;
32380                            }
32381                            // Ensure the sign of `-0` is preserved.
32382                            start = toFinite(start);
32383                            if (end === undefined) {
32384                                end = start;
32385                                start = 0;
32386                            } else {
32387                                end = toFinite(end);
32388                            }
32389                            step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
32390                            return baseRange(start, end, step, fromRight);
32391                        };
32392                    }
32393
32394                    /**
32395                     * Creates a function that performs a relational operation on two values.
32396                     *
32397                     * @private
32398                     * @param {Function} operator The function to perform the operation.
32399                     * @returns {Function} Returns the new relational operation function.
32400                     */
32401                    function createRelationalOperation(operator) {
32402                        return function(value, other) {
32403                            if (!(typeof value == 'string' && typeof other == 'string')) {
32404                                value = toNumber(value);
32405                                other = toNumber(other);
32406                            }
32407                            return operator(value, other);
32408                        };
32409                    }
32410
32411                    /**
32412                     * Creates a function that wraps `func` to continue currying.
32413                     *
32414                     * @private
32415                     * @param {Function} func The function to wrap.
32416                     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
32417                     * @param {Function} wrapFunc The function to create the `func` wrapper.
32418                     * @param {*} placeholder The placeholder value.
32419                     * @param {*} [thisArg] The `this` binding of `func`.
32420                     * @param {Array} [partials] The arguments to prepend to those provided to
32421                     *  the new function.
32422                     * @param {Array} [holders] The `partials` placeholder indexes.
32423                     * @param {Array} [argPos] The argument positions of the new function.
32424                     * @param {number} [ary] The arity cap of `func`.
32425                     * @param {number} [arity] The arity of `func`.
32426                     * @returns {Function} Returns the new wrapped function.
32427                     */
32428                    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
32429                        var isCurry = bitmask & WRAP_CURRY_FLAG,
32430                            newHolders = isCurry ? holders : undefined,
32431                            newHoldersRight = isCurry ? undefined : holders,
32432                            newPartials = isCurry ? partials : undefined,
32433                            newPartialsRight = isCurry ? undefined : partials;
32434
32435                        bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
32436                        bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
32437
32438                        if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
32439                            bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
32440                        }
32441                        var newData = [
32442                            func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
32443                            newHoldersRight, argPos, ary, arity
32444                        ];
32445
32446                        var result = wrapFunc.apply(undefined, newData);
32447                        if (isLaziable(func)) {
32448                            setData(result, newData);
32449                        }
32450                        result.placeholder = placeholder;
32451                        return setWrapToString(result, func, bitmask);
32452                    }
32453
32454                    /**
32455                     * Creates a function like `_.round`.
32456                     *
32457                     * @private
32458                     * @param {string} methodName The name of the `Math` method to use when rounding.
32459                     * @returns {Function} Returns the new round function.
32460                     */
32461                    function createRound(methodName) {
32462                        var func = Math[methodName];
32463                        return function(number, precision) {
32464                            number = toNumber(number);
32465                            precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
32466                            if (precision && nativeIsFinite(number)) {
32467                                // Shift with exponential notation to avoid floating-point issues.
32468                                // See [MDN](https://mdn.io/round#Examples) for more details.
32469                                var pair = (toString(number) + 'e').split('e'),
32470                                    value = func(pair[0] + 'e' + (+pair[1] + precision));
32471
32472                                pair = (toString(value) + 'e').split('e');
32473                                return +(pair[0] + 'e' + (+pair[1] - precision));
32474                            }
32475                            return func(number);
32476                        };
32477                    }
32478
32479                    /**
32480                     * Creates a set object of `values`.
32481                     *
32482                     * @private
32483                     * @param {Array} values The values to add to the set.
32484                     * @returns {Object} Returns the new set.
32485                     */
32486                    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
32487                        return new Set(values);
32488                    };
32489
32490                    /**
32491                     * Creates a `_.toPairs` or `_.toPairsIn` function.
32492                     *
32493                     * @private
32494                     * @param {Function} keysFunc The function to get the keys of a given object.
32495                     * @returns {Function} Returns the new pairs function.
32496                     */
32497                    function createToPairs(keysFunc) {
32498                        return function(object) {
32499                            var tag = getTag(object);
32500                            if (tag == mapTag) {
32501                                return mapToArray(object);
32502                            }
32503                            if (tag == setTag) {
32504                                return setToPairs(object);
32505                            }
32506                            return baseToPairs(object, keysFunc(object));
32507                        };
32508                    }
32509
32510                    /**
32511                     * Creates a function that either curries or invokes `func` with optional
32512                     * `this` binding and partially applied arguments.
32513                     *
32514                     * @private
32515                     * @param {Function|string} func The function or method name to wrap.
32516                     * @param {number} bitmask The bitmask flags.
32517                     *    1 - `_.bind`
32518                     *    2 - `_.bindKey`
32519                     *    4 - `_.curry` or `_.curryRight` of a bound function
32520                     *    8 - `_.curry`
32521                     *   16 - `_.curryRight`
32522                     *   32 - `_.partial`
32523                     *   64 - `_.partialRight`
32524                     *  128 - `_.rearg`
32525                     *  256 - `_.ary`
32526                     *  512 - `_.flip`
32527                     * @param {*} [thisArg] The `this` binding of `func`.
32528                     * @param {Array} [partials] The arguments to be partially applied.
32529                     * @param {Array} [holders] The `partials` placeholder indexes.
32530                     * @param {Array} [argPos] The argument positions of the new function.
32531                     * @param {number} [ary] The arity cap of `func`.
32532                     * @param {number} [arity] The arity of `func`.
32533                     * @returns {Function} Returns the new wrapped function.
32534                     */
32535                    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
32536                        var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
32537                        if (!isBindKey && typeof func != 'function') {
32538                            throw new TypeError(FUNC_ERROR_TEXT);
32539                        }
32540                        var length = partials ? partials.length : 0;
32541                        if (!length) {
32542                            bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
32543                            partials = holders = undefined;
32544                        }
32545                        ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
32546                        arity = arity === undefined ? arity : toInteger(arity);
32547                        length -= holders ? holders.length : 0;
32548
32549                        if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
32550                            var partialsRight = partials,
32551                                holdersRight = holders;
32552
32553                            partials = holders = undefined;
32554                        }
32555                        var data = isBindKey ? undefined : getData(func);
32556
32557                        var newData = [
32558                            func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
32559                            argPos, ary, arity
32560                        ];
32561
32562                        if (data) {
32563                            mergeData(newData, data);
32564                        }
32565                        func = newData[0];
32566                        bitmask = newData[1];
32567                        thisArg = newData[2];
32568                        partials = newData[3];
32569                        holders = newData[4];
32570                        arity = newData[9] = newData[9] === undefined
32571                            ? (isBindKey ? 0 : func.length)
32572                            : nativeMax(newData[9] - length, 0);
32573
32574                        if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
32575                            bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
32576                        }
32577                        if (!bitmask || bitmask == WRAP_BIND_FLAG) {
32578                            var result = createBind(func, bitmask, thisArg);
32579                        } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
32580                            result = createCurry(func, bitmask, arity);
32581                        } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
32582                            result = createPartial(func, bitmask, thisArg, partials);
32583                        } else {
32584                            result = createHybrid.apply(undefined, newData);
32585                        }
32586                        var setter = data ? baseSetData : setData;
32587                        return setWrapToString(setter(result, newData), func, bitmask);
32588                    }
32589
32590                    /**
32591                     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
32592                     * of source objects to the destination object for all destination properties
32593                     * that resolve to `undefined`.
32594                     *
32595                     * @private
32596                     * @param {*} objValue The destination value.
32597                     * @param {*} srcValue The source value.
32598                     * @param {string} key The key of the property to assign.
32599                     * @param {Object} object The parent object of `objValue`.
32600                     * @returns {*} Returns the value to assign.
32601                     */
32602                    function customDefaultsAssignIn(objValue, srcValue, key, object) {
32603                        if (objValue === undefined ||
32604                            (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
32605                            return srcValue;
32606                        }
32607                        return objValue;
32608                    }
32609
32610                    /**
32611                     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
32612                     * objects into destination objects that are passed thru.
32613                     *
32614                     * @private
32615                     * @param {*} objValue The destination value.
32616                     * @param {*} srcValue The source value.
32617                     * @param {string} key The key of the property to merge.
32618                     * @param {Object} object The parent object of `objValue`.
32619                     * @param {Object} source The parent object of `srcValue`.
32620                     * @param {Object} [stack] Tracks traversed source values and their merged
32621                     *  counterparts.
32622                     * @returns {*} Returns the value to assign.
32623                     */
32624                    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
32625                        if (isObject(objValue) && isObject(srcValue)) {
32626                            // Recursively merge objects and arrays (susceptible to call stack limits).
32627                            stack.set(srcValue, objValue);
32628                            baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
32629                            stack['delete'](srcValue);
32630                        }
32631                        return objValue;
32632                    }
32633
32634                    /**
32635                     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
32636                     * objects.
32637                     *
32638                     * @private
32639                     * @param {*} value The value to inspect.
32640                     * @param {string} key The key of the property to inspect.
32641                     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
32642                     */
32643                    function customOmitClone(value) {
32644                        return isPlainObject(value) ? undefined : value;
32645                    }
32646
32647                    /**
32648                     * A specialized version of `baseIsEqualDeep` for arrays with support for
32649                     * partial deep comparisons.
32650                     *
32651                     * @private
32652                     * @param {Array} array The array to compare.
32653                     * @param {Array} other The other array to compare.
32654                     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
32655                     * @param {Function} customizer The function to customize comparisons.
32656                     * @param {Function} equalFunc The function to determine equivalents of values.
32657                     * @param {Object} stack Tracks traversed `array` and `other` objects.
32658                     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
32659                     */
32660                    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
32661                        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
32662                            arrLength = array.length,
32663                            othLength = other.length;
32664
32665                        if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
32666                            return false;
32667                        }
32668                        // Check that cyclic values are equal.
32669                        var arrStacked = stack.get(array);
32670                        var othStacked = stack.get(other);
32671                        if (arrStacked && othStacked) {
32672                            return arrStacked == other && othStacked == array;
32673                        }
32674                        var index = -1,
32675                            result = true,
32676                            seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
32677
32678                        stack.set(array, other);
32679                        stack.set(other, array);
32680
32681                        // Ignore non-index properties.
32682                        while (++index < arrLength) {
32683                            var arrValue = array[index],
32684                                othValue = other[index];
32685
32686                            if (customizer) {
32687                                var compared = isPartial
32688                                    ? customizer(othValue, arrValue, index, other, array, stack)
32689                                    : customizer(arrValue, othValue, index, array, other, stack);
32690                            }
32691                            if (compared !== undefined) {
32692                                if (compared) {
32693                                    continue;
32694                                }
32695                                result = false;
32696                                break;
32697                            }
32698                            // Recursively compare arrays (susceptible to call stack limits).
32699                            if (seen) {
32700                                if (!arraySome(other, function(othValue, othIndex) {
32701                                    if (!cacheHas(seen, othIndex) &&
32702                                        (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
32703                                        return seen.push(othIndex);
32704                                    }
32705                                })) {
32706                                    result = false;
32707                                    break;
32708                                }
32709                            } else if (!(
32710                                arrValue === othValue ||
32711                                equalFunc(arrValue, othValue, bitmask, customizer, stack)
32712                            )) {
32713                                result = false;
32714                                break;
32715                            }
32716                        }
32717                        stack['delete'](array);
32718                        stack['delete'](other);
32719                        return result;
32720                    }
32721
32722                    /**
32723                     * A specialized version of `baseIsEqualDeep` for comparing objects of
32724                     * the same `toStringTag`.
32725                     *
32726                     * **Note:** This function only supports comparing values with tags of
32727                     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
32728                     *
32729                     * @private
32730                     * @param {Object} object The object to compare.
32731                     * @param {Object} other The other object to compare.
32732                     * @param {string} tag The `toStringTag` of the objects to compare.
32733                     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
32734                     * @param {Function} customizer The function to customize comparisons.
32735                     * @param {Function} equalFunc The function to determine equivalents of values.
32736                     * @param {Object} stack Tracks traversed `object` and `other` objects.
32737                     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
32738                     */
32739                    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
32740                        switch (tag) {
32741                            case dataViewTag:
32742                                if ((object.byteLength != other.byteLength) ||
32743                                    (object.byteOffset != other.byteOffset)) {
32744                                    return false;
32745                                }
32746                                object = object.buffer;
32747                                other = other.buffer;
32748
32749                            case arrayBufferTag:
32750                                if ((object.byteLength != other.byteLength) ||
32751                                    !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
32752                                    return false;
32753                                }
32754                                return true;
32755
32756                            case boolTag:
32757                            case dateTag:
32758                            case numberTag:
32759                                // Coerce booleans to `1` or `0` and dates to milliseconds.
32760                                // Invalid dates are coerced to `NaN`.
32761                                return eq(+object, +other);
32762
32763                            case errorTag:
32764                                return object.name == other.name && object.message == other.message;
32765
32766                            case regexpTag:
32767                            case stringTag:
32768                                // Coerce regexes to strings and treat strings, primitives and objects,
32769                                // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
32770                                // for more details.
32771                                return object == (other + '');
32772
32773                            case mapTag:
32774                                var convert = mapToArray;
32775
32776                            case setTag:
32777                                var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
32778                                convert || (convert = setToArray);
32779
32780                                if (object.size != other.size && !isPartial) {
32781                                    return false;
32782                                }
32783                                // Assume cyclic values are equal.
32784                                var stacked = stack.get(object);
32785                                if (stacked) {
32786                                    return stacked == other;
32787                                }
32788                                bitmask |= COMPARE_UNORDERED_FLAG;
32789
32790                                // Recursively compare objects (susceptible to call stack limits).
32791                                stack.set(object, other);
32792                                var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
32793                                stack['delete'](object);
32794                                return result;
32795
32796                            case symbolTag:
32797                                if (symbolValueOf) {
32798                                    return symbolValueOf.call(object) == symbolValueOf.call(other);
32799                                }
32800                        }
32801                        return false;
32802                    }
32803
32804                    /**
32805                     * A specialized version of `baseIsEqualDeep` for objects with support for
32806                     * partial deep comparisons.
32807                     *
32808                     * @private
32809                     * @param {Object} object The object to compare.
32810                     * @param {Object} other The other object to compare.
32811                     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
32812                     * @param {Function} customizer The function to customize comparisons.
32813                     * @param {Function} equalFunc The function to determine equivalents of values.
32814                     * @param {Object} stack Tracks traversed `object` and `other` objects.
32815                     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
32816                     */
32817                    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
32818                        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
32819                            objProps = getAllKeys(object),
32820                            objLength = objProps.length,
32821                            othProps = getAllKeys(other),
32822                            othLength = othProps.length;
32823
32824                        if (objLength != othLength && !isPartial) {
32825                            return false;
32826                        }
32827                        var index = objLength;
32828                        while (index--) {
32829                            var key = objProps[index];
32830                            if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
32831                                return false;
32832                            }
32833                        }
32834                        // Check that cyclic values are equal.
32835                        var objStacked = stack.get(object);
32836                        var othStacked = stack.get(other);
32837                        if (objStacked && othStacked) {
32838                            return objStacked == other && othStacked == object;
32839                        }
32840                        var result = true;
32841                        stack.set(object, other);
32842                        stack.set(other, object);
32843
32844                        var skipCtor = isPartial;
32845                        while (++index < objLength) {
32846                            key = objProps[index];
32847                            var objValue = object[key],
32848                                othValue = other[key];
32849
32850                            if (customizer) {
32851                                var compared = isPartial
32852                                    ? customizer(othValue, objValue, key, other, object, stack)
32853                                    : customizer(objValue, othValue, key, object, other, stack);
32854                            }
32855                            // Recursively compare objects (susceptible to call stack limits).
32856                            if (!(compared === undefined
32857                                    ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
32858                                    : compared
32859                            )) {
32860                                result = false;
32861                                break;
32862                            }
32863                            skipCtor || (skipCtor = key == 'constructor');
32864                        }
32865                        if (result && !skipCtor) {
32866                            var objCtor = object.constructor,
32867                                othCtor = other.constructor;
32868
32869                            // Non `Object` object instances with different constructors are not equal.
32870                            if (objCtor != othCtor &&
32871                                ('constructor' in object && 'constructor' in other) &&
32872                                !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
32873                                    typeof othCtor == 'function' && othCtor instanceof othCtor)) {
32874                                result = false;
32875                            }
32876                        }
32877                        stack['delete'](object);
32878                        stack['delete'](other);
32879                        return result;
32880                    }
32881
32882                    /**
32883                     * A specialized version of `baseRest` which flattens the rest array.
32884                     *
32885                     * @private
32886                     * @param {Function} func The function to apply a rest parameter to.
32887                     * @returns {Function} Returns the new function.
32888                     */
32889                    function flatRest(func) {
32890                        return setToString(overRest(func, undefined, flatten), func + '');
32891                    }
32892
32893                    /**
32894                     * Creates an array of own enumerable property names and symbols of `object`.
32895                     *
32896                     * @private
32897                     * @param {Object} object The object to query.
32898                     * @returns {Array} Returns the array of property names and symbols.
32899                     */
32900                    function getAllKeys(object) {
32901                        return baseGetAllKeys(object, keys, getSymbols);
32902                    }
32903
32904                    /**
32905                     * Creates an array of own and inherited enumerable property names and
32906                     * symbols of `object`.
32907                     *
32908                     * @private
32909                     * @param {Object} object The object to query.
32910                     * @returns {Array} Returns the array of property names and symbols.
32911                     */
32912                    function getAllKeysIn(object) {
32913                        return baseGetAllKeys(object, keysIn, getSymbolsIn);
32914                    }
32915
32916                    /**
32917                     * Gets metadata for `func`.
32918                     *
32919                     * @private
32920                     * @param {Function} func The function to query.
32921                     * @returns {*} Returns the metadata for `func`.
32922                     */
32923                    var getData = !metaMap ? noop : function(func) {
32924                        return metaMap.get(func);
32925                    };
32926
32927                    /**
32928                     * Gets the name of `func`.
32929                     *
32930                     * @private
32931                     * @param {Function} func The function to query.
32932                     * @returns {string} Returns the function name.
32933                     */
32934                    function getFuncName(func) {
32935                        var result = (func.name + ''),
32936                            array = realNames[result],
32937                            length = hasOwnProperty.call(realNames, result) ? array.length : 0;
32938
32939                        while (length--) {
32940                            var data = array[length],
32941                                otherFunc = data.func;
32942                            if (otherFunc == null || otherFunc == func) {
32943                                return data.name;
32944                            }
32945                        }
32946                        return result;
32947                    }
32948
32949                    /**
32950                     * Gets the argument placeholder value for `func`.
32951                     *
32952                     * @private
32953                     * @param {Function} func The function to inspect.
32954                     * @returns {*} Returns the placeholder value.
32955                     */
32956                    function getHolder(func) {
32957                        var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
32958                        return object.placeholder;
32959                    }
32960
32961                    /**
32962                     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
32963                     * this function returns the custom method, otherwise it returns `baseIteratee`.
32964                     * If arguments are provided, the chosen function is invoked with them and
32965                     * its result is returned.
32966                     *
32967                     * @private
32968                     * @param {*} [value] The value to convert to an iteratee.
32969                     * @param {number} [arity] The arity of the created iteratee.
32970                     * @returns {Function} Returns the chosen function or its result.
32971                     */
32972                    function getIteratee() {
32973                        var result = lodash.iteratee || iteratee;
32974                        result = result === iteratee ? baseIteratee : result;
32975                        return arguments.length ? result(arguments[0], arguments[1]) : result;
32976                    }
32977
32978                    /**
32979                     * Gets the data for `map`.
32980                     *
32981                     * @private
32982                     * @param {Object} map The map to query.
32983                     * @param {string} key The reference key.
32984                     * @returns {*} Returns the map data.
32985                     */
32986                    function getMapData(map, key) {
32987                        var data = map.__data__;
32988                        return isKeyable(key)
32989                            ? data[typeof key == 'string' ? 'string' : 'hash']
32990                            : data.map;
32991                    }
32992
32993                    /**
32994                     * Gets the property names, values, and compare flags of `object`.
32995                     *
32996                     * @private
32997                     * @param {Object} object The object to query.
32998                     * @returns {Array} Returns the match data of `object`.
32999                     */
33000                    function getMatchData(object) {
33001                        var result = keys(object),
33002                            length = result.length;
33003
33004                        while (length--) {
33005                            var key = result[length],
33006                                value = object[key];
33007
33008                            result[length] = [key, value, isStrictComparable(value)];
33009                        }
33010                        return result;
33011                    }
33012
33013                    /**
33014                     * Gets the native function at `key` of `object`.
33015                     *
33016                     * @private
33017                     * @param {Object} object The object to query.
33018                     * @param {string} key The key of the method to get.
33019                     * @returns {*} Returns the function if it's native, else `undefined`.
33020                     */
33021                    function getNative(object, key) {
33022                        var value = getValue(object, key);
33023                        return baseIsNative(value) ? value : undefined;
33024                    }
33025
33026                    /**
33027                     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
33028                     *
33029                     * @private
33030                     * @param {*} value The value to query.
33031                     * @returns {string} Returns the raw `toStringTag`.
33032                     */
33033                    function getRawTag(value) {
33034                        var isOwn = hasOwnProperty.call(value, symToStringTag),
33035                            tag = value[symToStringTag];
33036
33037                        try {
33038                            value[symToStringTag] = undefined;
33039                            var unmasked = true;
33040                        } catch (e) {}
33041
33042                        var result = nativeObjectToString.call(value);
33043                        if (unmasked) {
33044                            if (isOwn) {
33045                                value[symToStringTag] = tag;
33046                            } else {
33047                                delete value[symToStringTag];
33048                            }
33049                        }
33050                        return result;
33051                    }
33052
33053                    /**
33054                     * Creates an array of the own enumerable symbols of `object`.
33055                     *
33056                     * @private
33057                     * @param {Object} object The object to query.
33058                     * @returns {Array} Returns the array of symbols.
33059                     */
33060                    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
33061                        if (object == null) {
33062                            return [];
33063                        }
33064                        object = Object(object);
33065                        return arrayFilter(nativeGetSymbols(object), function(symbol) {
33066                            return propertyIsEnumerable.call(object, symbol);
33067                        });
33068                    };
33069
33070                    /**
33071                     * Creates an array of the own and inherited enumerable symbols of `object`.
33072                     *
33073                     * @private
33074                     * @param {Object} object The object to query.
33075                     * @returns {Array} Returns the array of symbols.
33076                     */
33077                    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
33078                        var result = [];
33079                        while (object) {
33080                            arrayPush(result, getSymbols(object));
33081                            object = getPrototype(object);
33082                        }
33083                        return result;
33084                    };
33085
33086                    /**
33087                     * Gets the `toStringTag` of `value`.
33088                     *
33089                     * @private
33090                     * @param {*} value The value to query.
33091                     * @returns {string} Returns the `toStringTag`.
33092                     */
33093                    var getTag = baseGetTag;
33094
33095                    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
33096                    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
33097                        (Map && getTag(new Map) != mapTag) ||
33098                        (Promise && getTag(Promise.resolve()) != promiseTag) ||
33099                        (Set && getTag(new Set) != setTag) ||
33100                        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
33101                        getTag = function(value) {
33102                            var result = baseGetTag(value),
33103                                Ctor = result == objectTag ? value.constructor : undefined,
33104                                ctorString = Ctor ? toSource(Ctor) : '';
33105
33106                            if (ctorString) {
33107                                switch (ctorString) {
33108                                    case dataViewCtorString: return dataViewTag;
33109                                    case mapCtorString: return mapTag;
33110                                    case promiseCtorString: return promiseTag;
33111                                    case setCtorString: return setTag;
33112                                    case weakMapCtorString: return weakMapTag;
33113                                }
33114                            }
33115                            return result;
33116                        };
33117                    }
33118
33119                    /**
33120                     * Gets the view, applying any `transforms` to the `start` and `end` positions.
33121                     *
33122                     * @private
33123                     * @param {number} start The start of the view.
33124                     * @param {number} end The end of the view.
33125                     * @param {Array} transforms The transformations to apply to the view.
33126                     * @returns {Object} Returns an object containing the `start` and `end`
33127                     *  positions of the view.
33128                     */
33129                    function getView(start, end, transforms) {
33130                        var index = -1,
33131                            length = transforms.length;
33132
33133                        while (++index < length) {
33134                            var data = transforms[index],
33135                                size = data.size;
33136
33137                            switch (data.type) {
33138                                case 'drop':      start += size; break;
33139                                case 'dropRight': end -= size; break;
33140                                case 'take':      end = nativeMin(end, start + size); break;
33141                                case 'takeRight': start = nativeMax(start, end - size); break;
33142                            }
33143                        }
33144                        return { 'start': start, 'end': end };
33145                    }
33146
33147                    /**
33148                     * Extracts wrapper details from the `source` body comment.
33149                     *
33150                     * @private
33151                     * @param {string} source The source to inspect.
33152                     * @returns {Array} Returns the wrapper details.
33153                     */
33154                    function getWrapDetails(source) {
33155                        var match = source.match(reWrapDetails);
33156                        return match ? match[1].split(reSplitDetails) : [];
33157                    }
33158
33159                    /**
33160                     * Checks if `path` exists on `object`.
33161                     *
33162                     * @private
33163                     * @param {Object} object The object to query.
33164                     * @param {Array|string} path The path to check.
33165                     * @param {Function} hasFunc The function to check properties.
33166                     * @returns {boolean} Returns `true` if `path` exists, else `false`.
33167                     */
33168                    function hasPath(object, path, hasFunc) {
33169                        path = castPath(path, object);
33170
33171                        var index = -1,
33172                            length = path.length,
33173                            result = false;
33174
33175                        while (++index < length) {
33176                            var key = toKey(path[index]);
33177                            if (!(result = object != null && hasFunc(object, key))) {
33178                                break;
33179                            }
33180                            object = object[key];
33181                        }
33182                        if (result || ++index != length) {
33183                            return result;
33184                        }
33185                        length = object == null ? 0 : object.length;
33186                        return !!length && isLength(length) && isIndex(key, length) &&
33187                            (isArray(object) || isArguments(object));
33188                    }
33189
33190                    /**
33191                     * Initializes an array clone.
33192                     *
33193                     * @private
33194                     * @param {Array} array The array to clone.
33195                     * @returns {Array} Returns the initialized clone.
33196                     */
33197                    function initCloneArray(array) {
33198                        var length = array.length,
33199                            result = new array.constructor(length);
33200
33201                        // Add properties assigned by `RegExp#exec`.
33202                        if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
33203                            result.index = array.index;
33204                            result.input = array.input;
33205                        }
33206                        return result;
33207                    }
33208
33209                    /**
33210                     * Initializes an object clone.
33211                     *
33212                     * @private
33213                     * @param {Object} object The object to clone.
33214                     * @returns {Object} Returns the initialized clone.
33215                     */
33216                    function initCloneObject(object) {
33217                        return (typeof object.constructor == 'function' && !isPrototype(object))
33218                            ? baseCreate(getPrototype(object))
33219                            : {};
33220                    }
33221
33222                    /**
33223                     * Initializes an object clone based on its `toStringTag`.
33224                     *
33225                     * **Note:** This function only supports cloning values with tags of
33226                     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
33227                     *
33228                     * @private
33229                     * @param {Object} object The object to clone.
33230                     * @param {string} tag The `toStringTag` of the object to clone.
33231                     * @param {boolean} [isDeep] Specify a deep clone.
33232                     * @returns {Object} Returns the initialized clone.
33233                     */
33234                    function initCloneByTag(object, tag, isDeep) {
33235                        var Ctor = object.constructor;
33236                        switch (tag) {
33237                            case arrayBufferTag:
33238                                return cloneArrayBuffer(object);
33239
33240                            case boolTag:
33241                            case dateTag:
33242                                return new Ctor(+object);
33243
33244                            case dataViewTag:
33245                                return cloneDataView(object, isDeep);
33246
33247                            case float32Tag: case float64Tag:
33248                            case int8Tag: case int16Tag: case int32Tag:
33249                            case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
33250                                return cloneTypedArray(object, isDeep);
33251
33252                            case mapTag:
33253                                return new Ctor;
33254
33255                            case numberTag:
33256                            case stringTag:
33257                                return new Ctor(object);
33258
33259                            case regexpTag:
33260                                return cloneRegExp(object);
33261
33262                            case setTag:
33263                                return new Ctor;
33264
33265                            case symbolTag:
33266                                return cloneSymbol(object);
33267                        }
33268                    }
33269
33270                    /**
33271                     * Inserts wrapper `details` in a comment at the top of the `source` body.
33272                     *
33273                     * @private
33274                     * @param {string} source The source to modify.
33275                     * @returns {Array} details The details to insert.
33276                     * @returns {string} Returns the modified source.
33277                     */
33278                    function insertWrapDetails(source, details) {
33279                        var length = details.length;
33280                        if (!length) {
33281                            return source;
33282                        }
33283                        var lastIndex = length - 1;
33284                        details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
33285                        details = details.join(length > 2 ? ', ' : ' ');
33286                        return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
33287                    }
33288
33289                    /**
33290                     * Checks if `value` is a flattenable `arguments` object or array.
33291                     *
33292                     * @private
33293                     * @param {*} value The value to check.
33294                     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
33295                     */
33296                    function isFlattenable(value) {
33297                        return isArray(value) || isArguments(value) ||
33298                            !!(spreadableSymbol && value && value[spreadableSymbol]);
33299                    }
33300
33301                    /**
33302                     * Checks if `value` is a valid array-like index.
33303                     *
33304                     * @private
33305                     * @param {*} value The value to check.
33306                     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
33307                     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
33308                     */
33309                    function isIndex(value, length) {
33310                        var type = typeof value;
33311                        length = length == null ? MAX_SAFE_INTEGER : length;
33312
33313                        return !!length &&
33314                            (type == 'number' ||
33315                                (type != 'symbol' && reIsUint.test(value))) &&
33316                            (value > -1 && value % 1 == 0 && value < length);
33317                    }
33318
33319                    /**
33320                     * Checks if the given arguments are from an iteratee call.
33321                     *
33322                     * @private
33323                     * @param {*} value The potential iteratee value argument.
33324                     * @param {*} index The potential iteratee index or key argument.
33325                     * @param {*} object The potential iteratee object argument.
33326                     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
33327                     *  else `false`.
33328                     */
33329                    function isIterateeCall(value, index, object) {
33330                        if (!isObject(object)) {
33331                            return false;
33332                        }
33333                        var type = typeof index;
33334                        if (type == 'number'
33335                            ? (isArrayLike(object) && isIndex(index, object.length))
33336                            : (type == 'string' && index in object)
33337                        ) {
33338                            return eq(object[index], value);
33339                        }
33340                        return false;
33341                    }
33342
33343                    /**
33344                     * Checks if `value` is a property name and not a property path.
33345                     *
33346                     * @private
33347                     * @param {*} value The value to check.
33348                     * @param {Object} [object] The object to query keys on.
33349                     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
33350                     */
33351                    function isKey(value, object) {
33352                        if (isArray(value)) {
33353                            return false;
33354                        }
33355                        var type = typeof value;
33356                        if (type == 'number' || type == 'symbol' || type == 'boolean' ||
33357                            value == null || isSymbol(value)) {
33358                            return true;
33359                        }
33360                        return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
33361                            (object != null && value in Object(object));
33362                    }
33363
33364                    /**
33365                     * Checks if `value` is suitable for use as unique object key.
33366                     *
33367                     * @private
33368                     * @param {*} value The value to check.
33369                     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
33370                     */
33371                    function isKeyable(value) {
33372                        var type = typeof value;
33373                        return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
33374                            ? (value !== '__proto__')
33375                            : (value === null);
33376                    }
33377
33378                    /**
33379                     * Checks if `func` has a lazy counterpart.
33380                     *
33381                     * @private
33382                     * @param {Function} func The function to check.
33383                     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
33384                     *  else `false`.
33385                     */
33386                    function isLaziable(func) {
33387                        var funcName = getFuncName(func),
33388                            other = lodash[funcName];
33389
33390                        if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
33391                            return false;
33392                        }
33393                        if (func === other) {
33394                            return true;
33395                        }
33396                        var data = getData(other);
33397                        return !!data && func === data[0];
33398                    }
33399
33400                    /**
33401                     * Checks if `func` has its source masked.
33402                     *
33403                     * @private
33404                     * @param {Function} func The function to check.
33405                     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
33406                     */
33407                    function isMasked(func) {
33408                        return !!maskSrcKey && (maskSrcKey in func);
33409                    }
33410
33411                    /**
33412                     * Checks if `func` is capable of being masked.
33413                     *
33414                     * @private
33415                     * @param {*} value The value to check.
33416                     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
33417                     */
33418                    var isMaskable = coreJsData ? isFunction : stubFalse;
33419
33420                    /**
33421                     * Checks if `value` is likely a prototype object.
33422                     *
33423                     * @private
33424                     * @param {*} value The value to check.
33425                     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
33426                     */
33427                    function isPrototype(value) {
33428                        var Ctor = value && value.constructor,
33429                            proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
33430
33431                        return value === proto;
33432                    }
33433
33434                    /**
33435                     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
33436                     *
33437                     * @private
33438                     * @param {*} value The value to check.
33439                     * @returns {boolean} Returns `true` if `value` if suitable for strict
33440                     *  equality comparisons, else `false`.
33441                     */
33442                    function isStrictComparable(value) {
33443                        return value === value && !isObject(value);
33444                    }
33445
33446                    /**
33447                     * A specialized version of `matchesProperty` for source values suitable
33448                     * for strict equality comparisons, i.e. `===`.
33449                     *
33450                     * @private
33451                     * @param {string} key The key of the property to get.
33452                     * @param {*} srcValue The value to match.
33453                     * @returns {Function} Returns the new spec function.
33454                     */
33455                    function matchesStrictComparable(key, srcValue) {
33456                        return function(object) {
33457                            if (object == null) {
33458                                return false;
33459                            }
33460                            return object[key] === srcValue &&
33461                                (srcValue !== undefined || (key in Object(object)));
33462                        };
33463                    }
33464
33465                    /**
33466                     * A specialized version of `_.memoize` which clears the memoized function's
33467                     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
33468                     *
33469                     * @private
33470                     * @param {Function} func The function to have its output memoized.
33471                     * @returns {Function} Returns the new memoized function.
33472                     */
33473                    function memoizeCapped(func) {
33474                        var result = memoize(func, function(key) {
33475                            if (cache.size === MAX_MEMOIZE_SIZE) {
33476                                cache.clear();
33477                            }
33478                            return key;
33479                        });
33480
33481                        var cache = result.cache;
33482                        return result;
33483                    }
33484
33485                    /**
33486                     * Merges the function metadata of `source` into `data`.
33487                     *
33488                     * Merging metadata reduces the number of wrappers used to invoke a function.
33489                     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
33490                     * may be applied regardless of execution order. Methods like `_.ary` and
33491                     * `_.rearg` modify function arguments, making the order in which they are
33492                     * executed important, preventing the merging of metadata. However, we make
33493                     * an exception for a safe combined case where curried functions have `_.ary`
33494                     * and or `_.rearg` applied.
33495                     *
33496                     * @private
33497                     * @param {Array} data The destination metadata.
33498                     * @param {Array} source The source metadata.
33499                     * @returns {Array} Returns `data`.
33500                     */
33501                    function mergeData(data, source) {
33502                        var bitmask = data[1],
33503                            srcBitmask = source[1],
33504                            newBitmask = bitmask | srcBitmask,
33505                            isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
33506
33507                        var isCombo =
33508                            ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
33509                            ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
33510                            ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
33511
33512                        // Exit early if metadata can't be merged.
33513                        if (!(isCommon || isCombo)) {
33514                            return data;
33515                        }
33516                        // Use source `thisArg` if available.
33517                        if (srcBitmask & WRAP_BIND_FLAG) {
33518                            data[2] = source[2];
33519                            // Set when currying a bound function.
33520                            newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
33521                        }
33522                        // Compose partial arguments.
33523                        var value = source[3];
33524                        if (value) {
33525                            var partials = data[3];
33526                            data[3] = partials ? composeArgs(partials, value, source[4]) : value;
33527                            data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
33528                        }
33529                        // Compose partial right arguments.
33530                        value = source[5];
33531                        if (value) {
33532                            partials = data[5];
33533                            data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
33534                            data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
33535                        }
33536                        // Use source `argPos` if available.
33537                        value = source[7];
33538                        if (value) {
33539                            data[7] = value;
33540                        }
33541                        // Use source `ary` if it's smaller.
33542                        if (srcBitmask & WRAP_ARY_FLAG) {
33543                            data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
33544                        }
33545                        // Use source `arity` if one is not provided.
33546                        if (data[9] == null) {
33547                            data[9] = source[9];
33548                        }
33549                        // Use source `func` and merge bitmasks.
33550                        data[0] = source[0];
33551                        data[1] = newBitmask;
33552
33553                        return data;
33554                    }
33555
33556                    /**
33557                     * This function is like
33558                     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
33559                     * except that it includes inherited enumerable properties.
33560                     *
33561                     * @private
33562                     * @param {Object} object The object to query.
33563                     * @returns {Array} Returns the array of property names.
33564                     */
33565                    function nativeKeysIn(object) {
33566                        var result = [];
33567                        if (object != null) {
33568                            for (var key in Object(object)) {
33569                                result.push(key);
33570                            }
33571                        }
33572                        return result;
33573                    }
33574
33575                    /**
33576                     * Converts `value` to a string using `Object.prototype.toString`.
33577                     *
33578                     * @private
33579                     * @param {*} value The value to convert.
33580                     * @returns {string} Returns the converted string.
33581                     */
33582                    function objectToString(value) {
33583                        return nativeObjectToString.call(value);
33584                    }
33585
33586                    /**
33587                     * A specialized version of `baseRest` which transforms the rest array.
33588                     *
33589                     * @private
33590                     * @param {Function} func The function to apply a rest parameter to.
33591                     * @param {number} [start=func.length-1] The start position of the rest parameter.
33592                     * @param {Function} transform The rest array transform.
33593                     * @returns {Function} Returns the new function.
33594                     */
33595                    function overRest(func, start, transform) {
33596                        start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
33597                        return function() {
33598                            var args = arguments,
33599                                index = -1,
33600                                length = nativeMax(args.length - start, 0),
33601                                array = Array(length);
33602
33603                            while (++index < length) {
33604                                array[index] = args[start + index];
33605                            }
33606                            index = -1;
33607                            var otherArgs = Array(start + 1);
33608                            while (++index < start) {
33609                                otherArgs[index] = args[index];
33610                            }
33611                            otherArgs[start] = transform(array);
33612                            return apply(func, this, otherArgs);
33613                        };
33614                    }
33615
33616                    /**
33617                     * Gets the parent value at `path` of `object`.
33618                     *
33619                     * @private
33620                     * @param {Object} object The object to query.
33621                     * @param {Array} path The path to get the parent value of.
33622                     * @returns {*} Returns the parent value.
33623                     */
33624                    function parent(object, path) {
33625                        return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
33626                    }
33627
33628                    /**
33629                     * Reorder `array` according to the specified indexes where the element at
33630                     * the first index is assigned as the first element, the element at
33631                     * the second index is assigned as the second element, and so on.
33632                     *
33633                     * @private
33634                     * @param {Array} array The array to reorder.
33635                     * @param {Array} indexes The arranged array indexes.
33636                     * @returns {Array} Returns `array`.
33637                     */
33638                    function reorder(array, indexes) {
33639                        var arrLength = array.length,
33640                            length = nativeMin(indexes.length, arrLength),
33641                            oldArray = copyArray(array);
33642
33643                        while (length--) {
33644                            var index = indexes[length];
33645                            array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
33646                        }
33647                        return array;
33648                    }
33649
33650                    /**
33651                     * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
33652                     *
33653                     * @private
33654                     * @param {Object} object The object to query.
33655                     * @param {string} key The key of the property to get.
33656                     * @returns {*} Returns the property value.
33657                     */
33658                    function safeGet(object, key) {
33659                        if (key === 'constructor' && typeof object[key] === 'function') {
33660                            return;
33661                        }
33662
33663                        if (key == '__proto__') {
33664                            return;
33665                        }
33666
33667                        return object[key];
33668                    }
33669
33670                    /**
33671                     * Sets metadata for `func`.
33672                     *
33673                     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
33674                     * period of time, it will trip its breaker and transition to an identity
33675                     * function to avoid garbage collection pauses in V8. See
33676                     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
33677                     * for more details.
33678                     *
33679                     * @private
33680                     * @param {Function} func The function to associate metadata with.
33681                     * @param {*} data The metadata.
33682                     * @returns {Function} Returns `func`.
33683                     */
33684                    var setData = shortOut(baseSetData);
33685
33686                    /**
33687                     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
33688                     *
33689                     * @private
33690                     * @param {Function} func The function to delay.
33691                     * @param {number} wait The number of milliseconds to delay invocation.
33692                     * @returns {number|Object} Returns the timer id or timeout object.
33693                     */
33694                    var setTimeout = ctxSetTimeout || function(func, wait) {
33695                        return root.setTimeout(func, wait);
33696                    };
33697
33698                    /**
33699                     * Sets the `toString` method of `func` to return `string`.
33700                     *
33701                     * @private
33702                     * @param {Function} func The function to modify.
33703                     * @param {Function} string The `toString` result.
33704                     * @returns {Function} Returns `func`.
33705                     */
33706                    var setToString = shortOut(baseSetToString);
33707
33708                    /**
33709                     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
33710                     * with wrapper details in a comment at the top of the source body.
33711                     *
33712                     * @private
33713                     * @param {Function} wrapper The function to modify.
33714                     * @param {Function} reference The reference function.
33715                     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
33716                     * @returns {Function} Returns `wrapper`.
33717                     */
33718                    function setWrapToString(wrapper, reference, bitmask) {
33719                        var source = (reference + '');
33720                        return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
33721                    }
33722
33723                    /**
33724                     * Creates a function that'll short out and invoke `identity` instead
33725                     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
33726                     * milliseconds.
33727                     *
33728                     * @private
33729                     * @param {Function} func The function to restrict.
33730                     * @returns {Function} Returns the new shortable function.
33731                     */
33732                    function shortOut(func) {
33733                        var count = 0,
33734                            lastCalled = 0;
33735
33736                        return function() {
33737                            var stamp = nativeNow(),
33738                                remaining = HOT_SPAN - (stamp - lastCalled);
33739
33740                            lastCalled = stamp;
33741                            if (remaining > 0) {
33742                                if (++count >= HOT_COUNT) {
33743                                    return arguments[0];
33744                                }
33745                            } else {
33746                                count = 0;
33747                            }
33748                            return func.apply(undefined, arguments);
33749                        };
33750                    }
33751
33752                    /**
33753                     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
33754                     *
33755                     * @private
33756                     * @param {Array} array The array to shuffle.
33757                     * @param {number} [size=array.length] The size of `array`.
33758                     * @returns {Array} Returns `array`.
33759                     */
33760                    function shuffleSelf(array, size) {
33761                        var index = -1,
33762                            length = array.length,
33763                            lastIndex = length - 1;
33764
33765                        size = size === undefined ? length : size;
33766                        while (++index < size) {
33767                            var rand = baseRandom(index, lastIndex),
33768                                value = array[rand];
33769
33770                            array[rand] = array[index];
33771                            array[index] = value;
33772                        }
33773                        array.length = size;
33774                        return array;
33775                    }
33776
33777                    /**
33778                     * Converts `string` to a property path array.
33779                     *
33780                     * @private
33781                     * @param {string} string The string to convert.
33782                     * @returns {Array} Returns the property path array.
33783                     */
33784                    var stringToPath = memoizeCapped(function(string) {
33785                        var result = [];
33786                        if (string.charCodeAt(0) === 46 /* . */) {
33787                            result.push('');
33788                        }
33789                        string.replace(rePropName, function(match, number, quote, subString) {
33790                            result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
33791                        });
33792                        return result;
33793                    });
33794
33795                    /**
33796                     * Converts `value` to a string key if it's not a string or symbol.
33797                     *
33798                     * @private
33799                     * @param {*} value The value to inspect.
33800                     * @returns {string|symbol} Returns the key.
33801                     */
33802                    function toKey(value) {
33803                        if (typeof value == 'string' || isSymbol(value)) {
33804                            return value;
33805                        }
33806                        var result = (value + '');
33807                        return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
33808                    }
33809
33810                    /**
33811                     * Converts `func` to its source code.
33812                     *
33813                     * @private
33814                     * @param {Function} func The function to convert.
33815                     * @returns {string} Returns the source code.
33816                     */
33817                    function toSource(func) {
33818                        if (func != null) {
33819                            try {
33820                                return funcToString.call(func);
33821                            } catch (e) {}
33822                            try {
33823                                return (func + '');
33824                            } catch (e) {}
33825                        }
33826                        return '';
33827                    }
33828
33829                    /**
33830                     * Updates wrapper `details` based on `bitmask` flags.
33831                     *
33832                     * @private
33833                     * @returns {Array} details The details to modify.
33834                     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
33835                     * @returns {Array} Returns `details`.
33836                     */
33837                    function updateWrapDetails(details, bitmask) {
33838                        arrayEach(wrapFlags, function(pair) {
33839                            var value = '_.' + pair[0];
33840                            if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
33841                                details.push(value);
33842                            }
33843                        });
33844                        return details.sort();
33845                    }
33846
33847                    /**
33848                     * Creates a clone of `wrapper`.
33849                     *
33850                     * @private
33851                     * @param {Object} wrapper The wrapper to clone.
33852                     * @returns {Object} Returns the cloned wrapper.
33853                     */
33854                    function wrapperClone(wrapper) {
33855                        if (wrapper instanceof LazyWrapper) {
33856                            return wrapper.clone();
33857                        }
33858                        var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
33859                        result.__actions__ = copyArray(wrapper.__actions__);
33860                        result.__index__  = wrapper.__index__;
33861                        result.__values__ = wrapper.__values__;
33862                        return result;
33863                    }
33864
33865                    /*------------------------------------------------------------------------*/
33866
33867                    /**
33868                     * Creates an array of elements split into groups the length of `size`.
33869                     * If `array` can't be split evenly, the final chunk will be the remaining
33870                     * elements.
33871                     *
33872                     * @static
33873                     * @memberOf _
33874                     * @since 3.0.0
33875                     * @category Array
33876                     * @param {Array} array The array to process.
33877                     * @param {number} [size=1] The length of each chunk
33878                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
33879                     * @returns {Array} Returns the new array of chunks.
33880                     * @example
33881                     *
33882                     * _.chunk(['a', 'b', 'c', 'd'], 2);
33883                     * // => [['a', 'b'], ['c', 'd']]
33884                     *
33885                     * _.chunk(['a', 'b', 'c', 'd'], 3);
33886                     * // => [['a', 'b', 'c'], ['d']]
33887                     */
33888                    function chunk(array, size, guard) {
33889                        if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
33890                            size = 1;
33891                        } else {
33892                            size = nativeMax(toInteger(size), 0);
33893                        }
33894                        var length = array == null ? 0 : array.length;
33895                        if (!length || size < 1) {
33896                            return [];
33897                        }
33898                        var index = 0,
33899                            resIndex = 0,
33900                            result = Array(nativeCeil(length / size));
33901
33902                        while (index < length) {
33903                            result[resIndex++] = baseSlice(array, index, (index += size));
33904                        }
33905                        return result;
33906                    }
33907
33908                    /**
33909                     * Creates an array with all falsey values removed. The values `false`, `null`,
33910                     * `0`, `""`, `undefined`, and `NaN` are falsey.
33911                     *
33912                     * @static
33913                     * @memberOf _
33914                     * @since 0.1.0
33915                     * @category Array
33916                     * @param {Array} array The array to compact.
33917                     * @returns {Array} Returns the new array of filtered values.
33918                     * @example
33919                     *
33920                     * _.compact([0, 1, false, 2, '', 3]);
33921                     * // => [1, 2, 3]
33922                     */
33923                    function compact(array) {
33924                        var index = -1,
33925                            length = array == null ? 0 : array.length,
33926                            resIndex = 0,
33927                            result = [];
33928
33929                        while (++index < length) {
33930                            var value = array[index];
33931                            if (value) {
33932                                result[resIndex++] = value;
33933                            }
33934                        }
33935                        return result;
33936                    }
33937
33938                    /**
33939                     * Creates a new array concatenating `array` with any additional arrays
33940                     * and/or values.
33941                     *
33942                     * @static
33943                     * @memberOf _
33944                     * @since 4.0.0
33945                     * @category Array
33946                     * @param {Array} array The array to concatenate.
33947                     * @param {...*} [values] The values to concatenate.
33948                     * @returns {Array} Returns the new concatenated array.
33949                     * @example
33950                     *
33951                     * var array = [1];
33952                     * var other = _.concat(array, 2, [3], [[4]]);
33953                     *
33954                     * console.log(other);
33955                     * // => [1, 2, 3, [4]]
33956                     *
33957                     * console.log(array);
33958                     * // => [1]
33959                     */
33960                    function concat() {
33961                        var length = arguments.length;
33962                        if (!length) {
33963                            return [];
33964                        }
33965                        var args = Array(length - 1),
33966                            array = arguments[0],
33967                            index = length;
33968
33969                        while (index--) {
33970                            args[index - 1] = arguments[index];
33971                        }
33972                        return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
33973                    }
33974
33975                    /**
33976                     * Creates an array of `array` values not included in the other given arrays
33977                     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
33978                     * for equality comparisons. The order and references of result values are
33979                     * determined by the first array.
33980                     *
33981                     * **Note:** Unlike `_.pullAll`, this method returns a new array.
33982                     *
33983                     * @static
33984                     * @memberOf _
33985                     * @since 0.1.0
33986                     * @category Array
33987                     * @param {Array} array The array to inspect.
33988                     * @param {...Array} [values] The values to exclude.
33989                     * @returns {Array} Returns the new array of filtered values.
33990                     * @see _.without, _.xor
33991                     * @example
33992                     *
33993                     * _.difference([2, 1], [2, 3]);
33994                     * // => [1]
33995                     */
33996                    var difference = baseRest(function(array, values) {
33997                        return isArrayLikeObject(array)
33998                            ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
33999                            : [];
34000                    });
34001
34002                    /**
34003                     * This method is like `_.difference` except that it accepts `iteratee` which
34004                     * is invoked for each element of `array` and `values` to generate the criterion
34005                     * by which they're compared. The order and references of result values are
34006                     * determined by the first array. The iteratee is invoked with one argument:
34007                     * (value).
34008                     *
34009                     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
34010                     *
34011                     * @static
34012                     * @memberOf _
34013                     * @since 4.0.0
34014                     * @category Array
34015                     * @param {Array} array The array to inspect.
34016                     * @param {...Array} [values] The values to exclude.
34017                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
34018                     * @returns {Array} Returns the new array of filtered values.
34019                     * @example
34020                     *
34021                     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
34022                     * // => [1.2]
34023                     *
34024                     * // The `_.property` iteratee shorthand.
34025                     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
34026                     * // => [{ 'x': 2 }]
34027                     */
34028                    var differenceBy = baseRest(function(array, values) {
34029                        var iteratee = last(values);
34030                        if (isArrayLikeObject(iteratee)) {
34031                            iteratee = undefined;
34032                        }
34033                        return isArrayLikeObject(array)
34034                            ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
34035                            : [];
34036                    });
34037
34038                    /**
34039                     * This method is like `_.difference` except that it accepts `comparator`
34040                     * which is invoked to compare elements of `array` to `values`. The order and
34041                     * references of result values are determined by the first array. The comparator
34042                     * is invoked with two arguments: (arrVal, othVal).
34043                     *
34044                     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
34045                     *
34046                     * @static
34047                     * @memberOf _
34048                     * @since 4.0.0
34049                     * @category Array
34050                     * @param {Array} array The array to inspect.
34051                     * @param {...Array} [values] The values to exclude.
34052                     * @param {Function} [comparator] The comparator invoked per element.
34053                     * @returns {Array} Returns the new array of filtered values.
34054                     * @example
34055                     *
34056                     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
34057                     *
34058                     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
34059                     * // => [{ 'x': 2, 'y': 1 }]
34060                     */
34061                    var differenceWith = baseRest(function(array, values) {
34062                        var comparator = last(values);
34063                        if (isArrayLikeObject(comparator)) {
34064                            comparator = undefined;
34065                        }
34066                        return isArrayLikeObject(array)
34067                            ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
34068                            : [];
34069                    });
34070
34071                    /**
34072                     * Creates a slice of `array` with `n` elements dropped from the beginning.
34073                     *
34074                     * @static
34075                     * @memberOf _
34076                     * @since 0.5.0
34077                     * @category Array
34078                     * @param {Array} array The array to query.
34079                     * @param {number} [n=1] The number of elements to drop.
34080                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
34081                     * @returns {Array} Returns the slice of `array`.
34082                     * @example
34083                     *
34084                     * _.drop([1, 2, 3]);
34085                     * // => [2, 3]
34086                     *
34087                     * _.drop([1, 2, 3], 2);
34088                     * // => [3]
34089                     *
34090                     * _.drop([1, 2, 3], 5);
34091                     * // => []
34092                     *
34093                     * _.drop([1, 2, 3], 0);
34094                     * // => [1, 2, 3]
34095                     */
34096                    function drop(array, n, guard) {
34097                        var length = array == null ? 0 : array.length;
34098                        if (!length) {
34099                            return [];
34100                        }
34101                        n = (guard || n === undefined) ? 1 : toInteger(n);
34102                        return baseSlice(array, n < 0 ? 0 : n, length);
34103                    }
34104
34105                    /**
34106                     * Creates a slice of `array` with `n` elements dropped from the end.
34107                     *
34108                     * @static
34109                     * @memberOf _
34110                     * @since 3.0.0
34111                     * @category Array
34112                     * @param {Array} array The array to query.
34113                     * @param {number} [n=1] The number of elements to drop.
34114                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
34115                     * @returns {Array} Returns the slice of `array`.
34116                     * @example
34117                     *
34118                     * _.dropRight([1, 2, 3]);
34119                     * // => [1, 2]
34120                     *
34121                     * _.dropRight([1, 2, 3], 2);
34122                     * // => [1]
34123                     *
34124                     * _.dropRight([1, 2, 3], 5);
34125                     * // => []
34126                     *
34127                     * _.dropRight([1, 2, 3], 0);
34128                     * // => [1, 2, 3]
34129                     */
34130                    function dropRight(array, n, guard) {
34131                        var length = array == null ? 0 : array.length;
34132                        if (!length) {
34133                            return [];
34134                        }
34135                        n = (guard || n === undefined) ? 1 : toInteger(n);
34136                        n = length - n;
34137                        return baseSlice(array, 0, n < 0 ? 0 : n);
34138                    }
34139
34140                    /**
34141                     * Creates a slice of `array` excluding elements dropped from the end.
34142                     * Elements are dropped until `predicate` returns falsey. The predicate is
34143                     * invoked with three arguments: (value, index, array).
34144                     *
34145                     * @static
34146                     * @memberOf _
34147                     * @since 3.0.0
34148                     * @category Array
34149                     * @param {Array} array The array to query.
34150                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
34151                     * @returns {Array} Returns the slice of `array`.
34152                     * @example
34153                     *
34154                     * var users = [
34155                     *   { 'user': 'barney',  'active': true },
34156                     *   { 'user': 'fred',    'active': false },
34157                     *   { 'user': 'pebbles', 'active': false }
34158                     * ];
34159                     *
34160                     * _.dropRightWhile(users, function(o) { return !o.active; });
34161                     * // => objects for ['barney']
34162                     *
34163                     * // The `_.matches` iteratee shorthand.
34164                     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
34165                     * // => objects for ['barney', 'fred']
34166                     *
34167                     * // The `_.matchesProperty` iteratee shorthand.
34168                     * _.dropRightWhile(users, ['active', false]);
34169                     * // => objects for ['barney']
34170                     *
34171                     * // The `_.property` iteratee shorthand.
34172                     * _.dropRightWhile(users, 'active');
34173                     * // => objects for ['barney', 'fred', 'pebbles']
34174                     */
34175                    function dropRightWhile(array, predicate) {
34176                        return (array && array.length)
34177                            ? baseWhile(array, getIteratee(predicate, 3), true, true)
34178                            : [];
34179                    }
34180
34181                    /**
34182                     * Creates a slice of `array` excluding elements dropped from the beginning.
34183                     * Elements are dropped until `predicate` returns falsey. The predicate is
34184                     * invoked with three arguments: (value, index, array).
34185                     *
34186                     * @static
34187                     * @memberOf _
34188                     * @since 3.0.0
34189                     * @category Array
34190                     * @param {Array} array The array to query.
34191                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
34192                     * @returns {Array} Returns the slice of `array`.
34193                     * @example
34194                     *
34195                     * var users = [
34196                     *   { 'user': 'barney',  'active': false },
34197                     *   { 'user': 'fred',    'active': false },
34198                     *   { 'user': 'pebbles', 'active': true }
34199                     * ];
34200                     *
34201                     * _.dropWhile(users, function(o) { return !o.active; });
34202                     * // => objects for ['pebbles']
34203                     *
34204                     * // The `_.matches` iteratee shorthand.
34205                     * _.dropWhile(users, { 'user': 'barney', 'active': false });
34206                     * // => objects for ['fred', 'pebbles']
34207                     *
34208                     * // The `_.matchesProperty` iteratee shorthand.
34209                     * _.dropWhile(users, ['active', false]);
34210                     * // => objects for ['pebbles']
34211                     *
34212                     * // The `_.property` iteratee shorthand.
34213                     * _.dropWhile(users, 'active');
34214                     * // => objects for ['barney', 'fred', 'pebbles']
34215                     */
34216                    function dropWhile(array, predicate) {
34217                        return (array && array.length)
34218                            ? baseWhile(array, getIteratee(predicate, 3), true)
34219                            : [];
34220                    }
34221
34222                    /**
34223                     * Fills elements of `array` with `value` from `start` up to, but not
34224                     * including, `end`.
34225                     *
34226                     * **Note:** This method mutates `array`.
34227                     *
34228                     * @static
34229                     * @memberOf _
34230                     * @since 3.2.0
34231                     * @category Array
34232                     * @param {Array} array The array to fill.
34233                     * @param {*} value The value to fill `array` with.
34234                     * @param {number} [start=0] The start position.
34235                     * @param {number} [end=array.length] The end position.
34236                     * @returns {Array} Returns `array`.
34237                     * @example
34238                     *
34239                     * var array = [1, 2, 3];
34240                     *
34241                     * _.fill(array, 'a');
34242                     * console.log(array);
34243                     * // => ['a', 'a', 'a']
34244                     *
34245                     * _.fill(Array(3), 2);
34246                     * // => [2, 2, 2]
34247                     *
34248                     * _.fill([4, 6, 8, 10], '*', 1, 3);
34249                     * // => [4, '*', '*', 10]
34250                     */
34251                    function fill(array, value, start, end) {
34252                        var length = array == null ? 0 : array.length;
34253                        if (!length) {
34254                            return [];
34255                        }
34256                        if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
34257                            start = 0;
34258                            end = length;
34259                        }
34260                        return baseFill(array, value, start, end);
34261                    }
34262
34263                    /**
34264                     * This method is like `_.find` except that it returns the index of the first
34265                     * element `predicate` returns truthy for instead of the element itself.
34266                     *
34267                     * @static
34268                     * @memberOf _
34269                     * @since 1.1.0
34270                     * @category Array
34271                     * @param {Array} array The array to inspect.
34272                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
34273                     * @param {number} [fromIndex=0] The index to search from.
34274                     * @returns {number} Returns the index of the found element, else `-1`.
34275                     * @example
34276                     *
34277                     * var users = [
34278                     *   { 'user': 'barney',  'active': false },
34279                     *   { 'user': 'fred',    'active': false },
34280                     *   { 'user': 'pebbles', 'active': true }
34281                     * ];
34282                     *
34283                     * _.findIndex(users, function(o) { return o.user == 'barney'; });
34284                     * // => 0
34285                     *
34286                     * // The `_.matches` iteratee shorthand.
34287                     * _.findIndex(users, { 'user': 'fred', 'active': false });
34288                     * // => 1
34289                     *
34290                     * // The `_.matchesProperty` iteratee shorthand.
34291                     * _.findIndex(users, ['active', false]);
34292                     * // => 0
34293                     *
34294                     * // The `_.property` iteratee shorthand.
34295                     * _.findIndex(users, 'active');
34296                     * // => 2
34297                     */
34298                    function findIndex(array, predicate, fromIndex) {
34299                        var length = array == null ? 0 : array.length;
34300                        if (!length) {
34301                            return -1;
34302                        }
34303                        var index = fromIndex == null ? 0 : toInteger(fromIndex);
34304                        if (index < 0) {
34305                            index = nativeMax(length + index, 0);
34306                        }
34307                        return baseFindIndex(array, getIteratee(predicate, 3), index);
34308                    }
34309
34310                    /**
34311                     * This method is like `_.findIndex` except that it iterates over elements
34312                     * of `collection` from right to left.
34313                     *
34314                     * @static
34315                     * @memberOf _
34316                     * @since 2.0.0
34317                     * @category Array
34318                     * @param {Array} array The array to inspect.
34319                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
34320                     * @param {number} [fromIndex=array.length-1] The index to search from.
34321                     * @returns {number} Returns the index of the found element, else `-1`.
34322                     * @example
34323                     *
34324                     * var users = [
34325                     *   { 'user': 'barney',  'active': true },
34326                     *   { 'user': 'fred',    'active': false },
34327                     *   { 'user': 'pebbles', 'active': false }
34328                     * ];
34329                     *
34330                     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
34331                     * // => 2
34332                     *
34333                     * // The `_.matches` iteratee shorthand.
34334                     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
34335                     * // => 0
34336                     *
34337                     * // The `_.matchesProperty` iteratee shorthand.
34338                     * _.findLastIndex(users, ['active', false]);
34339                     * // => 2
34340                     *
34341                     * // The `_.property` iteratee shorthand.
34342                     * _.findLastIndex(users, 'active');
34343                     * // => 0
34344                     */
34345                    function findLastIndex(array, predicate, fromIndex) {
34346                        var length = array == null ? 0 : array.length;
34347                        if (!length) {
34348                            return -1;
34349                        }
34350                        var index = length - 1;
34351                        if (fromIndex !== undefined) {
34352                            index = toInteger(fromIndex);
34353                            index = fromIndex < 0
34354                                ? nativeMax(length + index, 0)
34355                                : nativeMin(index, length - 1);
34356                        }
34357                        return baseFindIndex(array, getIteratee(predicate, 3), index, true);
34358                    }
34359
34360                    /**
34361                     * Flattens `array` a single level deep.
34362                     *
34363                     * @static
34364                     * @memberOf _
34365                     * @since 0.1.0
34366                     * @category Array
34367                     * @param {Array} array The array to flatten.
34368                     * @returns {Array} Returns the new flattened array.
34369                     * @example
34370                     *
34371                     * _.flatten([1, [2, [3, [4]], 5]]);
34372                     * // => [1, 2, [3, [4]], 5]
34373                     */
34374                    function flatten(array) {
34375                        var length = array == null ? 0 : array.length;
34376                        return length ? baseFlatten(array, 1) : [];
34377                    }
34378
34379                    /**
34380                     * Recursively flattens `array`.
34381                     *
34382                     * @static
34383                     * @memberOf _
34384                     * @since 3.0.0
34385                     * @category Array
34386                     * @param {Array} array The array to flatten.
34387                     * @returns {Array} Returns the new flattened array.
34388                     * @example
34389                     *
34390                     * _.flattenDeep([1, [2, [3, [4]], 5]]);
34391                     * // => [1, 2, 3, 4, 5]
34392                     */
34393                    function flattenDeep(array) {
34394                        var length = array == null ? 0 : array.length;
34395                        return length ? baseFlatten(array, INFINITY) : [];
34396                    }
34397
34398                    /**
34399                     * Recursively flatten `array` up to `depth` times.
34400                     *
34401                     * @static
34402                     * @memberOf _
34403                     * @since 4.4.0
34404                     * @category Array
34405                     * @param {Array} array The array to flatten.
34406                     * @param {number} [depth=1] The maximum recursion depth.
34407                     * @returns {Array} Returns the new flattened array.
34408                     * @example
34409                     *
34410                     * var array = [1, [2, [3, [4]], 5]];
34411                     *
34412                     * _.flattenDepth(array, 1);
34413                     * // => [1, 2, [3, [4]], 5]
34414                     *
34415                     * _.flattenDepth(array, 2);
34416                     * // => [1, 2, 3, [4], 5]
34417                     */
34418                    function flattenDepth(array, depth) {
34419                        var length = array == null ? 0 : array.length;
34420                        if (!length) {
34421                            return [];
34422                        }
34423                        depth = depth === undefined ? 1 : toInteger(depth);
34424                        return baseFlatten(array, depth);
34425                    }
34426
34427                    /**
34428                     * The inverse of `_.toPairs`; this method returns an object composed
34429                     * from key-value `pairs`.
34430                     *
34431                     * @static
34432                     * @memberOf _
34433                     * @since 4.0.0
34434                     * @category Array
34435                     * @param {Array} pairs The key-value pairs.
34436                     * @returns {Object} Returns the new object.
34437                     * @example
34438                     *
34439                     * _.fromPairs([['a', 1], ['b', 2]]);
34440                     * // => { 'a': 1, 'b': 2 }
34441                     */
34442                    function fromPairs(pairs) {
34443                        var index = -1,
34444                            length = pairs == null ? 0 : pairs.length,
34445                            result = {};
34446
34447                        while (++index < length) {
34448                            var pair = pairs[index];
34449                            result[pair[0]] = pair[1];
34450                        }
34451                        return result;
34452                    }
34453
34454                    /**
34455                     * Gets the first element of `array`.
34456                     *
34457                     * @static
34458                     * @memberOf _
34459                     * @since 0.1.0
34460                     * @alias first
34461                     * @category Array
34462                     * @param {Array} array The array to query.
34463                     * @returns {*} Returns the first element of `array`.
34464                     * @example
34465                     *
34466                     * _.head([1, 2, 3]);
34467                     * // => 1
34468                     *
34469                     * _.head([]);
34470                     * // => undefined
34471                     */
34472                    function head(array) {
34473                        return (array && array.length) ? array[0] : undefined;
34474                    }
34475
34476                    /**
34477                     * Gets the index at which the first occurrence of `value` is found in `array`
34478                     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
34479                     * for equality comparisons. If `fromIndex` is negative, it's used as the
34480                     * offset from the end of `array`.
34481                     *
34482                     * @static
34483                     * @memberOf _
34484                     * @since 0.1.0
34485                     * @category Array
34486                     * @param {Array} array The array to inspect.
34487                     * @param {*} value The value to search for.
34488                     * @param {number} [fromIndex=0] The index to search from.
34489                     * @returns {number} Returns the index of the matched value, else `-1`.
34490                     * @example
34491                     *
34492                     * _.indexOf([1, 2, 1, 2], 2);
34493                     * // => 1
34494                     *
34495                     * // Search from the `fromIndex`.
34496                     * _.indexOf([1, 2, 1, 2], 2, 2);
34497                     * // => 3
34498                     */
34499                    function indexOf(array, value, fromIndex) {
34500                        var length = array == null ? 0 : array.length;
34501                        if (!length) {
34502                            return -1;
34503                        }
34504                        var index = fromIndex == null ? 0 : toInteger(fromIndex);
34505                        if (index < 0) {
34506                            index = nativeMax(length + index, 0);
34507                        }
34508                        return baseIndexOf(array, value, index);
34509                    }
34510
34511                    /**
34512                     * Gets all but the last element of `array`.
34513                     *
34514                     * @static
34515                     * @memberOf _
34516                     * @since 0.1.0
34517                     * @category Array
34518                     * @param {Array} array The array to query.
34519                     * @returns {Array} Returns the slice of `array`.
34520                     * @example
34521                     *
34522                     * _.initial([1, 2, 3]);
34523                     * // => [1, 2]
34524                     */
34525                    function initial(array) {
34526                        var length = array == null ? 0 : array.length;
34527                        return length ? baseSlice(array, 0, -1) : [];
34528                    }
34529
34530                    /**
34531                     * Creates an array of unique values that are included in all given arrays
34532                     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
34533                     * for equality comparisons. The order and references of result values are
34534                     * determined by the first array.
34535                     *
34536                     * @static
34537                     * @memberOf _
34538                     * @since 0.1.0
34539                     * @category Array
34540                     * @param {...Array} [arrays] The arrays to inspect.
34541                     * @returns {Array} Returns the new array of intersecting values.
34542                     * @example
34543                     *
34544                     * _.intersection([2, 1], [2, 3]);
34545                     * // => [2]
34546                     */
34547                    var intersection = baseRest(function(arrays) {
34548                        var mapped = arrayMap(arrays, castArrayLikeObject);
34549                        return (mapped.length && mapped[0] === arrays[0])
34550                            ? baseIntersection(mapped)
34551                            : [];
34552                    });
34553
34554                    /**
34555                     * This method is like `_.intersection` except that it accepts `iteratee`
34556                     * which is invoked for each element of each `arrays` to generate the criterion
34557                     * by which they're compared. The order and references of result values are
34558                     * determined by the first array. The iteratee is invoked with one argument:
34559                     * (value).
34560                     *
34561                     * @static
34562                     * @memberOf _
34563                     * @since 4.0.0
34564                     * @category Array
34565                     * @param {...Array} [arrays] The arrays to inspect.
34566                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
34567                     * @returns {Array} Returns the new array of intersecting values.
34568                     * @example
34569                     *
34570                     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
34571                     * // => [2.1]
34572                     *
34573                     * // The `_.property` iteratee shorthand.
34574                     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
34575                     * // => [{ 'x': 1 }]
34576                     */
34577                    var intersectionBy = baseRest(function(arrays) {
34578                        var iteratee = last(arrays),
34579                            mapped = arrayMap(arrays, castArrayLikeObject);
34580
34581                        if (iteratee === last(mapped)) {
34582                            iteratee = undefined;
34583                        } else {
34584                            mapped.pop();
34585                        }
34586                        return (mapped.length && mapped[0] === arrays[0])
34587                            ? baseIntersection(mapped, getIteratee(iteratee, 2))
34588                            : [];
34589                    });
34590
34591                    /**
34592                     * This method is like `_.intersection` except that it accepts `comparator`
34593                     * which is invoked to compare elements of `arrays`. The order and references
34594                     * of result values are determined by the first array. The comparator is
34595                     * invoked with two arguments: (arrVal, othVal).
34596                     *
34597                     * @static
34598                     * @memberOf _
34599                     * @since 4.0.0
34600                     * @category Array
34601                     * @param {...Array} [arrays] The arrays to inspect.
34602                     * @param {Function} [comparator] The comparator invoked per element.
34603                     * @returns {Array} Returns the new array of intersecting values.
34604                     * @example
34605                     *
34606                     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
34607                     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
34608                     *
34609                     * _.intersectionWith(objects, others, _.isEqual);
34610                     * // => [{ 'x': 1, 'y': 2 }]
34611                     */
34612                    var intersectionWith = baseRest(function(arrays) {
34613                        var comparator = last(arrays),
34614                            mapped = arrayMap(arrays, castArrayLikeObject);
34615
34616                        comparator = typeof comparator == 'function' ? comparator : undefined;
34617                        if (comparator) {
34618                            mapped.pop();
34619                        }
34620                        return (mapped.length && mapped[0] === arrays[0])
34621                            ? baseIntersection(mapped, undefined, comparator)
34622                            : [];
34623                    });
34624
34625                    /**
34626                     * Converts all elements in `array` into a string separated by `separator`.
34627                     *
34628                     * @static
34629                     * @memberOf _
34630                     * @since 4.0.0
34631                     * @category Array
34632                     * @param {Array} array The array to convert.
34633                     * @param {string} [separator=','] The element separator.
34634                     * @returns {string} Returns the joined string.
34635                     * @example
34636                     *
34637                     * _.join(['a', 'b', 'c'], '~');
34638                     * // => 'a~b~c'
34639                     */
34640                    function join(array, separator) {
34641                        return array == null ? '' : nativeJoin.call(array, separator);
34642                    }
34643
34644                    /**
34645                     * Gets the last element of `array`.
34646                     *
34647                     * @static
34648                     * @memberOf _
34649                     * @since 0.1.0
34650                     * @category Array
34651                     * @param {Array} array The array to query.
34652                     * @returns {*} Returns the last element of `array`.
34653                     * @example
34654                     *
34655                     * _.last([1, 2, 3]);
34656                     * // => 3
34657                     */
34658                    function last(array) {
34659                        var length = array == null ? 0 : array.length;
34660                        return length ? array[length - 1] : undefined;
34661                    }
34662
34663                    /**
34664                     * This method is like `_.indexOf` except that it iterates over elements of
34665                     * `array` from right to left.
34666                     *
34667                     * @static
34668                     * @memberOf _
34669                     * @since 0.1.0
34670                     * @category Array
34671                     * @param {Array} array The array to inspect.
34672                     * @param {*} value The value to search for.
34673                     * @param {number} [fromIndex=array.length-1] The index to search from.
34674                     * @returns {number} Returns the index of the matched value, else `-1`.
34675                     * @example
34676                     *
34677                     * _.lastIndexOf([1, 2, 1, 2], 2);
34678                     * // => 3
34679                     *
34680                     * // Search from the `fromIndex`.
34681                     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
34682                     * // => 1
34683                     */
34684                    function lastIndexOf(array, value, fromIndex) {
34685                        var length = array == null ? 0 : array.length;
34686                        if (!length) {
34687                            return -1;
34688                        }
34689                        var index = length;
34690                        if (fromIndex !== undefined) {
34691                            index = toInteger(fromIndex);
34692                            index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
34693                        }
34694                        return value === value
34695                            ? strictLastIndexOf(array, value, index)
34696                            : baseFindIndex(array, baseIsNaN, index, true);
34697                    }
34698
34699                    /**
34700                     * Gets the element at index `n` of `array`. If `n` is negative, the nth
34701                     * element from the end is returned.
34702                     *
34703                     * @static
34704                     * @memberOf _
34705                     * @since 4.11.0
34706                     * @category Array
34707                     * @param {Array} array The array to query.
34708                     * @param {number} [n=0] The index of the element to return.
34709                     * @returns {*} Returns the nth element of `array`.
34710                     * @example
34711                     *
34712                     * var array = ['a', 'b', 'c', 'd'];
34713                     *
34714                     * _.nth(array, 1);
34715                     * // => 'b'
34716                     *
34717                     * _.nth(array, -2);
34718                     * // => 'c';
34719                     */
34720                    function nth(array, n) {
34721                        return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
34722                    }
34723
34724                    /**
34725                     * Removes all given values from `array` using
34726                     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
34727                     * for equality comparisons.
34728                     *
34729                     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
34730                     * to remove elements from an array by predicate.
34731                     *
34732                     * @static
34733                     * @memberOf _
34734                     * @since 2.0.0
34735                     * @category Array
34736                     * @param {Array} array The array to modify.
34737                     * @param {...*} [values] The values to remove.
34738                     * @returns {Array} Returns `array`.
34739                     * @example
34740                     *
34741                     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
34742                     *
34743                     * _.pull(array, 'a', 'c');
34744                     * console.log(array);
34745                     * // => ['b', 'b']
34746                     */
34747                    var pull = baseRest(pullAll);
34748
34749                    /**
34750                     * This method is like `_.pull` except that it accepts an array of values to remove.
34751                     *
34752                     * **Note:** Unlike `_.difference`, this method mutates `array`.
34753                     *
34754                     * @static
34755                     * @memberOf _
34756                     * @since 4.0.0
34757                     * @category Array
34758                     * @param {Array} array The array to modify.
34759                     * @param {Array} values The values to remove.
34760                     * @returns {Array} Returns `array`.
34761                     * @example
34762                     *
34763                     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
34764                     *
34765                     * _.pullAll(array, ['a', 'c']);
34766                     * console.log(array);
34767                     * // => ['b', 'b']
34768                     */
34769                    function pullAll(array, values) {
34770                        return (array && array.length && values && values.length)
34771                            ? basePullAll(array, values)
34772                            : array;
34773                    }
34774
34775                    /**
34776                     * This method is like `_.pullAll` except that it accepts `iteratee` which is
34777                     * invoked for each element of `array` and `values` to generate the criterion
34778                     * by which they're compared. The iteratee is invoked with one argument: (value).
34779                     *
34780                     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
34781                     *
34782                     * @static
34783                     * @memberOf _
34784                     * @since 4.0.0
34785                     * @category Array
34786                     * @param {Array} array The array to modify.
34787                     * @param {Array} values The values to remove.
34788                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
34789                     * @returns {Array} Returns `array`.
34790                     * @example
34791                     *
34792                     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
34793                     *
34794                     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
34795                     * console.log(array);
34796                     * // => [{ 'x': 2 }]
34797                     */
34798                    function pullAllBy(array, values, iteratee) {
34799                        return (array && array.length && values && values.length)
34800                            ? basePullAll(array, values, getIteratee(iteratee, 2))
34801                            : array;
34802                    }
34803
34804                    /**
34805                     * This method is like `_.pullAll` except that it accepts `comparator` which
34806                     * is invoked to compare elements of `array` to `values`. The comparator is
34807                     * invoked with two arguments: (arrVal, othVal).
34808                     *
34809                     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
34810                     *
34811                     * @static
34812                     * @memberOf _
34813                     * @since 4.6.0
34814                     * @category Array
34815                     * @param {Array} array The array to modify.
34816                     * @param {Array} values The values to remove.
34817                     * @param {Function} [comparator] The comparator invoked per element.
34818                     * @returns {Array} Returns `array`.
34819                     * @example
34820                     *
34821                     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
34822                     *
34823                     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
34824                     * console.log(array);
34825                     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
34826                     */
34827                    function pullAllWith(array, values, comparator) {
34828                        return (array && array.length && values && values.length)
34829                            ? basePullAll(array, values, undefined, comparator)
34830                            : array;
34831                    }
34832
34833                    /**
34834                     * Removes elements from `array` corresponding to `indexes` and returns an
34835                     * array of removed elements.
34836                     *
34837                     * **Note:** Unlike `_.at`, this method mutates `array`.
34838                     *
34839                     * @static
34840                     * @memberOf _
34841                     * @since 3.0.0
34842                     * @category Array
34843                     * @param {Array} array The array to modify.
34844                     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
34845                     * @returns {Array} Returns the new array of removed elements.
34846                     * @example
34847                     *
34848                     * var array = ['a', 'b', 'c', 'd'];
34849                     * var pulled = _.pullAt(array, [1, 3]);
34850                     *
34851                     * console.log(array);
34852                     * // => ['a', 'c']
34853                     *
34854                     * console.log(pulled);
34855                     * // => ['b', 'd']
34856                     */
34857                    var pullAt = flatRest(function(array, indexes) {
34858                        var length = array == null ? 0 : array.length,
34859                            result = baseAt(array, indexes);
34860
34861                        basePullAt(array, arrayMap(indexes, function(index) {
34862                            return isIndex(index, length) ? +index : index;
34863                        }).sort(compareAscending));
34864
34865                        return result;
34866                    });
34867
34868                    /**
34869                     * Removes all elements from `array` that `predicate` returns truthy for
34870                     * and returns an array of the removed elements. The predicate is invoked
34871                     * with three arguments: (value, index, array).
34872                     *
34873                     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
34874                     * to pull elements from an array by value.
34875                     *
34876                     * @static
34877                     * @memberOf _
34878                     * @since 2.0.0
34879                     * @category Array
34880                     * @param {Array} array The array to modify.
34881                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
34882                     * @returns {Array} Returns the new array of removed elements.
34883                     * @example
34884                     *
34885                     * var array = [1, 2, 3, 4];
34886                     * var evens = _.remove(array, function(n) {
34887                     *   return n % 2 == 0;
34888                     * });
34889                     *
34890                     * console.log(array);
34891                     * // => [1, 3]
34892                     *
34893                     * console.log(evens);
34894                     * // => [2, 4]
34895                     */
34896                    function remove(array, predicate) {
34897                        var result = [];
34898                        if (!(array && array.length)) {
34899                            return result;
34900                        }
34901                        var index = -1,
34902                            indexes = [],
34903                            length = array.length;
34904
34905                        predicate = getIteratee(predicate, 3);
34906                        while (++index < length) {
34907                            var value = array[index];
34908                            if (predicate(value, index, array)) {
34909                                result.push(value);
34910                                indexes.push(index);
34911                            }
34912                        }
34913                        basePullAt(array, indexes);
34914                        return result;
34915                    }
34916
34917                    /**
34918                     * Reverses `array` so that the first element becomes the last, the second
34919                     * element becomes the second to last, and so on.
34920                     *
34921                     * **Note:** This method mutates `array` and is based on
34922                     * [`Array#reverse`](https://mdn.io/Array/reverse).
34923                     *
34924                     * @static
34925                     * @memberOf _
34926                     * @since 4.0.0
34927                     * @category Array
34928                     * @param {Array} array The array to modify.
34929                     * @returns {Array} Returns `array`.
34930                     * @example
34931                     *
34932                     * var array = [1, 2, 3];
34933                     *
34934                     * _.reverse(array);
34935                     * // => [3, 2, 1]
34936                     *
34937                     * console.log(array);
34938                     * // => [3, 2, 1]
34939                     */
34940                    function reverse(array) {
34941                        return array == null ? array : nativeReverse.call(array);
34942                    }
34943
34944                    /**
34945                     * Creates a slice of `array` from `start` up to, but not including, `end`.
34946                     *
34947                     * **Note:** This method is used instead of
34948                     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
34949                     * returned.
34950                     *
34951                     * @static
34952                     * @memberOf _
34953                     * @since 3.0.0
34954                     * @category Array
34955                     * @param {Array} array The array to slice.
34956                     * @param {number} [start=0] The start position.
34957                     * @param {number} [end=array.length] The end position.
34958                     * @returns {Array} Returns the slice of `array`.
34959                     */
34960                    function slice(array, start, end) {
34961                        var length = array == null ? 0 : array.length;
34962                        if (!length) {
34963                            return [];
34964                        }
34965                        if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
34966                            start = 0;
34967                            end = length;
34968                        }
34969                        else {
34970                            start = start == null ? 0 : toInteger(start);
34971                            end = end === undefined ? length : toInteger(end);
34972                        }
34973                        return baseSlice(array, start, end);
34974                    }
34975
34976                    /**
34977                     * Uses a binary search to determine the lowest index at which `value`
34978                     * should be inserted into `array` in order to maintain its sort order.
34979                     *
34980                     * @static
34981                     * @memberOf _
34982                     * @since 0.1.0
34983                     * @category Array
34984                     * @param {Array} array The sorted array to inspect.
34985                     * @param {*} value The value to evaluate.
34986                     * @returns {number} Returns the index at which `value` should be inserted
34987                     *  into `array`.
34988                     * @example
34989                     *
34990                     * _.sortedIndex([30, 50], 40);
34991                     * // => 1
34992                     */
34993                    function sortedIndex(array, value) {
34994                        return baseSortedIndex(array, value);
34995                    }
34996
34997                    /**
34998                     * This method is like `_.sortedIndex` except that it accepts `iteratee`
34999                     * which is invoked for `value` and each element of `array` to compute their
35000                     * sort ranking. The iteratee is invoked with one argument: (value).
35001                     *
35002                     * @static
35003                     * @memberOf _
35004                     * @since 4.0.0
35005                     * @category Array
35006                     * @param {Array} array The sorted array to inspect.
35007                     * @param {*} value The value to evaluate.
35008                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
35009                     * @returns {number} Returns the index at which `value` should be inserted
35010                     *  into `array`.
35011                     * @example
35012                     *
35013                     * var objects = [{ 'x': 4 }, { 'x': 5 }];
35014                     *
35015                     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
35016                     * // => 0
35017                     *
35018                     * // The `_.property` iteratee shorthand.
35019                     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
35020                     * // => 0
35021                     */
35022                    function sortedIndexBy(array, value, iteratee) {
35023                        return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
35024                    }
35025
35026                    /**
35027                     * This method is like `_.indexOf` except that it performs a binary
35028                     * search on a sorted `array`.
35029                     *
35030                     * @static
35031                     * @memberOf _
35032                     * @since 4.0.0
35033                     * @category Array
35034                     * @param {Array} array The array to inspect.
35035                     * @param {*} value The value to search for.
35036                     * @returns {number} Returns the index of the matched value, else `-1`.
35037                     * @example
35038                     *
35039                     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
35040                     * // => 1
35041                     */
35042                    function sortedIndexOf(array, value) {
35043                        var length = array == null ? 0 : array.length;
35044                        if (length) {
35045                            var index = baseSortedIndex(array, value);
35046                            if (index < length && eq(array[index], value)) {
35047                                return index;
35048                            }
35049                        }
35050                        return -1;
35051                    }
35052
35053                    /**
35054                     * This method is like `_.sortedIndex` except that it returns the highest
35055                     * index at which `value` should be inserted into `array` in order to
35056                     * maintain its sort order.
35057                     *
35058                     * @static
35059                     * @memberOf _
35060                     * @since 3.0.0
35061                     * @category Array
35062                     * @param {Array} array The sorted array to inspect.
35063                     * @param {*} value The value to evaluate.
35064                     * @returns {number} Returns the index at which `value` should be inserted
35065                     *  into `array`.
35066                     * @example
35067                     *
35068                     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
35069                     * // => 4
35070                     */
35071                    function sortedLastIndex(array, value) {
35072                        return baseSortedIndex(array, value, true);
35073                    }
35074
35075                    /**
35076                     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
35077                     * which is invoked for `value` and each element of `array` to compute their
35078                     * sort ranking. The iteratee is invoked with one argument: (value).
35079                     *
35080                     * @static
35081                     * @memberOf _
35082                     * @since 4.0.0
35083                     * @category Array
35084                     * @param {Array} array The sorted array to inspect.
35085                     * @param {*} value The value to evaluate.
35086                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
35087                     * @returns {number} Returns the index at which `value` should be inserted
35088                     *  into `array`.
35089                     * @example
35090                     *
35091                     * var objects = [{ 'x': 4 }, { 'x': 5 }];
35092                     *
35093                     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
35094                     * // => 1
35095                     *
35096                     * // The `_.property` iteratee shorthand.
35097                     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
35098                     * // => 1
35099                     */
35100                    function sortedLastIndexBy(array, value, iteratee) {
35101                        return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
35102                    }
35103
35104                    /**
35105                     * This method is like `_.lastIndexOf` except that it performs a binary
35106                     * search on a sorted `array`.
35107                     *
35108                     * @static
35109                     * @memberOf _
35110                     * @since 4.0.0
35111                     * @category Array
35112                     * @param {Array} array The array to inspect.
35113                     * @param {*} value The value to search for.
35114                     * @returns {number} Returns the index of the matched value, else `-1`.
35115                     * @example
35116                     *
35117                     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
35118                     * // => 3
35119                     */
35120                    function sortedLastIndexOf(array, value) {
35121                        var length = array == null ? 0 : array.length;
35122                        if (length) {
35123                            var index = baseSortedIndex(array, value, true) - 1;
35124                            if (eq(array[index], value)) {
35125                                return index;
35126                            }
35127                        }
35128                        return -1;
35129                    }
35130
35131                    /**
35132                     * This method is like `_.uniq` except that it's designed and optimized
35133                     * for sorted arrays.
35134                     *
35135                     * @static
35136                     * @memberOf _
35137                     * @since 4.0.0
35138                     * @category Array
35139                     * @param {Array} array The array to inspect.
35140                     * @returns {Array} Returns the new duplicate free array.
35141                     * @example
35142                     *
35143                     * _.sortedUniq([1, 1, 2]);
35144                     * // => [1, 2]
35145                     */
35146                    function sortedUniq(array) {
35147                        return (array && array.length)
35148                            ? baseSortedUniq(array)
35149                            : [];
35150                    }
35151
35152                    /**
35153                     * This method is like `_.uniqBy` except that it's designed and optimized
35154                     * for sorted arrays.
35155                     *
35156                     * @static
35157                     * @memberOf _
35158                     * @since 4.0.0
35159                     * @category Array
35160                     * @param {Array} array The array to inspect.
35161                     * @param {Function} [iteratee] The iteratee invoked per element.
35162                     * @returns {Array} Returns the new duplicate free array.
35163                     * @example
35164                     *
35165                     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
35166                     * // => [1.1, 2.3]
35167                     */
35168                    function sortedUniqBy(array, iteratee) {
35169                        return (array && array.length)
35170                            ? baseSortedUniq(array, getIteratee(iteratee, 2))
35171                            : [];
35172                    }
35173
35174                    /**
35175                     * Gets all but the first element of `array`.
35176                     *
35177                     * @static
35178                     * @memberOf _
35179                     * @since 4.0.0
35180                     * @category Array
35181                     * @param {Array} array The array to query.
35182                     * @returns {Array} Returns the slice of `array`.
35183                     * @example
35184                     *
35185                     * _.tail([1, 2, 3]);
35186                     * // => [2, 3]
35187                     */
35188                    function tail(array) {
35189                        var length = array == null ? 0 : array.length;
35190                        return length ? baseSlice(array, 1, length) : [];
35191                    }
35192
35193                    /**
35194                     * Creates a slice of `array` with `n` elements taken from the beginning.
35195                     *
35196                     * @static
35197                     * @memberOf _
35198                     * @since 0.1.0
35199                     * @category Array
35200                     * @param {Array} array The array to query.
35201                     * @param {number} [n=1] The number of elements to take.
35202                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
35203                     * @returns {Array} Returns the slice of `array`.
35204                     * @example
35205                     *
35206                     * _.take([1, 2, 3]);
35207                     * // => [1]
35208                     *
35209                     * _.take([1, 2, 3], 2);
35210                     * // => [1, 2]
35211                     *
35212                     * _.take([1, 2, 3], 5);
35213                     * // => [1, 2, 3]
35214                     *
35215                     * _.take([1, 2, 3], 0);
35216                     * // => []
35217                     */
35218                    function take(array, n, guard) {
35219                        if (!(array && array.length)) {
35220                            return [];
35221                        }
35222                        n = (guard || n === undefined) ? 1 : toInteger(n);
35223                        return baseSlice(array, 0, n < 0 ? 0 : n);
35224                    }
35225
35226                    /**
35227                     * Creates a slice of `array` with `n` elements taken from the end.
35228                     *
35229                     * @static
35230                     * @memberOf _
35231                     * @since 3.0.0
35232                     * @category Array
35233                     * @param {Array} array The array to query.
35234                     * @param {number} [n=1] The number of elements to take.
35235                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
35236                     * @returns {Array} Returns the slice of `array`.
35237                     * @example
35238                     *
35239                     * _.takeRight([1, 2, 3]);
35240                     * // => [3]
35241                     *
35242                     * _.takeRight([1, 2, 3], 2);
35243                     * // => [2, 3]
35244                     *
35245                     * _.takeRight([1, 2, 3], 5);
35246                     * // => [1, 2, 3]
35247                     *
35248                     * _.takeRight([1, 2, 3], 0);
35249                     * // => []
35250                     */
35251                    function takeRight(array, n, guard) {
35252                        var length = array == null ? 0 : array.length;
35253                        if (!length) {
35254                            return [];
35255                        }
35256                        n = (guard || n === undefined) ? 1 : toInteger(n);
35257                        n = length - n;
35258                        return baseSlice(array, n < 0 ? 0 : n, length);
35259                    }
35260
35261                    /**
35262                     * Creates a slice of `array` with elements taken from the end. Elements are
35263                     * taken until `predicate` returns falsey. The predicate is invoked with
35264                     * three arguments: (value, index, array).
35265                     *
35266                     * @static
35267                     * @memberOf _
35268                     * @since 3.0.0
35269                     * @category Array
35270                     * @param {Array} array The array to query.
35271                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
35272                     * @returns {Array} Returns the slice of `array`.
35273                     * @example
35274                     *
35275                     * var users = [
35276                     *   { 'user': 'barney',  'active': true },
35277                     *   { 'user': 'fred',    'active': false },
35278                     *   { 'user': 'pebbles', 'active': false }
35279                     * ];
35280                     *
35281                     * _.takeRightWhile(users, function(o) { return !o.active; });
35282                     * // => objects for ['fred', 'pebbles']
35283                     *
35284                     * // The `_.matches` iteratee shorthand.
35285                     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
35286                     * // => objects for ['pebbles']
35287                     *
35288                     * // The `_.matchesProperty` iteratee shorthand.
35289                     * _.takeRightWhile(users, ['active', false]);
35290                     * // => objects for ['fred', 'pebbles']
35291                     *
35292                     * // The `_.property` iteratee shorthand.
35293                     * _.takeRightWhile(users, 'active');
35294                     * // => []
35295                     */
35296                    function takeRightWhile(array, predicate) {
35297                        return (array && array.length)
35298                            ? baseWhile(array, getIteratee(predicate, 3), false, true)
35299                            : [];
35300                    }
35301
35302                    /**
35303                     * Creates a slice of `array` with elements taken from the beginning. Elements
35304                     * are taken until `predicate` returns falsey. The predicate is invoked with
35305                     * three arguments: (value, index, array).
35306                     *
35307                     * @static
35308                     * @memberOf _
35309                     * @since 3.0.0
35310                     * @category Array
35311                     * @param {Array} array The array to query.
35312                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
35313                     * @returns {Array} Returns the slice of `array`.
35314                     * @example
35315                     *
35316                     * var users = [
35317                     *   { 'user': 'barney',  'active': false },
35318                     *   { 'user': 'fred',    'active': false },
35319                     *   { 'user': 'pebbles', 'active': true }
35320                     * ];
35321                     *
35322                     * _.takeWhile(users, function(o) { return !o.active; });
35323                     * // => objects for ['barney', 'fred']
35324                     *
35325                     * // The `_.matches` iteratee shorthand.
35326                     * _.takeWhile(users, { 'user': 'barney', 'active': false });
35327                     * // => objects for ['barney']
35328                     *
35329                     * // The `_.matchesProperty` iteratee shorthand.
35330                     * _.takeWhile(users, ['active', false]);
35331                     * // => objects for ['barney', 'fred']
35332                     *
35333                     * // The `_.property` iteratee shorthand.
35334                     * _.takeWhile(users, 'active');
35335                     * // => []
35336                     */
35337                    function takeWhile(array, predicate) {
35338                        return (array && array.length)
35339                            ? baseWhile(array, getIteratee(predicate, 3))
35340                            : [];
35341                    }
35342
35343                    /**
35344                     * Creates an array of unique values, in order, from all given arrays using
35345                     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
35346                     * for equality comparisons.
35347                     *
35348                     * @static
35349                     * @memberOf _
35350                     * @since 0.1.0
35351                     * @category Array
35352                     * @param {...Array} [arrays] The arrays to inspect.
35353                     * @returns {Array} Returns the new array of combined values.
35354                     * @example
35355                     *
35356                     * _.union([2], [1, 2]);
35357                     * // => [2, 1]
35358                     */
35359                    var union = baseRest(function(arrays) {
35360                        return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
35361                    });
35362
35363                    /**
35364                     * This method is like `_.union` except that it accepts `iteratee` which is
35365                     * invoked for each element of each `arrays` to generate the criterion by
35366                     * which uniqueness is computed. Result values are chosen from the first
35367                     * array in which the value occurs. The iteratee is invoked with one argument:
35368                     * (value).
35369                     *
35370                     * @static
35371                     * @memberOf _
35372                     * @since 4.0.0
35373                     * @category Array
35374                     * @param {...Array} [arrays] The arrays to inspect.
35375                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
35376                     * @returns {Array} Returns the new array of combined values.
35377                     * @example
35378                     *
35379                     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
35380                     * // => [2.1, 1.2]
35381                     *
35382                     * // The `_.property` iteratee shorthand.
35383                     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
35384                     * // => [{ 'x': 1 }, { 'x': 2 }]
35385                     */
35386                    var unionBy = baseRest(function(arrays) {
35387                        var iteratee = last(arrays);
35388                        if (isArrayLikeObject(iteratee)) {
35389                            iteratee = undefined;
35390                        }
35391                        return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
35392                    });
35393
35394                    /**
35395                     * This method is like `_.union` except that it accepts `comparator` which
35396                     * is invoked to compare elements of `arrays`. Result values are chosen from
35397                     * the first array in which the value occurs. The comparator is invoked
35398                     * with two arguments: (arrVal, othVal).
35399                     *
35400                     * @static
35401                     * @memberOf _
35402                     * @since 4.0.0
35403                     * @category Array
35404                     * @param {...Array} [arrays] The arrays to inspect.
35405                     * @param {Function} [comparator] The comparator invoked per element.
35406                     * @returns {Array} Returns the new array of combined values.
35407                     * @example
35408                     *
35409                     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
35410                     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
35411                     *
35412                     * _.unionWith(objects, others, _.isEqual);
35413                     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
35414                     */
35415                    var unionWith = baseRest(function(arrays) {
35416                        var comparator = last(arrays);
35417                        comparator = typeof comparator == 'function' ? comparator : undefined;
35418                        return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
35419                    });
35420
35421                    /**
35422                     * Creates a duplicate-free version of an array, using
35423                     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
35424                     * for equality comparisons, in which only the first occurrence of each element
35425                     * is kept. The order of result values is determined by the order they occur
35426                     * in the array.
35427                     *
35428                     * @static
35429                     * @memberOf _
35430                     * @since 0.1.0
35431                     * @category Array
35432                     * @param {Array} array The array to inspect.
35433                     * @returns {Array} Returns the new duplicate free array.
35434                     * @example
35435                     *
35436                     * _.uniq([2, 1, 2]);
35437                     * // => [2, 1]
35438                     */
35439                    function uniq(array) {
35440                        return (array && array.length) ? baseUniq(array) : [];
35441                    }
35442
35443                    /**
35444                     * This method is like `_.uniq` except that it accepts `iteratee` which is
35445                     * invoked for each element in `array` to generate the criterion by which
35446                     * uniqueness is computed. The order of result values is determined by the
35447                     * order they occur in the array. The iteratee is invoked with one argument:
35448                     * (value).
35449                     *
35450                     * @static
35451                     * @memberOf _
35452                     * @since 4.0.0
35453                     * @category Array
35454                     * @param {Array} array The array to inspect.
35455                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
35456                     * @returns {Array} Returns the new duplicate free array.
35457                     * @example
35458                     *
35459                     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
35460                     * // => [2.1, 1.2]
35461                     *
35462                     * // The `_.property` iteratee shorthand.
35463                     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
35464                     * // => [{ 'x': 1 }, { 'x': 2 }]
35465                     */
35466                    function uniqBy(array, iteratee) {
35467                        return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
35468                    }
35469
35470                    /**
35471                     * This method is like `_.uniq` except that it accepts `comparator` which
35472                     * is invoked to compare elements of `array`. The order of result values is
35473                     * determined by the order they occur in the array.The comparator is invoked
35474                     * with two arguments: (arrVal, othVal).
35475                     *
35476                     * @static
35477                     * @memberOf _
35478                     * @since 4.0.0
35479                     * @category Array
35480                     * @param {Array} array The array to inspect.
35481                     * @param {Function} [comparator] The comparator invoked per element.
35482                     * @returns {Array} Returns the new duplicate free array.
35483                     * @example
35484                     *
35485                     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
35486                     *
35487                     * _.uniqWith(objects, _.isEqual);
35488                     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
35489                     */
35490                    function uniqWith(array, comparator) {
35491                        comparator = typeof comparator == 'function' ? comparator : undefined;
35492                        return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
35493                    }
35494
35495                    /**
35496                     * This method is like `_.zip` except that it accepts an array of grouped
35497                     * elements and creates an array regrouping the elements to their pre-zip
35498                     * configuration.
35499                     *
35500                     * @static
35501                     * @memberOf _
35502                     * @since 1.2.0
35503                     * @category Array
35504                     * @param {Array} array The array of grouped elements to process.
35505                     * @returns {Array} Returns the new array of regrouped elements.
35506                     * @example
35507                     *
35508                     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
35509                     * // => [['a', 1, true], ['b', 2, false]]
35510                     *
35511                     * _.unzip(zipped);
35512                     * // => [['a', 'b'], [1, 2], [true, false]]
35513                     */
35514                    function unzip(array) {
35515                        if (!(array && array.length)) {
35516                            return [];
35517                        }
35518                        var length = 0;
35519                        array = arrayFilter(array, function(group) {
35520                            if (isArrayLikeObject(group)) {
35521                                length = nativeMax(group.length, length);
35522                                return true;
35523                            }
35524                        });
35525                        return baseTimes(length, function(index) {
35526                            return arrayMap(array, baseProperty(index));
35527                        });
35528                    }
35529
35530                    /**
35531                     * This method is like `_.unzip` except that it accepts `iteratee` to specify
35532                     * how regrouped values should be combined. The iteratee is invoked with the
35533                     * elements of each group: (...group).
35534                     *
35535                     * @static
35536                     * @memberOf _
35537                     * @since 3.8.0
35538                     * @category Array
35539                     * @param {Array} array The array of grouped elements to process.
35540                     * @param {Function} [iteratee=_.identity] The function to combine
35541                     *  regrouped values.
35542                     * @returns {Array} Returns the new array of regrouped elements.
35543                     * @example
35544                     *
35545                     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
35546                     * // => [[1, 10, 100], [2, 20, 200]]
35547                     *
35548                     * _.unzipWith(zipped, _.add);
35549                     * // => [3, 30, 300]
35550                     */
35551                    function unzipWith(array, iteratee) {
35552                        if (!(array && array.length)) {
35553                            return [];
35554                        }
35555                        var result = unzip(array);
35556                        if (iteratee == null) {
35557                            return result;
35558                        }
35559                        return arrayMap(result, function(group) {
35560                            return apply(iteratee, undefined, group);
35561                        });
35562                    }
35563
35564                    /**
35565                     * Creates an array excluding all given values using
35566                     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
35567                     * for equality comparisons.
35568                     *
35569                     * **Note:** Unlike `_.pull`, this method returns a new array.
35570                     *
35571                     * @static
35572                     * @memberOf _
35573                     * @since 0.1.0
35574                     * @category Array
35575                     * @param {Array} array The array to inspect.
35576                     * @param {...*} [values] The values to exclude.
35577                     * @returns {Array} Returns the new array of filtered values.
35578                     * @see _.difference, _.xor
35579                     * @example
35580                     *
35581                     * _.without([2, 1, 2, 3], 1, 2);
35582                     * // => [3]
35583                     */
35584                    var without = baseRest(function(array, values) {
35585                        return isArrayLikeObject(array)
35586                            ? baseDifference(array, values)
35587                            : [];
35588                    });
35589
35590                    /**
35591                     * Creates an array of unique values that is the
35592                     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
35593                     * of the given arrays. The order of result values is determined by the order
35594                     * they occur in the arrays.
35595                     *
35596                     * @static
35597                     * @memberOf _
35598                     * @since 2.4.0
35599                     * @category Array
35600                     * @param {...Array} [arrays] The arrays to inspect.
35601                     * @returns {Array} Returns the new array of filtered values.
35602                     * @see _.difference, _.without
35603                     * @example
35604                     *
35605                     * _.xor([2, 1], [2, 3]);
35606                     * // => [1, 3]
35607                     */
35608                    var xor = baseRest(function(arrays) {
35609                        return baseXor(arrayFilter(arrays, isArrayLikeObject));
35610                    });
35611
35612                    /**
35613                     * This method is like `_.xor` except that it accepts `iteratee` which is
35614                     * invoked for each element of each `arrays` to generate the criterion by
35615                     * which by which they're compared. The order of result values is determined
35616                     * by the order they occur in the arrays. The iteratee is invoked with one
35617                     * argument: (value).
35618                     *
35619                     * @static
35620                     * @memberOf _
35621                     * @since 4.0.0
35622                     * @category Array
35623                     * @param {...Array} [arrays] The arrays to inspect.
35624                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
35625                     * @returns {Array} Returns the new array of filtered values.
35626                     * @example
35627                     *
35628                     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
35629                     * // => [1.2, 3.4]
35630                     *
35631                     * // The `_.property` iteratee shorthand.
35632                     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
35633                     * // => [{ 'x': 2 }]
35634                     */
35635                    var xorBy = baseRest(function(arrays) {
35636                        var iteratee = last(arrays);
35637                        if (isArrayLikeObject(iteratee)) {
35638                            iteratee = undefined;
35639                        }
35640                        return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
35641                    });
35642
35643                    /**
35644                     * This method is like `_.xor` except that it accepts `comparator` which is
35645                     * invoked to compare elements of `arrays`. The order of result values is
35646                     * determined by the order they occur in the arrays. The comparator is invoked
35647                     * with two arguments: (arrVal, othVal).
35648                     *
35649                     * @static
35650                     * @memberOf _
35651                     * @since 4.0.0
35652                     * @category Array
35653                     * @param {...Array} [arrays] The arrays to inspect.
35654                     * @param {Function} [comparator] The comparator invoked per element.
35655                     * @returns {Array} Returns the new array of filtered values.
35656                     * @example
35657                     *
35658                     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
35659                     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
35660                     *
35661                     * _.xorWith(objects, others, _.isEqual);
35662                     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
35663                     */
35664                    var xorWith = baseRest(function(arrays) {
35665                        var comparator = last(arrays);
35666                        comparator = typeof comparator == 'function' ? comparator : undefined;
35667                        return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
35668                    });
35669
35670                    /**
35671                     * Creates an array of grouped elements, the first of which contains the
35672                     * first elements of the given arrays, the second of which contains the
35673                     * second elements of the given arrays, and so on.
35674                     *
35675                     * @static
35676                     * @memberOf _
35677                     * @since 0.1.0
35678                     * @category Array
35679                     * @param {...Array} [arrays] The arrays to process.
35680                     * @returns {Array} Returns the new array of grouped elements.
35681                     * @example
35682                     *
35683                     * _.zip(['a', 'b'], [1, 2], [true, false]);
35684                     * // => [['a', 1, true], ['b', 2, false]]
35685                     */
35686                    var zip = baseRest(unzip);
35687
35688                    /**
35689                     * This method is like `_.fromPairs` except that it accepts two arrays,
35690                     * one of property identifiers and one of corresponding values.
35691                     *
35692                     * @static
35693                     * @memberOf _
35694                     * @since 0.4.0
35695                     * @category Array
35696                     * @param {Array} [props=[]] The property identifiers.
35697                     * @param {Array} [values=[]] The property values.
35698                     * @returns {Object} Returns the new object.
35699                     * @example
35700                     *
35701                     * _.zipObject(['a', 'b'], [1, 2]);
35702                     * // => { 'a': 1, 'b': 2 }
35703                     */
35704                    function zipObject(props, values) {
35705                        return baseZipObject(props || [], values || [], assignValue);
35706                    }
35707
35708                    /**
35709                     * This method is like `_.zipObject` except that it supports property paths.
35710                     *
35711                     * @static
35712                     * @memberOf _
35713                     * @since 4.1.0
35714                     * @category Array
35715                     * @param {Array} [props=[]] The property identifiers.
35716                     * @param {Array} [values=[]] The property values.
35717                     * @returns {Object} Returns the new object.
35718                     * @example
35719                     *
35720                     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
35721                     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
35722                     */
35723                    function zipObjectDeep(props, values) {
35724                        return baseZipObject(props || [], values || [], baseSet);
35725                    }
35726
35727                    /**
35728                     * This method is like `_.zip` except that it accepts `iteratee` to specify
35729                     * how grouped values should be combined. The iteratee is invoked with the
35730                     * elements of each group: (...group).
35731                     *
35732                     * @static
35733                     * @memberOf _
35734                     * @since 3.8.0
35735                     * @category Array
35736                     * @param {...Array} [arrays] The arrays to process.
35737                     * @param {Function} [iteratee=_.identity] The function to combine
35738                     *  grouped values.
35739                     * @returns {Array} Returns the new array of grouped elements.
35740                     * @example
35741                     *
35742                     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
35743                     *   return a + b + c;
35744                     * });
35745                     * // => [111, 222]
35746                     */
35747                    var zipWith = baseRest(function(arrays) {
35748                        var length = arrays.length,
35749                            iteratee = length > 1 ? arrays[length - 1] : undefined;
35750
35751                        iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
35752                        return unzipWith(arrays, iteratee);
35753                    });
35754
35755                    /*------------------------------------------------------------------------*/
35756
35757                    /**
35758                     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
35759                     * chain sequences enabled. The result of such sequences must be unwrapped
35760                     * with `_#value`.
35761                     *
35762                     * @static
35763                     * @memberOf _
35764                     * @since 1.3.0
35765                     * @category Seq
35766                     * @param {*} value The value to wrap.
35767                     * @returns {Object} Returns the new `lodash` wrapper instance.
35768                     * @example
35769                     *
35770                     * var users = [
35771                     *   { 'user': 'barney',  'age': 36 },
35772                     *   { 'user': 'fred',    'age': 40 },
35773                     *   { 'user': 'pebbles', 'age': 1 }
35774                     * ];
35775                     *
35776                     * var youngest = _
35777                     *   .chain(users)
35778                     *   .sortBy('age')
35779                     *   .map(function(o) {
35780                     *     return o.user + ' is ' + o.age;
35781                     *   })
35782                     *   .head()
35783                     *   .value();
35784                     * // => 'pebbles is 1'
35785                     */
35786                    function chain(value) {
35787                        var result = lodash(value);
35788                        result.__chain__ = true;
35789                        return result;
35790                    }
35791
35792                    /**
35793                     * This method invokes `interceptor` and returns `value`. The interceptor
35794                     * is invoked with one argument; (value). The purpose of this method is to
35795                     * "tap into" a method chain sequence in order to modify intermediate results.
35796                     *
35797                     * @static
35798                     * @memberOf _
35799                     * @since 0.1.0
35800                     * @category Seq
35801                     * @param {*} value The value to provide to `interceptor`.
35802                     * @param {Function} interceptor The function to invoke.
35803                     * @returns {*} Returns `value`.
35804                     * @example
35805                     *
35806                     * _([1, 2, 3])
35807                     *  .tap(function(array) {
35808                     *    // Mutate input array.
35809                     *    array.pop();
35810                     *  })
35811                     *  .reverse()
35812                     *  .value();
35813                     * // => [2, 1]
35814                     */
35815                    function tap(value, interceptor) {
35816                        interceptor(value);
35817                        return value;
35818                    }
35819
35820                    /**
35821                     * This method is like `_.tap` except that it returns the result of `interceptor`.
35822                     * The purpose of this method is to "pass thru" values replacing intermediate
35823                     * results in a method chain sequence.
35824                     *
35825                     * @static
35826                     * @memberOf _
35827                     * @since 3.0.0
35828                     * @category Seq
35829                     * @param {*} value The value to provide to `interceptor`.
35830                     * @param {Function} interceptor The function to invoke.
35831                     * @returns {*} Returns the result of `interceptor`.
35832                     * @example
35833                     *
35834                     * _('  abc  ')
35835                     *  .chain()
35836                     *  .trim()
35837                     *  .thru(function(value) {
35838                     *    return [value];
35839                     *  })
35840                     *  .value();
35841                     * // => ['abc']
35842                     */
35843                    function thru(value, interceptor) {
35844                        return interceptor(value);
35845                    }
35846
35847                    /**
35848                     * This method is the wrapper version of `_.at`.
35849                     *
35850                     * @name at
35851                     * @memberOf _
35852                     * @since 1.0.0
35853                     * @category Seq
35854                     * @param {...(string|string[])} [paths] The property paths to pick.
35855                     * @returns {Object} Returns the new `lodash` wrapper instance.
35856                     * @example
35857                     *
35858                     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
35859                     *
35860                     * _(object).at(['a[0].b.c', 'a[1]']).value();
35861                     * // => [3, 4]
35862                     */
35863                    var wrapperAt = flatRest(function(paths) {
35864                        var length = paths.length,
35865                            start = length ? paths[0] : 0,
35866                            value = this.__wrapped__,
35867                            interceptor = function(object) { return baseAt(object, paths); };
35868
35869                        if (length > 1 || this.__actions__.length ||
35870                            !(value instanceof LazyWrapper) || !isIndex(start)) {
35871                            return this.thru(interceptor);
35872                        }
35873                        value = value.slice(start, +start + (length ? 1 : 0));
35874                        value.__actions__.push({
35875                            'func': thru,
35876                            'args': [interceptor],
35877                            'thisArg': undefined
35878                        });
35879                        return new LodashWrapper(value, this.__chain__).thru(function(array) {
35880                            if (length && !array.length) {
35881                                array.push(undefined);
35882                            }
35883                            return array;
35884                        });
35885                    });
35886
35887                    /**
35888                     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
35889                     *
35890                     * @name chain
35891                     * @memberOf _
35892                     * @since 0.1.0
35893                     * @category Seq
35894                     * @returns {Object} Returns the new `lodash` wrapper instance.
35895                     * @example
35896                     *
35897                     * var users = [
35898                     *   { 'user': 'barney', 'age': 36 },
35899                     *   { 'user': 'fred',   'age': 40 }
35900                     * ];
35901                     *
35902                     * // A sequence without explicit chaining.
35903                     * _(users).head();
35904                     * // => { 'user': 'barney', 'age': 36 }
35905                     *
35906                     * // A sequence with explicit chaining.
35907                     * _(users)
35908                     *   .chain()
35909                     *   .head()
35910                     *   .pick('user')
35911                     *   .value();
35912                     * // => { 'user': 'barney' }
35913                     */
35914                    function wrapperChain() {
35915                        return chain(this);
35916                    }
35917
35918                    /**
35919                     * Executes the chain sequence and returns the wrapped result.
35920                     *
35921                     * @name commit
35922                     * @memberOf _
35923                     * @since 3.2.0
35924                     * @category Seq
35925                     * @returns {Object} Returns the new `lodash` wrapper instance.
35926                     * @example
35927                     *
35928                     * var array = [1, 2];
35929                     * var wrapped = _(array).push(3);
35930                     *
35931                     * console.log(array);
35932                     * // => [1, 2]
35933                     *
35934                     * wrapped = wrapped.commit();
35935                     * console.log(array);
35936                     * // => [1, 2, 3]
35937                     *
35938                     * wrapped.last();
35939                     * // => 3
35940                     *
35941                     * console.log(array);
35942                     * // => [1, 2, 3]
35943                     */
35944                    function wrapperCommit() {
35945                        return new LodashWrapper(this.value(), this.__chain__);
35946                    }
35947
35948                    /**
35949                     * Gets the next value on a wrapped object following the
35950                     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
35951                     *
35952                     * @name next
35953                     * @memberOf _
35954                     * @since 4.0.0
35955                     * @category Seq
35956                     * @returns {Object} Returns the next iterator value.
35957                     * @example
35958                     *
35959                     * var wrapped = _([1, 2]);
35960                     *
35961                     * wrapped.next();
35962                     * // => { 'done': false, 'value': 1 }
35963                     *
35964                     * wrapped.next();
35965                     * // => { 'done': false, 'value': 2 }
35966                     *
35967                     * wrapped.next();
35968                     * // => { 'done': true, 'value': undefined }
35969                     */
35970                    function wrapperNext() {
35971                        if (this.__values__ === undefined) {
35972                            this.__values__ = toArray(this.value());
35973                        }
35974                        var done = this.__index__ >= this.__values__.length,
35975                            value = done ? undefined : this.__values__[this.__index__++];
35976
35977                        return { 'done': done, 'value': value };
35978                    }
35979
35980                    /**
35981                     * Enables the wrapper to be iterable.
35982                     *
35983                     * @name Symbol.iterator
35984                     * @memberOf _
35985                     * @since 4.0.0
35986                     * @category Seq
35987                     * @returns {Object} Returns the wrapper object.
35988                     * @example
35989                     *
35990                     * var wrapped = _([1, 2]);
35991                     *
35992                     * wrapped[Symbol.iterator]() === wrapped;
35993                     * // => true
35994                     *
35995                     * Array.from(wrapped);
35996                     * // => [1, 2]
35997                     */
35998                    function wrapperToIterator() {
35999                        return this;
36000                    }
36001
36002                    /**
36003                     * Creates a clone of the chain sequence planting `value` as the wrapped value.
36004                     *
36005                     * @name plant
36006                     * @memberOf _
36007                     * @since 3.2.0
36008                     * @category Seq
36009                     * @param {*} value The value to plant.
36010                     * @returns {Object} Returns the new `lodash` wrapper instance.
36011                     * @example
36012                     *
36013                     * function square(n) {
36014                     *   return n * n;
36015                     * }
36016                     *
36017                     * var wrapped = _([1, 2]).map(square);
36018                     * var other = wrapped.plant([3, 4]);
36019                     *
36020                     * other.value();
36021                     * // => [9, 16]
36022                     *
36023                     * wrapped.value();
36024                     * // => [1, 4]
36025                     */
36026                    function wrapperPlant(value) {
36027                        var result,
36028                            parent = this;
36029
36030                        while (parent instanceof baseLodash) {
36031                            var clone = wrapperClone(parent);
36032                            clone.__index__ = 0;
36033                            clone.__values__ = undefined;
36034                            if (result) {
36035                                previous.__wrapped__ = clone;
36036                            } else {
36037                                result = clone;
36038                            }
36039                            var previous = clone;
36040                            parent = parent.__wrapped__;
36041                        }
36042                        previous.__wrapped__ = value;
36043                        return result;
36044                    }
36045
36046                    /**
36047                     * This method is the wrapper version of `_.reverse`.
36048                     *
36049                     * **Note:** This method mutates the wrapped array.
36050                     *
36051                     * @name reverse
36052                     * @memberOf _
36053                     * @since 0.1.0
36054                     * @category Seq
36055                     * @returns {Object} Returns the new `lodash` wrapper instance.
36056                     * @example
36057                     *
36058                     * var array = [1, 2, 3];
36059                     *
36060                     * _(array).reverse().value()
36061                     * // => [3, 2, 1]
36062                     *
36063                     * console.log(array);
36064                     * // => [3, 2, 1]
36065                     */
36066                    function wrapperReverse() {
36067                        var value = this.__wrapped__;
36068                        if (value instanceof LazyWrapper) {
36069                            var wrapped = value;
36070                            if (this.__actions__.length) {
36071                                wrapped = new LazyWrapper(this);
36072                            }
36073                            wrapped = wrapped.reverse();
36074                            wrapped.__actions__.push({
36075                                'func': thru,
36076                                'args': [reverse],
36077                                'thisArg': undefined
36078                            });
36079                            return new LodashWrapper(wrapped, this.__chain__);
36080                        }
36081                        return this.thru(reverse);
36082                    }
36083
36084                    /**
36085                     * Executes the chain sequence to resolve the unwrapped value.
36086                     *
36087                     * @name value
36088                     * @memberOf _
36089                     * @since 0.1.0
36090                     * @alias toJSON, valueOf
36091                     * @category Seq
36092                     * @returns {*} Returns the resolved unwrapped value.
36093                     * @example
36094                     *
36095                     * _([1, 2, 3]).value();
36096                     * // => [1, 2, 3]
36097                     */
36098                    function wrapperValue() {
36099                        return baseWrapperValue(this.__wrapped__, this.__actions__);
36100                    }
36101
36102                    /*------------------------------------------------------------------------*/
36103
36104                    /**
36105                     * Creates an object composed of keys generated from the results of running
36106                     * each element of `collection` thru `iteratee`. The corresponding value of
36107                     * each key is the number of times the key was returned by `iteratee`. The
36108                     * iteratee is invoked with one argument: (value).
36109                     *
36110                     * @static
36111                     * @memberOf _
36112                     * @since 0.5.0
36113                     * @category Collection
36114                     * @param {Array|Object} collection The collection to iterate over.
36115                     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
36116                     * @returns {Object} Returns the composed aggregate object.
36117                     * @example
36118                     *
36119                     * _.countBy([6.1, 4.2, 6.3], Math.floor);
36120                     * // => { '4': 1, '6': 2 }
36121                     *
36122                     * // The `_.property` iteratee shorthand.
36123                     * _.countBy(['one', 'two', 'three'], 'length');
36124                     * // => { '3': 2, '5': 1 }
36125                     */
36126                    var countBy = createAggregator(function(result, value, key) {
36127                        if (hasOwnProperty.call(result, key)) {
36128                            ++result[key];
36129                        } else {
36130                            baseAssignValue(result, key, 1);
36131                        }
36132                    });
36133
36134                    /**
36135                     * Checks if `predicate` returns truthy for **all** elements of `collection`.
36136                     * Iteration is stopped once `predicate` returns falsey. The predicate is
36137                     * invoked with three arguments: (value, index|key, collection).
36138                     *
36139                     * **Note:** This method returns `true` for
36140                     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
36141                     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
36142                     * elements of empty collections.
36143                     *
36144                     * @static
36145                     * @memberOf _
36146                     * @since 0.1.0
36147                     * @category Collection
36148                     * @param {Array|Object} collection The collection to iterate over.
36149                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
36150                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
36151                     * @returns {boolean} Returns `true` if all elements pass the predicate check,
36152                     *  else `false`.
36153                     * @example
36154                     *
36155                     * _.every([true, 1, null, 'yes'], Boolean);
36156                     * // => false
36157                     *
36158                     * var users = [
36159                     *   { 'user': 'barney', 'age': 36, 'active': false },
36160                     *   { 'user': 'fred',   'age': 40, 'active': false }
36161                     * ];
36162                     *
36163                     * // The `_.matches` iteratee shorthand.
36164                     * _.every(users, { 'user': 'barney', 'active': false });
36165                     * // => false
36166                     *
36167                     * // The `_.matchesProperty` iteratee shorthand.
36168                     * _.every(users, ['active', false]);
36169                     * // => true
36170                     *
36171                     * // The `_.property` iteratee shorthand.
36172                     * _.every(users, 'active');
36173                     * // => false
36174                     */
36175                    function every(collection, predicate, guard) {
36176                        var func = isArray(collection) ? arrayEvery : baseEvery;
36177                        if (guard && isIterateeCall(collection, predicate, guard)) {
36178                            predicate = undefined;
36179                        }
36180                        return func(collection, getIteratee(predicate, 3));
36181                    }
36182
36183                    /**
36184                     * Iterates over elements of `collection`, returning an array of all elements
36185                     * `predicate` returns truthy for. The predicate is invoked with three
36186                     * arguments: (value, index|key, collection).
36187                     *
36188                     * **Note:** Unlike `_.remove`, this method returns a new array.
36189                     *
36190                     * @static
36191                     * @memberOf _
36192                     * @since 0.1.0
36193                     * @category Collection
36194                     * @param {Array|Object} collection The collection to iterate over.
36195                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
36196                     * @returns {Array} Returns the new filtered array.
36197                     * @see _.reject
36198                     * @example
36199                     *
36200                     * var users = [
36201                     *   { 'user': 'barney', 'age': 36, 'active': true },
36202                     *   { 'user': 'fred',   'age': 40, 'active': false }
36203                     * ];
36204                     *
36205                     * _.filter(users, function(o) { return !o.active; });
36206                     * // => objects for ['fred']
36207                     *
36208                     * // The `_.matches` iteratee shorthand.
36209                     * _.filter(users, { 'age': 36, 'active': true });
36210                     * // => objects for ['barney']
36211                     *
36212                     * // The `_.matchesProperty` iteratee shorthand.
36213                     * _.filter(users, ['active', false]);
36214                     * // => objects for ['fred']
36215                     *
36216                     * // The `_.property` iteratee shorthand.
36217                     * _.filter(users, 'active');
36218                     * // => objects for ['barney']
36219                     *
36220                     * // Combining several predicates using `_.overEvery` or `_.overSome`.
36221                     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
36222                     * // => objects for ['fred', 'barney']
36223                     */
36224                    function filter(collection, predicate) {
36225                        var func = isArray(collection) ? arrayFilter : baseFilter;
36226                        return func(collection, getIteratee(predicate, 3));
36227                    }
36228
36229                    /**
36230                     * Iterates over elements of `collection`, returning the first element
36231                     * `predicate` returns truthy for. The predicate is invoked with three
36232                     * arguments: (value, index|key, collection).
36233                     *
36234                     * @static
36235                     * @memberOf _
36236                     * @since 0.1.0
36237                     * @category Collection
36238                     * @param {Array|Object} collection The collection to inspect.
36239                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
36240                     * @param {number} [fromIndex=0] The index to search from.
36241                     * @returns {*} Returns the matched element, else `undefined`.
36242                     * @example
36243                     *
36244                     * var users = [
36245                     *   { 'user': 'barney',  'age': 36, 'active': true },
36246                     *   { 'user': 'fred',    'age': 40, 'active': false },
36247                     *   { 'user': 'pebbles', 'age': 1,  'active': true }
36248                     * ];
36249                     *
36250                     * _.find(users, function(o) { return o.age < 40; });
36251                     * // => object for 'barney'
36252                     *
36253                     * // The `_.matches` iteratee shorthand.
36254                     * _.find(users, { 'age': 1, 'active': true });
36255                     * // => object for 'pebbles'
36256                     *
36257                     * // The `_.matchesProperty` iteratee shorthand.
36258                     * _.find(users, ['active', false]);
36259                     * // => object for 'fred'
36260                     *
36261                     * // The `_.property` iteratee shorthand.
36262                     * _.find(users, 'active');
36263                     * // => object for 'barney'
36264                     */
36265                    var find = createFind(findIndex);
36266
36267                    /**
36268                     * This method is like `_.find` except that it iterates over elements of
36269                     * `collection` from right to left.
36270                     *
36271                     * @static
36272                     * @memberOf _
36273                     * @since 2.0.0
36274                     * @category Collection
36275                     * @param {Array|Object} collection The collection to inspect.
36276                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
36277                     * @param {number} [fromIndex=collection.length-1] The index to search from.
36278                     * @returns {*} Returns the matched element, else `undefined`.
36279                     * @example
36280                     *
36281                     * _.findLast([1, 2, 3, 4], function(n) {
36282                     *   return n % 2 == 1;
36283                     * });
36284                     * // => 3
36285                     */
36286                    var findLast = createFind(findLastIndex);
36287
36288                    /**
36289                     * Creates a flattened array of values by running each element in `collection`
36290                     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
36291                     * with three arguments: (value, index|key, collection).
36292                     *
36293                     * @static
36294                     * @memberOf _
36295                     * @since 4.0.0
36296                     * @category Collection
36297                     * @param {Array|Object} collection The collection to iterate over.
36298                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36299                     * @returns {Array} Returns the new flattened array.
36300                     * @example
36301                     *
36302                     * function duplicate(n) {
36303                     *   return [n, n];
36304                     * }
36305                     *
36306                     * _.flatMap([1, 2], duplicate);
36307                     * // => [1, 1, 2, 2]
36308                     */
36309                    function flatMap(collection, iteratee) {
36310                        return baseFlatten(map(collection, iteratee), 1);
36311                    }
36312
36313                    /**
36314                     * This method is like `_.flatMap` except that it recursively flattens the
36315                     * mapped results.
36316                     *
36317                     * @static
36318                     * @memberOf _
36319                     * @since 4.7.0
36320                     * @category Collection
36321                     * @param {Array|Object} collection The collection to iterate over.
36322                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36323                     * @returns {Array} Returns the new flattened array.
36324                     * @example
36325                     *
36326                     * function duplicate(n) {
36327                     *   return [[[n, n]]];
36328                     * }
36329                     *
36330                     * _.flatMapDeep([1, 2], duplicate);
36331                     * // => [1, 1, 2, 2]
36332                     */
36333                    function flatMapDeep(collection, iteratee) {
36334                        return baseFlatten(map(collection, iteratee), INFINITY);
36335                    }
36336
36337                    /**
36338                     * This method is like `_.flatMap` except that it recursively flattens the
36339                     * mapped results up to `depth` times.
36340                     *
36341                     * @static
36342                     * @memberOf _
36343                     * @since 4.7.0
36344                     * @category Collection
36345                     * @param {Array|Object} collection The collection to iterate over.
36346                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36347                     * @param {number} [depth=1] The maximum recursion depth.
36348                     * @returns {Array} Returns the new flattened array.
36349                     * @example
36350                     *
36351                     * function duplicate(n) {
36352                     *   return [[[n, n]]];
36353                     * }
36354                     *
36355                     * _.flatMapDepth([1, 2], duplicate, 2);
36356                     * // => [[1, 1], [2, 2]]
36357                     */
36358                    function flatMapDepth(collection, iteratee, depth) {
36359                        depth = depth === undefined ? 1 : toInteger(depth);
36360                        return baseFlatten(map(collection, iteratee), depth);
36361                    }
36362
36363                    /**
36364                     * Iterates over elements of `collection` and invokes `iteratee` for each element.
36365                     * The iteratee is invoked with three arguments: (value, index|key, collection).
36366                     * Iteratee functions may exit iteration early by explicitly returning `false`.
36367                     *
36368                     * **Note:** As with other "Collections" methods, objects with a "length"
36369                     * property are iterated like arrays. To avoid this behavior use `_.forIn`
36370                     * or `_.forOwn` for object iteration.
36371                     *
36372                     * @static
36373                     * @memberOf _
36374                     * @since 0.1.0
36375                     * @alias each
36376                     * @category Collection
36377                     * @param {Array|Object} collection The collection to iterate over.
36378                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36379                     * @returns {Array|Object} Returns `collection`.
36380                     * @see _.forEachRight
36381                     * @example
36382                     *
36383                     * _.forEach([1, 2], function(value) {
36384                     *   console.log(value);
36385                     * });
36386                     * // => Logs `1` then `2`.
36387                     *
36388                     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
36389                     *   console.log(key);
36390                     * });
36391                     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
36392                     */
36393                    function forEach(collection, iteratee) {
36394                        var func = isArray(collection) ? arrayEach : baseEach;
36395                        return func(collection, getIteratee(iteratee, 3));
36396                    }
36397
36398                    /**
36399                     * This method is like `_.forEach` except that it iterates over elements of
36400                     * `collection` from right to left.
36401                     *
36402                     * @static
36403                     * @memberOf _
36404                     * @since 2.0.0
36405                     * @alias eachRight
36406                     * @category Collection
36407                     * @param {Array|Object} collection The collection to iterate over.
36408                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36409                     * @returns {Array|Object} Returns `collection`.
36410                     * @see _.forEach
36411                     * @example
36412                     *
36413                     * _.forEachRight([1, 2], function(value) {
36414                     *   console.log(value);
36415                     * });
36416                     * // => Logs `2` then `1`.
36417                     */
36418                    function forEachRight(collection, iteratee) {
36419                        var func = isArray(collection) ? arrayEachRight : baseEachRight;
36420                        return func(collection, getIteratee(iteratee, 3));
36421                    }
36422
36423                    /**
36424                     * Creates an object composed of keys generated from the results of running
36425                     * each element of `collection` thru `iteratee`. The order of grouped values
36426                     * is determined by the order they occur in `collection`. The corresponding
36427                     * value of each key is an array of elements responsible for generating the
36428                     * key. The iteratee is invoked with one argument: (value).
36429                     *
36430                     * @static
36431                     * @memberOf _
36432                     * @since 0.1.0
36433                     * @category Collection
36434                     * @param {Array|Object} collection The collection to iterate over.
36435                     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
36436                     * @returns {Object} Returns the composed aggregate object.
36437                     * @example
36438                     *
36439                     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
36440                     * // => { '4': [4.2], '6': [6.1, 6.3] }
36441                     *
36442                     * // The `_.property` iteratee shorthand.
36443                     * _.groupBy(['one', 'two', 'three'], 'length');
36444                     * // => { '3': ['one', 'two'], '5': ['three'] }
36445                     */
36446                    var groupBy = createAggregator(function(result, value, key) {
36447                        if (hasOwnProperty.call(result, key)) {
36448                            result[key].push(value);
36449                        } else {
36450                            baseAssignValue(result, key, [value]);
36451                        }
36452                    });
36453
36454                    /**
36455                     * Checks if `value` is in `collection`. If `collection` is a string, it's
36456                     * checked for a substring of `value`, otherwise
36457                     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
36458                     * is used for equality comparisons. If `fromIndex` is negative, it's used as
36459                     * the offset from the end of `collection`.
36460                     *
36461                     * @static
36462                     * @memberOf _
36463                     * @since 0.1.0
36464                     * @category Collection
36465                     * @param {Array|Object|string} collection The collection to inspect.
36466                     * @param {*} value The value to search for.
36467                     * @param {number} [fromIndex=0] The index to search from.
36468                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
36469                     * @returns {boolean} Returns `true` if `value` is found, else `false`.
36470                     * @example
36471                     *
36472                     * _.includes([1, 2, 3], 1);
36473                     * // => true
36474                     *
36475                     * _.includes([1, 2, 3], 1, 2);
36476                     * // => false
36477                     *
36478                     * _.includes({ 'a': 1, 'b': 2 }, 1);
36479                     * // => true
36480                     *
36481                     * _.includes('abcd', 'bc');
36482                     * // => true
36483                     */
36484                    function includes(collection, value, fromIndex, guard) {
36485                        collection = isArrayLike(collection) ? collection : values(collection);
36486                        fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
36487
36488                        var length = collection.length;
36489                        if (fromIndex < 0) {
36490                            fromIndex = nativeMax(length + fromIndex, 0);
36491                        }
36492                        return isString(collection)
36493                            ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
36494                            : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
36495                    }
36496
36497                    /**
36498                     * Invokes the method at `path` of each element in `collection`, returning
36499                     * an array of the results of each invoked method. Any additional arguments
36500                     * are provided to each invoked method. If `path` is a function, it's invoked
36501                     * for, and `this` bound to, each element in `collection`.
36502                     *
36503                     * @static
36504                     * @memberOf _
36505                     * @since 4.0.0
36506                     * @category Collection
36507                     * @param {Array|Object} collection The collection to iterate over.
36508                     * @param {Array|Function|string} path The path of the method to invoke or
36509                     *  the function invoked per iteration.
36510                     * @param {...*} [args] The arguments to invoke each method with.
36511                     * @returns {Array} Returns the array of results.
36512                     * @example
36513                     *
36514                     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
36515                     * // => [[1, 5, 7], [1, 2, 3]]
36516                     *
36517                     * _.invokeMap([123, 456], String.prototype.split, '');
36518                     * // => [['1', '2', '3'], ['4', '5', '6']]
36519                     */
36520                    var invokeMap = baseRest(function(collection, path, args) {
36521                        var index = -1,
36522                            isFunc = typeof path == 'function',
36523                            result = isArrayLike(collection) ? Array(collection.length) : [];
36524
36525                        baseEach(collection, function(value) {
36526                            result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
36527                        });
36528                        return result;
36529                    });
36530
36531                    /**
36532                     * Creates an object composed of keys generated from the results of running
36533                     * each element of `collection` thru `iteratee`. The corresponding value of
36534                     * each key is the last element responsible for generating the key. The
36535                     * iteratee is invoked with one argument: (value).
36536                     *
36537                     * @static
36538                     * @memberOf _
36539                     * @since 4.0.0
36540                     * @category Collection
36541                     * @param {Array|Object} collection The collection to iterate over.
36542                     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
36543                     * @returns {Object} Returns the composed aggregate object.
36544                     * @example
36545                     *
36546                     * var array = [
36547                     *   { 'dir': 'left', 'code': 97 },
36548                     *   { 'dir': 'right', 'code': 100 }
36549                     * ];
36550                     *
36551                     * _.keyBy(array, function(o) {
36552                     *   return String.fromCharCode(o.code);
36553                     * });
36554                     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
36555                     *
36556                     * _.keyBy(array, 'dir');
36557                     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
36558                     */
36559                    var keyBy = createAggregator(function(result, value, key) {
36560                        baseAssignValue(result, key, value);
36561                    });
36562
36563                    /**
36564                     * Creates an array of values by running each element in `collection` thru
36565                     * `iteratee`. The iteratee is invoked with three arguments:
36566                     * (value, index|key, collection).
36567                     *
36568                     * Many lodash methods are guarded to work as iteratees for methods like
36569                     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
36570                     *
36571                     * The guarded methods are:
36572                     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
36573                     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
36574                     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
36575                     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
36576                     *
36577                     * @static
36578                     * @memberOf _
36579                     * @since 0.1.0
36580                     * @category Collection
36581                     * @param {Array|Object} collection The collection to iterate over.
36582                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36583                     * @returns {Array} Returns the new mapped array.
36584                     * @example
36585                     *
36586                     * function square(n) {
36587                     *   return n * n;
36588                     * }
36589                     *
36590                     * _.map([4, 8], square);
36591                     * // => [16, 64]
36592                     *
36593                     * _.map({ 'a': 4, 'b': 8 }, square);
36594                     * // => [16, 64] (iteration order is not guaranteed)
36595                     *
36596                     * var users = [
36597                     *   { 'user': 'barney' },
36598                     *   { 'user': 'fred' }
36599                     * ];
36600                     *
36601                     * // The `_.property` iteratee shorthand.
36602                     * _.map(users, 'user');
36603                     * // => ['barney', 'fred']
36604                     */
36605                    function map(collection, iteratee) {
36606                        var func = isArray(collection) ? arrayMap : baseMap;
36607                        return func(collection, getIteratee(iteratee, 3));
36608                    }
36609
36610                    /**
36611                     * This method is like `_.sortBy` except that it allows specifying the sort
36612                     * orders of the iteratees to sort by. If `orders` is unspecified, all values
36613                     * are sorted in ascending order. Otherwise, specify an order of "desc" for
36614                     * descending or "asc" for ascending sort order of corresponding values.
36615                     *
36616                     * @static
36617                     * @memberOf _
36618                     * @since 4.0.0
36619                     * @category Collection
36620                     * @param {Array|Object} collection The collection to iterate over.
36621                     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
36622                     *  The iteratees to sort by.
36623                     * @param {string[]} [orders] The sort orders of `iteratees`.
36624                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
36625                     * @returns {Array} Returns the new sorted array.
36626                     * @example
36627                     *
36628                     * var users = [
36629                     *   { 'user': 'fred',   'age': 48 },
36630                     *   { 'user': 'barney', 'age': 34 },
36631                     *   { 'user': 'fred',   'age': 40 },
36632                     *   { 'user': 'barney', 'age': 36 }
36633                     * ];
36634                     *
36635                     * // Sort by `user` in ascending order and by `age` in descending order.
36636                     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
36637                     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
36638                     */
36639                    function orderBy(collection, iteratees, orders, guard) {
36640                        if (collection == null) {
36641                            return [];
36642                        }
36643                        if (!isArray(iteratees)) {
36644                            iteratees = iteratees == null ? [] : [iteratees];
36645                        }
36646                        orders = guard ? undefined : orders;
36647                        if (!isArray(orders)) {
36648                            orders = orders == null ? [] : [orders];
36649                        }
36650                        return baseOrderBy(collection, iteratees, orders);
36651                    }
36652
36653                    /**
36654                     * Creates an array of elements split into two groups, the first of which
36655                     * contains elements `predicate` returns truthy for, the second of which
36656                     * contains elements `predicate` returns falsey for. The predicate is
36657                     * invoked with one argument: (value).
36658                     *
36659                     * @static
36660                     * @memberOf _
36661                     * @since 3.0.0
36662                     * @category Collection
36663                     * @param {Array|Object} collection The collection to iterate over.
36664                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
36665                     * @returns {Array} Returns the array of grouped elements.
36666                     * @example
36667                     *
36668                     * var users = [
36669                     *   { 'user': 'barney',  'age': 36, 'active': false },
36670                     *   { 'user': 'fred',    'age': 40, 'active': true },
36671                     *   { 'user': 'pebbles', 'age': 1,  'active': false }
36672                     * ];
36673                     *
36674                     * _.partition(users, function(o) { return o.active; });
36675                     * // => objects for [['fred'], ['barney', 'pebbles']]
36676                     *
36677                     * // The `_.matches` iteratee shorthand.
36678                     * _.partition(users, { 'age': 1, 'active': false });
36679                     * // => objects for [['pebbles'], ['barney', 'fred']]
36680                     *
36681                     * // The `_.matchesProperty` iteratee shorthand.
36682                     * _.partition(users, ['active', false]);
36683                     * // => objects for [['barney', 'pebbles'], ['fred']]
36684                     *
36685                     * // The `_.property` iteratee shorthand.
36686                     * _.partition(users, 'active');
36687                     * // => objects for [['fred'], ['barney', 'pebbles']]
36688                     */
36689                    var partition = createAggregator(function(result, value, key) {
36690                        result[key ? 0 : 1].push(value);
36691                    }, function() { return [[], []]; });
36692
36693                    /**
36694                     * Reduces `collection` to a value which is the accumulated result of running
36695                     * each element in `collection` thru `iteratee`, where each successive
36696                     * invocation is supplied the return value of the previous. If `accumulator`
36697                     * is not given, the first element of `collection` is used as the initial
36698                     * value. The iteratee is invoked with four arguments:
36699                     * (accumulator, value, index|key, collection).
36700                     *
36701                     * Many lodash methods are guarded to work as iteratees for methods like
36702                     * `_.reduce`, `_.reduceRight`, and `_.transform`.
36703                     *
36704                     * The guarded methods are:
36705                     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
36706                     * and `sortBy`
36707                     *
36708                     * @static
36709                     * @memberOf _
36710                     * @since 0.1.0
36711                     * @category Collection
36712                     * @param {Array|Object} collection The collection to iterate over.
36713                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36714                     * @param {*} [accumulator] The initial value.
36715                     * @returns {*} Returns the accumulated value.
36716                     * @see _.reduceRight
36717                     * @example
36718                     *
36719                     * _.reduce([1, 2], function(sum, n) {
36720                     *   return sum + n;
36721                     * }, 0);
36722                     * // => 3
36723                     *
36724                     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
36725                     *   (result[value] || (result[value] = [])).push(key);
36726                     *   return result;
36727                     * }, {});
36728                     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
36729                     */
36730                    function reduce(collection, iteratee, accumulator) {
36731                        var func = isArray(collection) ? arrayReduce : baseReduce,
36732                            initAccum = arguments.length < 3;
36733
36734                        return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
36735                    }
36736
36737                    /**
36738                     * This method is like `_.reduce` except that it iterates over elements of
36739                     * `collection` from right to left.
36740                     *
36741                     * @static
36742                     * @memberOf _
36743                     * @since 0.1.0
36744                     * @category Collection
36745                     * @param {Array|Object} collection The collection to iterate over.
36746                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
36747                     * @param {*} [accumulator] The initial value.
36748                     * @returns {*} Returns the accumulated value.
36749                     * @see _.reduce
36750                     * @example
36751                     *
36752                     * var array = [[0, 1], [2, 3], [4, 5]];
36753                     *
36754                     * _.reduceRight(array, function(flattened, other) {
36755                     *   return flattened.concat(other);
36756                     * }, []);
36757                     * // => [4, 5, 2, 3, 0, 1]
36758                     */
36759                    function reduceRight(collection, iteratee, accumulator) {
36760                        var func = isArray(collection) ? arrayReduceRight : baseReduce,
36761                            initAccum = arguments.length < 3;
36762
36763                        return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
36764                    }
36765
36766                    /**
36767                     * The opposite of `_.filter`; this method returns the elements of `collection`
36768                     * that `predicate` does **not** return truthy for.
36769                     *
36770                     * @static
36771                     * @memberOf _
36772                     * @since 0.1.0
36773                     * @category Collection
36774                     * @param {Array|Object} collection The collection to iterate over.
36775                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
36776                     * @returns {Array} Returns the new filtered array.
36777                     * @see _.filter
36778                     * @example
36779                     *
36780                     * var users = [
36781                     *   { 'user': 'barney', 'age': 36, 'active': false },
36782                     *   { 'user': 'fred',   'age': 40, 'active': true }
36783                     * ];
36784                     *
36785                     * _.reject(users, function(o) { return !o.active; });
36786                     * // => objects for ['fred']
36787                     *
36788                     * // The `_.matches` iteratee shorthand.
36789                     * _.reject(users, { 'age': 40, 'active': true });
36790                     * // => objects for ['barney']
36791                     *
36792                     * // The `_.matchesProperty` iteratee shorthand.
36793                     * _.reject(users, ['active', false]);
36794                     * // => objects for ['fred']
36795                     *
36796                     * // The `_.property` iteratee shorthand.
36797                     * _.reject(users, 'active');
36798                     * // => objects for ['barney']
36799                     */
36800                    function reject(collection, predicate) {
36801                        var func = isArray(collection) ? arrayFilter : baseFilter;
36802                        return func(collection, negate(getIteratee(predicate, 3)));
36803                    }
36804
36805                    /**
36806                     * Gets a random element from `collection`.
36807                     *
36808                     * @static
36809                     * @memberOf _
36810                     * @since 2.0.0
36811                     * @category Collection
36812                     * @param {Array|Object} collection The collection to sample.
36813                     * @returns {*} Returns the random element.
36814                     * @example
36815                     *
36816                     * _.sample([1, 2, 3, 4]);
36817                     * // => 2
36818                     */
36819                    function sample(collection) {
36820                        var func = isArray(collection) ? arraySample : baseSample;
36821                        return func(collection);
36822                    }
36823
36824                    /**
36825                     * Gets `n` random elements at unique keys from `collection` up to the
36826                     * size of `collection`.
36827                     *
36828                     * @static
36829                     * @memberOf _
36830                     * @since 4.0.0
36831                     * @category Collection
36832                     * @param {Array|Object} collection The collection to sample.
36833                     * @param {number} [n=1] The number of elements to sample.
36834                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
36835                     * @returns {Array} Returns the random elements.
36836                     * @example
36837                     *
36838                     * _.sampleSize([1, 2, 3], 2);
36839                     * // => [3, 1]
36840                     *
36841                     * _.sampleSize([1, 2, 3], 4);
36842                     * // => [2, 3, 1]
36843                     */
36844                    function sampleSize(collection, n, guard) {
36845                        if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
36846                            n = 1;
36847                        } else {
36848                            n = toInteger(n);
36849                        }
36850                        var func = isArray(collection) ? arraySampleSize : baseSampleSize;
36851                        return func(collection, n);
36852                    }
36853
36854                    /**
36855                     * Creates an array of shuffled values, using a version of the
36856                     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
36857                     *
36858                     * @static
36859                     * @memberOf _
36860                     * @since 0.1.0
36861                     * @category Collection
36862                     * @param {Array|Object} collection The collection to shuffle.
36863                     * @returns {Array} Returns the new shuffled array.
36864                     * @example
36865                     *
36866                     * _.shuffle([1, 2, 3, 4]);
36867                     * // => [4, 1, 3, 2]
36868                     */
36869                    function shuffle(collection) {
36870                        var func = isArray(collection) ? arrayShuffle : baseShuffle;
36871                        return func(collection);
36872                    }
36873
36874                    /**
36875                     * Gets the size of `collection` by returning its length for array-like
36876                     * values or the number of own enumerable string keyed properties for objects.
36877                     *
36878                     * @static
36879                     * @memberOf _
36880                     * @since 0.1.0
36881                     * @category Collection
36882                     * @param {Array|Object|string} collection The collection to inspect.
36883                     * @returns {number} Returns the collection size.
36884                     * @example
36885                     *
36886                     * _.size([1, 2, 3]);
36887                     * // => 3
36888                     *
36889                     * _.size({ 'a': 1, 'b': 2 });
36890                     * // => 2
36891                     *
36892                     * _.size('pebbles');
36893                     * // => 7
36894                     */
36895                    function size(collection) {
36896                        if (collection == null) {
36897                            return 0;
36898                        }
36899                        if (isArrayLike(collection)) {
36900                            return isString(collection) ? stringSize(collection) : collection.length;
36901                        }
36902                        var tag = getTag(collection);
36903                        if (tag == mapTag || tag == setTag) {
36904                            return collection.size;
36905                        }
36906                        return baseKeys(collection).length;
36907                    }
36908
36909                    /**
36910                     * Checks if `predicate` returns truthy for **any** element of `collection`.
36911                     * Iteration is stopped once `predicate` returns truthy. The predicate is
36912                     * invoked with three arguments: (value, index|key, collection).
36913                     *
36914                     * @static
36915                     * @memberOf _
36916                     * @since 0.1.0
36917                     * @category Collection
36918                     * @param {Array|Object} collection The collection to iterate over.
36919                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
36920                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
36921                     * @returns {boolean} Returns `true` if any element passes the predicate check,
36922                     *  else `false`.
36923                     * @example
36924                     *
36925                     * _.some([null, 0, 'yes', false], Boolean);
36926                     * // => true
36927                     *
36928                     * var users = [
36929                     *   { 'user': 'barney', 'active': true },
36930                     *   { 'user': 'fred',   'active': false }
36931                     * ];
36932                     *
36933                     * // The `_.matches` iteratee shorthand.
36934                     * _.some(users, { 'user': 'barney', 'active': false });
36935                     * // => false
36936                     *
36937                     * // The `_.matchesProperty` iteratee shorthand.
36938                     * _.some(users, ['active', false]);
36939                     * // => true
36940                     *
36941                     * // The `_.property` iteratee shorthand.
36942                     * _.some(users, 'active');
36943                     * // => true
36944                     */
36945                    function some(collection, predicate, guard) {
36946                        var func = isArray(collection) ? arraySome : baseSome;
36947                        if (guard && isIterateeCall(collection, predicate, guard)) {
36948                            predicate = undefined;
36949                        }
36950                        return func(collection, getIteratee(predicate, 3));
36951                    }
36952
36953                    /**
36954                     * Creates an array of elements, sorted in ascending order by the results of
36955                     * running each element in a collection thru each iteratee. This method
36956                     * performs a stable sort, that is, it preserves the original sort order of
36957                     * equal elements. The iteratees are invoked with one argument: (value).
36958                     *
36959                     * @static
36960                     * @memberOf _
36961                     * @since 0.1.0
36962                     * @category Collection
36963                     * @param {Array|Object} collection The collection to iterate over.
36964                     * @param {...(Function|Function[])} [iteratees=[_.identity]]
36965                     *  The iteratees to sort by.
36966                     * @returns {Array} Returns the new sorted array.
36967                     * @example
36968                     *
36969                     * var users = [
36970                     *   { 'user': 'fred',   'age': 48 },
36971                     *   { 'user': 'barney', 'age': 36 },
36972                     *   { 'user': 'fred',   'age': 30 },
36973                     *   { 'user': 'barney', 'age': 34 }
36974                     * ];
36975                     *
36976                     * _.sortBy(users, [function(o) { return o.user; }]);
36977                     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
36978                     *
36979                     * _.sortBy(users, ['user', 'age']);
36980                     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
36981                     */
36982                    var sortBy = baseRest(function(collection, iteratees) {
36983                        if (collection == null) {
36984                            return [];
36985                        }
36986                        var length = iteratees.length;
36987                        if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
36988                            iteratees = [];
36989                        } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
36990                            iteratees = [iteratees[0]];
36991                        }
36992                        return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
36993                    });
36994
36995                    /*------------------------------------------------------------------------*/
36996
36997                    /**
36998                     * Gets the timestamp of the number of milliseconds that have elapsed since
36999                     * the Unix epoch (1 January 1970 00:00:00 UTC).
37000                     *
37001                     * @static
37002                     * @memberOf _
37003                     * @since 2.4.0
37004                     * @category Date
37005                     * @returns {number} Returns the timestamp.
37006                     * @example
37007                     *
37008                     * _.defer(function(stamp) {
37009                     *   console.log(_.now() - stamp);
37010                     * }, _.now());
37011                     * // => Logs the number of milliseconds it took for the deferred invocation.
37012                     */
37013                    var now = ctxNow || function() {
37014                        return root.Date.now();
37015                    };
37016
37017                    /*------------------------------------------------------------------------*/
37018
37019                    /**
37020                     * The opposite of `_.before`; this method creates a function that invokes
37021                     * `func` once it's called `n` or more times.
37022                     *
37023                     * @static
37024                     * @memberOf _
37025                     * @since 0.1.0
37026                     * @category Function
37027                     * @param {number} n The number of calls before `func` is invoked.
37028                     * @param {Function} func The function to restrict.
37029                     * @returns {Function} Returns the new restricted function.
37030                     * @example
37031                     *
37032                     * var saves = ['profile', 'settings'];
37033                     *
37034                     * var done = _.after(saves.length, function() {
37035                     *   console.log('done saving!');
37036                     * });
37037                     *
37038                     * _.forEach(saves, function(type) {
37039                     *   asyncSave({ 'type': type, 'complete': done });
37040                     * });
37041                     * // => Logs 'done saving!' after the two async saves have completed.
37042                     */
37043                    function after(n, func) {
37044                        if (typeof func != 'function') {
37045                            throw new TypeError(FUNC_ERROR_TEXT);
37046                        }
37047                        n = toInteger(n);
37048                        return function() {
37049                            if (--n < 1) {
37050                                return func.apply(this, arguments);
37051                            }
37052                        };
37053                    }
37054
37055                    /**
37056                     * Creates a function that invokes `func`, with up to `n` arguments,
37057                     * ignoring any additional arguments.
37058                     *
37059                     * @static
37060                     * @memberOf _
37061                     * @since 3.0.0
37062                     * @category Function
37063                     * @param {Function} func The function to cap arguments for.
37064                     * @param {number} [n=func.length] The arity cap.
37065                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
37066                     * @returns {Function} Returns the new capped function.
37067                     * @example
37068                     *
37069                     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
37070                     * // => [6, 8, 10]
37071                     */
37072                    function ary(func, n, guard) {
37073                        n = guard ? undefined : n;
37074                        n = (func && n == null) ? func.length : n;
37075                        return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
37076                    }
37077
37078                    /**
37079                     * Creates a function that invokes `func`, with the `this` binding and arguments
37080                     * of the created function, while it's called less than `n` times. Subsequent
37081                     * calls to the created function return the result of the last `func` invocation.
37082                     *
37083                     * @static
37084                     * @memberOf _
37085                     * @since 3.0.0
37086                     * @category Function
37087                     * @param {number} n The number of calls at which `func` is no longer invoked.
37088                     * @param {Function} func The function to restrict.
37089                     * @returns {Function} Returns the new restricted function.
37090                     * @example
37091                     *
37092                     * jQuery(element).on('click', _.before(5, addContactToList));
37093                     * // => Allows adding up to 4 contacts to the list.
37094                     */
37095                    function before(n, func) {
37096                        var result;
37097                        if (typeof func != 'function') {
37098                            throw new TypeError(FUNC_ERROR_TEXT);
37099                        }
37100                        n = toInteger(n);
37101                        return function() {
37102                            if (--n > 0) {
37103                                result = func.apply(this, arguments);
37104                            }
37105                            if (n <= 1) {
37106                                func = undefined;
37107                            }
37108                            return result;
37109                        };
37110                    }
37111
37112                    /**
37113                     * Creates a function that invokes `func` with the `this` binding of `thisArg`
37114                     * and `partials` prepended to the arguments it receives.
37115                     *
37116                     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
37117                     * may be used as a placeholder for partially applied arguments.
37118                     *
37119                     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
37120                     * property of bound functions.
37121                     *
37122                     * @static
37123                     * @memberOf _
37124                     * @since 0.1.0
37125                     * @category Function
37126                     * @param {Function} func The function to bind.
37127                     * @param {*} thisArg The `this` binding of `func`.
37128                     * @param {...*} [partials] The arguments to be partially applied.
37129                     * @returns {Function} Returns the new bound function.
37130                     * @example
37131                     *
37132                     * function greet(greeting, punctuation) {
37133                     *   return greeting + ' ' + this.user + punctuation;
37134                     * }
37135                     *
37136                     * var object = { 'user': 'fred' };
37137                     *
37138                     * var bound = _.bind(greet, object, 'hi');
37139                     * bound('!');
37140                     * // => 'hi fred!'
37141                     *
37142                     * // Bound with placeholders.
37143                     * var bound = _.bind(greet, object, _, '!');
37144                     * bound('hi');
37145                     * // => 'hi fred!'
37146                     */
37147                    var bind = baseRest(function(func, thisArg, partials) {
37148                        var bitmask = WRAP_BIND_FLAG;
37149                        if (partials.length) {
37150                            var holders = replaceHolders(partials, getHolder(bind));
37151                            bitmask |= WRAP_PARTIAL_FLAG;
37152                        }
37153                        return createWrap(func, bitmask, thisArg, partials, holders);
37154                    });
37155
37156                    /**
37157                     * Creates a function that invokes the method at `object[key]` with `partials`
37158                     * prepended to the arguments it receives.
37159                     *
37160                     * This method differs from `_.bind` by allowing bound functions to reference
37161                     * methods that may be redefined or don't yet exist. See
37162                     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
37163                     * for more details.
37164                     *
37165                     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
37166                     * builds, may be used as a placeholder for partially applied arguments.
37167                     *
37168                     * @static
37169                     * @memberOf _
37170                     * @since 0.10.0
37171                     * @category Function
37172                     * @param {Object} object The object to invoke the method on.
37173                     * @param {string} key The key of the method.
37174                     * @param {...*} [partials] The arguments to be partially applied.
37175                     * @returns {Function} Returns the new bound function.
37176                     * @example
37177                     *
37178                     * var object = {
37179                     *   'user': 'fred',
37180                     *   'greet': function(greeting, punctuation) {
37181                     *     return greeting + ' ' + this.user + punctuation;
37182                     *   }
37183                     * };
37184                     *
37185                     * var bound = _.bindKey(object, 'greet', 'hi');
37186                     * bound('!');
37187                     * // => 'hi fred!'
37188                     *
37189                     * object.greet = function(greeting, punctuation) {
37190                     *   return greeting + 'ya ' + this.user + punctuation;
37191                     * };
37192                     *
37193                     * bound('!');
37194                     * // => 'hiya fred!'
37195                     *
37196                     * // Bound with placeholders.
37197                     * var bound = _.bindKey(object, 'greet', _, '!');
37198                     * bound('hi');
37199                     * // => 'hiya fred!'
37200                     */
37201                    var bindKey = baseRest(function(object, key, partials) {
37202                        var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
37203                        if (partials.length) {
37204                            var holders = replaceHolders(partials, getHolder(bindKey));
37205                            bitmask |= WRAP_PARTIAL_FLAG;
37206                        }
37207                        return createWrap(key, bitmask, object, partials, holders);
37208                    });
37209
37210                    /**
37211                     * Creates a function that accepts arguments of `func` and either invokes
37212                     * `func` returning its result, if at least `arity` number of arguments have
37213                     * been provided, or returns a function that accepts the remaining `func`
37214                     * arguments, and so on. The arity of `func` may be specified if `func.length`
37215                     * is not sufficient.
37216                     *
37217                     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
37218                     * may be used as a placeholder for provided arguments.
37219                     *
37220                     * **Note:** This method doesn't set the "length" property of curried functions.
37221                     *
37222                     * @static
37223                     * @memberOf _
37224                     * @since 2.0.0
37225                     * @category Function
37226                     * @param {Function} func The function to curry.
37227                     * @param {number} [arity=func.length] The arity of `func`.
37228                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
37229                     * @returns {Function} Returns the new curried function.
37230                     * @example
37231                     *
37232                     * var abc = function(a, b, c) {
37233                     *   return [a, b, c];
37234                     * };
37235                     *
37236                     * var curried = _.curry(abc);
37237                     *
37238                     * curried(1)(2)(3);
37239                     * // => [1, 2, 3]
37240                     *
37241                     * curried(1, 2)(3);
37242                     * // => [1, 2, 3]
37243                     *
37244                     * curried(1, 2, 3);
37245                     * // => [1, 2, 3]
37246                     *
37247                     * // Curried with placeholders.
37248                     * curried(1)(_, 3)(2);
37249                     * // => [1, 2, 3]
37250                     */
37251                    function curry(func, arity, guard) {
37252                        arity = guard ? undefined : arity;
37253                        var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
37254                        result.placeholder = curry.placeholder;
37255                        return result;
37256                    }
37257
37258                    /**
37259                     * This method is like `_.curry` except that arguments are applied to `func`
37260                     * in the manner of `_.partialRight` instead of `_.partial`.
37261                     *
37262                     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
37263                     * builds, may be used as a placeholder for provided arguments.
37264                     *
37265                     * **Note:** This method doesn't set the "length" property of curried functions.
37266                     *
37267                     * @static
37268                     * @memberOf _
37269                     * @since 3.0.0
37270                     * @category Function
37271                     * @param {Function} func The function to curry.
37272                     * @param {number} [arity=func.length] The arity of `func`.
37273                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
37274                     * @returns {Function} Returns the new curried function.
37275                     * @example
37276                     *
37277                     * var abc = function(a, b, c) {
37278                     *   return [a, b, c];
37279                     * };
37280                     *
37281                     * var curried = _.curryRight(abc);
37282                     *
37283                     * curried(3)(2)(1);
37284                     * // => [1, 2, 3]
37285                     *
37286                     * curried(2, 3)(1);
37287                     * // => [1, 2, 3]
37288                     *
37289                     * curried(1, 2, 3);
37290                     * // => [1, 2, 3]
37291                     *
37292                     * // Curried with placeholders.
37293                     * curried(3)(1, _)(2);
37294                     * // => [1, 2, 3]
37295                     */
37296                    function curryRight(func, arity, guard) {
37297                        arity = guard ? undefined : arity;
37298                        var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
37299                        result.placeholder = curryRight.placeholder;
37300                        return result;
37301                    }
37302
37303                    /**
37304                     * Creates a debounced function that delays invoking `func` until after `wait`
37305                     * milliseconds have elapsed since the last time the debounced function was
37306                     * invoked. The debounced function comes with a `cancel` method to cancel
37307                     * delayed `func` invocations and a `flush` method to immediately invoke them.
37308                     * Provide `options` to indicate whether `func` should be invoked on the
37309                     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
37310                     * with the last arguments provided to the debounced function. Subsequent
37311                     * calls to the debounced function return the result of the last `func`
37312                     * invocation.
37313                     *
37314                     * **Note:** If `leading` and `trailing` options are `true`, `func` is
37315                     * invoked on the trailing edge of the timeout only if the debounced function
37316                     * is invoked more than once during the `wait` timeout.
37317                     *
37318                     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
37319                     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
37320                     *
37321                     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
37322                     * for details over the differences between `_.debounce` and `_.throttle`.
37323                     *
37324                     * @static
37325                     * @memberOf _
37326                     * @since 0.1.0
37327                     * @category Function
37328                     * @param {Function} func The function to debounce.
37329                     * @param {number} [wait=0] The number of milliseconds to delay.
37330                     * @param {Object} [options={}] The options object.
37331                     * @param {boolean} [options.leading=false]
37332                     *  Specify invoking on the leading edge of the timeout.
37333                     * @param {number} [options.maxWait]
37334                     *  The maximum time `func` is allowed to be delayed before it's invoked.
37335                     * @param {boolean} [options.trailing=true]
37336                     *  Specify invoking on the trailing edge of the timeout.
37337                     * @returns {Function} Returns the new debounced function.
37338                     * @example
37339                     *
37340                     * // Avoid costly calculations while the window size is in flux.
37341                     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
37342                     *
37343                     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
37344                     * jQuery(element).on('click', _.debounce(sendMail, 300, {
37345                     *   'leading': true,
37346                     *   'trailing': false
37347                     * }));
37348                     *
37349                     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
37350                     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
37351                     * var source = new EventSource('/stream');
37352                     * jQuery(source).on('message', debounced);
37353                     *
37354                     * // Cancel the trailing debounced invocation.
37355                     * jQuery(window).on('popstate', debounced.cancel);
37356                     */
37357                    function debounce(func, wait, options) {
37358                        var lastArgs,
37359                            lastThis,
37360                            maxWait,
37361                            result,
37362                            timerId,
37363                            lastCallTime,
37364                            lastInvokeTime = 0,
37365                            leading = false,
37366                            maxing = false,
37367                            trailing = true;
37368
37369                        if (typeof func != 'function') {
37370                            throw new TypeError(FUNC_ERROR_TEXT);
37371                        }
37372                        wait = toNumber(wait) || 0;
37373                        if (isObject(options)) {
37374                            leading = !!options.leading;
37375                            maxing = 'maxWait' in options;
37376                            maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
37377                            trailing = 'trailing' in options ? !!options.trailing : trailing;
37378                        }
37379
37380                        function invokeFunc(time) {
37381                            var args = lastArgs,
37382                                thisArg = lastThis;
37383
37384                            lastArgs = lastThis = undefined;
37385                            lastInvokeTime = time;
37386                            result = func.apply(thisArg, args);
37387                            return result;
37388                        }
37389
37390                        function leadingEdge(time) {
37391                            // Reset any `maxWait` timer.
37392                            lastInvokeTime = time;
37393                            // Start the timer for the trailing edge.
37394                            timerId = setTimeout(timerExpired, wait);
37395                            // Invoke the leading edge.
37396                            return leading ? invokeFunc(time) : result;
37397                        }
37398
37399                        function remainingWait(time) {
37400                            var timeSinceLastCall = time - lastCallTime,
37401                                timeSinceLastInvoke = time - lastInvokeTime,
37402                                timeWaiting = wait - timeSinceLastCall;
37403
37404                            return maxing
37405                                ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
37406                                : timeWaiting;
37407                        }
37408
37409                        function shouldInvoke(time) {
37410                            var timeSinceLastCall = time - lastCallTime,
37411                                timeSinceLastInvoke = time - lastInvokeTime;
37412
37413                            // Either this is the first call, activity has stopped and we're at the
37414                            // trailing edge, the system time has gone backwards and we're treating
37415                            // it as the trailing edge, or we've hit the `maxWait` limit.
37416                            return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
37417                                (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
37418                        }
37419
37420                        function timerExpired() {
37421                            var time = now();
37422                            if (shouldInvoke(time)) {
37423                                return trailingEdge(time);
37424                            }
37425                            // Restart the timer.
37426                            timerId = setTimeout(timerExpired, remainingWait(time));
37427                        }
37428
37429                        function trailingEdge(time) {
37430                            timerId = undefined;
37431
37432                            // Only invoke if we have `lastArgs` which means `func` has been
37433                            // debounced at least once.
37434                            if (trailing && lastArgs) {
37435                                return invokeFunc(time);
37436                            }
37437                            lastArgs = lastThis = undefined;
37438                            return result;
37439                        }
37440
37441                        function cancel() {
37442                            if (timerId !== undefined) {
37443                                clearTimeout(timerId);
37444                            }
37445                            lastInvokeTime = 0;
37446                            lastArgs = lastCallTime = lastThis = timerId = undefined;
37447                        }
37448
37449                        function flush() {
37450                            return timerId === undefined ? result : trailingEdge(now());
37451                        }
37452
37453                        function debounced() {
37454                            var time = now(),
37455                                isInvoking = shouldInvoke(time);
37456
37457                            lastArgs = arguments;
37458                            lastThis = this;
37459                            lastCallTime = time;
37460
37461                            if (isInvoking) {
37462                                if (timerId === undefined) {
37463                                    return leadingEdge(lastCallTime);
37464                                }
37465                                if (maxing) {
37466                                    // Handle invocations in a tight loop.
37467                                    clearTimeout(timerId);
37468                                    timerId = setTimeout(timerExpired, wait);
37469                                    return invokeFunc(lastCallTime);
37470                                }
37471                            }
37472                            if (timerId === undefined) {
37473                                timerId = setTimeout(timerExpired, wait);
37474                            }
37475                            return result;
37476                        }
37477                        debounced.cancel = cancel;
37478                        debounced.flush = flush;
37479                        return debounced;
37480                    }
37481
37482                    /**
37483                     * Defers invoking the `func` until the current call stack has cleared. Any
37484                     * additional arguments are provided to `func` when it's invoked.
37485                     *
37486                     * @static
37487                     * @memberOf _
37488                     * @since 0.1.0
37489                     * @category Function
37490                     * @param {Function} func The function to defer.
37491                     * @param {...*} [args] The arguments to invoke `func` with.
37492                     * @returns {number} Returns the timer id.
37493                     * @example
37494                     *
37495                     * _.defer(function(text) {
37496                     *   console.log(text);
37497                     * }, 'deferred');
37498                     * // => Logs 'deferred' after one millisecond.
37499                     */
37500                    var defer = baseRest(function(func, args) {
37501                        return baseDelay(func, 1, args);
37502                    });
37503
37504                    /**
37505                     * Invokes `func` after `wait` milliseconds. Any additional arguments are
37506                     * provided to `func` when it's invoked.
37507                     *
37508                     * @static
37509                     * @memberOf _
37510                     * @since 0.1.0
37511                     * @category Function
37512                     * @param {Function} func The function to delay.
37513                     * @param {number} wait The number of milliseconds to delay invocation.
37514                     * @param {...*} [args] The arguments to invoke `func` with.
37515                     * @returns {number} Returns the timer id.
37516                     * @example
37517                     *
37518                     * _.delay(function(text) {
37519                     *   console.log(text);
37520                     * }, 1000, 'later');
37521                     * // => Logs 'later' after one second.
37522                     */
37523                    var delay = baseRest(function(func, wait, args) {
37524                        return baseDelay(func, toNumber(wait) || 0, args);
37525                    });
37526
37527                    /**
37528                     * Creates a function that invokes `func` with arguments reversed.
37529                     *
37530                     * @static
37531                     * @memberOf _
37532                     * @since 4.0.0
37533                     * @category Function
37534                     * @param {Function} func The function to flip arguments for.
37535                     * @returns {Function} Returns the new flipped function.
37536                     * @example
37537                     *
37538                     * var flipped = _.flip(function() {
37539                     *   return _.toArray(arguments);
37540                     * });
37541                     *
37542                     * flipped('a', 'b', 'c', 'd');
37543                     * // => ['d', 'c', 'b', 'a']
37544                     */
37545                    function flip(func) {
37546                        return createWrap(func, WRAP_FLIP_FLAG);
37547                    }
37548
37549                    /**
37550                     * Creates a function that memoizes the result of `func`. If `resolver` is
37551                     * provided, it determines the cache key for storing the result based on the
37552                     * arguments provided to the memoized function. By default, the first argument
37553                     * provided to the memoized function is used as the map cache key. The `func`
37554                     * is invoked with the `this` binding of the memoized function.
37555                     *
37556                     * **Note:** The cache is exposed as the `cache` property on the memoized
37557                     * function. Its creation may be customized by replacing the `_.memoize.Cache`
37558                     * constructor with one whose instances implement the
37559                     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
37560                     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
37561                     *
37562                     * @static
37563                     * @memberOf _
37564                     * @since 0.1.0
37565                     * @category Function
37566                     * @param {Function} func The function to have its output memoized.
37567                     * @param {Function} [resolver] The function to resolve the cache key.
37568                     * @returns {Function} Returns the new memoized function.
37569                     * @example
37570                     *
37571                     * var object = { 'a': 1, 'b': 2 };
37572                     * var other = { 'c': 3, 'd': 4 };
37573                     *
37574                     * var values = _.memoize(_.values);
37575                     * values(object);
37576                     * // => [1, 2]
37577                     *
37578                     * values(other);
37579                     * // => [3, 4]
37580                     *
37581                     * object.a = 2;
37582                     * values(object);
37583                     * // => [1, 2]
37584                     *
37585                     * // Modify the result cache.
37586                     * values.cache.set(object, ['a', 'b']);
37587                     * values(object);
37588                     * // => ['a', 'b']
37589                     *
37590                     * // Replace `_.memoize.Cache`.
37591                     * _.memoize.Cache = WeakMap;
37592                     */
37593                    function memoize(func, resolver) {
37594                        if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
37595                            throw new TypeError(FUNC_ERROR_TEXT);
37596                        }
37597                        var memoized = function() {
37598                            var args = arguments,
37599                                key = resolver ? resolver.apply(this, args) : args[0],
37600                                cache = memoized.cache;
37601
37602                            if (cache.has(key)) {
37603                                return cache.get(key);
37604                            }
37605                            var result = func.apply(this, args);
37606                            memoized.cache = cache.set(key, result) || cache;
37607                            return result;
37608                        };
37609                        memoized.cache = new (memoize.Cache || MapCache);
37610                        return memoized;
37611                    }
37612
37613                    // Expose `MapCache`.
37614                    memoize.Cache = MapCache;
37615
37616                    /**
37617                     * Creates a function that negates the result of the predicate `func`. The
37618                     * `func` predicate is invoked with the `this` binding and arguments of the
37619                     * created function.
37620                     *
37621                     * @static
37622                     * @memberOf _
37623                     * @since 3.0.0
37624                     * @category Function
37625                     * @param {Function} predicate The predicate to negate.
37626                     * @returns {Function} Returns the new negated function.
37627                     * @example
37628                     *
37629                     * function isEven(n) {
37630                     *   return n % 2 == 0;
37631                     * }
37632                     *
37633                     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
37634                     * // => [1, 3, 5]
37635                     */
37636                    function negate(predicate) {
37637                        if (typeof predicate != 'function') {
37638                            throw new TypeError(FUNC_ERROR_TEXT);
37639                        }
37640                        return function() {
37641                            var args = arguments;
37642                            switch (args.length) {
37643                                case 0: return !predicate.call(this);
37644                                case 1: return !predicate.call(this, args[0]);
37645                                case 2: return !predicate.call(this, args[0], args[1]);
37646                                case 3: return !predicate.call(this, args[0], args[1], args[2]);
37647                            }
37648                            return !predicate.apply(this, args);
37649                        };
37650                    }
37651
37652                    /**
37653                     * Creates a function that is restricted to invoking `func` once. Repeat calls
37654                     * to the function return the value of the first invocation. The `func` is
37655                     * invoked with the `this` binding and arguments of the created function.
37656                     *
37657                     * @static
37658                     * @memberOf _
37659                     * @since 0.1.0
37660                     * @category Function
37661                     * @param {Function} func The function to restrict.
37662                     * @returns {Function} Returns the new restricted function.
37663                     * @example
37664                     *
37665                     * var initialize = _.once(createApplication);
37666                     * initialize();
37667                     * initialize();
37668                     * // => `createApplication` is invoked once
37669                     */
37670                    function once(func) {
37671                        return before(2, func);
37672                    }
37673
37674                    /**
37675                     * Creates a function that invokes `func` with its arguments transformed.
37676                     *
37677                     * @static
37678                     * @since 4.0.0
37679                     * @memberOf _
37680                     * @category Function
37681                     * @param {Function} func The function to wrap.
37682                     * @param {...(Function|Function[])} [transforms=[_.identity]]
37683                     *  The argument transforms.
37684                     * @returns {Function} Returns the new function.
37685                     * @example
37686                     *
37687                     * function doubled(n) {
37688                     *   return n * 2;
37689                     * }
37690                     *
37691                     * function square(n) {
37692                     *   return n * n;
37693                     * }
37694                     *
37695                     * var func = _.overArgs(function(x, y) {
37696                     *   return [x, y];
37697                     * }, [square, doubled]);
37698                     *
37699                     * func(9, 3);
37700                     * // => [81, 6]
37701                     *
37702                     * func(10, 5);
37703                     * // => [100, 10]
37704                     */
37705                    var overArgs = castRest(function(func, transforms) {
37706                        transforms = (transforms.length == 1 && isArray(transforms[0]))
37707                            ? arrayMap(transforms[0], baseUnary(getIteratee()))
37708                            : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
37709
37710                        var funcsLength = transforms.length;
37711                        return baseRest(function(args) {
37712                            var index = -1,
37713                                length = nativeMin(args.length, funcsLength);
37714
37715                            while (++index < length) {
37716                                args[index] = transforms[index].call(this, args[index]);
37717                            }
37718                            return apply(func, this, args);
37719                        });
37720                    });
37721
37722                    /**
37723                     * Creates a function that invokes `func` with `partials` prepended to the
37724                     * arguments it receives. This method is like `_.bind` except it does **not**
37725                     * alter the `this` binding.
37726                     *
37727                     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
37728                     * builds, may be used as a placeholder for partially applied arguments.
37729                     *
37730                     * **Note:** This method doesn't set the "length" property of partially
37731                     * applied functions.
37732                     *
37733                     * @static
37734                     * @memberOf _
37735                     * @since 0.2.0
37736                     * @category Function
37737                     * @param {Function} func The function to partially apply arguments to.
37738                     * @param {...*} [partials] The arguments to be partially applied.
37739                     * @returns {Function} Returns the new partially applied function.
37740                     * @example
37741                     *
37742                     * function greet(greeting, name) {
37743                     *   return greeting + ' ' + name;
37744                     * }
37745                     *
37746                     * var sayHelloTo = _.partial(greet, 'hello');
37747                     * sayHelloTo('fred');
37748                     * // => 'hello fred'
37749                     *
37750                     * // Partially applied with placeholders.
37751                     * var greetFred = _.partial(greet, _, 'fred');
37752                     * greetFred('hi');
37753                     * // => 'hi fred'
37754                     */
37755                    var partial = baseRest(function(func, partials) {
37756                        var holders = replaceHolders(partials, getHolder(partial));
37757                        return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
37758                    });
37759
37760                    /**
37761                     * This method is like `_.partial` except that partially applied arguments
37762                     * are appended to the arguments it receives.
37763                     *
37764                     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
37765                     * builds, may be used as a placeholder for partially applied arguments.
37766                     *
37767                     * **Note:** This method doesn't set the "length" property of partially
37768                     * applied functions.
37769                     *
37770                     * @static
37771                     * @memberOf _
37772                     * @since 1.0.0
37773                     * @category Function
37774                     * @param {Function} func The function to partially apply arguments to.
37775                     * @param {...*} [partials] The arguments to be partially applied.
37776                     * @returns {Function} Returns the new partially applied function.
37777                     * @example
37778                     *
37779                     * function greet(greeting, name) {
37780                     *   return greeting + ' ' + name;
37781                     * }
37782                     *
37783                     * var greetFred = _.partialRight(greet, 'fred');
37784                     * greetFred('hi');
37785                     * // => 'hi fred'
37786                     *
37787                     * // Partially applied with placeholders.
37788                     * var sayHelloTo = _.partialRight(greet, 'hello', _);
37789                     * sayHelloTo('fred');
37790                     * // => 'hello fred'
37791                     */
37792                    var partialRight = baseRest(function(func, partials) {
37793                        var holders = replaceHolders(partials, getHolder(partialRight));
37794                        return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
37795                    });
37796
37797                    /**
37798                     * Creates a function that invokes `func` with arguments arranged according
37799                     * to the specified `indexes` where the argument value at the first index is
37800                     * provided as the first argument, the argument value at the second index is
37801                     * provided as the second argument, and so on.
37802                     *
37803                     * @static
37804                     * @memberOf _
37805                     * @since 3.0.0
37806                     * @category Function
37807                     * @param {Function} func The function to rearrange arguments for.
37808                     * @param {...(number|number[])} indexes The arranged argument indexes.
37809                     * @returns {Function} Returns the new function.
37810                     * @example
37811                     *
37812                     * var rearged = _.rearg(function(a, b, c) {
37813                     *   return [a, b, c];
37814                     * }, [2, 0, 1]);
37815                     *
37816                     * rearged('b', 'c', 'a')
37817                     * // => ['a', 'b', 'c']
37818                     */
37819                    var rearg = flatRest(function(func, indexes) {
37820                        return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
37821                    });
37822
37823                    /**
37824                     * Creates a function that invokes `func` with the `this` binding of the
37825                     * created function and arguments from `start` and beyond provided as
37826                     * an array.
37827                     *
37828                     * **Note:** This method is based on the
37829                     * [rest parameter](https://mdn.io/rest_parameters).
37830                     *
37831                     * @static
37832                     * @memberOf _
37833                     * @since 4.0.0
37834                     * @category Function
37835                     * @param {Function} func The function to apply a rest parameter to.
37836                     * @param {number} [start=func.length-1] The start position of the rest parameter.
37837                     * @returns {Function} Returns the new function.
37838                     * @example
37839                     *
37840                     * var say = _.rest(function(what, names) {
37841                     *   return what + ' ' + _.initial(names).join(', ') +
37842                     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
37843                     * });
37844                     *
37845                     * say('hello', 'fred', 'barney', 'pebbles');
37846                     * // => 'hello fred, barney, & pebbles'
37847                     */
37848                    function rest(func, start) {
37849                        if (typeof func != 'function') {
37850                            throw new TypeError(FUNC_ERROR_TEXT);
37851                        }
37852                        start = start === undefined ? start : toInteger(start);
37853                        return baseRest(func, start);
37854                    }
37855
37856                    /**
37857                     * Creates a function that invokes `func` with the `this` binding of the
37858                     * create function and an array of arguments much like
37859                     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
37860                     *
37861                     * **Note:** This method is based on the
37862                     * [spread operator](https://mdn.io/spread_operator).
37863                     *
37864                     * @static
37865                     * @memberOf _
37866                     * @since 3.2.0
37867                     * @category Function
37868                     * @param {Function} func The function to spread arguments over.
37869                     * @param {number} [start=0] The start position of the spread.
37870                     * @returns {Function} Returns the new function.
37871                     * @example
37872                     *
37873                     * var say = _.spread(function(who, what) {
37874                     *   return who + ' says ' + what;
37875                     * });
37876                     *
37877                     * say(['fred', 'hello']);
37878                     * // => 'fred says hello'
37879                     *
37880                     * var numbers = Promise.all([
37881                     *   Promise.resolve(40),
37882                     *   Promise.resolve(36)
37883                     * ]);
37884                     *
37885                     * numbers.then(_.spread(function(x, y) {
37886                     *   return x + y;
37887                     * }));
37888                     * // => a Promise of 76
37889                     */
37890                    function spread(func, start) {
37891                        if (typeof func != 'function') {
37892                            throw new TypeError(FUNC_ERROR_TEXT);
37893                        }
37894                        start = start == null ? 0 : nativeMax(toInteger(start), 0);
37895                        return baseRest(function(args) {
37896                            var array = args[start],
37897                                otherArgs = castSlice(args, 0, start);
37898
37899                            if (array) {
37900                                arrayPush(otherArgs, array);
37901                            }
37902                            return apply(func, this, otherArgs);
37903                        });
37904                    }
37905
37906                    /**
37907                     * Creates a throttled function that only invokes `func` at most once per
37908                     * every `wait` milliseconds. The throttled function comes with a `cancel`
37909                     * method to cancel delayed `func` invocations and a `flush` method to
37910                     * immediately invoke them. Provide `options` to indicate whether `func`
37911                     * should be invoked on the leading and/or trailing edge of the `wait`
37912                     * timeout. The `func` is invoked with the last arguments provided to the
37913                     * throttled function. Subsequent calls to the throttled function return the
37914                     * result of the last `func` invocation.
37915                     *
37916                     * **Note:** If `leading` and `trailing` options are `true`, `func` is
37917                     * invoked on the trailing edge of the timeout only if the throttled function
37918                     * is invoked more than once during the `wait` timeout.
37919                     *
37920                     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
37921                     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
37922                     *
37923                     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
37924                     * for details over the differences between `_.throttle` and `_.debounce`.
37925                     *
37926                     * @static
37927                     * @memberOf _
37928                     * @since 0.1.0
37929                     * @category Function
37930                     * @param {Function} func The function to throttle.
37931                     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
37932                     * @param {Object} [options={}] The options object.
37933                     * @param {boolean} [options.leading=true]
37934                     *  Specify invoking on the leading edge of the timeout.
37935                     * @param {boolean} [options.trailing=true]
37936                     *  Specify invoking on the trailing edge of the timeout.
37937                     * @returns {Function} Returns the new throttled function.
37938                     * @example
37939                     *
37940                     * // Avoid excessively updating the position while scrolling.
37941                     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
37942                     *
37943                     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
37944                     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
37945                     * jQuery(element).on('click', throttled);
37946                     *
37947                     * // Cancel the trailing throttled invocation.
37948                     * jQuery(window).on('popstate', throttled.cancel);
37949                     */
37950                    function throttle(func, wait, options) {
37951                        var leading = true,
37952                            trailing = true;
37953
37954                        if (typeof func != 'function') {
37955                            throw new TypeError(FUNC_ERROR_TEXT);
37956                        }
37957                        if (isObject(options)) {
37958                            leading = 'leading' in options ? !!options.leading : leading;
37959                            trailing = 'trailing' in options ? !!options.trailing : trailing;
37960                        }
37961                        return debounce(func, wait, {
37962                            'leading': leading,
37963                            'maxWait': wait,
37964                            'trailing': trailing
37965                        });
37966                    }
37967
37968                    /**
37969                     * Creates a function that accepts up to one argument, ignoring any
37970                     * additional arguments.
37971                     *
37972                     * @static
37973                     * @memberOf _
37974                     * @since 4.0.0
37975                     * @category Function
37976                     * @param {Function} func The function to cap arguments for.
37977                     * @returns {Function} Returns the new capped function.
37978                     * @example
37979                     *
37980                     * _.map(['6', '8', '10'], _.unary(parseInt));
37981                     * // => [6, 8, 10]
37982                     */
37983                    function unary(func) {
37984                        return ary(func, 1);
37985                    }
37986
37987                    /**
37988                     * Creates a function that provides `value` to `wrapper` as its first
37989                     * argument. Any additional arguments provided to the function are appended
37990                     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
37991                     * binding of the created function.
37992                     *
37993                     * @static
37994                     * @memberOf _
37995                     * @since 0.1.0
37996                     * @category Function
37997                     * @param {*} value The value to wrap.
37998                     * @param {Function} [wrapper=identity] The wrapper function.
37999                     * @returns {Function} Returns the new function.
38000                     * @example
38001                     *
38002                     * var p = _.wrap(_.escape, function(func, text) {
38003                     *   return '<p>' + func(text) + '</p>';
38004                     * });
38005                     *
38006                     * p('fred, barney, & pebbles');
38007                     * // => '<p>fred, barney, &amp; pebbles</p>'
38008                     */
38009                    function wrap(value, wrapper) {
38010                        return partial(castFunction(wrapper), value);
38011                    }
38012
38013                    /*------------------------------------------------------------------------*/
38014
38015                    /**
38016                     * Casts `value` as an array if it's not one.
38017                     *
38018                     * @static
38019                     * @memberOf _
38020                     * @since 4.4.0
38021                     * @category Lang
38022                     * @param {*} value The value to inspect.
38023                     * @returns {Array} Returns the cast array.
38024                     * @example
38025                     *
38026                     * _.castArray(1);
38027                     * // => [1]
38028                     *
38029                     * _.castArray({ 'a': 1 });
38030                     * // => [{ 'a': 1 }]
38031                     *
38032                     * _.castArray('abc');
38033                     * // => ['abc']
38034                     *
38035                     * _.castArray(null);
38036                     * // => [null]
38037                     *
38038                     * _.castArray(undefined);
38039                     * // => [undefined]
38040                     *
38041                     * _.castArray();
38042                     * // => []
38043                     *
38044                     * var array = [1, 2, 3];
38045                     * console.log(_.castArray(array) === array);
38046                     * // => true
38047                     */
38048                    function castArray() {
38049                        if (!arguments.length) {
38050                            return [];
38051                        }
38052                        var value = arguments[0];
38053                        return isArray(value) ? value : [value];
38054                    }
38055
38056                    /**
38057                     * Creates a shallow clone of `value`.
38058                     *
38059                     * **Note:** This method is loosely based on the
38060                     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
38061                     * and supports cloning arrays, array buffers, booleans, date objects, maps,
38062                     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
38063                     * arrays. The own enumerable properties of `arguments` objects are cloned
38064                     * as plain objects. An empty object is returned for uncloneable values such
38065                     * as error objects, functions, DOM nodes, and WeakMaps.
38066                     *
38067                     * @static
38068                     * @memberOf _
38069                     * @since 0.1.0
38070                     * @category Lang
38071                     * @param {*} value The value to clone.
38072                     * @returns {*} Returns the cloned value.
38073                     * @see _.cloneDeep
38074                     * @example
38075                     *
38076                     * var objects = [{ 'a': 1 }, { 'b': 2 }];
38077                     *
38078                     * var shallow = _.clone(objects);
38079                     * console.log(shallow[0] === objects[0]);
38080                     * // => true
38081                     */
38082                    function clone(value) {
38083                        return baseClone(value, CLONE_SYMBOLS_FLAG);
38084                    }
38085
38086                    /**
38087                     * This method is like `_.clone` except that it accepts `customizer` which
38088                     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
38089                     * cloning is handled by the method instead. The `customizer` is invoked with
38090                     * up to four arguments; (value [, index|key, object, stack]).
38091                     *
38092                     * @static
38093                     * @memberOf _
38094                     * @since 4.0.0
38095                     * @category Lang
38096                     * @param {*} value The value to clone.
38097                     * @param {Function} [customizer] The function to customize cloning.
38098                     * @returns {*} Returns the cloned value.
38099                     * @see _.cloneDeepWith
38100                     * @example
38101                     *
38102                     * function customizer(value) {
38103                     *   if (_.isElement(value)) {
38104                     *     return value.cloneNode(false);
38105                     *   }
38106                     * }
38107                     *
38108                     * var el = _.cloneWith(document.body, customizer);
38109                     *
38110                     * console.log(el === document.body);
38111                     * // => false
38112                     * console.log(el.nodeName);
38113                     * // => 'BODY'
38114                     * console.log(el.childNodes.length);
38115                     * // => 0
38116                     */
38117                    function cloneWith(value, customizer) {
38118                        customizer = typeof customizer == 'function' ? customizer : undefined;
38119                        return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
38120                    }
38121
38122                    /**
38123                     * This method is like `_.clone` except that it recursively clones `value`.
38124                     *
38125                     * @static
38126                     * @memberOf _
38127                     * @since 1.0.0
38128                     * @category Lang
38129                     * @param {*} value The value to recursively clone.
38130                     * @returns {*} Returns the deep cloned value.
38131                     * @see _.clone
38132                     * @example
38133                     *
38134                     * var objects = [{ 'a': 1 }, { 'b': 2 }];
38135                     *
38136                     * var deep = _.cloneDeep(objects);
38137                     * console.log(deep[0] === objects[0]);
38138                     * // => false
38139                     */
38140                    function cloneDeep(value) {
38141                        return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
38142                    }
38143
38144                    /**
38145                     * This method is like `_.cloneWith` except that it recursively clones `value`.
38146                     *
38147                     * @static
38148                     * @memberOf _
38149                     * @since 4.0.0
38150                     * @category Lang
38151                     * @param {*} value The value to recursively clone.
38152                     * @param {Function} [customizer] The function to customize cloning.
38153                     * @returns {*} Returns the deep cloned value.
38154                     * @see _.cloneWith
38155                     * @example
38156                     *
38157                     * function customizer(value) {
38158                     *   if (_.isElement(value)) {
38159                     *     return value.cloneNode(true);
38160                     *   }
38161                     * }
38162                     *
38163                     * var el = _.cloneDeepWith(document.body, customizer);
38164                     *
38165                     * console.log(el === document.body);
38166                     * // => false
38167                     * console.log(el.nodeName);
38168                     * // => 'BODY'
38169                     * console.log(el.childNodes.length);
38170                     * // => 20
38171                     */
38172                    function cloneDeepWith(value, customizer) {
38173                        customizer = typeof customizer == 'function' ? customizer : undefined;
38174                        return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
38175                    }
38176
38177                    /**
38178                     * Checks if `object` conforms to `source` by invoking the predicate
38179                     * properties of `source` with the corresponding property values of `object`.
38180                     *
38181                     * **Note:** This method is equivalent to `_.conforms` when `source` is
38182                     * partially applied.
38183                     *
38184                     * @static
38185                     * @memberOf _
38186                     * @since 4.14.0
38187                     * @category Lang
38188                     * @param {Object} object The object to inspect.
38189                     * @param {Object} source The object of property predicates to conform to.
38190                     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
38191                     * @example
38192                     *
38193                     * var object = { 'a': 1, 'b': 2 };
38194                     *
38195                     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
38196                     * // => true
38197                     *
38198                     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
38199                     * // => false
38200                     */
38201                    function conformsTo(object, source) {
38202                        return source == null || baseConformsTo(object, source, keys(source));
38203                    }
38204
38205                    /**
38206                     * Performs a
38207                     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
38208                     * comparison between two values to determine if they are equivalent.
38209                     *
38210                     * @static
38211                     * @memberOf _
38212                     * @since 4.0.0
38213                     * @category Lang
38214                     * @param {*} value The value to compare.
38215                     * @param {*} other The other value to compare.
38216                     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
38217                     * @example
38218                     *
38219                     * var object = { 'a': 1 };
38220                     * var other = { 'a': 1 };
38221                     *
38222                     * _.eq(object, object);
38223                     * // => true
38224                     *
38225                     * _.eq(object, other);
38226                     * // => false
38227                     *
38228                     * _.eq('a', 'a');
38229                     * // => true
38230                     *
38231                     * _.eq('a', Object('a'));
38232                     * // => false
38233                     *
38234                     * _.eq(NaN, NaN);
38235                     * // => true
38236                     */
38237                    function eq(value, other) {
38238                        return value === other || (value !== value && other !== other);
38239                    }
38240
38241                    /**
38242                     * Checks if `value` is greater than `other`.
38243                     *
38244                     * @static
38245                     * @memberOf _
38246                     * @since 3.9.0
38247                     * @category Lang
38248                     * @param {*} value The value to compare.
38249                     * @param {*} other The other value to compare.
38250                     * @returns {boolean} Returns `true` if `value` is greater than `other`,
38251                     *  else `false`.
38252                     * @see _.lt
38253                     * @example
38254                     *
38255                     * _.gt(3, 1);
38256                     * // => true
38257                     *
38258                     * _.gt(3, 3);
38259                     * // => false
38260                     *
38261                     * _.gt(1, 3);
38262                     * // => false
38263                     */
38264                    var gt = createRelationalOperation(baseGt);
38265
38266                    /**
38267                     * Checks if `value` is greater than or equal to `other`.
38268                     *
38269                     * @static
38270                     * @memberOf _
38271                     * @since 3.9.0
38272                     * @category Lang
38273                     * @param {*} value The value to compare.
38274                     * @param {*} other The other value to compare.
38275                     * @returns {boolean} Returns `true` if `value` is greater than or equal to
38276                     *  `other`, else `false`.
38277                     * @see _.lte
38278                     * @example
38279                     *
38280                     * _.gte(3, 1);
38281                     * // => true
38282                     *
38283                     * _.gte(3, 3);
38284                     * // => true
38285                     *
38286                     * _.gte(1, 3);
38287                     * // => false
38288                     */
38289                    var gte = createRelationalOperation(function(value, other) {
38290                        return value >= other;
38291                    });
38292
38293                    /**
38294                     * Checks if `value` is likely an `arguments` object.
38295                     *
38296                     * @static
38297                     * @memberOf _
38298                     * @since 0.1.0
38299                     * @category Lang
38300                     * @param {*} value The value to check.
38301                     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
38302                     *  else `false`.
38303                     * @example
38304                     *
38305                     * _.isArguments(function() { return arguments; }());
38306                     * // => true
38307                     *
38308                     * _.isArguments([1, 2, 3]);
38309                     * // => false
38310                     */
38311                    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
38312                        return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
38313                            !propertyIsEnumerable.call(value, 'callee');
38314                    };
38315
38316                    /**
38317                     * Checks if `value` is classified as an `Array` object.
38318                     *
38319                     * @static
38320                     * @memberOf _
38321                     * @since 0.1.0
38322                     * @category Lang
38323                     * @param {*} value The value to check.
38324                     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
38325                     * @example
38326                     *
38327                     * _.isArray([1, 2, 3]);
38328                     * // => true
38329                     *
38330                     * _.isArray(document.body.children);
38331                     * // => false
38332                     *
38333                     * _.isArray('abc');
38334                     * // => false
38335                     *
38336                     * _.isArray(_.noop);
38337                     * // => false
38338                     */
38339                    var isArray = Array.isArray;
38340
38341                    /**
38342                     * Checks if `value` is classified as an `ArrayBuffer` object.
38343                     *
38344                     * @static
38345                     * @memberOf _
38346                     * @since 4.3.0
38347                     * @category Lang
38348                     * @param {*} value The value to check.
38349                     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
38350                     * @example
38351                     *
38352                     * _.isArrayBuffer(new ArrayBuffer(2));
38353                     * // => true
38354                     *
38355                     * _.isArrayBuffer(new Array(2));
38356                     * // => false
38357                     */
38358                    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
38359
38360                    /**
38361                     * Checks if `value` is array-like. A value is considered array-like if it's
38362                     * not a function and has a `value.length` that's an integer greater than or
38363                     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
38364                     *
38365                     * @static
38366                     * @memberOf _
38367                     * @since 4.0.0
38368                     * @category Lang
38369                     * @param {*} value The value to check.
38370                     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
38371                     * @example
38372                     *
38373                     * _.isArrayLike([1, 2, 3]);
38374                     * // => true
38375                     *
38376                     * _.isArrayLike(document.body.children);
38377                     * // => true
38378                     *
38379                     * _.isArrayLike('abc');
38380                     * // => true
38381                     *
38382                     * _.isArrayLike(_.noop);
38383                     * // => false
38384                     */
38385                    function isArrayLike(value) {
38386                        return value != null && isLength(value.length) && !isFunction(value);
38387                    }
38388
38389                    /**
38390                     * This method is like `_.isArrayLike` except that it also checks if `value`
38391                     * is an object.
38392                     *
38393                     * @static
38394                     * @memberOf _
38395                     * @since 4.0.0
38396                     * @category Lang
38397                     * @param {*} value The value to check.
38398                     * @returns {boolean} Returns `true` if `value` is an array-like object,
38399                     *  else `false`.
38400                     * @example
38401                     *
38402                     * _.isArrayLikeObject([1, 2, 3]);
38403                     * // => true
38404                     *
38405                     * _.isArrayLikeObject(document.body.children);
38406                     * // => true
38407                     *
38408                     * _.isArrayLikeObject('abc');
38409                     * // => false
38410                     *
38411                     * _.isArrayLikeObject(_.noop);
38412                     * // => false
38413                     */
38414                    function isArrayLikeObject(value) {
38415                        return isObjectLike(value) && isArrayLike(value);
38416                    }
38417
38418                    /**
38419                     * Checks if `value` is classified as a boolean primitive or object.
38420                     *
38421                     * @static
38422                     * @memberOf _
38423                     * @since 0.1.0
38424                     * @category Lang
38425                     * @param {*} value The value to check.
38426                     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
38427                     * @example
38428                     *
38429                     * _.isBoolean(false);
38430                     * // => true
38431                     *
38432                     * _.isBoolean(null);
38433                     * // => false
38434                     */
38435                    function isBoolean(value) {
38436                        return value === true || value === false ||
38437                            (isObjectLike(value) && baseGetTag(value) == boolTag);
38438                    }
38439
38440                    /**
38441                     * Checks if `value` is a buffer.
38442                     *
38443                     * @static
38444                     * @memberOf _
38445                     * @since 4.3.0
38446                     * @category Lang
38447                     * @param {*} value The value to check.
38448                     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
38449                     * @example
38450                     *
38451                     * _.isBuffer(new Buffer(2));
38452                     * // => true
38453                     *
38454                     * _.isBuffer(new Uint8Array(2));
38455                     * // => false
38456                     */
38457                    var isBuffer = nativeIsBuffer || stubFalse;
38458
38459                    /**
38460                     * Checks if `value` is classified as a `Date` object.
38461                     *
38462                     * @static
38463                     * @memberOf _
38464                     * @since 0.1.0
38465                     * @category Lang
38466                     * @param {*} value The value to check.
38467                     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
38468                     * @example
38469                     *
38470                     * _.isDate(new Date);
38471                     * // => true
38472                     *
38473                     * _.isDate('Mon April 23 2012');
38474                     * // => false
38475                     */
38476                    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
38477
38478                    /**
38479                     * Checks if `value` is likely a DOM element.
38480                     *
38481                     * @static
38482                     * @memberOf _
38483                     * @since 0.1.0
38484                     * @category Lang
38485                     * @param {*} value The value to check.
38486                     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
38487                     * @example
38488                     *
38489                     * _.isElement(document.body);
38490                     * // => true
38491                     *
38492                     * _.isElement('<body>');
38493                     * // => false
38494                     */
38495                    function isElement(value) {
38496                        return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
38497                    }
38498
38499                    /**
38500                     * Checks if `value` is an empty object, collection, map, or set.
38501                     *
38502                     * Objects are considered empty if they have no own enumerable string keyed
38503                     * properties.
38504                     *
38505                     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
38506                     * jQuery-like collections are considered empty if they have a `length` of `0`.
38507                     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
38508                     *
38509                     * @static
38510                     * @memberOf _
38511                     * @since 0.1.0
38512                     * @category Lang
38513                     * @param {*} value The value to check.
38514                     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
38515                     * @example
38516                     *
38517                     * _.isEmpty(null);
38518                     * // => true
38519                     *
38520                     * _.isEmpty(true);
38521                     * // => true
38522                     *
38523                     * _.isEmpty(1);
38524                     * // => true
38525                     *
38526                     * _.isEmpty([1, 2, 3]);
38527                     * // => false
38528                     *
38529                     * _.isEmpty({ 'a': 1 });
38530                     * // => false
38531                     */
38532                    function isEmpty(value) {
38533                        if (value == null) {
38534                            return true;
38535                        }
38536                        if (isArrayLike(value) &&
38537                            (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
38538                                isBuffer(value) || isTypedArray(value) || isArguments(value))) {
38539                            return !value.length;
38540                        }
38541                        var tag = getTag(value);
38542                        if (tag == mapTag || tag == setTag) {
38543                            return !value.size;
38544                        }
38545                        if (isPrototype(value)) {
38546                            return !baseKeys(value).length;
38547                        }
38548                        for (var key in value) {
38549                            if (hasOwnProperty.call(value, key)) {
38550                                return false;
38551                            }
38552                        }
38553                        return true;
38554                    }
38555
38556                    /**
38557                     * Performs a deep comparison between two values to determine if they are
38558                     * equivalent.
38559                     *
38560                     * **Note:** This method supports comparing arrays, array buffers, booleans,
38561                     * date objects, error objects, maps, numbers, `Object` objects, regexes,
38562                     * sets, strings, symbols, and typed arrays. `Object` objects are compared
38563                     * by their own, not inherited, enumerable properties. Functions and DOM
38564                     * nodes are compared by strict equality, i.e. `===`.
38565                     *
38566                     * @static
38567                     * @memberOf _
38568                     * @since 0.1.0
38569                     * @category Lang
38570                     * @param {*} value The value to compare.
38571                     * @param {*} other The other value to compare.
38572                     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
38573                     * @example
38574                     *
38575                     * var object = { 'a': 1 };
38576                     * var other = { 'a': 1 };
38577                     *
38578                     * _.isEqual(object, other);
38579                     * // => true
38580                     *
38581                     * object === other;
38582                     * // => false
38583                     */
38584                    function isEqual(value, other) {
38585                        return baseIsEqual(value, other);
38586                    }
38587
38588                    /**
38589                     * This method is like `_.isEqual` except that it accepts `customizer` which
38590                     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
38591                     * are handled by the method instead. The `customizer` is invoked with up to
38592                     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
38593                     *
38594                     * @static
38595                     * @memberOf _
38596                     * @since 4.0.0
38597                     * @category Lang
38598                     * @param {*} value The value to compare.
38599                     * @param {*} other The other value to compare.
38600                     * @param {Function} [customizer] The function to customize comparisons.
38601                     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
38602                     * @example
38603                     *
38604                     * function isGreeting(value) {
38605                     *   return /^h(?:i|ello)$/.test(value);
38606                     * }
38607                     *
38608                     * function customizer(objValue, othValue) {
38609                     *   if (isGreeting(objValue) && isGreeting(othValue)) {
38610                     *     return true;
38611                     *   }
38612                     * }
38613                     *
38614                     * var array = ['hello', 'goodbye'];
38615                     * var other = ['hi', 'goodbye'];
38616                     *
38617                     * _.isEqualWith(array, other, customizer);
38618                     * // => true
38619                     */
38620                    function isEqualWith(value, other, customizer) {
38621                        customizer = typeof customizer == 'function' ? customizer : undefined;
38622                        var result = customizer ? customizer(value, other) : undefined;
38623                        return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
38624                    }
38625
38626                    /**
38627                     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
38628                     * `SyntaxError`, `TypeError`, or `URIError` object.
38629                     *
38630                     * @static
38631                     * @memberOf _
38632                     * @since 3.0.0
38633                     * @category Lang
38634                     * @param {*} value The value to check.
38635                     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
38636                     * @example
38637                     *
38638                     * _.isError(new Error);
38639                     * // => true
38640                     *
38641                     * _.isError(Error);
38642                     * // => false
38643                     */
38644                    function isError(value) {
38645                        if (!isObjectLike(value)) {
38646                            return false;
38647                        }
38648                        var tag = baseGetTag(value);
38649                        return tag == errorTag || tag == domExcTag ||
38650                            (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
38651                    }
38652
38653                    /**
38654                     * Checks if `value` is a finite primitive number.
38655                     *
38656                     * **Note:** This method is based on
38657                     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
38658                     *
38659                     * @static
38660                     * @memberOf _
38661                     * @since 0.1.0
38662                     * @category Lang
38663                     * @param {*} value The value to check.
38664                     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
38665                     * @example
38666                     *
38667                     * _.isFinite(3);
38668                     * // => true
38669                     *
38670                     * _.isFinite(Number.MIN_VALUE);
38671                     * // => true
38672                     *
38673                     * _.isFinite(Infinity);
38674                     * // => false
38675                     *
38676                     * _.isFinite('3');
38677                     * // => false
38678                     */
38679                    function isFinite(value) {
38680                        return typeof value == 'number' && nativeIsFinite(value);
38681                    }
38682
38683                    /**
38684                     * Checks if `value` is classified as a `Function` object.
38685                     *
38686                     * @static
38687                     * @memberOf _
38688                     * @since 0.1.0
38689                     * @category Lang
38690                     * @param {*} value The value to check.
38691                     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
38692                     * @example
38693                     *
38694                     * _.isFunction(_);
38695                     * // => true
38696                     *
38697                     * _.isFunction(/abc/);
38698                     * // => false
38699                     */
38700                    function isFunction(value) {
38701                        if (!isObject(value)) {
38702                            return false;
38703                        }
38704                        // The use of `Object#toString` avoids issues with the `typeof` operator
38705                        // in Safari 9 which returns 'object' for typed arrays and other constructors.
38706                        var tag = baseGetTag(value);
38707                        return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
38708                    }
38709
38710                    /**
38711                     * Checks if `value` is an integer.
38712                     *
38713                     * **Note:** This method is based on
38714                     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
38715                     *
38716                     * @static
38717                     * @memberOf _
38718                     * @since 4.0.0
38719                     * @category Lang
38720                     * @param {*} value The value to check.
38721                     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
38722                     * @example
38723                     *
38724                     * _.isInteger(3);
38725                     * // => true
38726                     *
38727                     * _.isInteger(Number.MIN_VALUE);
38728                     * // => false
38729                     *
38730                     * _.isInteger(Infinity);
38731                     * // => false
38732                     *
38733                     * _.isInteger('3');
38734                     * // => false
38735                     */
38736                    function isInteger(value) {
38737                        return typeof value == 'number' && value == toInteger(value);
38738                    }
38739
38740                    /**
38741                     * Checks if `value` is a valid array-like length.
38742                     *
38743                     * **Note:** This method is loosely based on
38744                     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
38745                     *
38746                     * @static
38747                     * @memberOf _
38748                     * @since 4.0.0
38749                     * @category Lang
38750                     * @param {*} value The value to check.
38751                     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
38752                     * @example
38753                     *
38754                     * _.isLength(3);
38755                     * // => true
38756                     *
38757                     * _.isLength(Number.MIN_VALUE);
38758                     * // => false
38759                     *
38760                     * _.isLength(Infinity);
38761                     * // => false
38762                     *
38763                     * _.isLength('3');
38764                     * // => false
38765                     */
38766                    function isLength(value) {
38767                        return typeof value == 'number' &&
38768                            value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
38769                    }
38770
38771                    /**
38772                     * Checks if `value` is the
38773                     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
38774                     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
38775                     *
38776                     * @static
38777                     * @memberOf _
38778                     * @since 0.1.0
38779                     * @category Lang
38780                     * @param {*} value The value to check.
38781                     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
38782                     * @example
38783                     *
38784                     * _.isObject({});
38785                     * // => true
38786                     *
38787                     * _.isObject([1, 2, 3]);
38788                     * // => true
38789                     *
38790                     * _.isObject(_.noop);
38791                     * // => true
38792                     *
38793                     * _.isObject(null);
38794                     * // => false
38795                     */
38796                    function isObject(value) {
38797                        var type = typeof value;
38798                        return value != null && (type == 'object' || type == 'function');
38799                    }
38800
38801                    /**
38802                     * Checks if `value` is object-like. A value is object-like if it's not `null`
38803                     * and has a `typeof` result of "object".
38804                     *
38805                     * @static
38806                     * @memberOf _
38807                     * @since 4.0.0
38808                     * @category Lang
38809                     * @param {*} value The value to check.
38810                     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
38811                     * @example
38812                     *
38813                     * _.isObjectLike({});
38814                     * // => true
38815                     *
38816                     * _.isObjectLike([1, 2, 3]);
38817                     * // => true
38818                     *
38819                     * _.isObjectLike(_.noop);
38820                     * // => false
38821                     *
38822                     * _.isObjectLike(null);
38823                     * // => false
38824                     */
38825                    function isObjectLike(value) {
38826                        return value != null && typeof value == 'object';
38827                    }
38828
38829                    /**
38830                     * Checks if `value` is classified as a `Map` object.
38831                     *
38832                     * @static
38833                     * @memberOf _
38834                     * @since 4.3.0
38835                     * @category Lang
38836                     * @param {*} value The value to check.
38837                     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
38838                     * @example
38839                     *
38840                     * _.isMap(new Map);
38841                     * // => true
38842                     *
38843                     * _.isMap(new WeakMap);
38844                     * // => false
38845                     */
38846                    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
38847
38848                    /**
38849                     * Performs a partial deep comparison between `object` and `source` to
38850                     * determine if `object` contains equivalent property values.
38851                     *
38852                     * **Note:** This method is equivalent to `_.matches` when `source` is
38853                     * partially applied.
38854                     *
38855                     * Partial comparisons will match empty array and empty object `source`
38856                     * values against any array or object value, respectively. See `_.isEqual`
38857                     * for a list of supported value comparisons.
38858                     *
38859                     * @static
38860                     * @memberOf _
38861                     * @since 3.0.0
38862                     * @category Lang
38863                     * @param {Object} object The object to inspect.
38864                     * @param {Object} source The object of property values to match.
38865                     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
38866                     * @example
38867                     *
38868                     * var object = { 'a': 1, 'b': 2 };
38869                     *
38870                     * _.isMatch(object, { 'b': 2 });
38871                     * // => true
38872                     *
38873                     * _.isMatch(object, { 'b': 1 });
38874                     * // => false
38875                     */
38876                    function isMatch(object, source) {
38877                        return object === source || baseIsMatch(object, source, getMatchData(source));
38878                    }
38879
38880                    /**
38881                     * This method is like `_.isMatch` except that it accepts `customizer` which
38882                     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
38883                     * are handled by the method instead. The `customizer` is invoked with five
38884                     * arguments: (objValue, srcValue, index|key, object, source).
38885                     *
38886                     * @static
38887                     * @memberOf _
38888                     * @since 4.0.0
38889                     * @category Lang
38890                     * @param {Object} object The object to inspect.
38891                     * @param {Object} source The object of property values to match.
38892                     * @param {Function} [customizer] The function to customize comparisons.
38893                     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
38894                     * @example
38895                     *
38896                     * function isGreeting(value) {
38897                     *   return /^h(?:i|ello)$/.test(value);
38898                     * }
38899                     *
38900                     * function customizer(objValue, srcValue) {
38901                     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
38902                     *     return true;
38903                     *   }
38904                     * }
38905                     *
38906                     * var object = { 'greeting': 'hello' };
38907                     * var source = { 'greeting': 'hi' };
38908                     *
38909                     * _.isMatchWith(object, source, customizer);
38910                     * // => true
38911                     */
38912                    function isMatchWith(object, source, customizer) {
38913                        customizer = typeof customizer == 'function' ? customizer : undefined;
38914                        return baseIsMatch(object, source, getMatchData(source), customizer);
38915                    }
38916
38917                    /**
38918                     * Checks if `value` is `NaN`.
38919                     *
38920                     * **Note:** This method is based on
38921                     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
38922                     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
38923                     * `undefined` and other non-number values.
38924                     *
38925                     * @static
38926                     * @memberOf _
38927                     * @since 0.1.0
38928                     * @category Lang
38929                     * @param {*} value The value to check.
38930                     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
38931                     * @example
38932                     *
38933                     * _.isNaN(NaN);
38934                     * // => true
38935                     *
38936                     * _.isNaN(new Number(NaN));
38937                     * // => true
38938                     *
38939                     * isNaN(undefined);
38940                     * // => true
38941                     *
38942                     * _.isNaN(undefined);
38943                     * // => false
38944                     */
38945                    function isNaN(value) {
38946                        // An `NaN` primitive is the only value that is not equal to itself.
38947                        // Perform the `toStringTag` check first to avoid errors with some
38948                        // ActiveX objects in IE.
38949                        return isNumber(value) && value != +value;
38950                    }
38951
38952                    /**
38953                     * Checks if `value` is a pristine native function.
38954                     *
38955                     * **Note:** This method can't reliably detect native functions in the presence
38956                     * of the core-js package because core-js circumvents this kind of detection.
38957                     * Despite multiple requests, the core-js maintainer has made it clear: any
38958                     * attempt to fix the detection will be obstructed. As a result, we're left
38959                     * with little choice but to throw an error. Unfortunately, this also affects
38960                     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
38961                     * which rely on core-js.
38962                     *
38963                     * @static
38964                     * @memberOf _
38965                     * @since 3.0.0
38966                     * @category Lang
38967                     * @param {*} value The value to check.
38968                     * @returns {boolean} Returns `true` if `value` is a native function,
38969                     *  else `false`.
38970                     * @example
38971                     *
38972                     * _.isNative(Array.prototype.push);
38973                     * // => true
38974                     *
38975                     * _.isNative(_);
38976                     * // => false
38977                     */
38978                    function isNative(value) {
38979                        if (isMaskable(value)) {
38980                            throw new Error(CORE_ERROR_TEXT);
38981                        }
38982                        return baseIsNative(value);
38983                    }
38984
38985                    /**
38986                     * Checks if `value` is `null`.
38987                     *
38988                     * @static
38989                     * @memberOf _
38990                     * @since 0.1.0
38991                     * @category Lang
38992                     * @param {*} value The value to check.
38993                     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
38994                     * @example
38995                     *
38996                     * _.isNull(null);
38997                     * // => true
38998                     *
38999                     * _.isNull(void 0);
39000                     * // => false
39001                     */
39002                    function isNull(value) {
39003                        return value === null;
39004                    }
39005
39006                    /**
39007                     * Checks if `value` is `null` or `undefined`.
39008                     *
39009                     * @static
39010                     * @memberOf _
39011                     * @since 4.0.0
39012                     * @category Lang
39013                     * @param {*} value The value to check.
39014                     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
39015                     * @example
39016                     *
39017                     * _.isNil(null);
39018                     * // => true
39019                     *
39020                     * _.isNil(void 0);
39021                     * // => true
39022                     *
39023                     * _.isNil(NaN);
39024                     * // => false
39025                     */
39026                    function isNil(value) {
39027                        return value == null;
39028                    }
39029
39030                    /**
39031                     * Checks if `value` is classified as a `Number` primitive or object.
39032                     *
39033                     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
39034                     * classified as numbers, use the `_.isFinite` method.
39035                     *
39036                     * @static
39037                     * @memberOf _
39038                     * @since 0.1.0
39039                     * @category Lang
39040                     * @param {*} value The value to check.
39041                     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
39042                     * @example
39043                     *
39044                     * _.isNumber(3);
39045                     * // => true
39046                     *
39047                     * _.isNumber(Number.MIN_VALUE);
39048                     * // => true
39049                     *
39050                     * _.isNumber(Infinity);
39051                     * // => true
39052                     *
39053                     * _.isNumber('3');
39054                     * // => false
39055                     */
39056                    function isNumber(value) {
39057                        return typeof value == 'number' ||
39058                            (isObjectLike(value) && baseGetTag(value) == numberTag);
39059                    }
39060
39061                    /**
39062                     * Checks if `value` is a plain object, that is, an object created by the
39063                     * `Object` constructor or one with a `[[Prototype]]` of `null`.
39064                     *
39065                     * @static
39066                     * @memberOf _
39067                     * @since 0.8.0
39068                     * @category Lang
39069                     * @param {*} value The value to check.
39070                     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
39071                     * @example
39072                     *
39073                     * function Foo() {
39074                     *   this.a = 1;
39075                     * }
39076                     *
39077                     * _.isPlainObject(new Foo);
39078                     * // => false
39079                     *
39080                     * _.isPlainObject([1, 2, 3]);
39081                     * // => false
39082                     *
39083                     * _.isPlainObject({ 'x': 0, 'y': 0 });
39084                     * // => true
39085                     *
39086                     * _.isPlainObject(Object.create(null));
39087                     * // => true
39088                     */
39089                    function isPlainObject(value) {
39090                        if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
39091                            return false;
39092                        }
39093                        var proto = getPrototype(value);
39094                        if (proto === null) {
39095                            return true;
39096                        }
39097                        var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
39098                        return typeof Ctor == 'function' && Ctor instanceof Ctor &&
39099                            funcToString.call(Ctor) == objectCtorString;
39100                    }
39101
39102                    /**
39103                     * Checks if `value` is classified as a `RegExp` object.
39104                     *
39105                     * @static
39106                     * @memberOf _
39107                     * @since 0.1.0
39108                     * @category Lang
39109                     * @param {*} value The value to check.
39110                     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
39111                     * @example
39112                     *
39113                     * _.isRegExp(/abc/);
39114                     * // => true
39115                     *
39116                     * _.isRegExp('/abc/');
39117                     * // => false
39118                     */
39119                    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
39120
39121                    /**
39122                     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
39123                     * double precision number which isn't the result of a rounded unsafe integer.
39124                     *
39125                     * **Note:** This method is based on
39126                     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
39127                     *
39128                     * @static
39129                     * @memberOf _
39130                     * @since 4.0.0
39131                     * @category Lang
39132                     * @param {*} value The value to check.
39133                     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
39134                     * @example
39135                     *
39136                     * _.isSafeInteger(3);
39137                     * // => true
39138                     *
39139                     * _.isSafeInteger(Number.MIN_VALUE);
39140                     * // => false
39141                     *
39142                     * _.isSafeInteger(Infinity);
39143                     * // => false
39144                     *
39145                     * _.isSafeInteger('3');
39146                     * // => false
39147                     */
39148                    function isSafeInteger(value) {
39149                        return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
39150                    }
39151
39152                    /**
39153                     * Checks if `value` is classified as a `Set` object.
39154                     *
39155                     * @static
39156                     * @memberOf _
39157                     * @since 4.3.0
39158                     * @category Lang
39159                     * @param {*} value The value to check.
39160                     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
39161                     * @example
39162                     *
39163                     * _.isSet(new Set);
39164                     * // => true
39165                     *
39166                     * _.isSet(new WeakSet);
39167                     * // => false
39168                     */
39169                    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
39170
39171                    /**
39172                     * Checks if `value` is classified as a `String` primitive or object.
39173                     *
39174                     * @static
39175                     * @since 0.1.0
39176                     * @memberOf _
39177                     * @category Lang
39178                     * @param {*} value The value to check.
39179                     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
39180                     * @example
39181                     *
39182                     * _.isString('abc');
39183                     * // => true
39184                     *
39185                     * _.isString(1);
39186                     * // => false
39187                     */
39188                    function isString(value) {
39189                        return typeof value == 'string' ||
39190                            (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
39191                    }
39192
39193                    /**
39194                     * Checks if `value` is classified as a `Symbol` primitive or object.
39195                     *
39196                     * @static
39197                     * @memberOf _
39198                     * @since 4.0.0
39199                     * @category Lang
39200                     * @param {*} value The value to check.
39201                     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
39202                     * @example
39203                     *
39204                     * _.isSymbol(Symbol.iterator);
39205                     * // => true
39206                     *
39207                     * _.isSymbol('abc');
39208                     * // => false
39209                     */
39210                    function isSymbol(value) {
39211                        return typeof value == 'symbol' ||
39212                            (isObjectLike(value) && baseGetTag(value) == symbolTag);
39213                    }
39214
39215                    /**
39216                     * Checks if `value` is classified as a typed array.
39217                     *
39218                     * @static
39219                     * @memberOf _
39220                     * @since 3.0.0
39221                     * @category Lang
39222                     * @param {*} value The value to check.
39223                     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
39224                     * @example
39225                     *
39226                     * _.isTypedArray(new Uint8Array);
39227                     * // => true
39228                     *
39229                     * _.isTypedArray([]);
39230                     * // => false
39231                     */
39232                    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
39233
39234                    /**
39235                     * Checks if `value` is `undefined`.
39236                     *
39237                     * @static
39238                     * @since 0.1.0
39239                     * @memberOf _
39240                     * @category Lang
39241                     * @param {*} value The value to check.
39242                     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
39243                     * @example
39244                     *
39245                     * _.isUndefined(void 0);
39246                     * // => true
39247                     *
39248                     * _.isUndefined(null);
39249                     * // => false
39250                     */
39251                    function isUndefined(value) {
39252                        return value === undefined;
39253                    }
39254
39255                    /**
39256                     * Checks if `value` is classified as a `WeakMap` object.
39257                     *
39258                     * @static
39259                     * @memberOf _
39260                     * @since 4.3.0
39261                     * @category Lang
39262                     * @param {*} value The value to check.
39263                     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
39264                     * @example
39265                     *
39266                     * _.isWeakMap(new WeakMap);
39267                     * // => true
39268                     *
39269                     * _.isWeakMap(new Map);
39270                     * // => false
39271                     */
39272                    function isWeakMap(value) {
39273                        return isObjectLike(value) && getTag(value) == weakMapTag;
39274                    }
39275
39276                    /**
39277                     * Checks if `value` is classified as a `WeakSet` object.
39278                     *
39279                     * @static
39280                     * @memberOf _
39281                     * @since 4.3.0
39282                     * @category Lang
39283                     * @param {*} value The value to check.
39284                     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
39285                     * @example
39286                     *
39287                     * _.isWeakSet(new WeakSet);
39288                     * // => true
39289                     *
39290                     * _.isWeakSet(new Set);
39291                     * // => false
39292                     */
39293                    function isWeakSet(value) {
39294                        return isObjectLike(value) && baseGetTag(value) == weakSetTag;
39295                    }
39296
39297                    /**
39298                     * Checks if `value` is less than `other`.
39299                     *
39300                     * @static
39301                     * @memberOf _
39302                     * @since 3.9.0
39303                     * @category Lang
39304                     * @param {*} value The value to compare.
39305                     * @param {*} other The other value to compare.
39306                     * @returns {boolean} Returns `true` if `value` is less than `other`,
39307                     *  else `false`.
39308                     * @see _.gt
39309                     * @example
39310                     *
39311                     * _.lt(1, 3);
39312                     * // => true
39313                     *
39314                     * _.lt(3, 3);
39315                     * // => false
39316                     *
39317                     * _.lt(3, 1);
39318                     * // => false
39319                     */
39320                    var lt = createRelationalOperation(baseLt);
39321
39322                    /**
39323                     * Checks if `value` is less than or equal to `other`.
39324                     *
39325                     * @static
39326                     * @memberOf _
39327                     * @since 3.9.0
39328                     * @category Lang
39329                     * @param {*} value The value to compare.
39330                     * @param {*} other The other value to compare.
39331                     * @returns {boolean} Returns `true` if `value` is less than or equal to
39332                     *  `other`, else `false`.
39333                     * @see _.gte
39334                     * @example
39335                     *
39336                     * _.lte(1, 3);
39337                     * // => true
39338                     *
39339                     * _.lte(3, 3);
39340                     * // => true
39341                     *
39342                     * _.lte(3, 1);
39343                     * // => false
39344                     */
39345                    var lte = createRelationalOperation(function(value, other) {
39346                        return value <= other;
39347                    });
39348
39349                    /**
39350                     * Converts `value` to an array.
39351                     *
39352                     * @static
39353                     * @since 0.1.0
39354                     * @memberOf _
39355                     * @category Lang
39356                     * @param {*} value The value to convert.
39357                     * @returns {Array} Returns the converted array.
39358                     * @example
39359                     *
39360                     * _.toArray({ 'a': 1, 'b': 2 });
39361                     * // => [1, 2]
39362                     *
39363                     * _.toArray('abc');
39364                     * // => ['a', 'b', 'c']
39365                     *
39366                     * _.toArray(1);
39367                     * // => []
39368                     *
39369                     * _.toArray(null);
39370                     * // => []
39371                     */
39372                    function toArray(value) {
39373                        if (!value) {
39374                            return [];
39375                        }
39376                        if (isArrayLike(value)) {
39377                            return isString(value) ? stringToArray(value) : copyArray(value);
39378                        }
39379                        if (symIterator && value[symIterator]) {
39380                            return iteratorToArray(value[symIterator]());
39381                        }
39382                        var tag = getTag(value),
39383                            func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
39384
39385                        return func(value);
39386                    }
39387
39388                    /**
39389                     * Converts `value` to a finite number.
39390                     *
39391                     * @static
39392                     * @memberOf _
39393                     * @since 4.12.0
39394                     * @category Lang
39395                     * @param {*} value The value to convert.
39396                     * @returns {number} Returns the converted number.
39397                     * @example
39398                     *
39399                     * _.toFinite(3.2);
39400                     * // => 3.2
39401                     *
39402                     * _.toFinite(Number.MIN_VALUE);
39403                     * // => 5e-324
39404                     *
39405                     * _.toFinite(Infinity);
39406                     * // => 1.7976931348623157e+308
39407                     *
39408                     * _.toFinite('3.2');
39409                     * // => 3.2
39410                     */
39411                    function toFinite(value) {
39412                        if (!value) {
39413                            return value === 0 ? value : 0;
39414                        }
39415                        value = toNumber(value);
39416                        if (value === INFINITY || value === -INFINITY) {
39417                            var sign = (value < 0 ? -1 : 1);
39418                            return sign * MAX_INTEGER;
39419                        }
39420                        return value === value ? value : 0;
39421                    }
39422
39423                    /**
39424                     * Converts `value` to an integer.
39425                     *
39426                     * **Note:** This method is loosely based on
39427                     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
39428                     *
39429                     * @static
39430                     * @memberOf _
39431                     * @since 4.0.0
39432                     * @category Lang
39433                     * @param {*} value The value to convert.
39434                     * @returns {number} Returns the converted integer.
39435                     * @example
39436                     *
39437                     * _.toInteger(3.2);
39438                     * // => 3
39439                     *
39440                     * _.toInteger(Number.MIN_VALUE);
39441                     * // => 0
39442                     *
39443                     * _.toInteger(Infinity);
39444                     * // => 1.7976931348623157e+308
39445                     *
39446                     * _.toInteger('3.2');
39447                     * // => 3
39448                     */
39449                    function toInteger(value) {
39450                        var result = toFinite(value),
39451                            remainder = result % 1;
39452
39453                        return result === result ? (remainder ? result - remainder : result) : 0;
39454                    }
39455
39456                    /**
39457                     * Converts `value` to an integer suitable for use as the length of an
39458                     * array-like object.
39459                     *
39460                     * **Note:** This method is based on
39461                     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
39462                     *
39463                     * @static
39464                     * @memberOf _
39465                     * @since 4.0.0
39466                     * @category Lang
39467                     * @param {*} value The value to convert.
39468                     * @returns {number} Returns the converted integer.
39469                     * @example
39470                     *
39471                     * _.toLength(3.2);
39472                     * // => 3
39473                     *
39474                     * _.toLength(Number.MIN_VALUE);
39475                     * // => 0
39476                     *
39477                     * _.toLength(Infinity);
39478                     * // => 4294967295
39479                     *
39480                     * _.toLength('3.2');
39481                     * // => 3
39482                     */
39483                    function toLength(value) {
39484                        return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
39485                    }
39486
39487                    /**
39488                     * Converts `value` to a number.
39489                     *
39490                     * @static
39491                     * @memberOf _
39492                     * @since 4.0.0
39493                     * @category Lang
39494                     * @param {*} value The value to process.
39495                     * @returns {number} Returns the number.
39496                     * @example
39497                     *
39498                     * _.toNumber(3.2);
39499                     * // => 3.2
39500                     *
39501                     * _.toNumber(Number.MIN_VALUE);
39502                     * // => 5e-324
39503                     *
39504                     * _.toNumber(Infinity);
39505                     * // => Infinity
39506                     *
39507                     * _.toNumber('3.2');
39508                     * // => 3.2
39509                     */
39510                    function toNumber(value) {
39511                        if (typeof value == 'number') {
39512                            return value;
39513                        }
39514                        if (isSymbol(value)) {
39515                            return NAN;
39516                        }
39517                        if (isObject(value)) {
39518                            var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
39519                            value = isObject(other) ? (other + '') : other;
39520                        }
39521                        if (typeof value != 'string') {
39522                            return value === 0 ? value : +value;
39523                        }
39524                        value = baseTrim(value);
39525                        var isBinary = reIsBinary.test(value);
39526                        return (isBinary || reIsOctal.test(value))
39527                            ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
39528                            : (reIsBadHex.test(value) ? NAN : +value);
39529                    }
39530
39531                    /**
39532                     * Converts `value` to a plain object flattening inherited enumerable string
39533                     * keyed properties of `value` to own properties of the plain object.
39534                     *
39535                     * @static
39536                     * @memberOf _
39537                     * @since 3.0.0
39538                     * @category Lang
39539                     * @param {*} value The value to convert.
39540                     * @returns {Object} Returns the converted plain object.
39541                     * @example
39542                     *
39543                     * function Foo() {
39544                     *   this.b = 2;
39545                     * }
39546                     *
39547                     * Foo.prototype.c = 3;
39548                     *
39549                     * _.assign({ 'a': 1 }, new Foo);
39550                     * // => { 'a': 1, 'b': 2 }
39551                     *
39552                     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
39553                     * // => { 'a': 1, 'b': 2, 'c': 3 }
39554                     */
39555                    function toPlainObject(value) {
39556                        return copyObject(value, keysIn(value));
39557                    }
39558
39559                    /**
39560                     * Converts `value` to a safe integer. A safe integer can be compared and
39561                     * represented correctly.
39562                     *
39563                     * @static
39564                     * @memberOf _
39565                     * @since 4.0.0
39566                     * @category Lang
39567                     * @param {*} value The value to convert.
39568                     * @returns {number} Returns the converted integer.
39569                     * @example
39570                     *
39571                     * _.toSafeInteger(3.2);
39572                     * // => 3
39573                     *
39574                     * _.toSafeInteger(Number.MIN_VALUE);
39575                     * // => 0
39576                     *
39577                     * _.toSafeInteger(Infinity);
39578                     * // => 9007199254740991
39579                     *
39580                     * _.toSafeInteger('3.2');
39581                     * // => 3
39582                     */
39583                    function toSafeInteger(value) {
39584                        return value
39585                            ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
39586                            : (value === 0 ? value : 0);
39587                    }
39588
39589                    /**
39590                     * Converts `value` to a string. An empty string is returned for `null`
39591                     * and `undefined` values. The sign of `-0` is preserved.
39592                     *
39593                     * @static
39594                     * @memberOf _
39595                     * @since 4.0.0
39596                     * @category Lang
39597                     * @param {*} value The value to convert.
39598                     * @returns {string} Returns the converted string.
39599                     * @example
39600                     *
39601                     * _.toString(null);
39602                     * // => ''
39603                     *
39604                     * _.toString(-0);
39605                     * // => '-0'
39606                     *
39607                     * _.toString([1, 2, 3]);
39608                     * // => '1,2,3'
39609                     */
39610                    function toString(value) {
39611                        return value == null ? '' : baseToString(value);
39612                    }
39613
39614                    /*------------------------------------------------------------------------*/
39615
39616                    /**
39617                     * Assigns own enumerable string keyed properties of source objects to the
39618                     * destination object. Source objects are applied from left to right.
39619                     * Subsequent sources overwrite property assignments of previous sources.
39620                     *
39621                     * **Note:** This method mutates `object` and is loosely based on
39622                     * [`Object.assign`](https://mdn.io/Object/assign).
39623                     *
39624                     * @static
39625                     * @memberOf _
39626                     * @since 0.10.0
39627                     * @category Object
39628                     * @param {Object} object The destination object.
39629                     * @param {...Object} [sources] The source objects.
39630                     * @returns {Object} Returns `object`.
39631                     * @see _.assignIn
39632                     * @example
39633                     *
39634                     * function Foo() {
39635                     *   this.a = 1;
39636                     * }
39637                     *
39638                     * function Bar() {
39639                     *   this.c = 3;
39640                     * }
39641                     *
39642                     * Foo.prototype.b = 2;
39643                     * Bar.prototype.d = 4;
39644                     *
39645                     * _.assign({ 'a': 0 }, new Foo, new Bar);
39646                     * // => { 'a': 1, 'c': 3 }
39647                     */
39648                    var assign = createAssigner(function(object, source) {
39649                        if (isPrototype(source) || isArrayLike(source)) {
39650                            copyObject(source, keys(source), object);
39651                            return;
39652                        }
39653                        for (var key in source) {
39654                            if (hasOwnProperty.call(source, key)) {
39655                                assignValue(object, key, source[key]);
39656                            }
39657                        }
39658                    });
39659
39660                    /**
39661                     * This method is like `_.assign` except that it iterates over own and
39662                     * inherited source properties.
39663                     *
39664                     * **Note:** This method mutates `object`.
39665                     *
39666                     * @static
39667                     * @memberOf _
39668                     * @since 4.0.0
39669                     * @alias extend
39670                     * @category Object
39671                     * @param {Object} object The destination object.
39672                     * @param {...Object} [sources] The source objects.
39673                     * @returns {Object} Returns `object`.
39674                     * @see _.assign
39675                     * @example
39676                     *
39677                     * function Foo() {
39678                     *   this.a = 1;
39679                     * }
39680                     *
39681                     * function Bar() {
39682                     *   this.c = 3;
39683                     * }
39684                     *
39685                     * Foo.prototype.b = 2;
39686                     * Bar.prototype.d = 4;
39687                     *
39688                     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
39689                     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
39690                     */
39691                    var assignIn = createAssigner(function(object, source) {
39692                        copyObject(source, keysIn(source), object);
39693                    });
39694
39695                    /**
39696                     * This method is like `_.assignIn` except that it accepts `customizer`
39697                     * which is invoked to produce the assigned values. If `customizer` returns
39698                     * `undefined`, assignment is handled by the method instead. The `customizer`
39699                     * is invoked with five arguments: (objValue, srcValue, key, object, source).
39700                     *
39701                     * **Note:** This method mutates `object`.
39702                     *
39703                     * @static
39704                     * @memberOf _
39705                     * @since 4.0.0
39706                     * @alias extendWith
39707                     * @category Object
39708                     * @param {Object} object The destination object.
39709                     * @param {...Object} sources The source objects.
39710                     * @param {Function} [customizer] The function to customize assigned values.
39711                     * @returns {Object} Returns `object`.
39712                     * @see _.assignWith
39713                     * @example
39714                     *
39715                     * function customizer(objValue, srcValue) {
39716                     *   return _.isUndefined(objValue) ? srcValue : objValue;
39717                     * }
39718                     *
39719                     * var defaults = _.partialRight(_.assignInWith, customizer);
39720                     *
39721                     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
39722                     * // => { 'a': 1, 'b': 2 }
39723                     */
39724                    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
39725                        copyObject(source, keysIn(source), object, customizer);
39726                    });
39727
39728                    /**
39729                     * This method is like `_.assign` except that it accepts `customizer`
39730                     * which is invoked to produce the assigned values. If `customizer` returns
39731                     * `undefined`, assignment is handled by the method instead. The `customizer`
39732                     * is invoked with five arguments: (objValue, srcValue, key, object, source).
39733                     *
39734                     * **Note:** This method mutates `object`.
39735                     *
39736                     * @static
39737                     * @memberOf _
39738                     * @since 4.0.0
39739                     * @category Object
39740                     * @param {Object} object The destination object.
39741                     * @param {...Object} sources The source objects.
39742                     * @param {Function} [customizer] The function to customize assigned values.
39743                     * @returns {Object} Returns `object`.
39744                     * @see _.assignInWith
39745                     * @example
39746                     *
39747                     * function customizer(objValue, srcValue) {
39748                     *   return _.isUndefined(objValue) ? srcValue : objValue;
39749                     * }
39750                     *
39751                     * var defaults = _.partialRight(_.assignWith, customizer);
39752                     *
39753                     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
39754                     * // => { 'a': 1, 'b': 2 }
39755                     */
39756                    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
39757                        copyObject(source, keys(source), object, customizer);
39758                    });
39759
39760                    /**
39761                     * Creates an array of values corresponding to `paths` of `object`.
39762                     *
39763                     * @static
39764                     * @memberOf _
39765                     * @since 1.0.0
39766                     * @category Object
39767                     * @param {Object} object The object to iterate over.
39768                     * @param {...(string|string[])} [paths] The property paths to pick.
39769                     * @returns {Array} Returns the picked values.
39770                     * @example
39771                     *
39772                     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
39773                     *
39774                     * _.at(object, ['a[0].b.c', 'a[1]']);
39775                     * // => [3, 4]
39776                     */
39777                    var at = flatRest(baseAt);
39778
39779                    /**
39780                     * Creates an object that inherits from the `prototype` object. If a
39781                     * `properties` object is given, its own enumerable string keyed properties
39782                     * are assigned to the created object.
39783                     *
39784                     * @static
39785                     * @memberOf _
39786                     * @since 2.3.0
39787                     * @category Object
39788                     * @param {Object} prototype The object to inherit from.
39789                     * @param {Object} [properties] The properties to assign to the object.
39790                     * @returns {Object} Returns the new object.
39791                     * @example
39792                     *
39793                     * function Shape() {
39794                     *   this.x = 0;
39795                     *   this.y = 0;
39796                     * }
39797                     *
39798                     * function Circle() {
39799                     *   Shape.call(this);
39800                     * }
39801                     *
39802                     * Circle.prototype = _.create(Shape.prototype, {
39803                     *   'constructor': Circle
39804                     * });
39805                     *
39806                     * var circle = new Circle;
39807                     * circle instanceof Circle;
39808                     * // => true
39809                     *
39810                     * circle instanceof Shape;
39811                     * // => true
39812                     */
39813                    function create(prototype, properties) {
39814                        var result = baseCreate(prototype);
39815                        return properties == null ? result : baseAssign(result, properties);
39816                    }
39817
39818                    /**
39819                     * Assigns own and inherited enumerable string keyed properties of source
39820                     * objects to the destination object for all destination properties that
39821                     * resolve to `undefined`. Source objects are applied from left to right.
39822                     * Once a property is set, additional values of the same property are ignored.
39823                     *
39824                     * **Note:** This method mutates `object`.
39825                     *
39826                     * @static
39827                     * @since 0.1.0
39828                     * @memberOf _
39829                     * @category Object
39830                     * @param {Object} object The destination object.
39831                     * @param {...Object} [sources] The source objects.
39832                     * @returns {Object} Returns `object`.
39833                     * @see _.defaultsDeep
39834                     * @example
39835                     *
39836                     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
39837                     * // => { 'a': 1, 'b': 2 }
39838                     */
39839                    var defaults = baseRest(function(object, sources) {
39840                        object = Object(object);
39841
39842                        var index = -1;
39843                        var length = sources.length;
39844                        var guard = length > 2 ? sources[2] : undefined;
39845
39846                        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
39847                            length = 1;
39848                        }
39849
39850                        while (++index < length) {
39851                            var source = sources[index];
39852                            var props = keysIn(source);
39853                            var propsIndex = -1;
39854                            var propsLength = props.length;
39855
39856                            while (++propsIndex < propsLength) {
39857                                var key = props[propsIndex];
39858                                var value = object[key];
39859
39860                                if (value === undefined ||
39861                                    (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
39862                                    object[key] = source[key];
39863                                }
39864                            }
39865                        }
39866
39867                        return object;
39868                    });
39869
39870                    /**
39871                     * This method is like `_.defaults` except that it recursively assigns
39872                     * default properties.
39873                     *
39874                     * **Note:** This method mutates `object`.
39875                     *
39876                     * @static
39877                     * @memberOf _
39878                     * @since 3.10.0
39879                     * @category Object
39880                     * @param {Object} object The destination object.
39881                     * @param {...Object} [sources] The source objects.
39882                     * @returns {Object} Returns `object`.
39883                     * @see _.defaults
39884                     * @example
39885                     *
39886                     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
39887                     * // => { 'a': { 'b': 2, 'c': 3 } }
39888                     */
39889                    var defaultsDeep = baseRest(function(args) {
39890                        args.push(undefined, customDefaultsMerge);
39891                        return apply(mergeWith, undefined, args);
39892                    });
39893
39894                    /**
39895                     * This method is like `_.find` except that it returns the key of the first
39896                     * element `predicate` returns truthy for instead of the element itself.
39897                     *
39898                     * @static
39899                     * @memberOf _
39900                     * @since 1.1.0
39901                     * @category Object
39902                     * @param {Object} object The object to inspect.
39903                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
39904                     * @returns {string|undefined} Returns the key of the matched element,
39905                     *  else `undefined`.
39906                     * @example
39907                     *
39908                     * var users = {
39909                     *   'barney':  { 'age': 36, 'active': true },
39910                     *   'fred':    { 'age': 40, 'active': false },
39911                     *   'pebbles': { 'age': 1,  'active': true }
39912                     * };
39913                     *
39914                     * _.findKey(users, function(o) { return o.age < 40; });
39915                     * // => 'barney' (iteration order is not guaranteed)
39916                     *
39917                     * // The `_.matches` iteratee shorthand.
39918                     * _.findKey(users, { 'age': 1, 'active': true });
39919                     * // => 'pebbles'
39920                     *
39921                     * // The `_.matchesProperty` iteratee shorthand.
39922                     * _.findKey(users, ['active', false]);
39923                     * // => 'fred'
39924                     *
39925                     * // The `_.property` iteratee shorthand.
39926                     * _.findKey(users, 'active');
39927                     * // => 'barney'
39928                     */
39929                    function findKey(object, predicate) {
39930                        return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
39931                    }
39932
39933                    /**
39934                     * This method is like `_.findKey` except that it iterates over elements of
39935                     * a collection in the opposite order.
39936                     *
39937                     * @static
39938                     * @memberOf _
39939                     * @since 2.0.0
39940                     * @category Object
39941                     * @param {Object} object The object to inspect.
39942                     * @param {Function} [predicate=_.identity] The function invoked per iteration.
39943                     * @returns {string|undefined} Returns the key of the matched element,
39944                     *  else `undefined`.
39945                     * @example
39946                     *
39947                     * var users = {
39948                     *   'barney':  { 'age': 36, 'active': true },
39949                     *   'fred':    { 'age': 40, 'active': false },
39950                     *   'pebbles': { 'age': 1,  'active': true }
39951                     * };
39952                     *
39953                     * _.findLastKey(users, function(o) { return o.age < 40; });
39954                     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
39955                     *
39956                     * // The `_.matches` iteratee shorthand.
39957                     * _.findLastKey(users, { 'age': 36, 'active': true });
39958                     * // => 'barney'
39959                     *
39960                     * // The `_.matchesProperty` iteratee shorthand.
39961                     * _.findLastKey(users, ['active', false]);
39962                     * // => 'fred'
39963                     *
39964                     * // The `_.property` iteratee shorthand.
39965                     * _.findLastKey(users, 'active');
39966                     * // => 'pebbles'
39967                     */
39968                    function findLastKey(object, predicate) {
39969                        return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
39970                    }
39971
39972                    /**
39973                     * Iterates over own and inherited enumerable string keyed properties of an
39974                     * object and invokes `iteratee` for each property. The iteratee is invoked
39975                     * with three arguments: (value, key, object). Iteratee functions may exit
39976                     * iteration early by explicitly returning `false`.
39977                     *
39978                     * @static
39979                     * @memberOf _
39980                     * @since 0.3.0
39981                     * @category Object
39982                     * @param {Object} object The object to iterate over.
39983                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
39984                     * @returns {Object} Returns `object`.
39985                     * @see _.forInRight
39986                     * @example
39987                     *
39988                     * function Foo() {
39989                     *   this.a = 1;
39990                     *   this.b = 2;
39991                     * }
39992                     *
39993                     * Foo.prototype.c = 3;
39994                     *
39995                     * _.forIn(new Foo, function(value, key) {
39996                     *   console.log(key);
39997                     * });
39998                     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
39999                     */
40000                    function forIn(object, iteratee) {
40001                        return object == null
40002                            ? object
40003                            : baseFor(object, getIteratee(iteratee, 3), keysIn);
40004                    }
40005
40006                    /**
40007                     * This method is like `_.forIn` except that it iterates over properties of
40008                     * `object` in the opposite order.
40009                     *
40010                     * @static
40011                     * @memberOf _
40012                     * @since 2.0.0
40013                     * @category Object
40014                     * @param {Object} object The object to iterate over.
40015                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
40016                     * @returns {Object} Returns `object`.
40017                     * @see _.forIn
40018                     * @example
40019                     *
40020                     * function Foo() {
40021                     *   this.a = 1;
40022                     *   this.b = 2;
40023                     * }
40024                     *
40025                     * Foo.prototype.c = 3;
40026                     *
40027                     * _.forInRight(new Foo, function(value, key) {
40028                     *   console.log(key);
40029                     * });
40030                     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
40031                     */
40032                    function forInRight(object, iteratee) {
40033                        return object == null
40034                            ? object
40035                            : baseForRight(object, getIteratee(iteratee, 3), keysIn);
40036                    }
40037
40038                    /**
40039                     * Iterates over own enumerable string keyed properties of an object and
40040                     * invokes `iteratee` for each property. The iteratee is invoked with three
40041                     * arguments: (value, key, object). Iteratee functions may exit iteration
40042                     * early by explicitly returning `false`.
40043                     *
40044                     * @static
40045                     * @memberOf _
40046                     * @since 0.3.0
40047                     * @category Object
40048                     * @param {Object} object The object to iterate over.
40049                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
40050                     * @returns {Object} Returns `object`.
40051                     * @see _.forOwnRight
40052                     * @example
40053                     *
40054                     * function Foo() {
40055                     *   this.a = 1;
40056                     *   this.b = 2;
40057                     * }
40058                     *
40059                     * Foo.prototype.c = 3;
40060                     *
40061                     * _.forOwn(new Foo, function(value, key) {
40062                     *   console.log(key);
40063                     * });
40064                     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
40065                     */
40066                    function forOwn(object, iteratee) {
40067                        return object && baseForOwn(object, getIteratee(iteratee, 3));
40068                    }
40069
40070                    /**
40071                     * This method is like `_.forOwn` except that it iterates over properties of
40072                     * `object` in the opposite order.
40073                     *
40074                     * @static
40075                     * @memberOf _
40076                     * @since 2.0.0
40077                     * @category Object
40078                     * @param {Object} object The object to iterate over.
40079                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
40080                     * @returns {Object} Returns `object`.
40081                     * @see _.forOwn
40082                     * @example
40083                     *
40084                     * function Foo() {
40085                     *   this.a = 1;
40086                     *   this.b = 2;
40087                     * }
40088                     *
40089                     * Foo.prototype.c = 3;
40090                     *
40091                     * _.forOwnRight(new Foo, function(value, key) {
40092                     *   console.log(key);
40093                     * });
40094                     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
40095                     */
40096                    function forOwnRight(object, iteratee) {
40097                        return object && baseForOwnRight(object, getIteratee(iteratee, 3));
40098                    }
40099
40100                    /**
40101                     * Creates an array of function property names from own enumerable properties
40102                     * of `object`.
40103                     *
40104                     * @static
40105                     * @since 0.1.0
40106                     * @memberOf _
40107                     * @category Object
40108                     * @param {Object} object The object to inspect.
40109                     * @returns {Array} Returns the function names.
40110                     * @see _.functionsIn
40111                     * @example
40112                     *
40113                     * function Foo() {
40114                     *   this.a = _.constant('a');
40115                     *   this.b = _.constant('b');
40116                     * }
40117                     *
40118                     * Foo.prototype.c = _.constant('c');
40119                     *
40120                     * _.functions(new Foo);
40121                     * // => ['a', 'b']
40122                     */
40123                    function functions(object) {
40124                        return object == null ? [] : baseFunctions(object, keys(object));
40125                    }
40126
40127                    /**
40128                     * Creates an array of function property names from own and inherited
40129                     * enumerable properties of `object`.
40130                     *
40131                     * @static
40132                     * @memberOf _
40133                     * @since 4.0.0
40134                     * @category Object
40135                     * @param {Object} object The object to inspect.
40136                     * @returns {Array} Returns the function names.
40137                     * @see _.functions
40138                     * @example
40139                     *
40140                     * function Foo() {
40141                     *   this.a = _.constant('a');
40142                     *   this.b = _.constant('b');
40143                     * }
40144                     *
40145                     * Foo.prototype.c = _.constant('c');
40146                     *
40147                     * _.functionsIn(new Foo);
40148                     * // => ['a', 'b', 'c']
40149                     */
40150                    function functionsIn(object) {
40151                        return object == null ? [] : baseFunctions(object, keysIn(object));
40152                    }
40153
40154                    /**
40155                     * Gets the value at `path` of `object`. If the resolved value is
40156                     * `undefined`, the `defaultValue` is returned in its place.
40157                     *
40158                     * @static
40159                     * @memberOf _
40160                     * @since 3.7.0
40161                     * @category Object
40162                     * @param {Object} object The object to query.
40163                     * @param {Array|string} path The path of the property to get.
40164                     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
40165                     * @returns {*} Returns the resolved value.
40166                     * @example
40167                     *
40168                     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
40169                     *
40170                     * _.get(object, 'a[0].b.c');
40171                     * // => 3
40172                     *
40173                     * _.get(object, ['a', '0', 'b', 'c']);
40174                     * // => 3
40175                     *
40176                     * _.get(object, 'a.b.c', 'default');
40177                     * // => 'default'
40178                     */
40179                    function get(object, path, defaultValue) {
40180                        var result = object == null ? undefined : baseGet(object, path);
40181                        return result === undefined ? defaultValue : result;
40182                    }
40183
40184                    /**
40185                     * Checks if `path` is a direct property of `object`.
40186                     *
40187                     * @static
40188                     * @since 0.1.0
40189                     * @memberOf _
40190                     * @category Object
40191                     * @param {Object} object The object to query.
40192                     * @param {Array|string} path The path to check.
40193                     * @returns {boolean} Returns `true` if `path` exists, else `false`.
40194                     * @example
40195                     *
40196                     * var object = { 'a': { 'b': 2 } };
40197                     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
40198                     *
40199                     * _.has(object, 'a');
40200                     * // => true
40201                     *
40202                     * _.has(object, 'a.b');
40203                     * // => true
40204                     *
40205                     * _.has(object, ['a', 'b']);
40206                     * // => true
40207                     *
40208                     * _.has(other, 'a');
40209                     * // => false
40210                     */
40211                    function has(object, path) {
40212                        return object != null && hasPath(object, path, baseHas);
40213                    }
40214
40215                    /**
40216                     * Checks if `path` is a direct or inherited property of `object`.
40217                     *
40218                     * @static
40219                     * @memberOf _
40220                     * @since 4.0.0
40221                     * @category Object
40222                     * @param {Object} object The object to query.
40223                     * @param {Array|string} path The path to check.
40224                     * @returns {boolean} Returns `true` if `path` exists, else `false`.
40225                     * @example
40226                     *
40227                     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
40228                     *
40229                     * _.hasIn(object, 'a');
40230                     * // => true
40231                     *
40232                     * _.hasIn(object, 'a.b');
40233                     * // => true
40234                     *
40235                     * _.hasIn(object, ['a', 'b']);
40236                     * // => true
40237                     *
40238                     * _.hasIn(object, 'b');
40239                     * // => false
40240                     */
40241                    function hasIn(object, path) {
40242                        return object != null && hasPath(object, path, baseHasIn);
40243                    }
40244
40245                    /**
40246                     * Creates an object composed of the inverted keys and values of `object`.
40247                     * If `object` contains duplicate values, subsequent values overwrite
40248                     * property assignments of previous values.
40249                     *
40250                     * @static
40251                     * @memberOf _
40252                     * @since 0.7.0
40253                     * @category Object
40254                     * @param {Object} object The object to invert.
40255                     * @returns {Object} Returns the new inverted object.
40256                     * @example
40257                     *
40258                     * var object = { 'a': 1, 'b': 2, 'c': 1 };
40259                     *
40260                     * _.invert(object);
40261                     * // => { '1': 'c', '2': 'b' }
40262                     */
40263                    var invert = createInverter(function(result, value, key) {
40264                        if (value != null &&
40265                            typeof value.toString != 'function') {
40266                            value = nativeObjectToString.call(value);
40267                        }
40268
40269                        result[value] = key;
40270                    }, constant(identity));
40271
40272                    /**
40273                     * This method is like `_.invert` except that the inverted object is generated
40274                     * from the results of running each element of `object` thru `iteratee`. The
40275                     * corresponding inverted value of each inverted key is an array of keys
40276                     * responsible for generating the inverted value. The iteratee is invoked
40277                     * with one argument: (value).
40278                     *
40279                     * @static
40280                     * @memberOf _
40281                     * @since 4.1.0
40282                     * @category Object
40283                     * @param {Object} object The object to invert.
40284                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
40285                     * @returns {Object} Returns the new inverted object.
40286                     * @example
40287                     *
40288                     * var object = { 'a': 1, 'b': 2, 'c': 1 };
40289                     *
40290                     * _.invertBy(object);
40291                     * // => { '1': ['a', 'c'], '2': ['b'] }
40292                     *
40293                     * _.invertBy(object, function(value) {
40294                     *   return 'group' + value;
40295                     * });
40296                     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
40297                     */
40298                    var invertBy = createInverter(function(result, value, key) {
40299                        if (value != null &&
40300                            typeof value.toString != 'function') {
40301                            value = nativeObjectToString.call(value);
40302                        }
40303
40304                        if (hasOwnProperty.call(result, value)) {
40305                            result[value].push(key);
40306                        } else {
40307                            result[value] = [key];
40308                        }
40309                    }, getIteratee);
40310
40311                    /**
40312                     * Invokes the method at `path` of `object`.
40313                     *
40314                     * @static
40315                     * @memberOf _
40316                     * @since 4.0.0
40317                     * @category Object
40318                     * @param {Object} object The object to query.
40319                     * @param {Array|string} path The path of the method to invoke.
40320                     * @param {...*} [args] The arguments to invoke the method with.
40321                     * @returns {*} Returns the result of the invoked method.
40322                     * @example
40323                     *
40324                     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
40325                     *
40326                     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
40327                     * // => [2, 3]
40328                     */
40329                    var invoke = baseRest(baseInvoke);
40330
40331                    /**
40332                     * Creates an array of the own enumerable property names of `object`.
40333                     *
40334                     * **Note:** Non-object values are coerced to objects. See the
40335                     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
40336                     * for more details.
40337                     *
40338                     * @static
40339                     * @since 0.1.0
40340                     * @memberOf _
40341                     * @category Object
40342                     * @param {Object} object The object to query.
40343                     * @returns {Array} Returns the array of property names.
40344                     * @example
40345                     *
40346                     * function Foo() {
40347                     *   this.a = 1;
40348                     *   this.b = 2;
40349                     * }
40350                     *
40351                     * Foo.prototype.c = 3;
40352                     *
40353                     * _.keys(new Foo);
40354                     * // => ['a', 'b'] (iteration order is not guaranteed)
40355                     *
40356                     * _.keys('hi');
40357                     * // => ['0', '1']
40358                     */
40359                    function keys(object) {
40360                        return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
40361                    }
40362
40363                    /**
40364                     * Creates an array of the own and inherited enumerable property names of `object`.
40365                     *
40366                     * **Note:** Non-object values are coerced to objects.
40367                     *
40368                     * @static
40369                     * @memberOf _
40370                     * @since 3.0.0
40371                     * @category Object
40372                     * @param {Object} object The object to query.
40373                     * @returns {Array} Returns the array of property names.
40374                     * @example
40375                     *
40376                     * function Foo() {
40377                     *   this.a = 1;
40378                     *   this.b = 2;
40379                     * }
40380                     *
40381                     * Foo.prototype.c = 3;
40382                     *
40383                     * _.keysIn(new Foo);
40384                     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
40385                     */
40386                    function keysIn(object) {
40387                        return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
40388                    }
40389
40390                    /**
40391                     * The opposite of `_.mapValues`; this method creates an object with the
40392                     * same values as `object` and keys generated by running each own enumerable
40393                     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
40394                     * with three arguments: (value, key, object).
40395                     *
40396                     * @static
40397                     * @memberOf _
40398                     * @since 3.8.0
40399                     * @category Object
40400                     * @param {Object} object The object to iterate over.
40401                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
40402                     * @returns {Object} Returns the new mapped object.
40403                     * @see _.mapValues
40404                     * @example
40405                     *
40406                     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
40407                     *   return key + value;
40408                     * });
40409                     * // => { 'a1': 1, 'b2': 2 }
40410                     */
40411                    function mapKeys(object, iteratee) {
40412                        var result = {};
40413                        iteratee = getIteratee(iteratee, 3);
40414
40415                        baseForOwn(object, function(value, key, object) {
40416                            baseAssignValue(result, iteratee(value, key, object), value);
40417                        });
40418                        return result;
40419                    }
40420
40421                    /**
40422                     * Creates an object with the same keys as `object` and values generated
40423                     * by running each own enumerable string keyed property of `object` thru
40424                     * `iteratee`. The iteratee is invoked with three arguments:
40425                     * (value, key, object).
40426                     *
40427                     * @static
40428                     * @memberOf _
40429                     * @since 2.4.0
40430                     * @category Object
40431                     * @param {Object} object The object to iterate over.
40432                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
40433                     * @returns {Object} Returns the new mapped object.
40434                     * @see _.mapKeys
40435                     * @example
40436                     *
40437                     * var users = {
40438                     *   'fred':    { 'user': 'fred',    'age': 40 },
40439                     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
40440                     * };
40441                     *
40442                     * _.mapValues(users, function(o) { return o.age; });
40443                     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
40444                     *
40445                     * // The `_.property` iteratee shorthand.
40446                     * _.mapValues(users, 'age');
40447                     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
40448                     */
40449                    function mapValues(object, iteratee) {
40450                        var result = {};
40451                        iteratee = getIteratee(iteratee, 3);
40452
40453                        baseForOwn(object, function(value, key, object) {
40454                            baseAssignValue(result, key, iteratee(value, key, object));
40455                        });
40456                        return result;
40457                    }
40458
40459                    /**
40460                     * This method is like `_.assign` except that it recursively merges own and
40461                     * inherited enumerable string keyed properties of source objects into the
40462                     * destination object. Source properties that resolve to `undefined` are
40463                     * skipped if a destination value exists. Array and plain object properties
40464                     * are merged recursively. Other objects and value types are overridden by
40465                     * assignment. Source objects are applied from left to right. Subsequent
40466                     * sources overwrite property assignments of previous sources.
40467                     *
40468                     * **Note:** This method mutates `object`.
40469                     *
40470                     * @static
40471                     * @memberOf _
40472                     * @since 0.5.0
40473                     * @category Object
40474                     * @param {Object} object The destination object.
40475                     * @param {...Object} [sources] The source objects.
40476                     * @returns {Object} Returns `object`.
40477                     * @example
40478                     *
40479                     * var object = {
40480                     *   'a': [{ 'b': 2 }, { 'd': 4 }]
40481                     * };
40482                     *
40483                     * var other = {
40484                     *   'a': [{ 'c': 3 }, { 'e': 5 }]
40485                     * };
40486                     *
40487                     * _.merge(object, other);
40488                     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
40489                     */
40490                    var merge = createAssigner(function(object, source, srcIndex) {
40491                        baseMerge(object, source, srcIndex);
40492                    });
40493
40494                    /**
40495                     * This method is like `_.merge` except that it accepts `customizer` which
40496                     * is invoked to produce the merged values of the destination and source
40497                     * properties. If `customizer` returns `undefined`, merging is handled by the
40498                     * method instead. The `customizer` is invoked with six arguments:
40499                     * (objValue, srcValue, key, object, source, stack).
40500                     *
40501                     * **Note:** This method mutates `object`.
40502                     *
40503                     * @static
40504                     * @memberOf _
40505                     * @since 4.0.0
40506                     * @category Object
40507                     * @param {Object} object The destination object.
40508                     * @param {...Object} sources The source objects.
40509                     * @param {Function} customizer The function to customize assigned values.
40510                     * @returns {Object} Returns `object`.
40511                     * @example
40512                     *
40513                     * function customizer(objValue, srcValue) {
40514                     *   if (_.isArray(objValue)) {
40515                     *     return objValue.concat(srcValue);
40516                     *   }
40517                     * }
40518                     *
40519                     * var object = { 'a': [1], 'b': [2] };
40520                     * var other = { 'a': [3], 'b': [4] };
40521                     *
40522                     * _.mergeWith(object, other, customizer);
40523                     * // => { 'a': [1, 3], 'b': [2, 4] }
40524                     */
40525                    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
40526                        baseMerge(object, source, srcIndex, customizer);
40527                    });
40528
40529                    /**
40530                     * The opposite of `_.pick`; this method creates an object composed of the
40531                     * own and inherited enumerable property paths of `object` that are not omitted.
40532                     *
40533                     * **Note:** This method is considerably slower than `_.pick`.
40534                     *
40535                     * @static
40536                     * @since 0.1.0
40537                     * @memberOf _
40538                     * @category Object
40539                     * @param {Object} object The source object.
40540                     * @param {...(string|string[])} [paths] The property paths to omit.
40541                     * @returns {Object} Returns the new object.
40542                     * @example
40543                     *
40544                     * var object = { 'a': 1, 'b': '2', 'c': 3 };
40545                     *
40546                     * _.omit(object, ['a', 'c']);
40547                     * // => { 'b': '2' }
40548                     */
40549                    var omit = flatRest(function(object, paths) {
40550                        var result = {};
40551                        if (object == null) {
40552                            return result;
40553                        }
40554                        var isDeep = false;
40555                        paths = arrayMap(paths, function(path) {
40556                            path = castPath(path, object);
40557                            isDeep || (isDeep = path.length > 1);
40558                            return path;
40559                        });
40560                        copyObject(object, getAllKeysIn(object), result);
40561                        if (isDeep) {
40562                            result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
40563                        }
40564                        var length = paths.length;
40565                        while (length--) {
40566                            baseUnset(result, paths[length]);
40567                        }
40568                        return result;
40569                    });
40570
40571                    /**
40572                     * The opposite of `_.pickBy`; this method creates an object composed of
40573                     * the own and inherited enumerable string keyed properties of `object` that
40574                     * `predicate` doesn't return truthy for. The predicate is invoked with two
40575                     * arguments: (value, key).
40576                     *
40577                     * @static
40578                     * @memberOf _
40579                     * @since 4.0.0
40580                     * @category Object
40581                     * @param {Object} object The source object.
40582                     * @param {Function} [predicate=_.identity] The function invoked per property.
40583                     * @returns {Object} Returns the new object.
40584                     * @example
40585                     *
40586                     * var object = { 'a': 1, 'b': '2', 'c': 3 };
40587                     *
40588                     * _.omitBy(object, _.isNumber);
40589                     * // => { 'b': '2' }
40590                     */
40591                    function omitBy(object, predicate) {
40592                        return pickBy(object, negate(getIteratee(predicate)));
40593                    }
40594
40595                    /**
40596                     * Creates an object composed of the picked `object` properties.
40597                     *
40598                     * @static
40599                     * @since 0.1.0
40600                     * @memberOf _
40601                     * @category Object
40602                     * @param {Object} object The source object.
40603                     * @param {...(string|string[])} [paths] The property paths to pick.
40604                     * @returns {Object} Returns the new object.
40605                     * @example
40606                     *
40607                     * var object = { 'a': 1, 'b': '2', 'c': 3 };
40608                     *
40609                     * _.pick(object, ['a', 'c']);
40610                     * // => { 'a': 1, 'c': 3 }
40611                     */
40612                    var pick = flatRest(function(object, paths) {
40613                        return object == null ? {} : basePick(object, paths);
40614                    });
40615
40616                    /**
40617                     * Creates an object composed of the `object` properties `predicate` returns
40618                     * truthy for. The predicate is invoked with two arguments: (value, key).
40619                     *
40620                     * @static
40621                     * @memberOf _
40622                     * @since 4.0.0
40623                     * @category Object
40624                     * @param {Object} object The source object.
40625                     * @param {Function} [predicate=_.identity] The function invoked per property.
40626                     * @returns {Object} Returns the new object.
40627                     * @example
40628                     *
40629                     * var object = { 'a': 1, 'b': '2', 'c': 3 };
40630                     *
40631                     * _.pickBy(object, _.isNumber);
40632                     * // => { 'a': 1, 'c': 3 }
40633                     */
40634                    function pickBy(object, predicate) {
40635                        if (object == null) {
40636                            return {};
40637                        }
40638                        var props = arrayMap(getAllKeysIn(object), function(prop) {
40639                            return [prop];
40640                        });
40641                        predicate = getIteratee(predicate);
40642                        return basePickBy(object, props, function(value, path) {
40643                            return predicate(value, path[0]);
40644                        });
40645                    }
40646
40647                    /**
40648                     * This method is like `_.get` except that if the resolved value is a
40649                     * function it's invoked with the `this` binding of its parent object and
40650                     * its result is returned.
40651                     *
40652                     * @static
40653                     * @since 0.1.0
40654                     * @memberOf _
40655                     * @category Object
40656                     * @param {Object} object The object to query.
40657                     * @param {Array|string} path The path of the property to resolve.
40658                     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
40659                     * @returns {*} Returns the resolved value.
40660                     * @example
40661                     *
40662                     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
40663                     *
40664                     * _.result(object, 'a[0].b.c1');
40665                     * // => 3
40666                     *
40667                     * _.result(object, 'a[0].b.c2');
40668                     * // => 4
40669                     *
40670                     * _.result(object, 'a[0].b.c3', 'default');
40671                     * // => 'default'
40672                     *
40673                     * _.result(object, 'a[0].b.c3', _.constant('default'));
40674                     * // => 'default'
40675                     */
40676                    function result(object, path, defaultValue) {
40677                        path = castPath(path, object);
40678
40679                        var index = -1,
40680                            length = path.length;
40681
40682                        // Ensure the loop is entered when path is empty.
40683                        if (!length) {
40684                            length = 1;
40685                            object = undefined;
40686                        }
40687                        while (++index < length) {
40688                            var value = object == null ? undefined : object[toKey(path[index])];
40689                            if (value === undefined) {
40690                                index = length;
40691                                value = defaultValue;
40692                            }
40693                            object = isFunction(value) ? value.call(object) : value;
40694                        }
40695                        return object;
40696                    }
40697
40698                    /**
40699                     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
40700                     * it's created. Arrays are created for missing index properties while objects
40701                     * are created for all other missing properties. Use `_.setWith` to customize
40702                     * `path` creation.
40703                     *
40704                     * **Note:** This method mutates `object`.
40705                     *
40706                     * @static
40707                     * @memberOf _
40708                     * @since 3.7.0
40709                     * @category Object
40710                     * @param {Object} object The object to modify.
40711                     * @param {Array|string} path The path of the property to set.
40712                     * @param {*} value The value to set.
40713                     * @returns {Object} Returns `object`.
40714                     * @example
40715                     *
40716                     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
40717                     *
40718                     * _.set(object, 'a[0].b.c', 4);
40719                     * console.log(object.a[0].b.c);
40720                     * // => 4
40721                     *
40722                     * _.set(object, ['x', '0', 'y', 'z'], 5);
40723                     * console.log(object.x[0].y.z);
40724                     * // => 5
40725                     */
40726                    function set(object, path, value) {
40727                        return object == null ? object : baseSet(object, path, value);
40728                    }
40729
40730                    /**
40731                     * This method is like `_.set` except that it accepts `customizer` which is
40732                     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
40733                     * path creation is handled by the method instead. The `customizer` is invoked
40734                     * with three arguments: (nsValue, key, nsObject).
40735                     *
40736                     * **Note:** This method mutates `object`.
40737                     *
40738                     * @static
40739                     * @memberOf _
40740                     * @since 4.0.0
40741                     * @category Object
40742                     * @param {Object} object The object to modify.
40743                     * @param {Array|string} path The path of the property to set.
40744                     * @param {*} value The value to set.
40745                     * @param {Function} [customizer] The function to customize assigned values.
40746                     * @returns {Object} Returns `object`.
40747                     * @example
40748                     *
40749                     * var object = {};
40750                     *
40751                     * _.setWith(object, '[0][1]', 'a', Object);
40752                     * // => { '0': { '1': 'a' } }
40753                     */
40754                    function setWith(object, path, value, customizer) {
40755                        customizer = typeof customizer == 'function' ? customizer : undefined;
40756                        return object == null ? object : baseSet(object, path, value, customizer);
40757                    }
40758
40759                    /**
40760                     * Creates an array of own enumerable string keyed-value pairs for `object`
40761                     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
40762                     * entries are returned.
40763                     *
40764                     * @static
40765                     * @memberOf _
40766                     * @since 4.0.0
40767                     * @alias entries
40768                     * @category Object
40769                     * @param {Object} object The object to query.
40770                     * @returns {Array} Returns the key-value pairs.
40771                     * @example
40772                     *
40773                     * function Foo() {
40774                     *   this.a = 1;
40775                     *   this.b = 2;
40776                     * }
40777                     *
40778                     * Foo.prototype.c = 3;
40779                     *
40780                     * _.toPairs(new Foo);
40781                     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
40782                     */
40783                    var toPairs = createToPairs(keys);
40784
40785                    /**
40786                     * Creates an array of own and inherited enumerable string keyed-value pairs
40787                     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
40788                     * or set, its entries are returned.
40789                     *
40790                     * @static
40791                     * @memberOf _
40792                     * @since 4.0.0
40793                     * @alias entriesIn
40794                     * @category Object
40795                     * @param {Object} object The object to query.
40796                     * @returns {Array} Returns the key-value pairs.
40797                     * @example
40798                     *
40799                     * function Foo() {
40800                     *   this.a = 1;
40801                     *   this.b = 2;
40802                     * }
40803                     *
40804                     * Foo.prototype.c = 3;
40805                     *
40806                     * _.toPairsIn(new Foo);
40807                     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
40808                     */
40809                    var toPairsIn = createToPairs(keysIn);
40810
40811                    /**
40812                     * An alternative to `_.reduce`; this method transforms `object` to a new
40813                     * `accumulator` object which is the result of running each of its own
40814                     * enumerable string keyed properties thru `iteratee`, with each invocation
40815                     * potentially mutating the `accumulator` object. If `accumulator` is not
40816                     * provided, a new object with the same `[[Prototype]]` will be used. The
40817                     * iteratee is invoked with four arguments: (accumulator, value, key, object).
40818                     * Iteratee functions may exit iteration early by explicitly returning `false`.
40819                     *
40820                     * @static
40821                     * @memberOf _
40822                     * @since 1.3.0
40823                     * @category Object
40824                     * @param {Object} object The object to iterate over.
40825                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
40826                     * @param {*} [accumulator] The custom accumulator value.
40827                     * @returns {*} Returns the accumulated value.
40828                     * @example
40829                     *
40830                     * _.transform([2, 3, 4], function(result, n) {
40831                     *   result.push(n *= n);
40832                     *   return n % 2 == 0;
40833                     * }, []);
40834                     * // => [4, 9]
40835                     *
40836                     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
40837                     *   (result[value] || (result[value] = [])).push(key);
40838                     * }, {});
40839                     * // => { '1': ['a', 'c'], '2': ['b'] }
40840                     */
40841                    function transform(object, iteratee, accumulator) {
40842                        var isArr = isArray(object),
40843                            isArrLike = isArr || isBuffer(object) || isTypedArray(object);
40844
40845                        iteratee = getIteratee(iteratee, 4);
40846                        if (accumulator == null) {
40847                            var Ctor = object && object.constructor;
40848                            if (isArrLike) {
40849                                accumulator = isArr ? new Ctor : [];
40850                            }
40851                            else if (isObject(object)) {
40852                                accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
40853                            }
40854                            else {
40855                                accumulator = {};
40856                            }
40857                        }
40858                        (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
40859                            return iteratee(accumulator, value, index, object);
40860                        });
40861                        return accumulator;
40862                    }
40863
40864                    /**
40865                     * Removes the property at `path` of `object`.
40866                     *
40867                     * **Note:** This method mutates `object`.
40868                     *
40869                     * @static
40870                     * @memberOf _
40871                     * @since 4.0.0
40872                     * @category Object
40873                     * @param {Object} object The object to modify.
40874                     * @param {Array|string} path The path of the property to unset.
40875                     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
40876                     * @example
40877                     *
40878                     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
40879                     * _.unset(object, 'a[0].b.c');
40880                     * // => true
40881                     *
40882                     * console.log(object);
40883                     * // => { 'a': [{ 'b': {} }] };
40884                     *
40885                     * _.unset(object, ['a', '0', 'b', 'c']);
40886                     * // => true
40887                     *
40888                     * console.log(object);
40889                     * // => { 'a': [{ 'b': {} }] };
40890                     */
40891                    function unset(object, path) {
40892                        return object == null ? true : baseUnset(object, path);
40893                    }
40894
40895                    /**
40896                     * This method is like `_.set` except that accepts `updater` to produce the
40897                     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
40898                     * is invoked with one argument: (value).
40899                     *
40900                     * **Note:** This method mutates `object`.
40901                     *
40902                     * @static
40903                     * @memberOf _
40904                     * @since 4.6.0
40905                     * @category Object
40906                     * @param {Object} object The object to modify.
40907                     * @param {Array|string} path The path of the property to set.
40908                     * @param {Function} updater The function to produce the updated value.
40909                     * @returns {Object} Returns `object`.
40910                     * @example
40911                     *
40912                     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
40913                     *
40914                     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
40915                     * console.log(object.a[0].b.c);
40916                     * // => 9
40917                     *
40918                     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
40919                     * console.log(object.x[0].y.z);
40920                     * // => 0
40921                     */
40922                    function update(object, path, updater) {
40923                        return object == null ? object : baseUpdate(object, path, castFunction(updater));
40924                    }
40925
40926                    /**
40927                     * This method is like `_.update` except that it accepts `customizer` which is
40928                     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
40929                     * path creation is handled by the method instead. The `customizer` is invoked
40930                     * with three arguments: (nsValue, key, nsObject).
40931                     *
40932                     * **Note:** This method mutates `object`.
40933                     *
40934                     * @static
40935                     * @memberOf _
40936                     * @since 4.6.0
40937                     * @category Object
40938                     * @param {Object} object The object to modify.
40939                     * @param {Array|string} path The path of the property to set.
40940                     * @param {Function} updater The function to produce the updated value.
40941                     * @param {Function} [customizer] The function to customize assigned values.
40942                     * @returns {Object} Returns `object`.
40943                     * @example
40944                     *
40945                     * var object = {};
40946                     *
40947                     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
40948                     * // => { '0': { '1': 'a' } }
40949                     */
40950                    function updateWith(object, path, updater, customizer) {
40951                        customizer = typeof customizer == 'function' ? customizer : undefined;
40952                        return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
40953                    }
40954
40955                    /**
40956                     * Creates an array of the own enumerable string keyed property values of `object`.
40957                     *
40958                     * **Note:** Non-object values are coerced to objects.
40959                     *
40960                     * @static
40961                     * @since 0.1.0
40962                     * @memberOf _
40963                     * @category Object
40964                     * @param {Object} object The object to query.
40965                     * @returns {Array} Returns the array of property values.
40966                     * @example
40967                     *
40968                     * function Foo() {
40969                     *   this.a = 1;
40970                     *   this.b = 2;
40971                     * }
40972                     *
40973                     * Foo.prototype.c = 3;
40974                     *
40975                     * _.values(new Foo);
40976                     * // => [1, 2] (iteration order is not guaranteed)
40977                     *
40978                     * _.values('hi');
40979                     * // => ['h', 'i']
40980                     */
40981                    function values(object) {
40982                        return object == null ? [] : baseValues(object, keys(object));
40983                    }
40984
40985                    /**
40986                     * Creates an array of the own and inherited enumerable string keyed property
40987                     * values of `object`.
40988                     *
40989                     * **Note:** Non-object values are coerced to objects.
40990                     *
40991                     * @static
40992                     * @memberOf _
40993                     * @since 3.0.0
40994                     * @category Object
40995                     * @param {Object} object The object to query.
40996                     * @returns {Array} Returns the array of property values.
40997                     * @example
40998                     *
40999                     * function Foo() {
41000                     *   this.a = 1;
41001                     *   this.b = 2;
41002                     * }
41003                     *
41004                     * Foo.prototype.c = 3;
41005                     *
41006                     * _.valuesIn(new Foo);
41007                     * // => [1, 2, 3] (iteration order is not guaranteed)
41008                     */
41009                    function valuesIn(object) {
41010                        return object == null ? [] : baseValues(object, keysIn(object));
41011                    }
41012
41013                    /*------------------------------------------------------------------------*/
41014
41015                    /**
41016                     * Clamps `number` within the inclusive `lower` and `upper` bounds.
41017                     *
41018                     * @static
41019                     * @memberOf _
41020                     * @since 4.0.0
41021                     * @category Number
41022                     * @param {number} number The number to clamp.
41023                     * @param {number} [lower] The lower bound.
41024                     * @param {number} upper The upper bound.
41025                     * @returns {number} Returns the clamped number.
41026                     * @example
41027                     *
41028                     * _.clamp(-10, -5, 5);
41029                     * // => -5
41030                     *
41031                     * _.clamp(10, -5, 5);
41032                     * // => 5
41033                     */
41034                    function clamp(number, lower, upper) {
41035                        if (upper === undefined) {
41036                            upper = lower;
41037                            lower = undefined;
41038                        }
41039                        if (upper !== undefined) {
41040                            upper = toNumber(upper);
41041                            upper = upper === upper ? upper : 0;
41042                        }
41043                        if (lower !== undefined) {
41044                            lower = toNumber(lower);
41045                            lower = lower === lower ? lower : 0;
41046                        }
41047                        return baseClamp(toNumber(number), lower, upper);
41048                    }
41049
41050                    /**
41051                     * Checks if `n` is between `start` and up to, but not including, `end`. If
41052                     * `end` is not specified, it's set to `start` with `start` then set to `0`.
41053                     * If `start` is greater than `end` the params are swapped to support
41054                     * negative ranges.
41055                     *
41056                     * @static
41057                     * @memberOf _
41058                     * @since 3.3.0
41059                     * @category Number
41060                     * @param {number} number The number to check.
41061                     * @param {number} [start=0] The start of the range.
41062                     * @param {number} end The end of the range.
41063                     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
41064                     * @see _.range, _.rangeRight
41065                     * @example
41066                     *
41067                     * _.inRange(3, 2, 4);
41068                     * // => true
41069                     *
41070                     * _.inRange(4, 8);
41071                     * // => true
41072                     *
41073                     * _.inRange(4, 2);
41074                     * // => false
41075                     *
41076                     * _.inRange(2, 2);
41077                     * // => false
41078                     *
41079                     * _.inRange(1.2, 2);
41080                     * // => true
41081                     *
41082                     * _.inRange(5.2, 4);
41083                     * // => false
41084                     *
41085                     * _.inRange(-3, -2, -6);
41086                     * // => true
41087                     */
41088                    function inRange(number, start, end) {
41089                        start = toFinite(start);
41090                        if (end === undefined) {
41091                            end = start;
41092                            start = 0;
41093                        } else {
41094                            end = toFinite(end);
41095                        }
41096                        number = toNumber(number);
41097                        return baseInRange(number, start, end);
41098                    }
41099
41100                    /**
41101                     * Produces a random number between the inclusive `lower` and `upper` bounds.
41102                     * If only one argument is provided a number between `0` and the given number
41103                     * is returned. If `floating` is `true`, or either `lower` or `upper` are
41104                     * floats, a floating-point number is returned instead of an integer.
41105                     *
41106                     * **Note:** JavaScript follows the IEEE-754 standard for resolving
41107                     * floating-point values which can produce unexpected results.
41108                     *
41109                     * @static
41110                     * @memberOf _
41111                     * @since 0.7.0
41112                     * @category Number
41113                     * @param {number} [lower=0] The lower bound.
41114                     * @param {number} [upper=1] The upper bound.
41115                     * @param {boolean} [floating] Specify returning a floating-point number.
41116                     * @returns {number} Returns the random number.
41117                     * @example
41118                     *
41119                     * _.random(0, 5);
41120                     * // => an integer between 0 and 5
41121                     *
41122                     * _.random(5);
41123                     * // => also an integer between 0 and 5
41124                     *
41125                     * _.random(5, true);
41126                     * // => a floating-point number between 0 and 5
41127                     *
41128                     * _.random(1.2, 5.2);
41129                     * // => a floating-point number between 1.2 and 5.2
41130                     */
41131                    function random(lower, upper, floating) {
41132                        if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
41133                            upper = floating = undefined;
41134                        }
41135                        if (floating === undefined) {
41136                            if (typeof upper == 'boolean') {
41137                                floating = upper;
41138                                upper = undefined;
41139                            }
41140                            else if (typeof lower == 'boolean') {
41141                                floating = lower;
41142                                lower = undefined;
41143                            }
41144                        }
41145                        if (lower === undefined && upper === undefined) {
41146                            lower = 0;
41147                            upper = 1;
41148                        }
41149                        else {
41150                            lower = toFinite(lower);
41151                            if (upper === undefined) {
41152                                upper = lower;
41153                                lower = 0;
41154                            } else {
41155                                upper = toFinite(upper);
41156                            }
41157                        }
41158                        if (lower > upper) {
41159                            var temp = lower;
41160                            lower = upper;
41161                            upper = temp;
41162                        }
41163                        if (floating || lower % 1 || upper % 1) {
41164                            var rand = nativeRandom();
41165                            return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
41166                        }
41167                        return baseRandom(lower, upper);
41168                    }
41169
41170                    /*------------------------------------------------------------------------*/
41171
41172                    /**
41173                     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
41174                     *
41175                     * @static
41176                     * @memberOf _
41177                     * @since 3.0.0
41178                     * @category String
41179                     * @param {string} [string=''] The string to convert.
41180                     * @returns {string} Returns the camel cased string.
41181                     * @example
41182                     *
41183                     * _.camelCase('Foo Bar');
41184                     * // => 'fooBar'
41185                     *
41186                     * _.camelCase('--foo-bar--');
41187                     * // => 'fooBar'
41188                     *
41189                     * _.camelCase('__FOO_BAR__');
41190                     * // => 'fooBar'
41191                     */
41192                    var camelCase = createCompounder(function(result, word, index) {
41193                        word = word.toLowerCase();
41194                        return result + (index ? capitalize(word) : word);
41195                    });
41196
41197                    /**
41198                     * Converts the first character of `string` to upper case and the remaining
41199                     * to lower case.
41200                     *
41201                     * @static
41202                     * @memberOf _
41203                     * @since 3.0.0
41204                     * @category String
41205                     * @param {string} [string=''] The string to capitalize.
41206                     * @returns {string} Returns the capitalized string.
41207                     * @example
41208                     *
41209                     * _.capitalize('FRED');
41210                     * // => 'Fred'
41211                     */
41212                    function capitalize(string) {
41213                        return upperFirst(toString(string).toLowerCase());
41214                    }
41215
41216                    /**
41217                     * Deburrs `string` by converting
41218                     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
41219                     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
41220                     * letters to basic Latin letters and removing
41221                     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
41222                     *
41223                     * @static
41224                     * @memberOf _
41225                     * @since 3.0.0
41226                     * @category String
41227                     * @param {string} [string=''] The string to deburr.
41228                     * @returns {string} Returns the deburred string.
41229                     * @example
41230                     *
41231                     * _.deburr('déjà vu');
41232                     * // => 'deja vu'
41233                     */
41234                    function deburr(string) {
41235                        string = toString(string);
41236                        return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
41237                    }
41238
41239                    /**
41240                     * Checks if `string` ends with the given target string.
41241                     *
41242                     * @static
41243                     * @memberOf _
41244                     * @since 3.0.0
41245                     * @category String
41246                     * @param {string} [string=''] The string to inspect.
41247                     * @param {string} [target] The string to search for.
41248                     * @param {number} [position=string.length] The position to search up to.
41249                     * @returns {boolean} Returns `true` if `string` ends with `target`,
41250                     *  else `false`.
41251                     * @example
41252                     *
41253                     * _.endsWith('abc', 'c');
41254                     * // => true
41255                     *
41256                     * _.endsWith('abc', 'b');
41257                     * // => false
41258                     *
41259                     * _.endsWith('abc', 'b', 2);
41260                     * // => true
41261                     */
41262                    function endsWith(string, target, position) {
41263                        string = toString(string);
41264                        target = baseToString(target);
41265
41266                        var length = string.length;
41267                        position = position === undefined
41268                            ? length
41269                            : baseClamp(toInteger(position), 0, length);
41270
41271                        var end = position;
41272                        position -= target.length;
41273                        return position >= 0 && string.slice(position, end) == target;
41274                    }
41275
41276                    /**
41277                     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
41278                     * corresponding HTML entities.
41279                     *
41280                     * **Note:** No other characters are escaped. To escape additional
41281                     * characters use a third-party library like [_he_](https://mths.be/he).
41282                     *
41283                     * Though the ">" character is escaped for symmetry, characters like
41284                     * ">" and "/" don't need escaping in HTML and have no special meaning
41285                     * unless they're part of a tag or unquoted attribute value. See
41286                     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
41287                     * (under "semi-related fun fact") for more details.
41288                     *
41289                     * When working with HTML you should always
41290                     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
41291                     * XSS vectors.
41292                     *
41293                     * @static
41294                     * @since 0.1.0
41295                     * @memberOf _
41296                     * @category String
41297                     * @param {string} [string=''] The string to escape.
41298                     * @returns {string} Returns the escaped string.
41299                     * @example
41300                     *
41301                     * _.escape('fred, barney, & pebbles');
41302                     * // => 'fred, barney, &amp; pebbles'
41303                     */
41304                    function escape(string) {
41305                        string = toString(string);
41306                        return (string && reHasUnescapedHtml.test(string))
41307                            ? string.replace(reUnescapedHtml, escapeHtmlChar)
41308                            : string;
41309                    }
41310
41311                    /**
41312                     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
41313                     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
41314                     *
41315                     * @static
41316                     * @memberOf _
41317                     * @since 3.0.0
41318                     * @category String
41319                     * @param {string} [string=''] The string to escape.
41320                     * @returns {string} Returns the escaped string.
41321                     * @example
41322                     *
41323                     * _.escapeRegExp('[lodash](https://lodash.com/)');
41324                     * // => '\[lodash\]\(https://lodash\.com/\)'
41325                     */
41326                    function escapeRegExp(string) {
41327                        string = toString(string);
41328                        return (string && reHasRegExpChar.test(string))
41329                            ? string.replace(reRegExpChar, '\\$&')
41330                            : string;
41331                    }
41332
41333                    /**
41334                     * Converts `string` to
41335                     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
41336                     *
41337                     * @static
41338                     * @memberOf _
41339                     * @since 3.0.0
41340                     * @category String
41341                     * @param {string} [string=''] The string to convert.
41342                     * @returns {string} Returns the kebab cased string.
41343                     * @example
41344                     *
41345                     * _.kebabCase('Foo Bar');
41346                     * // => 'foo-bar'
41347                     *
41348                     * _.kebabCase('fooBar');
41349                     * // => 'foo-bar'
41350                     *
41351                     * _.kebabCase('__FOO_BAR__');
41352                     * // => 'foo-bar'
41353                     */
41354                    var kebabCase = createCompounder(function(result, word, index) {
41355                        return result + (index ? '-' : '') + word.toLowerCase();
41356                    });
41357
41358                    /**
41359                     * Converts `string`, as space separated words, to lower case.
41360                     *
41361                     * @static
41362                     * @memberOf _
41363                     * @since 4.0.0
41364                     * @category String
41365                     * @param {string} [string=''] The string to convert.
41366                     * @returns {string} Returns the lower cased string.
41367                     * @example
41368                     *
41369                     * _.lowerCase('--Foo-Bar--');
41370                     * // => 'foo bar'
41371                     *
41372                     * _.lowerCase('fooBar');
41373                     * // => 'foo bar'
41374                     *
41375                     * _.lowerCase('__FOO_BAR__');
41376                     * // => 'foo bar'
41377                     */
41378                    var lowerCase = createCompounder(function(result, word, index) {
41379                        return result + (index ? ' ' : '') + word.toLowerCase();
41380                    });
41381
41382                    /**
41383                     * Converts the first character of `string` to lower case.
41384                     *
41385                     * @static
41386                     * @memberOf _
41387                     * @since 4.0.0
41388                     * @category String
41389                     * @param {string} [string=''] The string to convert.
41390                     * @returns {string} Returns the converted string.
41391                     * @example
41392                     *
41393                     * _.lowerFirst('Fred');
41394                     * // => 'fred'
41395                     *
41396                     * _.lowerFirst('FRED');
41397                     * // => 'fRED'
41398                     */
41399                    var lowerFirst = createCaseFirst('toLowerCase');
41400
41401                    /**
41402                     * Pads `string` on the left and right sides if it's shorter than `length`.
41403                     * Padding characters are truncated if they can't be evenly divided by `length`.
41404                     *
41405                     * @static
41406                     * @memberOf _
41407                     * @since 3.0.0
41408                     * @category String
41409                     * @param {string} [string=''] The string to pad.
41410                     * @param {number} [length=0] The padding length.
41411                     * @param {string} [chars=' '] The string used as padding.
41412                     * @returns {string} Returns the padded string.
41413                     * @example
41414                     *
41415                     * _.pad('abc', 8);
41416                     * // => '  abc   '
41417                     *
41418                     * _.pad('abc', 8, '_-');
41419                     * // => '_-abc_-_'
41420                     *
41421                     * _.pad('abc', 3);
41422                     * // => 'abc'
41423                     */
41424                    function pad(string, length, chars) {
41425                        string = toString(string);
41426                        length = toInteger(length);
41427
41428                        var strLength = length ? stringSize(string) : 0;
41429                        if (!length || strLength >= length) {
41430                            return string;
41431                        }
41432                        var mid = (length - strLength) / 2;
41433                        return (
41434                            createPadding(nativeFloor(mid), chars) +
41435                            string +
41436                            createPadding(nativeCeil(mid), chars)
41437                        );
41438                    }
41439
41440                    /**
41441                     * Pads `string` on the right side if it's shorter than `length`. Padding
41442                     * characters are truncated if they exceed `length`.
41443                     *
41444                     * @static
41445                     * @memberOf _
41446                     * @since 4.0.0
41447                     * @category String
41448                     * @param {string} [string=''] The string to pad.
41449                     * @param {number} [length=0] The padding length.
41450                     * @param {string} [chars=' '] The string used as padding.
41451                     * @returns {string} Returns the padded string.
41452                     * @example
41453                     *
41454                     * _.padEnd('abc', 6);
41455                     * // => 'abc   '
41456                     *
41457                     * _.padEnd('abc', 6, '_-');
41458                     * // => 'abc_-_'
41459                     *
41460                     * _.padEnd('abc', 3);
41461                     * // => 'abc'
41462                     */
41463                    function padEnd(string, length, chars) {
41464                        string = toString(string);
41465                        length = toInteger(length);
41466
41467                        var strLength = length ? stringSize(string) : 0;
41468                        return (length && strLength < length)
41469                            ? (string + createPadding(length - strLength, chars))
41470                            : string;
41471                    }
41472
41473                    /**
41474                     * Pads `string` on the left side if it's shorter than `length`. Padding
41475                     * characters are truncated if they exceed `length`.
41476                     *
41477                     * @static
41478                     * @memberOf _
41479                     * @since 4.0.0
41480                     * @category String
41481                     * @param {string} [string=''] The string to pad.
41482                     * @param {number} [length=0] The padding length.
41483                     * @param {string} [chars=' '] The string used as padding.
41484                     * @returns {string} Returns the padded string.
41485                     * @example
41486                     *
41487                     * _.padStart('abc', 6);
41488                     * // => '   abc'
41489                     *
41490                     * _.padStart('abc', 6, '_-');
41491                     * // => '_-_abc'
41492                     *
41493                     * _.padStart('abc', 3);
41494                     * // => 'abc'
41495                     */
41496                    function padStart(string, length, chars) {
41497                        string = toString(string);
41498                        length = toInteger(length);
41499
41500                        var strLength = length ? stringSize(string) : 0;
41501                        return (length && strLength < length)
41502                            ? (createPadding(length - strLength, chars) + string)
41503                            : string;
41504                    }
41505
41506                    /**
41507                     * Converts `string` to an integer of the specified radix. If `radix` is
41508                     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
41509                     * hexadecimal, in which case a `radix` of `16` is used.
41510                     *
41511                     * **Note:** This method aligns with the
41512                     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
41513                     *
41514                     * @static
41515                     * @memberOf _
41516                     * @since 1.1.0
41517                     * @category String
41518                     * @param {string} string The string to convert.
41519                     * @param {number} [radix=10] The radix to interpret `value` by.
41520                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
41521                     * @returns {number} Returns the converted integer.
41522                     * @example
41523                     *
41524                     * _.parseInt('08');
41525                     * // => 8
41526                     *
41527                     * _.map(['6', '08', '10'], _.parseInt);
41528                     * // => [6, 8, 10]
41529                     */
41530                    function parseInt(string, radix, guard) {
41531                        if (guard || radix == null) {
41532                            radix = 0;
41533                        } else if (radix) {
41534                            radix = +radix;
41535                        }
41536                        return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
41537                    }
41538
41539                    /**
41540                     * Repeats the given string `n` times.
41541                     *
41542                     * @static
41543                     * @memberOf _
41544                     * @since 3.0.0
41545                     * @category String
41546                     * @param {string} [string=''] The string to repeat.
41547                     * @param {number} [n=1] The number of times to repeat the string.
41548                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
41549                     * @returns {string} Returns the repeated string.
41550                     * @example
41551                     *
41552                     * _.repeat('*', 3);
41553                     * // => '***'
41554                     *
41555                     * _.repeat('abc', 2);
41556                     * // => 'abcabc'
41557                     *
41558                     * _.repeat('abc', 0);
41559                     * // => ''
41560                     */
41561                    function repeat(string, n, guard) {
41562                        if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
41563                            n = 1;
41564                        } else {
41565                            n = toInteger(n);
41566                        }
41567                        return baseRepeat(toString(string), n);
41568                    }
41569
41570                    /**
41571                     * Replaces matches for `pattern` in `string` with `replacement`.
41572                     *
41573                     * **Note:** This method is based on
41574                     * [`String#replace`](https://mdn.io/String/replace).
41575                     *
41576                     * @static
41577                     * @memberOf _
41578                     * @since 4.0.0
41579                     * @category String
41580                     * @param {string} [string=''] The string to modify.
41581                     * @param {RegExp|string} pattern The pattern to replace.
41582                     * @param {Function|string} replacement The match replacement.
41583                     * @returns {string} Returns the modified string.
41584                     * @example
41585                     *
41586                     * _.replace('Hi Fred', 'Fred', 'Barney');
41587                     * // => 'Hi Barney'
41588                     */
41589                    function replace() {
41590                        var args = arguments,
41591                            string = toString(args[0]);
41592
41593                        return args.length < 3 ? string : string.replace(args[1], args[2]);
41594                    }
41595
41596                    /**
41597                     * Converts `string` to
41598                     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
41599                     *
41600                     * @static
41601                     * @memberOf _
41602                     * @since 3.0.0
41603                     * @category String
41604                     * @param {string} [string=''] The string to convert.
41605                     * @returns {string} Returns the snake cased string.
41606                     * @example
41607                     *
41608                     * _.snakeCase('Foo Bar');
41609                     * // => 'foo_bar'
41610                     *
41611                     * _.snakeCase('fooBar');
41612                     * // => 'foo_bar'
41613                     *
41614                     * _.snakeCase('--FOO-BAR--');
41615                     * // => 'foo_bar'
41616                     */
41617                    var snakeCase = createCompounder(function(result, word, index) {
41618                        return result + (index ? '_' : '') + word.toLowerCase();
41619                    });
41620
41621                    /**
41622                     * Splits `string` by `separator`.
41623                     *
41624                     * **Note:** This method is based on
41625                     * [`String#split`](https://mdn.io/String/split).
41626                     *
41627                     * @static
41628                     * @memberOf _
41629                     * @since 4.0.0
41630                     * @category String
41631                     * @param {string} [string=''] The string to split.
41632                     * @param {RegExp|string} separator The separator pattern to split by.
41633                     * @param {number} [limit] The length to truncate results to.
41634                     * @returns {Array} Returns the string segments.
41635                     * @example
41636                     *
41637                     * _.split('a-b-c', '-', 2);
41638                     * // => ['a', 'b']
41639                     */
41640                    function split(string, separator, limit) {
41641                        if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
41642                            separator = limit = undefined;
41643                        }
41644                        limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
41645                        if (!limit) {
41646                            return [];
41647                        }
41648                        string = toString(string);
41649                        if (string && (
41650                            typeof separator == 'string' ||
41651                            (separator != null && !isRegExp(separator))
41652                        )) {
41653                            separator = baseToString(separator);
41654                            if (!separator && hasUnicode(string)) {
41655                                return castSlice(stringToArray(string), 0, limit);
41656                            }
41657                        }
41658                        return string.split(separator, limit);
41659                    }
41660
41661                    /**
41662                     * Converts `string` to
41663                     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
41664                     *
41665                     * @static
41666                     * @memberOf _
41667                     * @since 3.1.0
41668                     * @category String
41669                     * @param {string} [string=''] The string to convert.
41670                     * @returns {string} Returns the start cased string.
41671                     * @example
41672                     *
41673                     * _.startCase('--foo-bar--');
41674                     * // => 'Foo Bar'
41675                     *
41676                     * _.startCase('fooBar');
41677                     * // => 'Foo Bar'
41678                     *
41679                     * _.startCase('__FOO_BAR__');
41680                     * // => 'FOO BAR'
41681                     */
41682                    var startCase = createCompounder(function(result, word, index) {
41683                        return result + (index ? ' ' : '') + upperFirst(word);
41684                    });
41685
41686                    /**
41687                     * Checks if `string` starts with the given target string.
41688                     *
41689                     * @static
41690                     * @memberOf _
41691                     * @since 3.0.0
41692                     * @category String
41693                     * @param {string} [string=''] The string to inspect.
41694                     * @param {string} [target] The string to search for.
41695                     * @param {number} [position=0] The position to search from.
41696                     * @returns {boolean} Returns `true` if `string` starts with `target`,
41697                     *  else `false`.
41698                     * @example
41699                     *
41700                     * _.startsWith('abc', 'a');
41701                     * // => true
41702                     *
41703                     * _.startsWith('abc', 'b');
41704                     * // => false
41705                     *
41706                     * _.startsWith('abc', 'b', 1);
41707                     * // => true
41708                     */
41709                    function startsWith(string, target, position) {
41710                        string = toString(string);
41711                        position = position == null
41712                            ? 0
41713                            : baseClamp(toInteger(position), 0, string.length);
41714
41715                        target = baseToString(target);
41716                        return string.slice(position, position + target.length) == target;
41717                    }
41718
41719                    /**
41720                     * Creates a compiled template function that can interpolate data properties
41721                     * in "interpolate" delimiters, HTML-escape interpolated data properties in
41722                     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
41723                     * properties may be accessed as free variables in the template. If a setting
41724                     * object is given, it takes precedence over `_.templateSettings` values.
41725                     *
41726                     * **Note:** In the development build `_.template` utilizes
41727                     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
41728                     * for easier debugging.
41729                     *
41730                     * For more information on precompiling templates see
41731                     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
41732                     *
41733                     * For more information on Chrome extension sandboxes see
41734                     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
41735                     *
41736                     * @static
41737                     * @since 0.1.0
41738                     * @memberOf _
41739                     * @category String
41740                     * @param {string} [string=''] The template string.
41741                     * @param {Object} [options={}] The options object.
41742                     * @param {RegExp} [options.escape=_.templateSettings.escape]
41743                     *  The HTML "escape" delimiter.
41744                     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
41745                     *  The "evaluate" delimiter.
41746                     * @param {Object} [options.imports=_.templateSettings.imports]
41747                     *  An object to import into the template as free variables.
41748                     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
41749                     *  The "interpolate" delimiter.
41750                     * @param {string} [options.sourceURL='lodash.templateSources[n]']
41751                     *  The sourceURL of the compiled template.
41752                     * @param {string} [options.variable='obj']
41753                     *  The data object variable name.
41754                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
41755                     * @returns {Function} Returns the compiled template function.
41756                     * @example
41757                     *
41758                     * // Use the "interpolate" delimiter to create a compiled template.
41759                     * var compiled = _.template('hello <%= user %>!');
41760                     * compiled({ 'user': 'fred' });
41761                     * // => 'hello fred!'
41762                     *
41763                     * // Use the HTML "escape" delimiter to escape data property values.
41764                     * var compiled = _.template('<b><%- value %></b>');
41765                     * compiled({ 'value': '<script>' });
41766                     * // => '<b>&lt;script&gt;</b>'
41767                     *
41768                     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
41769                     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
41770                     * compiled({ 'users': ['fred', 'barney'] });
41771                     * // => '<li>fred</li><li>barney</li>'
41772                     *
41773                     * // Use the internal `print` function in "evaluate" delimiters.
41774                     * var compiled = _.template('<% print("hello " + user); %>!');
41775                     * compiled({ 'user': 'barney' });
41776                     * // => 'hello barney!'
41777                     *
41778                     * // Use the ES template literal delimiter as an "interpolate" delimiter.
41779                     * // Disable support by replacing the "interpolate" delimiter.
41780                     * var compiled = _.template('hello ${ user }!');
41781                     * compiled({ 'user': 'pebbles' });
41782                     * // => 'hello pebbles!'
41783                     *
41784                     * // Use backslashes to treat delimiters as plain text.
41785                     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
41786                     * compiled({ 'value': 'ignored' });
41787                     * // => '<%- value %>'
41788                     *
41789                     * // Use the `imports` option to import `jQuery` as `jq`.
41790                     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
41791                     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
41792                     * compiled({ 'users': ['fred', 'barney'] });
41793                     * // => '<li>fred</li><li>barney</li>'
41794                     *
41795                     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
41796                     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
41797                     * compiled(data);
41798                     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
41799                     *
41800                     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
41801                     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
41802                     * compiled.source;
41803                     * // => function(data) {
41804                     * //   var __t, __p = '';
41805                     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
41806                     * //   return __p;
41807                     * // }
41808                     *
41809                     * // Use custom template delimiters.
41810                     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
41811                     * var compiled = _.template('hello {{ user }}!');
41812                     * compiled({ 'user': 'mustache' });
41813                     * // => 'hello mustache!'
41814                     *
41815                     * // Use the `source` property to inline compiled templates for meaningful
41816                     * // line numbers in error messages and stack traces.
41817                     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
41818                     *   var JST = {\
41819                     *     "main": ' + _.template(mainText).source + '\
41820                     *   };\
41821                     * ');
41822                     */
41823                    function template(string, options, guard) {
41824                        // Based on John Resig's `tmpl` implementation
41825                        // (http://ejohn.org/blog/javascript-micro-templating/)
41826                        // and Laura Doktorova's doT.js (https://github.com/olado/doT).
41827                        var settings = lodash.templateSettings;
41828
41829                        if (guard && isIterateeCall(string, options, guard)) {
41830                            options = undefined;
41831                        }
41832                        string = toString(string);
41833                        options = assignInWith({}, options, settings, customDefaultsAssignIn);
41834
41835                        var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
41836                            importsKeys = keys(imports),
41837                            importsValues = baseValues(imports, importsKeys);
41838
41839                        var isEscaping,
41840                            isEvaluating,
41841                            index = 0,
41842                            interpolate = options.interpolate || reNoMatch,
41843                            source = "__p += '";
41844
41845                        // Compile the regexp to match each delimiter.
41846                        var reDelimiters = RegExp(
41847                            (options.escape || reNoMatch).source + '|' +
41848                            interpolate.source + '|' +
41849                            (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
41850                            (options.evaluate || reNoMatch).source + '|$'
41851                            , 'g');
41852
41853                        // Use a sourceURL for easier debugging.
41854                        // The sourceURL gets injected into the source that's eval-ed, so be careful
41855                        // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
41856                        // and escape the comment, thus injecting code that gets evaled.
41857                        var sourceURL = '//# sourceURL=' +
41858                            (hasOwnProperty.call(options, 'sourceURL')
41859                                    ? (options.sourceURL + '').replace(/\s/g, ' ')
41860                                    : ('lodash.templateSources[' + (++templateCounter) + ']')
41861                            ) + '\n';
41862
41863                        string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
41864                            interpolateValue || (interpolateValue = esTemplateValue);
41865
41866                            // Escape characters that can't be included in string literals.
41867                            source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
41868
41869                            // Replace delimiters with snippets.
41870                            if (escapeValue) {
41871                                isEscaping = true;
41872                                source += "' +\n__e(" + escapeValue + ") +\n'";
41873                            }
41874                            if (evaluateValue) {
41875                                isEvaluating = true;
41876                                source += "';\n" + evaluateValue + ";\n__p += '";
41877                            }
41878                            if (interpolateValue) {
41879                                source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
41880                            }
41881                            index = offset + match.length;
41882
41883                            // The JS engine embedded in Adobe products needs `match` returned in
41884                            // order to produce the correct `offset` value.
41885                            return match;
41886                        });
41887
41888                        source += "';\n";
41889
41890                        // If `variable` is not specified wrap a with-statement around the generated
41891                        // code to add the data object to the top of the scope chain.
41892                        var variable = hasOwnProperty.call(options, 'variable') && options.variable;
41893                        if (!variable) {
41894                            source = 'with (obj) {\n' + source + '\n}\n';
41895                        }
41896                            // Throw an error if a forbidden character was found in `variable`, to prevent
41897                        // potential command injection attacks.
41898                        else if (reForbiddenIdentifierChars.test(variable)) {
41899                            throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
41900                        }
41901
41902                        // Cleanup code by stripping empty strings.
41903                        source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
41904                            .replace(reEmptyStringMiddle, '$1')
41905                            .replace(reEmptyStringTrailing, '$1;');
41906
41907                        // Frame code as the function body.
41908                        source = 'function(' + (variable || 'obj') + ') {\n' +
41909                            (variable
41910                                    ? ''
41911                                    : 'obj || (obj = {});\n'
41912                            ) +
41913                            "var __t, __p = ''" +
41914                            (isEscaping
41915                                    ? ', __e = _.escape'
41916                                    : ''
41917                            ) +
41918                            (isEvaluating
41919                                    ? ', __j = Array.prototype.join;\n' +
41920                                    "function print() { __p += __j.call(arguments, '') }\n"
41921                                    : ';\n'
41922                            ) +
41923                            source +
41924                            'return __p\n}';
41925
41926                        var result = attempt(function() {
41927                            return Function(importsKeys, sourceURL + 'return ' + source)
41928                                .apply(undefined, importsValues);
41929                        });
41930
41931                        // Provide the compiled function's source by its `toString` method or
41932                        // the `source` property as a convenience for inlining compiled templates.
41933                        result.source = source;
41934                        if (isError(result)) {
41935                            throw result;
41936                        }
41937                        return result;
41938                    }
41939
41940                    /**
41941                     * Converts `string`, as a whole, to lower case just like
41942                     * [String#toLowerCase](https://mdn.io/toLowerCase).
41943                     *
41944                     * @static
41945                     * @memberOf _
41946                     * @since 4.0.0
41947                     * @category String
41948                     * @param {string} [string=''] The string to convert.
41949                     * @returns {string} Returns the lower cased string.
41950                     * @example
41951                     *
41952                     * _.toLower('--Foo-Bar--');
41953                     * // => '--foo-bar--'
41954                     *
41955                     * _.toLower('fooBar');
41956                     * // => 'foobar'
41957                     *
41958                     * _.toLower('__FOO_BAR__');
41959                     * // => '__foo_bar__'
41960                     */
41961                    function toLower(value) {
41962                        return toString(value).toLowerCase();
41963                    }
41964
41965                    /**
41966                     * Converts `string`, as a whole, to upper case just like
41967                     * [String#toUpperCase](https://mdn.io/toUpperCase).
41968                     *
41969                     * @static
41970                     * @memberOf _
41971                     * @since 4.0.0
41972                     * @category String
41973                     * @param {string} [string=''] The string to convert.
41974                     * @returns {string} Returns the upper cased string.
41975                     * @example
41976                     *
41977                     * _.toUpper('--foo-bar--');
41978                     * // => '--FOO-BAR--'
41979                     *
41980                     * _.toUpper('fooBar');
41981                     * // => 'FOOBAR'
41982                     *
41983                     * _.toUpper('__foo_bar__');
41984                     * // => '__FOO_BAR__'
41985                     */
41986                    function toUpper(value) {
41987                        return toString(value).toUpperCase();
41988                    }
41989
41990                    /**
41991                     * Removes leading and trailing whitespace or specified characters from `string`.
41992                     *
41993                     * @static
41994                     * @memberOf _
41995                     * @since 3.0.0
41996                     * @category String
41997                     * @param {string} [string=''] The string to trim.
41998                     * @param {string} [chars=whitespace] The characters to trim.
41999                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
42000                     * @returns {string} Returns the trimmed string.
42001                     * @example
42002                     *
42003                     * _.trim('  abc  ');
42004                     * // => 'abc'
42005                     *
42006                     * _.trim('-_-abc-_-', '_-');
42007                     * // => 'abc'
42008                     *
42009                     * _.map(['  foo  ', '  bar  '], _.trim);
42010                     * // => ['foo', 'bar']
42011                     */
42012                    function trim(string, chars, guard) {
42013                        string = toString(string);
42014                        if (string && (guard || chars === undefined)) {
42015                            return baseTrim(string);
42016                        }
42017                        if (!string || !(chars = baseToString(chars))) {
42018                            return string;
42019                        }
42020                        var strSymbols = stringToArray(string),
42021                            chrSymbols = stringToArray(chars),
42022                            start = charsStartIndex(strSymbols, chrSymbols),
42023                            end = charsEndIndex(strSymbols, chrSymbols) + 1;
42024
42025                        return castSlice(strSymbols, start, end).join('');
42026                    }
42027
42028                    /**
42029                     * Removes trailing whitespace or specified characters from `string`.
42030                     *
42031                     * @static
42032                     * @memberOf _
42033                     * @since 4.0.0
42034                     * @category String
42035                     * @param {string} [string=''] The string to trim.
42036                     * @param {string} [chars=whitespace] The characters to trim.
42037                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
42038                     * @returns {string} Returns the trimmed string.
42039                     * @example
42040                     *
42041                     * _.trimEnd('  abc  ');
42042                     * // => '  abc'
42043                     *
42044                     * _.trimEnd('-_-abc-_-', '_-');
42045                     * // => '-_-abc'
42046                     */
42047                    function trimEnd(string, chars, guard) {
42048                        string = toString(string);
42049                        if (string && (guard || chars === undefined)) {
42050                            return string.slice(0, trimmedEndIndex(string) + 1);
42051                        }
42052                        if (!string || !(chars = baseToString(chars))) {
42053                            return string;
42054                        }
42055                        var strSymbols = stringToArray(string),
42056                            end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
42057
42058                        return castSlice(strSymbols, 0, end).join('');
42059                    }
42060
42061                    /**
42062                     * Removes leading whitespace or specified characters from `string`.
42063                     *
42064                     * @static
42065                     * @memberOf _
42066                     * @since 4.0.0
42067                     * @category String
42068                     * @param {string} [string=''] The string to trim.
42069                     * @param {string} [chars=whitespace] The characters to trim.
42070                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
42071                     * @returns {string} Returns the trimmed string.
42072                     * @example
42073                     *
42074                     * _.trimStart('  abc  ');
42075                     * // => 'abc  '
42076                     *
42077                     * _.trimStart('-_-abc-_-', '_-');
42078                     * // => 'abc-_-'
42079                     */
42080                    function trimStart(string, chars, guard) {
42081                        string = toString(string);
42082                        if (string && (guard || chars === undefined)) {
42083                            return string.replace(reTrimStart, '');
42084                        }
42085                        if (!string || !(chars = baseToString(chars))) {
42086                            return string;
42087                        }
42088                        var strSymbols = stringToArray(string),
42089                            start = charsStartIndex(strSymbols, stringToArray(chars));
42090
42091                        return castSlice(strSymbols, start).join('');
42092                    }
42093
42094                    /**
42095                     * Truncates `string` if it's longer than the given maximum string length.
42096                     * The last characters of the truncated string are replaced with the omission
42097                     * string which defaults to "...".
42098                     *
42099                     * @static
42100                     * @memberOf _
42101                     * @since 4.0.0
42102                     * @category String
42103                     * @param {string} [string=''] The string to truncate.
42104                     * @param {Object} [options={}] The options object.
42105                     * @param {number} [options.length=30] The maximum string length.
42106                     * @param {string} [options.omission='...'] The string to indicate text is omitted.
42107                     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
42108                     * @returns {string} Returns the truncated string.
42109                     * @example
42110                     *
42111                     * _.truncate('hi-diddly-ho there, neighborino');
42112                     * // => 'hi-diddly-ho there, neighbo...'
42113                     *
42114                     * _.truncate('hi-diddly-ho there, neighborino', {
42115                     *   'length': 24,
42116                     *   'separator': ' '
42117                     * });
42118                     * // => 'hi-diddly-ho there,...'
42119                     *
42120                     * _.truncate('hi-diddly-ho there, neighborino', {
42121                     *   'length': 24,
42122                     *   'separator': /,? +/
42123                     * });
42124                     * // => 'hi-diddly-ho there...'
42125                     *
42126                     * _.truncate('hi-diddly-ho there, neighborino', {
42127                     *   'omission': ' [...]'
42128                     * });
42129                     * // => 'hi-diddly-ho there, neig [...]'
42130                     */
42131                    function truncate(string, options) {
42132                        var length = DEFAULT_TRUNC_LENGTH,
42133                            omission = DEFAULT_TRUNC_OMISSION;
42134
42135                        if (isObject(options)) {
42136                            var separator = 'separator' in options ? options.separator : separator;
42137                            length = 'length' in options ? toInteger(options.length) : length;
42138                            omission = 'omission' in options ? baseToString(options.omission) : omission;
42139                        }
42140                        string = toString(string);
42141
42142                        var strLength = string.length;
42143                        if (hasUnicode(string)) {
42144                            var strSymbols = stringToArray(string);
42145                            strLength = strSymbols.length;
42146                        }
42147                        if (length >= strLength) {
42148                            return string;
42149                        }
42150                        var end = length - stringSize(omission);
42151                        if (end < 1) {
42152                            return omission;
42153                        }
42154                        var result = strSymbols
42155                            ? castSlice(strSymbols, 0, end).join('')
42156                            : string.slice(0, end);
42157
42158                        if (separator === undefined) {
42159                            return result + omission;
42160                        }
42161                        if (strSymbols) {
42162                            end += (result.length - end);
42163                        }
42164                        if (isRegExp(separator)) {
42165                            if (string.slice(end).search(separator)) {
42166                                var match,
42167                                    substring = result;
42168
42169                                if (!separator.global) {
42170                                    separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
42171                                }
42172                                separator.lastIndex = 0;
42173                                while ((match = separator.exec(substring))) {
42174                                    var newEnd = match.index;
42175                                }
42176                                result = result.slice(0, newEnd === undefined ? end : newEnd);
42177                            }
42178                        } else if (string.indexOf(baseToString(separator), end) != end) {
42179                            var index = result.lastIndexOf(separator);
42180                            if (index > -1) {
42181                                result = result.slice(0, index);
42182                            }
42183                        }
42184                        return result + omission;
42185                    }
42186
42187                    /**
42188                     * The inverse of `_.escape`; this method converts the HTML entities
42189                     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
42190                     * their corresponding characters.
42191                     *
42192                     * **Note:** No other HTML entities are unescaped. To unescape additional
42193                     * HTML entities use a third-party library like [_he_](https://mths.be/he).
42194                     *
42195                     * @static
42196                     * @memberOf _
42197                     * @since 0.6.0
42198                     * @category String
42199                     * @param {string} [string=''] The string to unescape.
42200                     * @returns {string} Returns the unescaped string.
42201                     * @example
42202                     *
42203                     * _.unescape('fred, barney, &amp; pebbles');
42204                     * // => 'fred, barney, & pebbles'
42205                     */
42206                    function unescape(string) {
42207                        string = toString(string);
42208                        return (string && reHasEscapedHtml.test(string))
42209                            ? string.replace(reEscapedHtml, unescapeHtmlChar)
42210                            : string;
42211                    }
42212
42213                    /**
42214                     * Converts `string`, as space separated words, to upper case.
42215                     *
42216                     * @static
42217                     * @memberOf _
42218                     * @since 4.0.0
42219                     * @category String
42220                     * @param {string} [string=''] The string to convert.
42221                     * @returns {string} Returns the upper cased string.
42222                     * @example
42223                     *
42224                     * _.upperCase('--foo-bar');
42225                     * // => 'FOO BAR'
42226                     *
42227                     * _.upperCase('fooBar');
42228                     * // => 'FOO BAR'
42229                     *
42230                     * _.upperCase('__foo_bar__');
42231                     * // => 'FOO BAR'
42232                     */
42233                    var upperCase = createCompounder(function(result, word, index) {
42234                        return result + (index ? ' ' : '') + word.toUpperCase();
42235                    });
42236
42237                    /**
42238                     * Converts the first character of `string` to upper case.
42239                     *
42240                     * @static
42241                     * @memberOf _
42242                     * @since 4.0.0
42243                     * @category String
42244                     * @param {string} [string=''] The string to convert.
42245                     * @returns {string} Returns the converted string.
42246                     * @example
42247                     *
42248                     * _.upperFirst('fred');
42249                     * // => 'Fred'
42250                     *
42251                     * _.upperFirst('FRED');
42252                     * // => 'FRED'
42253                     */
42254                    var upperFirst = createCaseFirst('toUpperCase');
42255
42256                    /**
42257                     * Splits `string` into an array of its words.
42258                     *
42259                     * @static
42260                     * @memberOf _
42261                     * @since 3.0.0
42262                     * @category String
42263                     * @param {string} [string=''] The string to inspect.
42264                     * @param {RegExp|string} [pattern] The pattern to match words.
42265                     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
42266                     * @returns {Array} Returns the words of `string`.
42267                     * @example
42268                     *
42269                     * _.words('fred, barney, & pebbles');
42270                     * // => ['fred', 'barney', 'pebbles']
42271                     *
42272                     * _.words('fred, barney, & pebbles', /[^, ]+/g);
42273                     * // => ['fred', 'barney', '&', 'pebbles']
42274                     */
42275                    function words(string, pattern, guard) {
42276                        string = toString(string);
42277                        pattern = guard ? undefined : pattern;
42278
42279                        if (pattern === undefined) {
42280                            return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
42281                        }
42282                        return string.match(pattern) || [];
42283                    }
42284
42285                    /*------------------------------------------------------------------------*/
42286
42287                    /**
42288                     * Attempts to invoke `func`, returning either the result or the caught error
42289                     * object. Any additional arguments are provided to `func` when it's invoked.
42290                     *
42291                     * @static
42292                     * @memberOf _
42293                     * @since 3.0.0
42294                     * @category Util
42295                     * @param {Function} func The function to attempt.
42296                     * @param {...*} [args] The arguments to invoke `func` with.
42297                     * @returns {*} Returns the `func` result or error object.
42298                     * @example
42299                     *
42300                     * // Avoid throwing errors for invalid selectors.
42301                     * var elements = _.attempt(function(selector) {
42302                     *   return document.querySelectorAll(selector);
42303                     * }, '>_>');
42304                     *
42305                     * if (_.isError(elements)) {
42306                     *   elements = [];
42307                     * }
42308                     */
42309                    var attempt = baseRest(function(func, args) {
42310                        try {
42311                            return apply(func, undefined, args);
42312                        } catch (e) {
42313                            return isError(e) ? e : new Error(e);
42314                        }
42315                    });
42316
42317                    /**
42318                     * Binds methods of an object to the object itself, overwriting the existing
42319                     * method.
42320                     *
42321                     * **Note:** This method doesn't set the "length" property of bound functions.
42322                     *
42323                     * @static
42324                     * @since 0.1.0
42325                     * @memberOf _
42326                     * @category Util
42327                     * @param {Object} object The object to bind and assign the bound methods to.
42328                     * @param {...(string|string[])} methodNames The object method names to bind.
42329                     * @returns {Object} Returns `object`.
42330                     * @example
42331                     *
42332                     * var view = {
42333                     *   'label': 'docs',
42334                     *   'click': function() {
42335                     *     console.log('clicked ' + this.label);
42336                     *   }
42337                     * };
42338                     *
42339                     * _.bindAll(view, ['click']);
42340                     * jQuery(element).on('click', view.click);
42341                     * // => Logs 'clicked docs' when clicked.
42342                     */
42343                    var bindAll = flatRest(function(object, methodNames) {
42344                        arrayEach(methodNames, function(key) {
42345                            key = toKey(key);
42346                            baseAssignValue(object, key, bind(object[key], object));
42347                        });
42348                        return object;
42349                    });
42350
42351                    /**
42352                     * Creates a function that iterates over `pairs` and invokes the corresponding
42353                     * function of the first predicate to return truthy. The predicate-function
42354                     * pairs are invoked with the `this` binding and arguments of the created
42355                     * function.
42356                     *
42357                     * @static
42358                     * @memberOf _
42359                     * @since 4.0.0
42360                     * @category Util
42361                     * @param {Array} pairs The predicate-function pairs.
42362                     * @returns {Function} Returns the new composite function.
42363                     * @example
42364                     *
42365                     * var func = _.cond([
42366                     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
42367                     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
42368                     *   [_.stubTrue,                      _.constant('no match')]
42369                     * ]);
42370                     *
42371                     * func({ 'a': 1, 'b': 2 });
42372                     * // => 'matches A'
42373                     *
42374                     * func({ 'a': 0, 'b': 1 });
42375                     * // => 'matches B'
42376                     *
42377                     * func({ 'a': '1', 'b': '2' });
42378                     * // => 'no match'
42379                     */
42380                    function cond(pairs) {
42381                        var length = pairs == null ? 0 : pairs.length,
42382                            toIteratee = getIteratee();
42383
42384                        pairs = !length ? [] : arrayMap(pairs, function(pair) {
42385                            if (typeof pair[1] != 'function') {
42386                                throw new TypeError(FUNC_ERROR_TEXT);
42387                            }
42388                            return [toIteratee(pair[0]), pair[1]];
42389                        });
42390
42391                        return baseRest(function(args) {
42392                            var index = -1;
42393                            while (++index < length) {
42394                                var pair = pairs[index];
42395                                if (apply(pair[0], this, args)) {
42396                                    return apply(pair[1], this, args);
42397                                }
42398                            }
42399                        });
42400                    }
42401
42402                    /**
42403                     * Creates a function that invokes the predicate properties of `source` with
42404                     * the corresponding property values of a given object, returning `true` if
42405                     * all predicates return truthy, else `false`.
42406                     *
42407                     * **Note:** The created function is equivalent to `_.conformsTo` with
42408                     * `source` partially applied.
42409                     *
42410                     * @static
42411                     * @memberOf _
42412                     * @since 4.0.0
42413                     * @category Util
42414                     * @param {Object} source The object of property predicates to conform to.
42415                     * @returns {Function} Returns the new spec function.
42416                     * @example
42417                     *
42418                     * var objects = [
42419                     *   { 'a': 2, 'b': 1 },
42420                     *   { 'a': 1, 'b': 2 }
42421                     * ];
42422                     *
42423                     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
42424                     * // => [{ 'a': 1, 'b': 2 }]
42425                     */
42426                    function conforms(source) {
42427                        return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
42428                    }
42429
42430                    /**
42431                     * Creates a function that returns `value`.
42432                     *
42433                     * @static
42434                     * @memberOf _
42435                     * @since 2.4.0
42436                     * @category Util
42437                     * @param {*} value The value to return from the new function.
42438                     * @returns {Function} Returns the new constant function.
42439                     * @example
42440                     *
42441                     * var objects = _.times(2, _.constant({ 'a': 1 }));
42442                     *
42443                     * console.log(objects);
42444                     * // => [{ 'a': 1 }, { 'a': 1 }]
42445                     *
42446                     * console.log(objects[0] === objects[1]);
42447                     * // => true
42448                     */
42449                    function constant(value) {
42450                        return function() {
42451                            return value;
42452                        };
42453                    }
42454
42455                    /**
42456                     * Checks `value` to determine whether a default value should be returned in
42457                     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
42458                     * or `undefined`.
42459                     *
42460                     * @static
42461                     * @memberOf _
42462                     * @since 4.14.0
42463                     * @category Util
42464                     * @param {*} value The value to check.
42465                     * @param {*} defaultValue The default value.
42466                     * @returns {*} Returns the resolved value.
42467                     * @example
42468                     *
42469                     * _.defaultTo(1, 10);
42470                     * // => 1
42471                     *
42472                     * _.defaultTo(undefined, 10);
42473                     * // => 10
42474                     */
42475                    function defaultTo(value, defaultValue) {
42476                        return (value == null || value !== value) ? defaultValue : value;
42477                    }
42478
42479                    /**
42480                     * Creates a function that returns the result of invoking the given functions
42481                     * with the `this` binding of the created function, where each successive
42482                     * invocation is supplied the return value of the previous.
42483                     *
42484                     * @static
42485                     * @memberOf _
42486                     * @since 3.0.0
42487                     * @category Util
42488                     * @param {...(Function|Function[])} [funcs] The functions to invoke.
42489                     * @returns {Function} Returns the new composite function.
42490                     * @see _.flowRight
42491                     * @example
42492                     *
42493                     * function square(n) {
42494                     *   return n * n;
42495                     * }
42496                     *
42497                     * var addSquare = _.flow([_.add, square]);
42498                     * addSquare(1, 2);
42499                     * // => 9
42500                     */
42501                    var flow = createFlow();
42502
42503                    /**
42504                     * This method is like `_.flow` except that it creates a function that
42505                     * invokes the given functions from right to left.
42506                     *
42507                     * @static
42508                     * @since 3.0.0
42509                     * @memberOf _
42510                     * @category Util
42511                     * @param {...(Function|Function[])} [funcs] The functions to invoke.
42512                     * @returns {Function} Returns the new composite function.
42513                     * @see _.flow
42514                     * @example
42515                     *
42516                     * function square(n) {
42517                     *   return n * n;
42518                     * }
42519                     *
42520                     * var addSquare = _.flowRight([square, _.add]);
42521                     * addSquare(1, 2);
42522                     * // => 9
42523                     */
42524                    var flowRight = createFlow(true);
42525
42526                    /**
42527                     * This method returns the first argument it receives.
42528                     *
42529                     * @static
42530                     * @since 0.1.0
42531                     * @memberOf _
42532                     * @category Util
42533                     * @param {*} value Any value.
42534                     * @returns {*} Returns `value`.
42535                     * @example
42536                     *
42537                     * var object = { 'a': 1 };
42538                     *
42539                     * console.log(_.identity(object) === object);
42540                     * // => true
42541                     */
42542                    function identity(value) {
42543                        return value;
42544                    }
42545
42546                    /**
42547                     * Creates a function that invokes `func` with the arguments of the created
42548                     * function. If `func` is a property name, the created function returns the
42549                     * property value for a given element. If `func` is an array or object, the
42550                     * created function returns `true` for elements that contain the equivalent
42551                     * source properties, otherwise it returns `false`.
42552                     *
42553                     * @static
42554                     * @since 4.0.0
42555                     * @memberOf _
42556                     * @category Util
42557                     * @param {*} [func=_.identity] The value to convert to a callback.
42558                     * @returns {Function} Returns the callback.
42559                     * @example
42560                     *
42561                     * var users = [
42562                     *   { 'user': 'barney', 'age': 36, 'active': true },
42563                     *   { 'user': 'fred',   'age': 40, 'active': false }
42564                     * ];
42565                     *
42566                     * // The `_.matches` iteratee shorthand.
42567                     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
42568                     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
42569                     *
42570                     * // The `_.matchesProperty` iteratee shorthand.
42571                     * _.filter(users, _.iteratee(['user', 'fred']));
42572                     * // => [{ 'user': 'fred', 'age': 40 }]
42573                     *
42574                     * // The `_.property` iteratee shorthand.
42575                     * _.map(users, _.iteratee('user'));
42576                     * // => ['barney', 'fred']
42577                     *
42578                     * // Create custom iteratee shorthands.
42579                     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
42580                     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
42581                     *     return func.test(string);
42582                     *   };
42583                     * });
42584                     *
42585                     * _.filter(['abc', 'def'], /ef/);
42586                     * // => ['def']
42587                     */
42588                    function iteratee(func) {
42589                        return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
42590                    }
42591
42592                    /**
42593                     * Creates a function that performs a partial deep comparison between a given
42594                     * object and `source`, returning `true` if the given object has equivalent
42595                     * property values, else `false`.
42596                     *
42597                     * **Note:** The created function is equivalent to `_.isMatch` with `source`
42598                     * partially applied.
42599                     *
42600                     * Partial comparisons will match empty array and empty object `source`
42601                     * values against any array or object value, respectively. See `_.isEqual`
42602                     * for a list of supported value comparisons.
42603                     *
42604                     * **Note:** Multiple values can be checked by combining several matchers
42605                     * using `_.overSome`
42606                     *
42607                     * @static
42608                     * @memberOf _
42609                     * @since 3.0.0
42610                     * @category Util
42611                     * @param {Object} source The object of property values to match.
42612                     * @returns {Function} Returns the new spec function.
42613                     * @example
42614                     *
42615                     * var objects = [
42616                     *   { 'a': 1, 'b': 2, 'c': 3 },
42617                     *   { 'a': 4, 'b': 5, 'c': 6 }
42618                     * ];
42619                     *
42620                     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
42621                     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
42622                     *
42623                     * // Checking for several possible values
42624                     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
42625                     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
42626                     */
42627                    function matches(source) {
42628                        return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
42629                    }
42630
42631                    /**
42632                     * Creates a function that performs a partial deep comparison between the
42633                     * value at `path` of a given object to `srcValue`, returning `true` if the
42634                     * object value is equivalent, else `false`.
42635                     *
42636                     * **Note:** Partial comparisons will match empty array and empty object
42637                     * `srcValue` values against any array or object value, respectively. See
42638                     * `_.isEqual` for a list of supported value comparisons.
42639                     *
42640                     * **Note:** Multiple values can be checked by combining several matchers
42641                     * using `_.overSome`
42642                     *
42643                     * @static
42644                     * @memberOf _
42645                     * @since 3.2.0
42646                     * @category Util
42647                     * @param {Array|string} path The path of the property to get.
42648                     * @param {*} srcValue The value to match.
42649                     * @returns {Function} Returns the new spec function.
42650                     * @example
42651                     *
42652                     * var objects = [
42653                     *   { 'a': 1, 'b': 2, 'c': 3 },
42654                     *   { 'a': 4, 'b': 5, 'c': 6 }
42655                     * ];
42656                     *
42657                     * _.find(objects, _.matchesProperty('a', 4));
42658                     * // => { 'a': 4, 'b': 5, 'c': 6 }
42659                     *
42660                     * // Checking for several possible values
42661                     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
42662                     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
42663                     */
42664                    function matchesProperty(path, srcValue) {
42665                        return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
42666                    }
42667
42668                    /**
42669                     * Creates a function that invokes the method at `path` of a given object.
42670                     * Any additional arguments are provided to the invoked method.
42671                     *
42672                     * @static
42673                     * @memberOf _
42674                     * @since 3.7.0
42675                     * @category Util
42676                     * @param {Array|string} path The path of the method to invoke.
42677                     * @param {...*} [args] The arguments to invoke the method with.
42678                     * @returns {Function} Returns the new invoker function.
42679                     * @example
42680                     *
42681                     * var objects = [
42682                     *   { 'a': { 'b': _.constant(2) } },
42683                     *   { 'a': { 'b': _.constant(1) } }
42684                     * ];
42685                     *
42686                     * _.map(objects, _.method('a.b'));
42687                     * // => [2, 1]
42688                     *
42689                     * _.map(objects, _.method(['a', 'b']));
42690                     * // => [2, 1]
42691                     */
42692                    var method = baseRest(function(path, args) {
42693                        return function(object) {
42694                            return baseInvoke(object, path, args);
42695                        };
42696                    });
42697
42698                    /**
42699                     * The opposite of `_.method`; this method creates a function that invokes
42700                     * the method at a given path of `object`. Any additional arguments are
42701                     * provided to the invoked method.
42702                     *
42703                     * @static
42704                     * @memberOf _
42705                     * @since 3.7.0
42706                     * @category Util
42707                     * @param {Object} object The object to query.
42708                     * @param {...*} [args] The arguments to invoke the method with.
42709                     * @returns {Function} Returns the new invoker function.
42710                     * @example
42711                     *
42712                     * var array = _.times(3, _.constant),
42713                     *     object = { 'a': array, 'b': array, 'c': array };
42714                     *
42715                     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
42716                     * // => [2, 0]
42717                     *
42718                     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
42719                     * // => [2, 0]
42720                     */
42721                    var methodOf = baseRest(function(object, args) {
42722                        return function(path) {
42723                            return baseInvoke(object, path, args);
42724                        };
42725                    });
42726
42727                    /**
42728                     * Adds all own enumerable string keyed function properties of a source
42729                     * object to the destination object. If `object` is a function, then methods
42730                     * are added to its prototype as well.
42731                     *
42732                     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
42733                     * avoid conflicts caused by modifying the original.
42734                     *
42735                     * @static
42736                     * @since 0.1.0
42737                     * @memberOf _
42738                     * @category Util
42739                     * @param {Function|Object} [object=lodash] The destination object.
42740                     * @param {Object} source The object of functions to add.
42741                     * @param {Object} [options={}] The options object.
42742                     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
42743                     * @returns {Function|Object} Returns `object`.
42744                     * @example
42745                     *
42746                     * function vowels(string) {
42747                     *   return _.filter(string, function(v) {
42748                     *     return /[aeiou]/i.test(v);
42749                     *   });
42750                     * }
42751                     *
42752                     * _.mixin({ 'vowels': vowels });
42753                     * _.vowels('fred');
42754                     * // => ['e']
42755                     *
42756                     * _('fred').vowels().value();
42757                     * // => ['e']
42758                     *
42759                     * _.mixin({ 'vowels': vowels }, { 'chain': false });
42760                     * _('fred').vowels();
42761                     * // => ['e']
42762                     */
42763                    function mixin(object, source, options) {
42764                        var props = keys(source),
42765                            methodNames = baseFunctions(source, props);
42766
42767                        if (options == null &&
42768                            !(isObject(source) && (methodNames.length || !props.length))) {
42769                            options = source;
42770                            source = object;
42771                            object = this;
42772                            methodNames = baseFunctions(source, keys(source));
42773                        }
42774                        var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
42775                            isFunc = isFunction(object);
42776
42777                        arrayEach(methodNames, function(methodName) {
42778                            var func = source[methodName];
42779                            object[methodName] = func;
42780                            if (isFunc) {
42781                                object.prototype[methodName] = function() {
42782                                    var chainAll = this.__chain__;
42783                                    if (chain || chainAll) {
42784                                        var result = object(this.__wrapped__),
42785                                            actions = result.__actions__ = copyArray(this.__actions__);
42786
42787                                        actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
42788                                        result.__chain__ = chainAll;
42789                                        return result;
42790                                    }
42791                                    return func.apply(object, arrayPush([this.value()], arguments));
42792                                };
42793                            }
42794                        });
42795
42796                        return object;
42797                    }
42798
42799                    /**
42800                     * Reverts the `_` variable to its previous value and returns a reference to
42801                     * the `lodash` function.
42802                     *
42803                     * @static
42804                     * @since 0.1.0
42805                     * @memberOf _
42806                     * @category Util
42807                     * @returns {Function} Returns the `lodash` function.
42808                     * @example
42809                     *
42810                     * var lodash = _.noConflict();
42811                     */
42812                    function noConflict() {
42813                        if (root._ === this) {
42814                            root._ = oldDash;
42815                        }
42816                        return this;
42817                    }
42818
42819                    /**
42820                     * This method returns `undefined`.
42821                     *
42822                     * @static
42823                     * @memberOf _
42824                     * @since 2.3.0
42825                     * @category Util
42826                     * @example
42827                     *
42828                     * _.times(2, _.noop);
42829                     * // => [undefined, undefined]
42830                     */
42831                    function noop() {
42832                        // No operation performed.
42833                    }
42834
42835                    /**
42836                     * Creates a function that gets the argument at index `n`. If `n` is negative,
42837                     * the nth argument from the end is returned.
42838                     *
42839                     * @static
42840                     * @memberOf _
42841                     * @since 4.0.0
42842                     * @category Util
42843                     * @param {number} [n=0] The index of the argument to return.
42844                     * @returns {Function} Returns the new pass-thru function.
42845                     * @example
42846                     *
42847                     * var func = _.nthArg(1);
42848                     * func('a', 'b', 'c', 'd');
42849                     * // => 'b'
42850                     *
42851                     * var func = _.nthArg(-2);
42852                     * func('a', 'b', 'c', 'd');
42853                     * // => 'c'
42854                     */
42855                    function nthArg(n) {
42856                        n = toInteger(n);
42857                        return baseRest(function(args) {
42858                            return baseNth(args, n);
42859                        });
42860                    }
42861
42862                    /**
42863                     * Creates a function that invokes `iteratees` with the arguments it receives
42864                     * and returns their results.
42865                     *
42866                     * @static
42867                     * @memberOf _
42868                     * @since 4.0.0
42869                     * @category Util
42870                     * @param {...(Function|Function[])} [iteratees=[_.identity]]
42871                     *  The iteratees to invoke.
42872                     * @returns {Function} Returns the new function.
42873                     * @example
42874                     *
42875                     * var func = _.over([Math.max, Math.min]);
42876                     *
42877                     * func(1, 2, 3, 4);
42878                     * // => [4, 1]
42879                     */
42880                    var over = createOver(arrayMap);
42881
42882                    /**
42883                     * Creates a function that checks if **all** of the `predicates` return
42884                     * truthy when invoked with the arguments it receives.
42885                     *
42886                     * Following shorthands are possible for providing predicates.
42887                     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
42888                     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
42889                     *
42890                     * @static
42891                     * @memberOf _
42892                     * @since 4.0.0
42893                     * @category Util
42894                     * @param {...(Function|Function[])} [predicates=[_.identity]]
42895                     *  The predicates to check.
42896                     * @returns {Function} Returns the new function.
42897                     * @example
42898                     *
42899                     * var func = _.overEvery([Boolean, isFinite]);
42900                     *
42901                     * func('1');
42902                     * // => true
42903                     *
42904                     * func(null);
42905                     * // => false
42906                     *
42907                     * func(NaN);
42908                     * // => false
42909                     */
42910                    var overEvery = createOver(arrayEvery);
42911
42912                    /**
42913                     * Creates a function that checks if **any** of the `predicates` return
42914                     * truthy when invoked with the arguments it receives.
42915                     *
42916                     * Following shorthands are possible for providing predicates.
42917                     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
42918                     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
42919                     *
42920                     * @static
42921                     * @memberOf _
42922                     * @since 4.0.0
42923                     * @category Util
42924                     * @param {...(Function|Function[])} [predicates=[_.identity]]
42925                     *  The predicates to check.
42926                     * @returns {Function} Returns the new function.
42927                     * @example
42928                     *
42929                     * var func = _.overSome([Boolean, isFinite]);
42930                     *
42931                     * func('1');
42932                     * // => true
42933                     *
42934                     * func(null);
42935                     * // => true
42936                     *
42937                     * func(NaN);
42938                     * // => false
42939                     *
42940                     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
42941                     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
42942                     */
42943                    var overSome = createOver(arraySome);
42944
42945                    /**
42946                     * Creates a function that returns the value at `path` of a given object.
42947                     *
42948                     * @static
42949                     * @memberOf _
42950                     * @since 2.4.0
42951                     * @category Util
42952                     * @param {Array|string} path The path of the property to get.
42953                     * @returns {Function} Returns the new accessor function.
42954                     * @example
42955                     *
42956                     * var objects = [
42957                     *   { 'a': { 'b': 2 } },
42958                     *   { 'a': { 'b': 1 } }
42959                     * ];
42960                     *
42961                     * _.map(objects, _.property('a.b'));
42962                     * // => [2, 1]
42963                     *
42964                     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
42965                     * // => [1, 2]
42966                     */
42967                    function property(path) {
42968                        return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
42969                    }
42970
42971                    /**
42972                     * The opposite of `_.property`; this method creates a function that returns
42973                     * the value at a given path of `object`.
42974                     *
42975                     * @static
42976                     * @memberOf _
42977                     * @since 3.0.0
42978                     * @category Util
42979                     * @param {Object} object The object to query.
42980                     * @returns {Function} Returns the new accessor function.
42981                     * @example
42982                     *
42983                     * var array = [0, 1, 2],
42984                     *     object = { 'a': array, 'b': array, 'c': array };
42985                     *
42986                     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
42987                     * // => [2, 0]
42988                     *
42989                     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
42990                     * // => [2, 0]
42991                     */
42992                    function propertyOf(object) {
42993                        return function(path) {
42994                            return object == null ? undefined : baseGet(object, path);
42995                        };
42996                    }
42997
42998                    /**
42999                     * Creates an array of numbers (positive and/or negative) progressing from
43000                     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
43001                     * `start` is specified without an `end` or `step`. If `end` is not specified,
43002                     * it's set to `start` with `start` then set to `0`.
43003                     *
43004                     * **Note:** JavaScript follows the IEEE-754 standard for resolving
43005                     * floating-point values which can produce unexpected results.
43006                     *
43007                     * @static
43008                     * @since 0.1.0
43009                     * @memberOf _
43010                     * @category Util
43011                     * @param {number} [start=0] The start of the range.
43012                     * @param {number} end The end of the range.
43013                     * @param {number} [step=1] The value to increment or decrement by.
43014                     * @returns {Array} Returns the range of numbers.
43015                     * @see _.inRange, _.rangeRight
43016                     * @example
43017                     *
43018                     * _.range(4);
43019                     * // => [0, 1, 2, 3]
43020                     *
43021                     * _.range(-4);
43022                     * // => [0, -1, -2, -3]
43023                     *
43024                     * _.range(1, 5);
43025                     * // => [1, 2, 3, 4]
43026                     *
43027                     * _.range(0, 20, 5);
43028                     * // => [0, 5, 10, 15]
43029                     *
43030                     * _.range(0, -4, -1);
43031                     * // => [0, -1, -2, -3]
43032                     *
43033                     * _.range(1, 4, 0);
43034                     * // => [1, 1, 1]
43035                     *
43036                     * _.range(0);
43037                     * // => []
43038                     */
43039                    var range = createRange();
43040
43041                    /**
43042                     * This method is like `_.range` except that it populates values in
43043                     * descending order.
43044                     *
43045                     * @static
43046                     * @memberOf _
43047                     * @since 4.0.0
43048                     * @category Util
43049                     * @param {number} [start=0] The start of the range.
43050                     * @param {number} end The end of the range.
43051                     * @param {number} [step=1] The value to increment or decrement by.
43052                     * @returns {Array} Returns the range of numbers.
43053                     * @see _.inRange, _.range
43054                     * @example
43055                     *
43056                     * _.rangeRight(4);
43057                     * // => [3, 2, 1, 0]
43058                     *
43059                     * _.rangeRight(-4);
43060                     * // => [-3, -2, -1, 0]
43061                     *
43062                     * _.rangeRight(1, 5);
43063                     * // => [4, 3, 2, 1]
43064                     *
43065                     * _.rangeRight(0, 20, 5);
43066                     * // => [15, 10, 5, 0]
43067                     *
43068                     * _.rangeRight(0, -4, -1);
43069                     * // => [-3, -2, -1, 0]
43070                     *
43071                     * _.rangeRight(1, 4, 0);
43072                     * // => [1, 1, 1]
43073                     *
43074                     * _.rangeRight(0);
43075                     * // => []
43076                     */
43077                    var rangeRight = createRange(true);
43078
43079                    /**
43080                     * This method returns a new empty array.
43081                     *
43082                     * @static
43083                     * @memberOf _
43084                     * @since 4.13.0
43085                     * @category Util
43086                     * @returns {Array} Returns the new empty array.
43087                     * @example
43088                     *
43089                     * var arrays = _.times(2, _.stubArray);
43090                     *
43091                     * console.log(arrays);
43092                     * // => [[], []]
43093                     *
43094                     * console.log(arrays[0] === arrays[1]);
43095                     * // => false
43096                     */
43097                    function stubArray() {
43098                        return [];
43099                    }
43100
43101                    /**
43102                     * This method returns `false`.
43103                     *
43104                     * @static
43105                     * @memberOf _
43106                     * @since 4.13.0
43107                     * @category Util
43108                     * @returns {boolean} Returns `false`.
43109                     * @example
43110                     *
43111                     * _.times(2, _.stubFalse);
43112                     * // => [false, false]
43113                     */
43114                    function stubFalse() {
43115                        return false;
43116                    }
43117
43118                    /**
43119                     * This method returns a new empty object.
43120                     *
43121                     * @static
43122                     * @memberOf _
43123                     * @since 4.13.0
43124                     * @category Util
43125                     * @returns {Object} Returns the new empty object.
43126                     * @example
43127                     *
43128                     * var objects = _.times(2, _.stubObject);
43129                     *
43130                     * console.log(objects);
43131                     * // => [{}, {}]
43132                     *
43133                     * console.log(objects[0] === objects[1]);
43134                     * // => false
43135                     */
43136                    function stubObject() {
43137                        return {};
43138                    }
43139
43140                    /**
43141                     * This method returns an empty string.
43142                     *
43143                     * @static
43144                     * @memberOf _
43145                     * @since 4.13.0
43146                     * @category Util
43147                     * @returns {string} Returns the empty string.
43148                     * @example
43149                     *
43150                     * _.times(2, _.stubString);
43151                     * // => ['', '']
43152                     */
43153                    function stubString() {
43154                        return '';
43155                    }
43156
43157                    /**
43158                     * This method returns `true`.
43159                     *
43160                     * @static
43161                     * @memberOf _
43162                     * @since 4.13.0
43163                     * @category Util
43164                     * @returns {boolean} Returns `true`.
43165                     * @example
43166                     *
43167                     * _.times(2, _.stubTrue);
43168                     * // => [true, true]
43169                     */
43170                    function stubTrue() {
43171                        return true;
43172                    }
43173
43174                    /**
43175                     * Invokes the iteratee `n` times, returning an array of the results of
43176                     * each invocation. The iteratee is invoked with one argument; (index).
43177                     *
43178                     * @static
43179                     * @since 0.1.0
43180                     * @memberOf _
43181                     * @category Util
43182                     * @param {number} n The number of times to invoke `iteratee`.
43183                     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
43184                     * @returns {Array} Returns the array of results.
43185                     * @example
43186                     *
43187                     * _.times(3, String);
43188                     * // => ['0', '1', '2']
43189                     *
43190                     *  _.times(4, _.constant(0));
43191                     * // => [0, 0, 0, 0]
43192                     */
43193                    function times(n, iteratee) {
43194                        n = toInteger(n);
43195                        if (n < 1 || n > MAX_SAFE_INTEGER) {
43196                            return [];
43197                        }
43198                        var index = MAX_ARRAY_LENGTH,
43199                            length = nativeMin(n, MAX_ARRAY_LENGTH);
43200
43201                        iteratee = getIteratee(iteratee);
43202                        n -= MAX_ARRAY_LENGTH;
43203
43204                        var result = baseTimes(length, iteratee);
43205                        while (++index < n) {
43206                            iteratee(index);
43207                        }
43208                        return result;
43209                    }
43210
43211                    /**
43212                     * Converts `value` to a property path array.
43213                     *
43214                     * @static
43215                     * @memberOf _
43216                     * @since 4.0.0
43217                     * @category Util
43218                     * @param {*} value The value to convert.
43219                     * @returns {Array} Returns the new property path array.
43220                     * @example
43221                     *
43222                     * _.toPath('a.b.c');
43223                     * // => ['a', 'b', 'c']
43224                     *
43225                     * _.toPath('a[0].b.c');
43226                     * // => ['a', '0', 'b', 'c']
43227                     */
43228                    function toPath(value) {
43229                        if (isArray(value)) {
43230                            return arrayMap(value, toKey);
43231                        }
43232                        return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
43233                    }
43234
43235                    /**
43236                     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
43237                     *
43238                     * @static
43239                     * @since 0.1.0
43240                     * @memberOf _
43241                     * @category Util
43242                     * @param {string} [prefix=''] The value to prefix the ID with.
43243                     * @returns {string} Returns the unique ID.
43244                     * @example
43245                     *
43246                     * _.uniqueId('contact_');
43247                     * // => 'contact_104'
43248                     *
43249                     * _.uniqueId();
43250                     * // => '105'
43251                     */
43252                    function uniqueId(prefix) {
43253                        var id = ++idCounter;
43254                        return toString(prefix) + id;
43255                    }
43256
43257                    /*------------------------------------------------------------------------*/
43258
43259                    /**
43260                     * Adds two numbers.
43261                     *
43262                     * @static
43263                     * @memberOf _
43264                     * @since 3.4.0
43265                     * @category Math
43266                     * @param {number} augend The first number in an addition.
43267                     * @param {number} addend The second number in an addition.
43268                     * @returns {number} Returns the total.
43269                     * @example
43270                     *
43271                     * _.add(6, 4);
43272                     * // => 10
43273                     */
43274                    var add = createMathOperation(function(augend, addend) {
43275                        return augend + addend;
43276                    }, 0);
43277
43278                    /**
43279                     * Computes `number` rounded up to `precision`.
43280                     *
43281                     * @static
43282                     * @memberOf _
43283                     * @since 3.10.0
43284                     * @category Math
43285                     * @param {number} number The number to round up.
43286                     * @param {number} [precision=0] The precision to round up to.
43287                     * @returns {number} Returns the rounded up number.
43288                     * @example
43289                     *
43290                     * _.ceil(4.006);
43291                     * // => 5
43292                     *
43293                     * _.ceil(6.004, 2);
43294                     * // => 6.01
43295                     *
43296                     * _.ceil(6040, -2);
43297                     * // => 6100
43298                     */
43299                    var ceil = createRound('ceil');
43300
43301                    /**
43302                     * Divide two numbers.
43303                     *
43304                     * @static
43305                     * @memberOf _
43306                     * @since 4.7.0
43307                     * @category Math
43308                     * @param {number} dividend The first number in a division.
43309                     * @param {number} divisor The second number in a division.
43310                     * @returns {number} Returns the quotient.
43311                     * @example
43312                     *
43313                     * _.divide(6, 4);
43314                     * // => 1.5
43315                     */
43316                    var divide = createMathOperation(function(dividend, divisor) {
43317                        return dividend / divisor;
43318                    }, 1);
43319
43320                    /**
43321                     * Computes `number` rounded down to `precision`.
43322                     *
43323                     * @static
43324                     * @memberOf _
43325                     * @since 3.10.0
43326                     * @category Math
43327                     * @param {number} number The number to round down.
43328                     * @param {number} [precision=0] The precision to round down to.
43329                     * @returns {number} Returns the rounded down number.
43330                     * @example
43331                     *
43332                     * _.floor(4.006);
43333                     * // => 4
43334                     *
43335                     * _.floor(0.046, 2);
43336                     * // => 0.04
43337                     *
43338                     * _.floor(4060, -2);
43339                     * // => 4000
43340                     */
43341                    var floor = createRound('floor');
43342
43343                    /**
43344                     * Computes the maximum value of `array`. If `array` is empty or falsey,
43345                     * `undefined` is returned.
43346                     *
43347                     * @static
43348                     * @since 0.1.0
43349                     * @memberOf _
43350                     * @category Math
43351                     * @param {Array} array The array to iterate over.
43352                     * @returns {*} Returns the maximum value.
43353                     * @example
43354                     *
43355                     * _.max([4, 2, 8, 6]);
43356                     * // => 8
43357                     *
43358                     * _.max([]);
43359                     * // => undefined
43360                     */
43361                    function max(array) {
43362                        return (array && array.length)
43363                            ? baseExtremum(array, identity, baseGt)
43364                            : undefined;
43365                    }
43366
43367                    /**
43368                     * This method is like `_.max` except that it accepts `iteratee` which is
43369                     * invoked for each element in `array` to generate the criterion by which
43370                     * the value is ranked. The iteratee is invoked with one argument: (value).
43371                     *
43372                     * @static
43373                     * @memberOf _
43374                     * @since 4.0.0
43375                     * @category Math
43376                     * @param {Array} array The array to iterate over.
43377                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43378                     * @returns {*} Returns the maximum value.
43379                     * @example
43380                     *
43381                     * var objects = [{ 'n': 1 }, { 'n': 2 }];
43382                     *
43383                     * _.maxBy(objects, function(o) { return o.n; });
43384                     * // => { 'n': 2 }
43385                     *
43386                     * // The `_.property` iteratee shorthand.
43387                     * _.maxBy(objects, 'n');
43388                     * // => { 'n': 2 }
43389                     */
43390                    function maxBy(array, iteratee) {
43391                        return (array && array.length)
43392                            ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
43393                            : undefined;
43394                    }
43395
43396                    /**
43397                     * Computes the mean of the values in `array`.
43398                     *
43399                     * @static
43400                     * @memberOf _
43401                     * @since 4.0.0
43402                     * @category Math
43403                     * @param {Array} array The array to iterate over.
43404                     * @returns {number} Returns the mean.
43405                     * @example
43406                     *
43407                     * _.mean([4, 2, 8, 6]);
43408                     * // => 5
43409                     */
43410                    function mean(array) {
43411                        return baseMean(array, identity);
43412                    }
43413
43414                    /**
43415                     * This method is like `_.mean` except that it accepts `iteratee` which is
43416                     * invoked for each element in `array` to generate the value to be averaged.
43417                     * The iteratee is invoked with one argument: (value).
43418                     *
43419                     * @static
43420                     * @memberOf _
43421                     * @since 4.7.0
43422                     * @category Math
43423                     * @param {Array} array The array to iterate over.
43424                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43425                     * @returns {number} Returns the mean.
43426                     * @example
43427                     *
43428                     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
43429                     *
43430                     * _.meanBy(objects, function(o) { return o.n; });
43431                     * // => 5
43432                     *
43433                     * // The `_.property` iteratee shorthand.
43434                     * _.meanBy(objects, 'n');
43435                     * // => 5
43436                     */
43437                    function meanBy(array, iteratee) {
43438                        return baseMean(array, getIteratee(iteratee, 2));
43439                    }
43440
43441                    /**
43442                     * Computes the minimum value of `array`. If `array` is empty or falsey,
43443                     * `undefined` is returned.
43444                     *
43445                     * @static
43446                     * @since 0.1.0
43447                     * @memberOf _
43448                     * @category Math
43449                     * @param {Array} array The array to iterate over.
43450                     * @returns {*} Returns the minimum value.
43451                     * @example
43452                     *
43453                     * _.min([4, 2, 8, 6]);
43454                     * // => 2
43455                     *
43456                     * _.min([]);
43457                     * // => undefined
43458                     */
43459                    function min(array) {
43460                        return (array && array.length)
43461                            ? baseExtremum(array, identity, baseLt)
43462                            : undefined;
43463                    }
43464
43465                    /**
43466                     * This method is like `_.min` except that it accepts `iteratee` which is
43467                     * invoked for each element in `array` to generate the criterion by which
43468                     * the value is ranked. The iteratee is invoked with one argument: (value).
43469                     *
43470                     * @static
43471                     * @memberOf _
43472                     * @since 4.0.0
43473                     * @category Math
43474                     * @param {Array} array The array to iterate over.
43475                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43476                     * @returns {*} Returns the minimum value.
43477                     * @example
43478                     *
43479                     * var objects = [{ 'n': 1 }, { 'n': 2 }];
43480                     *
43481                     * _.minBy(objects, function(o) { return o.n; });
43482                     * // => { 'n': 1 }
43483                     *
43484                     * // The `_.property` iteratee shorthand.
43485                     * _.minBy(objects, 'n');
43486                     * // => { 'n': 1 }
43487                     */
43488                    function minBy(array, iteratee) {
43489                        return (array && array.length)
43490                            ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
43491                            : undefined;
43492                    }
43493
43494                    /**
43495                     * Multiply two numbers.
43496                     *
43497                     * @static
43498                     * @memberOf _
43499                     * @since 4.7.0
43500                     * @category Math
43501                     * @param {number} multiplier The first number in a multiplication.
43502                     * @param {number} multiplicand The second number in a multiplication.
43503                     * @returns {number} Returns the product.
43504                     * @example
43505                     *
43506                     * _.multiply(6, 4);
43507                     * // => 24
43508                     */
43509                    var multiply = createMathOperation(function(multiplier, multiplicand) {
43510                        return multiplier * multiplicand;
43511                    }, 1);
43512
43513                    /**
43514                     * Computes `number` rounded to `precision`.
43515                     *
43516                     * @static
43517                     * @memberOf _
43518                     * @since 3.10.0
43519                     * @category Math
43520                     * @param {number} number The number to round.
43521                     * @param {number} [precision=0] The precision to round to.
43522                     * @returns {number} Returns the rounded number.
43523                     * @example
43524                     *
43525                     * _.round(4.006);
43526                     * // => 4
43527                     *
43528                     * _.round(4.006, 2);
43529                     * // => 4.01
43530                     *
43531                     * _.round(4060, -2);
43532                     * // => 4100
43533                     */
43534                    var round = createRound('round');
43535
43536                    /**
43537                     * Subtract two numbers.
43538                     *
43539                     * @static
43540                     * @memberOf _
43541                     * @since 4.0.0
43542                     * @category Math
43543                     * @param {number} minuend The first number in a subtraction.
43544                     * @param {number} subtrahend The second number in a subtraction.
43545                     * @returns {number} Returns the difference.
43546                     * @example
43547                     *
43548                     * _.subtract(6, 4);
43549                     * // => 2
43550                     */
43551                    var subtract = createMathOperation(function(minuend, subtrahend) {
43552                        return minuend - subtrahend;
43553                    }, 0);
43554
43555                    /**
43556                     * Computes the sum of the values in `array`.
43557                     *
43558                     * @static
43559                     * @memberOf _
43560                     * @since 3.4.0
43561                     * @category Math
43562                     * @param {Array} array The array to iterate over.
43563                     * @returns {number} Returns the sum.
43564                     * @example
43565                     *
43566                     * _.sum([4, 2, 8, 6]);
43567                     * // => 20
43568                     */
43569                    function sum(array) {
43570                        return (array && array.length)
43571                            ? baseSum(array, identity)
43572                            : 0;
43573                    }
43574
43575                    /**
43576                     * This method is like `_.sum` except that it accepts `iteratee` which is
43577                     * invoked for each element in `array` to generate the value to be summed.
43578                     * The iteratee is invoked with one argument: (value).
43579                     *
43580                     * @static
43581                     * @memberOf _
43582                     * @since 4.0.0
43583                     * @category Math
43584                     * @param {Array} array The array to iterate over.
43585                     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43586                     * @returns {number} Returns the sum.
43587                     * @example
43588                     *
43589                     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
43590                     *
43591                     * _.sumBy(objects, function(o) { return o.n; });
43592                     * // => 20
43593                     *
43594                     * // The `_.property` iteratee shorthand.
43595                     * _.sumBy(objects, 'n');
43596                     * // => 20
43597                     */
43598                    function sumBy(array, iteratee) {
43599                        return (array && array.length)
43600                            ? baseSum(array, getIteratee(iteratee, 2))
43601                            : 0;
43602                    }
43603
43604                    /*------------------------------------------------------------------------*/
43605
43606                    // Add methods that return wrapped values in chain sequences.
43607                    lodash.after = after;
43608                    lodash.ary = ary;
43609                    lodash.assign = assign;
43610                    lodash.assignIn = assignIn;
43611                    lodash.assignInWith = assignInWith;
43612                    lodash.assignWith = assignWith;
43613                    lodash.at = at;
43614                    lodash.before = before;
43615                    lodash.bind = bind;
43616                    lodash.bindAll = bindAll;
43617                    lodash.bindKey = bindKey;
43618                    lodash.castArray = castArray;
43619                    lodash.chain = chain;
43620                    lodash.chunk = chunk;
43621                    lodash.compact = compact;
43622                    lodash.concat = concat;
43623                    lodash.cond = cond;
43624                    lodash.conforms = conforms;
43625                    lodash.constant = constant;
43626                    lodash.countBy = countBy;
43627                    lodash.create = create;
43628                    lodash.curry = curry;
43629                    lodash.curryRight = curryRight;
43630                    lodash.debounce = debounce;
43631                    lodash.defaults = defaults;
43632                    lodash.defaultsDeep = defaultsDeep;
43633                    lodash.defer = defer;
43634                    lodash.delay = delay;
43635                    lodash.difference = difference;
43636                    lodash.differenceBy = differenceBy;
43637                    lodash.differenceWith = differenceWith;
43638                    lodash.drop = drop;
43639                    lodash.dropRight = dropRight;
43640                    lodash.dropRightWhile = dropRightWhile;
43641                    lodash.dropWhile = dropWhile;
43642                    lodash.fill = fill;
43643                    lodash.filter = filter;
43644                    lodash.flatMap = flatMap;
43645                    lodash.flatMapDeep = flatMapDeep;
43646                    lodash.flatMapDepth = flatMapDepth;
43647                    lodash.flatten = flatten;
43648                    lodash.flattenDeep = flattenDeep;
43649                    lodash.flattenDepth = flattenDepth;
43650                    lodash.flip = flip;
43651                    lodash.flow = flow;
43652                    lodash.flowRight = flowRight;
43653                    lodash.fromPairs = fromPairs;
43654                    lodash.functions = functions;
43655                    lodash.functionsIn = functionsIn;
43656                    lodash.groupBy = groupBy;
43657                    lodash.initial = initial;
43658                    lodash.intersection = intersection;
43659                    lodash.intersectionBy = intersectionBy;
43660                    lodash.intersectionWith = intersectionWith;
43661                    lodash.invert = invert;
43662                    lodash.invertBy = invertBy;
43663                    lodash.invokeMap = invokeMap;
43664                    lodash.iteratee = iteratee;
43665                    lodash.keyBy = keyBy;
43666                    lodash.keys = keys;
43667                    lodash.keysIn = keysIn;
43668                    lodash.map = map;
43669                    lodash.mapKeys = mapKeys;
43670                    lodash.mapValues = mapValues;
43671                    lodash.matches = matches;
43672                    lodash.matchesProperty = matchesProperty;
43673                    lodash.memoize = memoize;
43674                    lodash.merge = merge;
43675                    lodash.mergeWith = mergeWith;
43676                    lodash.method = method;
43677                    lodash.methodOf = methodOf;
43678                    lodash.mixin = mixin;
43679                    lodash.negate = negate;
43680                    lodash.nthArg = nthArg;
43681                    lodash.omit = omit;
43682                    lodash.omitBy = omitBy;
43683                    lodash.once = once;
43684                    lodash.orderBy = orderBy;
43685                    lodash.over = over;
43686                    lodash.overArgs = overArgs;
43687                    lodash.overEvery = overEvery;
43688                    lodash.overSome = overSome;
43689                    lodash.partial = partial;
43690                    lodash.partialRight = partialRight;
43691                    lodash.partition = partition;
43692                    lodash.pick = pick;
43693                    lodash.pickBy = pickBy;
43694                    lodash.property = property;
43695                    lodash.propertyOf = propertyOf;
43696                    lodash.pull = pull;
43697                    lodash.pullAll = pullAll;
43698                    lodash.pullAllBy = pullAllBy;
43699                    lodash.pullAllWith = pullAllWith;
43700                    lodash.pullAt = pullAt;
43701                    lodash.range = range;
43702                    lodash.rangeRight = rangeRight;
43703                    lodash.rearg = rearg;
43704                    lodash.reject = reject;
43705                    lodash.remove = remove;
43706                    lodash.rest = rest;
43707                    lodash.reverse = reverse;
43708                    lodash.sampleSize = sampleSize;
43709                    lodash.set = set;
43710                    lodash.setWith = setWith;
43711                    lodash.shuffle = shuffle;
43712                    lodash.slice = slice;
43713                    lodash.sortBy = sortBy;
43714                    lodash.sortedUniq = sortedUniq;
43715                    lodash.sortedUniqBy = sortedUniqBy;
43716                    lodash.split = split;
43717                    lodash.spread = spread;
43718                    lodash.tail = tail;
43719                    lodash.take = take;
43720                    lodash.takeRight = takeRight;
43721                    lodash.takeRightWhile = takeRightWhile;
43722                    lodash.takeWhile = takeWhile;
43723                    lodash.tap = tap;
43724                    lodash.throttle = throttle;
43725                    lodash.thru = thru;
43726                    lodash.toArray = toArray;
43727                    lodash.toPairs = toPairs;
43728                    lodash.toPairsIn = toPairsIn;
43729                    lodash.toPath = toPath;
43730                    lodash.toPlainObject = toPlainObject;
43731                    lodash.transform = transform;
43732                    lodash.unary = unary;
43733                    lodash.union = union;
43734                    lodash.unionBy = unionBy;
43735                    lodash.unionWith = unionWith;
43736                    lodash.uniq = uniq;
43737                    lodash.uniqBy = uniqBy;
43738                    lodash.uniqWith = uniqWith;
43739                    lodash.unset = unset;
43740                    lodash.unzip = unzip;
43741                    lodash.unzipWith = unzipWith;
43742                    lodash.update = update;
43743                    lodash.updateWith = updateWith;
43744                    lodash.values = values;
43745                    lodash.valuesIn = valuesIn;
43746                    lodash.without = without;
43747                    lodash.words = words;
43748                    lodash.wrap = wrap;
43749                    lodash.xor = xor;
43750                    lodash.xorBy = xorBy;
43751                    lodash.xorWith = xorWith;
43752                    lodash.zip = zip;
43753                    lodash.zipObject = zipObject;
43754                    lodash.zipObjectDeep = zipObjectDeep;
43755                    lodash.zipWith = zipWith;
43756
43757                    // Add aliases.
43758                    lodash.entries = toPairs;
43759                    lodash.entriesIn = toPairsIn;
43760                    lodash.extend = assignIn;
43761                    lodash.extendWith = assignInWith;
43762
43763                    // Add methods to `lodash.prototype`.
43764                    mixin(lodash, lodash);
43765
43766                    /*------------------------------------------------------------------------*/
43767
43768                    // Add methods that return unwrapped values in chain sequences.
43769                    lodash.add = add;
43770                    lodash.attempt = attempt;
43771                    lodash.camelCase = camelCase;
43772                    lodash.capitalize = capitalize;
43773                    lodash.ceil = ceil;
43774                    lodash.clamp = clamp;
43775                    lodash.clone = clone;
43776                    lodash.cloneDeep = cloneDeep;
43777                    lodash.cloneDeepWith = cloneDeepWith;
43778                    lodash.cloneWith = cloneWith;
43779                    lodash.conformsTo = conformsTo;
43780                    lodash.deburr = deburr;
43781                    lodash.defaultTo = defaultTo;
43782                    lodash.divide = divide;
43783                    lodash.endsWith = endsWith;
43784                    lodash.eq = eq;
43785                    lodash.escape = escape;
43786                    lodash.escapeRegExp = escapeRegExp;
43787                    lodash.every = every;
43788                    lodash.find = find;
43789                    lodash.findIndex = findIndex;
43790                    lodash.findKey = findKey;
43791                    lodash.findLast = findLast;
43792                    lodash.findLastIndex = findLastIndex;
43793                    lodash.findLastKey = findLastKey;
43794                    lodash.floor = floor;
43795                    lodash.forEach = forEach;
43796                    lodash.forEachRight = forEachRight;
43797                    lodash.forIn = forIn;
43798                    lodash.forInRight = forInRight;
43799                    lodash.forOwn = forOwn;
43800                    lodash.forOwnRight = forOwnRight;
43801                    lodash.get = get;
43802                    lodash.gt = gt;
43803                    lodash.gte = gte;
43804                    lodash.has = has;
43805                    lodash.hasIn = hasIn;
43806                    lodash.head = head;
43807                    lodash.identity = identity;
43808                    lodash.includes = includes;
43809                    lodash.indexOf = indexOf;
43810                    lodash.inRange = inRange;
43811                    lodash.invoke = invoke;
43812                    lodash.isArguments = isArguments;
43813                    lodash.isArray = isArray;
43814                    lodash.isArrayBuffer = isArrayBuffer;
43815                    lodash.isArrayLike = isArrayLike;
43816                    lodash.isArrayLikeObject = isArrayLikeObject;
43817                    lodash.isBoolean = isBoolean;
43818                    lodash.isBuffer = isBuffer;
43819                    lodash.isDate = isDate;
43820                    lodash.isElement = isElement;
43821                    lodash.isEmpty = isEmpty;
43822                    lodash.isEqual = isEqual;
43823                    lodash.isEqualWith = isEqualWith;
43824                    lodash.isError = isError;
43825                    lodash.isFinite = isFinite;
43826                    lodash.isFunction = isFunction;
43827                    lodash.isInteger = isInteger;
43828                    lodash.isLength = isLength;
43829                    lodash.isMap = isMap;
43830                    lodash.isMatch = isMatch;
43831                    lodash.isMatchWith = isMatchWith;
43832                    lodash.isNaN = isNaN;
43833                    lodash.isNative = isNative;
43834                    lodash.isNil = isNil;
43835                    lodash.isNull = isNull;
43836                    lodash.isNumber = isNumber;
43837                    lodash.isObject = isObject;
43838                    lodash.isObjectLike = isObjectLike;
43839                    lodash.isPlainObject = isPlainObject;
43840                    lodash.isRegExp = isRegExp;
43841                    lodash.isSafeInteger = isSafeInteger;
43842                    lodash.isSet = isSet;
43843                    lodash.isString = isString;
43844                    lodash.isSymbol = isSymbol;
43845                    lodash.isTypedArray = isTypedArray;
43846                    lodash.isUndefined = isUndefined;
43847                    lodash.isWeakMap = isWeakMap;
43848                    lodash.isWeakSet = isWeakSet;
43849                    lodash.join = join;
43850                    lodash.kebabCase = kebabCase;
43851                    lodash.last = last;
43852                    lodash.lastIndexOf = lastIndexOf;
43853                    lodash.lowerCase = lowerCase;
43854                    lodash.lowerFirst = lowerFirst;
43855                    lodash.lt = lt;
43856                    lodash.lte = lte;
43857                    lodash.max = max;
43858                    lodash.maxBy = maxBy;
43859                    lodash.mean = mean;
43860                    lodash.meanBy = meanBy;
43861                    lodash.min = min;
43862                    lodash.minBy = minBy;
43863                    lodash.stubArray = stubArray;
43864                    lodash.stubFalse = stubFalse;
43865                    lodash.stubObject = stubObject;
43866                    lodash.stubString = stubString;
43867                    lodash.stubTrue = stubTrue;
43868                    lodash.multiply = multiply;
43869                    lodash.nth = nth;
43870                    lodash.noConflict = noConflict;
43871                    lodash.noop = noop;
43872                    lodash.now = now;
43873                    lodash.pad = pad;
43874                    lodash.padEnd = padEnd;
43875                    lodash.padStart = padStart;
43876                    lodash.parseInt = parseInt;
43877                    lodash.random = random;
43878                    lodash.reduce = reduce;
43879                    lodash.reduceRight = reduceRight;
43880                    lodash.repeat = repeat;
43881                    lodash.replace = replace;
43882                    lodash.result = result;
43883                    lodash.round = round;
43884                    lodash.runInContext = runInContext;
43885                    lodash.sample = sample;
43886                    lodash.size = size;
43887                    lodash.snakeCase = snakeCase;
43888                    lodash.some = some;
43889                    lodash.sortedIndex = sortedIndex;
43890                    lodash.sortedIndexBy = sortedIndexBy;
43891                    lodash.sortedIndexOf = sortedIndexOf;
43892                    lodash.sortedLastIndex = sortedLastIndex;
43893                    lodash.sortedLastIndexBy = sortedLastIndexBy;
43894                    lodash.sortedLastIndexOf = sortedLastIndexOf;
43895                    lodash.startCase = startCase;
43896                    lodash.startsWith = startsWith;
43897                    lodash.subtract = subtract;
43898                    lodash.sum = sum;
43899                    lodash.sumBy = sumBy;
43900                    lodash.template = template;
43901                    lodash.times = times;
43902                    lodash.toFinite = toFinite;
43903                    lodash.toInteger = toInteger;
43904                    lodash.toLength = toLength;
43905                    lodash.toLower = toLower;
43906                    lodash.toNumber = toNumber;
43907                    lodash.toSafeInteger = toSafeInteger;
43908                    lodash.toString = toString;
43909                    lodash.toUpper = toUpper;
43910                    lodash.trim = trim;
43911                    lodash.trimEnd = trimEnd;
43912                    lodash.trimStart = trimStart;
43913                    lodash.truncate = truncate;
43914                    lodash.unescape = unescape;
43915                    lodash.uniqueId = uniqueId;
43916                    lodash.upperCase = upperCase;
43917                    lodash.upperFirst = upperFirst;
43918
43919                    // Add aliases.
43920                    lodash.each = forEach;
43921                    lodash.eachRight = forEachRight;
43922                    lodash.first = head;
43923
43924                    mixin(lodash, (function() {
43925                        var source = {};
43926                        baseForOwn(lodash, function(func, methodName) {
43927                            if (!hasOwnProperty.call(lodash.prototype, methodName)) {
43928                                source[methodName] = func;
43929                            }
43930                        });
43931                        return source;
43932                    }()), { 'chain': false });
43933
43934                    /*------------------------------------------------------------------------*/
43935
43936                    /**
43937                     * The semantic version number.
43938                     *
43939                     * @static
43940                     * @memberOf _
43941                     * @type {string}
43942                     */
43943                    lodash.VERSION = VERSION;
43944
43945                    // Assign default placeholders.
43946                    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
43947                        lodash[methodName].placeholder = lodash;
43948                    });
43949
43950                    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
43951                    arrayEach(['drop', 'take'], function(methodName, index) {
43952                        LazyWrapper.prototype[methodName] = function(n) {
43953                            n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
43954
43955                            var result = (this.__filtered__ && !index)
43956                                ? new LazyWrapper(this)
43957                                : this.clone();
43958
43959                            if (result.__filtered__) {
43960                                result.__takeCount__ = nativeMin(n, result.__takeCount__);
43961                            } else {
43962                                result.__views__.push({
43963                                    'size': nativeMin(n, MAX_ARRAY_LENGTH),
43964                                    'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
43965                                });
43966                            }
43967                            return result;
43968                        };
43969
43970                        LazyWrapper.prototype[methodName + 'Right'] = function(n) {
43971                            return this.reverse()[methodName](n).reverse();
43972                        };
43973                    });
43974
43975                    // Add `LazyWrapper` methods that accept an `iteratee` value.
43976                    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
43977                        var type = index + 1,
43978                            isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
43979
43980                        LazyWrapper.prototype[methodName] = function(iteratee) {
43981                            var result = this.clone();
43982                            result.__iteratees__.push({
43983                                'iteratee': getIteratee(iteratee, 3),
43984                                'type': type
43985                            });
43986                            result.__filtered__ = result.__filtered__ || isFilter;
43987                            return result;
43988                        };
43989                    });
43990
43991                    // Add `LazyWrapper` methods for `_.head` and `_.last`.
43992                    arrayEach(['head', 'last'], function(methodName, index) {
43993                        var takeName = 'take' + (index ? 'Right' : '');
43994
43995                        LazyWrapper.prototype[methodName] = function() {
43996                            return this[takeName](1).value()[0];
43997                        };
43998                    });
43999
44000                    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
44001                    arrayEach(['initial', 'tail'], function(methodName, index) {
44002                        var dropName = 'drop' + (index ? '' : 'Right');
44003
44004                        LazyWrapper.prototype[methodName] = function() {
44005                            return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
44006                        };
44007                    });
44008
44009                    LazyWrapper.prototype.compact = function() {
44010                        return this.filter(identity);
44011                    };
44012
44013                    LazyWrapper.prototype.find = function(predicate) {
44014                        return this.filter(predicate).head();
44015                    };
44016
44017                    LazyWrapper.prototype.findLast = function(predicate) {
44018                        return this.reverse().find(predicate);
44019                    };
44020
44021                    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
44022                        if (typeof path == 'function') {
44023                            return new LazyWrapper(this);
44024                        }
44025                        return this.map(function(value) {
44026                            return baseInvoke(value, path, args);
44027                        });
44028                    });
44029
44030                    LazyWrapper.prototype.reject = function(predicate) {
44031                        return this.filter(negate(getIteratee(predicate)));
44032                    };
44033
44034                    LazyWrapper.prototype.slice = function(start, end) {
44035                        start = toInteger(start);
44036
44037                        var result = this;
44038                        if (result.__filtered__ && (start > 0 || end < 0)) {
44039                            return new LazyWrapper(result);
44040                        }
44041                        if (start < 0) {
44042                            result = result.takeRight(-start);
44043                        } else if (start) {
44044                            result = result.drop(start);
44045                        }
44046                        if (end !== undefined) {
44047                            end = toInteger(end);
44048                            result = end < 0 ? result.dropRight(-end) : result.take(end - start);
44049                        }
44050                        return result;
44051                    };
44052
44053                    LazyWrapper.prototype.takeRightWhile = function(predicate) {
44054                        return this.reverse().takeWhile(predicate).reverse();
44055                    };
44056
44057                    LazyWrapper.prototype.toArray = function() {
44058                        return this.take(MAX_ARRAY_LENGTH);
44059                    };
44060
44061                    // Add `LazyWrapper` methods to `lodash.prototype`.
44062                    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
44063                        var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
44064                            isTaker = /^(?:head|last)$/.test(methodName),
44065                            lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
44066                            retUnwrapped = isTaker || /^find/.test(methodName);
44067
44068                        if (!lodashFunc) {
44069                            return;
44070                        }
44071                        lodash.prototype[methodName] = function() {
44072                            var value = this.__wrapped__,
44073                                args = isTaker ? [1] : arguments,
44074                                isLazy = value instanceof LazyWrapper,
44075                                iteratee = args[0],
44076                                useLazy = isLazy || isArray(value);
44077
44078                            var interceptor = function(value) {
44079                                var result = lodashFunc.apply(lodash, arrayPush([value], args));
44080                                return (isTaker && chainAll) ? result[0] : result;
44081                            };
44082
44083                            if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
44084                                // Avoid lazy use if the iteratee has a "length" value other than `1`.
44085                                isLazy = useLazy = false;
44086                            }
44087                            var chainAll = this.__chain__,
44088                                isHybrid = !!this.__actions__.length,
44089                                isUnwrapped = retUnwrapped && !chainAll,
44090                                onlyLazy = isLazy && !isHybrid;
44091
44092                            if (!retUnwrapped && useLazy) {
44093                                value = onlyLazy ? value : new LazyWrapper(this);
44094                                var result = func.apply(value, args);
44095                                result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
44096                                return new LodashWrapper(result, chainAll);
44097                            }
44098                            if (isUnwrapped && onlyLazy) {
44099                                return func.apply(this, args);
44100                            }
44101                            result = this.thru(interceptor);
44102                            return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
44103                        };
44104                    });
44105
44106                    // Add `Array` methods to `lodash.prototype`.
44107                    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
44108                        var func = arrayProto[methodName],
44109                            chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
44110                            retUnwrapped = /^(?:pop|shift)$/.test(methodName);
44111
44112                        lodash.prototype[methodName] = function() {
44113                            var args = arguments;
44114                            if (retUnwrapped && !this.__chain__) {
44115                                var value = this.value();
44116                                return func.apply(isArray(value) ? value : [], args);
44117                            }
44118                            return this[chainName](function(value) {
44119                                return func.apply(isArray(value) ? value : [], args);
44120                            });
44121                        };
44122                    });
44123
44124                    // Map minified method names to their real names.
44125                    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
44126                        var lodashFunc = lodash[methodName];
44127                        if (lodashFunc) {
44128                            var key = lodashFunc.name + '';
44129                            if (!hasOwnProperty.call(realNames, key)) {
44130                                realNames[key] = [];
44131                            }
44132                            realNames[key].push({ 'name': methodName, 'func': lodashFunc });
44133                        }
44134                    });
44135
44136                    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
44137                        'name': 'wrapper',
44138                        'func': undefined
44139                    }];
44140
44141                    // Add methods to `LazyWrapper`.
44142                    LazyWrapper.prototype.clone = lazyClone;
44143                    LazyWrapper.prototype.reverse = lazyReverse;
44144                    LazyWrapper.prototype.value = lazyValue;
44145
44146                    // Add chain sequence methods to the `lodash` wrapper.
44147                    lodash.prototype.at = wrapperAt;
44148                    lodash.prototype.chain = wrapperChain;
44149                    lodash.prototype.commit = wrapperCommit;
44150                    lodash.prototype.next = wrapperNext;
44151                    lodash.prototype.plant = wrapperPlant;
44152                    lodash.prototype.reverse = wrapperReverse;
44153                    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
44154
44155                    // Add lazy aliases.
44156                    lodash.prototype.first = lodash.prototype.head;
44157
44158                    if (symIterator) {
44159                        lodash.prototype[symIterator] = wrapperToIterator;
44160                    }
44161                    return lodash;
44162                });
44163
44164                /*--------------------------------------------------------------------------*/
44165
44166                // Export lodash.
44167                var _ = runInContext();
44168
44169                // Some AMD build optimizers, like r.js, check for condition patterns like:
44170                if (true) {
44171                    // Expose Lodash on the global object to prevent errors when Lodash is
44172                    // loaded by a script tag in the presence of an AMD loader.
44173                    // See http://requirejs.org/docs/errors.html#mismatch for more details.
44174                    // Use `_.noConflict` to remove Lodash from the global object.
44175                    root._ = _;
44176
44177                    // Define as an anonymous module so, through path mapping, it can be
44178                    // referenced as the "underscore" module.
44179                    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
44180                        return _;
44181                    }).call(exports, __webpack_require__, exports, module),
44182                    __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
44183                }
44184                // Check for `exports` after `define` in case a build optimizer adds it.
44185                else {}
44186            }.call(this));
44187
44188
44189            /***/ }),
44190
44191        
44191/***/ "./src/sass/style.scss":
44192        /*!*****************************!*\
44193  !*** ./src/sass/style.scss ***!
44194  \*****************************/
44195        /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
44196
44197            "use strict";
44198            __webpack_require__.r(__webpack_exports__);
44199// extracted by mini-css-extract-plugin
44200
44201
44202            /***/ }),
44203
44204        
vendor: 145,634 bytes, lines 44204-47664
44204/***/ "./node_modules/owl.carousel/dist/owl.carousel.js":
44205        /*!********************************************************!*\
44206  !*** ./node_modules/owl.carousel/dist/owl.carousel.js ***!
44207  \********************************************************/
44208        /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
44209
44210            /* provided dependency */ var jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
44211            /* provided dependency */ var __webpack_provided_window_dot_jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
44212            /**
44213             * Owl Carousel v2.3.4
44214             * Copyright 2013-2018 David Deutsch
44215             * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
44216             */
44217            /**
44218             * Owl carousel
44219             * @version 2.3.4
44220             * @author Bartosz Wojciechowski
44221             * @author David Deutsch
44222             * @license The MIT License (MIT)
44223             * @todo Lazy Load Icon
44224             * @todo prevent animationend bubling
44225             * @todo itemsScaleUp
44226             * @todo Test Zepto
44227             * @todo stagePadding calculate wrong active classes
44228             */
44229            ;(function($, window, document, undefined) {
44230
44231                /**
44232                 * Creates a carousel.
44233                 * @class The Owl Carousel.
44234                 * @public
44235                 * @param {HTMLElement|jQuery} element - The element to create the carousel for.
44236                 * @param {Object} [options] - The options
44237                 */
44238                function Owl(element, options) {
44239
44240                    /**
44241                     * Current settings for the carousel.
44242                     * @public
44243                     */
44244                    this.settings = null;
44245
44246                    /**
44247                     * Current options set by the caller including defaults.
44248                     * @public
44249                     */
44250                    this.options = $.extend({}, Owl.Defaults, options);
44251
44252                    /**
44253                     * Plugin element.
44254                     * @public
44255                     */
44256                    this.$element = $(element);
44257
44258                    /**
44259                     * Proxied event handlers.
44260                     * @protected
44261                     */
44262                    this._handlers = {};
44263
44264                    /**
44265                     * References to the running plugins of this carousel.
44266                     * @protected
44267                     */
44268                    this._plugins = {};
44269
44270                    /**
44271                     * Currently suppressed events to prevent them from being retriggered.
44272                     * @protected
44273                     */
44274                    this._supress = {};
44275
44276                    /**
44277                     * Absolute current position.
44278                     * @protected
44279                     */
44280                    this._current = null;
44281
44282                    /**
44283                     * Animation speed in milliseconds.
44284                     * @protected
44285                     */
44286                    this._speed = null;
44287
44288                    /**
44289                     * Coordinates of all items in pixel.
44290                     * @todo The name of this member is missleading.
44291                     * @protected
44292                     */
44293                    this._coordinates = [];
44294
44295                    /**
44296                     * Current breakpoint.
44297                     * @todo Real media queries would be nice.
44298                     * @protected
44299                     */
44300                    this._breakpoint = null;
44301
44302                    /**
44303                     * Current width of the plugin element.
44304                     */
44305                    this._width = null;
44306
44307                    /**
44308                     * All real items.
44309                     * @protected
44310                     */
44311                    this._items = [];
44312
44313                    /**
44314                     * All cloned items.
44315                     * @protected
44316                     */
44317                    this._clones = [];
44318
44319                    /**
44320                     * Merge values of all items.
44321                     * @todo Maybe this could be part of a plugin.
44322                     * @protected
44323                     */
44324                    this._mergers = [];
44325
44326                    /**
44327                     * Widths of all items.
44328                     */
44329                    this._widths = [];
44330
44331                    /**
44332                     * Invalidated parts within the update process.
44333                     * @protected
44334                     */
44335                    this._invalidated = {};
44336
44337                    /**
44338                     * Ordered list of workers for the update process.
44339                     * @protected
44340                     */
44341                    this._pipe = [];
44342
44343                    /**
44344                     * Current state information for the drag operation.
44345                     * @todo #261
44346                     * @protected
44347                     */
44348                    this._drag = {
44349                        time: null,
44350                        target: null,
44351                        pointer: null,
44352                        stage: {
44353                            start: null,
44354                            current: null
44355                        },
44356                        direction: null
44357                    };
44358
44359                    /**
44360                     * Current state information and their tags.
44361                     * @type {Object}
44362                     * @protected
44363                     */
44364                    this._states = {
44365                        current: {},
44366                        tags: {
44367                            'initializing': [ 'busy' ],
44368                            'animating': [ 'busy' ],
44369                            'dragging': [ 'interacting' ]
44370                        }
44371                    };
44372
44373                    $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) {
44374                        this._handlers[handler] = $.proxy(this[handler], this);
44375                    }, this));
44376
44377                    $.each(Owl.Plugins, $.proxy(function(key, plugin) {
44378                        this._plugins[key.charAt(0).toLowerCase() + key.slice(1)]
44379                            = new plugin(this);
44380                    }, this));
44381
44382                    $.each(Owl.Workers, $.proxy(function(priority, worker) {
44383                        this._pipe.push({
44384                            'filter': worker.filter,
44385                            'run': $.proxy(worker.run, this)
44386                        });
44387                    }, this));
44388
44389                    this.setup();
44390                    this.initialize();
44391                }
44392
44393                /**
44394                 * Default options for the carousel.
44395                 * @public
44396                 */
44397                Owl.Defaults = {
44398                    items: 3,
44399                    loop: false,
44400                    center: false,
44401                    rewind: false,
44402                    checkVisibility: true,
44403
44404                    mouseDrag: true,
44405                    touchDrag: true,
44406                    pullDrag: true,
44407                    freeDrag: false,
44408
44409                    margin: 0,
44410                    stagePadding: 0,
44411
44412                    merge: false,
44413                    mergeFit: true,
44414                    autoWidth: false,
44415
44416                    startPosition: 0,
44417                    rtl: false,
44418
44419                    smartSpeed: 250,
44420                    fluidSpeed: false,
44421                    dragEndSpeed: false,
44422
44423                    responsive: {},
44424                    responsiveRefreshRate: 200,
44425                    responsiveBaseElement: window,
44426
44427                    fallbackEasing: 'swing',
44428                    slideTransition: '',
44429
44430                    info: false,
44431
44432                    nestedItemSelector: false,
44433                    itemElement: 'div',
44434                    stageElement: 'div',
44435
44436                    refreshClass: 'owl-refresh',
44437                    loadedClass: 'owl-loaded',
44438                    loadingClass: 'owl-loading',
44439                    rtlClass: 'owl-rtl',
44440                    responsiveClass: 'owl-responsive',
44441                    dragClass: 'owl-drag',
44442                    itemClass: 'owl-item',
44443                    stageClass: 'owl-stage',
44444                    stageOuterClass: 'owl-stage-outer',
44445                    grabClass: 'owl-grab'
44446                };
44447
44448                /**
44449                 * Enumeration for width.
44450                 * @public
44451                 * @readonly
44452                 * @enum {String}
44453                 */
44454                Owl.Width = {
44455                    Default: 'default',
44456                    Inner: 'inner',
44457                    Outer: 'outer'
44458                };
44459
44460                /**
44461                 * Enumeration for types.
44462                 * @public
44463                 * @readonly
44464                 * @enum {String}
44465                 */
44466                Owl.Type = {
44467                    Event: 'event',
44468                    State: 'state'
44469                };
44470
44471                /**
44472                 * Contains all registered plugins.
44473                 * @public
44474                 */
44475                Owl.Plugins = {};
44476
44477                /**
44478                 * List of workers involved in the update process.
44479                 */
44480                Owl.Workers = [ {
44481                    filter: [ 'width', 'settings' ],
44482                    run: function() {
44483                        this._width = this.$element.width();
44484                    }
44485                }, {
44486                    filter: [ 'width', 'items', 'settings' ],
44487                    run: function(cache) {
44488                        cache.current = this._items && this._items[this.relative(this._current)];
44489                    }
44490                }, {
44491                    filter: [ 'items', 'settings' ],
44492                    run: function() {
44493                        this.$stage.children('.cloned').remove();
44494                    }
44495                }, {
44496                    filter: [ 'width', 'items', 'settings' ],
44497                    run: function(cache) {
44498                        var margin = this.settings.margin || '',
44499                            grid = !this.settings.autoWidth,
44500                            rtl = this.settings.rtl,
44501                            css = {
44502                                'width': 'auto',
44503                                'margin-left': rtl ? margin : '',
44504                                'margin-right': rtl ? '' : margin
44505                            };
44506
44507                        !grid && this.$stage.children().css(css);
44508
44509                        cache.css = css;
44510                    }
44511                }, {
44512                    filter: [ 'width', 'items', 'settings' ],
44513                    run: function(cache) {
44514                        var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
44515                            merge = null,
44516                            iterator = this._items.length,
44517                            grid = !this.settings.autoWidth,
44518                            widths = [];
44519
44520                        cache.items = {
44521                            merge: false,
44522                            width: width
44523                        };
44524
44525                        while (iterator--) {
44526                            merge = this._mergers[iterator];
44527                            merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;
44528
44529                            cache.items.merge = merge > 1 || cache.items.merge;
44530
44531                            widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
44532                        }
44533
44534                        this._widths = widths;
44535                    }
44536                }, {
44537                    filter: [ 'items', 'settings' ],
44538                    run: function() {
44539                        var clones = [],
44540                            items = this._items,
44541                            settings = this.settings,
44542                            // TODO: Should be computed from number of min width items in stage
44543                            view = Math.max(settings.items * 2, 4),
44544                            size = Math.ceil(items.length / 2) * 2,
44545                            repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
44546                            append = '',
44547                            prepend = '';
44548
44549                        repeat /= 2;
44550
44551                        while (repeat > 0) {
44552                            // Switch to only using appended clones
44553                            clones.push(this.normalize(clones.length / 2, true));
44554                            append = append + items[clones[clones.length - 1]][0].outerHTML;
44555                            clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
44556                            prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
44557                            repeat -= 1;
44558                        }
44559
44560                        this._clones = clones;
44561
44562                        $(append).addClass('cloned').appendTo(this.$stage);
44563                        $(prepend).addClass('cloned').prependTo(this.$stage);
44564                    }
44565                }, {
44566                    filter: [ 'width', 'items', 'settings' ],
44567                    run: function() {
44568                        var rtl = this.settings.rtl ? 1 : -1,
44569                            size = this._clones.length + this._items.length,
44570                            iterator = -1,
44571                            previous = 0,
44572                            current = 0,
44573                            coordinates = [];
44574
44575                        while (++iterator < size) {
44576                            previous = coordinates[iterator - 1] || 0;
44577                            current = this._widths[this.relative(iterator)] + this.settings.margin;
44578                            coordinates.push(previous + current * rtl);
44579                        }
44580
44581                        this._coordinates = coordinates;
44582                    }
44583                }, {
44584                    filter: [ 'width', 'items', 'settings' ],
44585                    run: function() {
44586                        var padding = this.settings.stagePadding,
44587                            coordinates = this._coordinates,
44588                            css = {
44589                                'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
44590                                'padding-left': padding || '',
44591                                'padding-right': padding || ''
44592                            };
44593
44594                        this.$stage.css(css);
44595                    }
44596                }, {
44597                    filter: [ 'width', 'items', 'settings' ],
44598                    run: function(cache) {
44599                        var iterator = this._coordinates.length,
44600                            grid = !this.settings.autoWidth,
44601                            items = this.$stage.children();
44602
44603                        if (grid && cache.items.merge) {
44604                            while (iterator--) {
44605                                cache.css.width = this._widths[this.relative(iterator)];
44606                                items.eq(iterator).css(cache.css);
44607                            }
44608                        } else if (grid) {
44609                            cache.css.width = cache.items.width;
44610                            items.css(cache.css);
44611                        }
44612                    }
44613                }, {
44614                    filter: [ 'items' ],
44615                    run: function() {
44616                        this._coordinates.length < 1 && this.$stage.removeAttr('style');
44617                    }
44618                }, {
44619                    filter: [ 'width', 'items', 'settings' ],
44620                    run: function(cache) {
44621                        cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
44622                        cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
44623                        this.reset(cache.current);
44624                    }
44625                }, {
44626                    filter: [ 'position' ],
44627                    run: function() {
44628                        this.animate(this.coordinates(this._current));
44629                    }
44630                }, {
44631                    filter: [ 'width', 'position', 'items', 'settings' ],
44632                    run: function() {
44633                        var rtl = this.settings.rtl ? 1 : -1,
44634                            padding = this.settings.stagePadding * 2,
44635                            begin = this.coordinates(this.current()) + padding,
44636                            end = begin + this.width() * rtl,
44637                            inner, outer, matches = [], i, n;
44638
44639                        for (i = 0, n = this._coordinates.length; i < n; i++) {
44640                            inner = this._coordinates[i - 1] || 0;
44641                            outer = Math.abs(this._coordinates[i]) + padding * rtl;
44642
44643                            if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))
44644                                || (this.op(outer, '<', begin) && this.op(outer, '>', end))) {
44645                                matches.push(i);
44646                            }
44647                        }
44648
44649                        this.$stage.children('.active').removeClass('active');
44650                        this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');
44651
44652                        this.$stage.children('.center').removeClass('center');
44653                        if (this.settings.center) {
44654                            this.$stage.children().eq(this.current()).addClass('center');
44655                        }
44656                    }
44657                } ];
44658
44659                /**
44660                 * Create the stage DOM element
44661                 */
44662                Owl.prototype.initializeStage = function() {
44663                    this.$stage = this.$element.find('.' + this.settings.stageClass);
44664
44665                    // if the stage is already in the DOM, grab it and skip stage initialization
44666                    if (this.$stage.length) {
44667                        return;
44668                    }
44669
44670                    this.$element.addClass(this.options.loadingClass);
44671
44672                    // create stage
44673                    this.$stage = $('<' + this.settings.stageElement + '>', {
44674                        "class": this.settings.stageClass
44675                    }).wrap( $( '<div/>', {
44676                        "class": this.settings.stageOuterClass
44677                    }));
44678
44679                    // append stage
44680                    this.$element.append(this.$stage.parent());
44681                };
44682
44683                /**
44684                 * Create item DOM elements
44685                 */
44686                Owl.prototype.initializeItems = function() {
44687                    var $items = this.$element.find('.owl-item');
44688
44689                    // if the items are already in the DOM, grab them and skip item initialization
44690                    if ($items.length) {
44691                        this._items = $items.get().map(function(item) {
44692                            return $(item);
44693                        });
44694
44695                        this._mergers = this._items.map(function() {
44696                            return 1;
44697                        });
44698
44699                        this.refresh();
44700
44701                        return;
44702                    }
44703
44704                    // append content
44705                    this.replace(this.$element.children().not(this.$stage.parent()));
44706
44707                    // check visibility
44708                    if (this.isVisible()) {
44709                        // update view
44710                        this.refresh();
44711                    } else {
44712                        // invalidate width
44713                        this.invalidate('width');
44714                    }
44715
44716                    this.$element
44717                        .removeClass(this.options.loadingClass)
44718                        .addClass(this.options.loadedClass);
44719                };
44720
44721                /**
44722                 * Initializes the carousel.
44723                 * @protected
44724                 */
44725                Owl.prototype.initialize = function() {
44726                    this.enter('initializing');
44727                    this.trigger('initialize');
44728
44729                    this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);
44730
44731                    if (this.settings.autoWidth && !this.is('pre-loading')) {
44732                        var imgs, nestedSelector, width;
44733                        imgs = this.$element.find('img');
44734                        nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
44735                        width = this.$element.children(nestedSelector).width();
44736
44737                        if (imgs.length && width <= 0) {
44738                            this.preloadAutoWidthImages(imgs);
44739                        }
44740                    }
44741
44742                    this.initializeStage();
44743                    this.initializeItems();
44744
44745                    // register event handlers
44746                    this.registerEventHandlers();
44747
44748                    this.leave('initializing');
44749                    this.trigger('initialized');
44750                };
44751
44752                /**
44753                 * @returns {Boolean} visibility of $element
44754                 *                    if you know the carousel will always be visible you can set `checkVisibility` to `false` to
44755                 *                    prevent the expensive browser layout forced reflow the $element.is(':visible') does
44756                 */
44757                Owl.prototype.isVisible = function() {
44758                    return this.settings.checkVisibility
44759                        ? this.$element.is(':visible')
44760                        : true;
44761                };
44762
44763                /**
44764                 * Setups the current settings.
44765                 * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
44766                 * @todo Support for media queries by using `matchMedia` would be nice.
44767                 * @public
44768                 */
44769                Owl.prototype.setup = function() {
44770                    var viewport = this.viewport(),
44771                        overwrites = this.options.responsive,
44772                        match = -1,
44773                        settings = null;
44774
44775                    if (!overwrites) {
44776                        settings = $.extend({}, this.options);
44777                    } else {
44778                        $.each(overwrites, function(breakpoint) {
44779                            if (breakpoint <= viewport && breakpoint > match) {
44780                                match = Number(breakpoint);
44781                            }
44782                        });
44783
44784                        settings = $.extend({}, this.options, overwrites[match]);
44785                        if (typeof settings.stagePadding === 'function') {
44786                            settings.stagePadding = settings.stagePadding();
44787                        }
44788                        delete settings.responsive;
44789
44790                        // responsive class
44791                        if (settings.responsiveClass) {
44792                            this.$element.attr('class',
44793                                this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match)
44794                            );
44795                        }
44796                    }
44797
44798                    this.trigger('change', { property: { name: 'settings', value: settings } });
44799                    this._breakpoint = match;
44800                    this.settings = settings;
44801                    this.invalidate('settings');
44802                    this.trigger('changed', { property: { name: 'settings', value: this.settings } });
44803                };
44804
44805                /**
44806                 * Updates option logic if necessery.
44807                 * @protected
44808                 */
44809                Owl.prototype.optionsLogic = function() {
44810                    if (this.settings.autoWidth) {
44811                        this.settings.stagePadding = false;
44812                        this.settings.merge = false;
44813                    }
44814                };
44815
44816                /**
44817                 * Prepares an item before add.
44818                 * @todo Rename event parameter `content` to `item`.
44819                 * @protected
44820                 * @returns {jQuery|HTMLElement} - The item container.
44821                 */
44822                Owl.prototype.prepare = function(item) {
44823                    var event = this.trigger('prepare', { content: item });
44824
44825                    if (!event.data) {
44826                        event.data = $('<' + this.settings.itemElement + '/>')
44827                            .addClass(this.options.itemClass).append(item)
44828                    }
44829
44830                    this.trigger('prepared', { content: event.data });
44831
44832                    return event.data;
44833                };
44834
44835                /**
44836                 * Updates the view.
44837                 * @public
44838                 */
44839                Owl.prototype.update = function() {
44840                    var i = 0,
44841                        n = this._pipe.length,
44842                        filter = $.proxy(function(p) { return this[p] }, this._invalidated),
44843                        cache = {};
44844
44845                    while (i < n) {
44846                        if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
44847                            this._pipe[i].run(cache);
44848                        }
44849                        i++;
44850                    }
44851
44852                    this._invalidated = {};
44853
44854                    !this.is('valid') && this.enter('valid');
44855                };
44856
44857                /**
44858                 * Gets the width of the view.
44859                 * @public
44860                 * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
44861                 * @returns {Number} - The width of the view in pixel.
44862                 */
44863                Owl.prototype.width = function(dimension) {
44864                    dimension = dimension || Owl.Width.Default;
44865                    switch (dimension) {
44866                        case Owl.Width.Inner:
44867                        case Owl.Width.Outer:
44868                            return this._width;
44869                        default:
44870                            return this._width - this.settings.stagePadding * 2 + this.settings.margin;
44871                    }
44872                };
44873
44874                /**
44875                 * Refreshes the carousel primarily for adaptive purposes.
44876                 * @public
44877                 */
44878                Owl.prototype.refresh = function() {
44879                    this.enter('refreshing');
44880                    this.trigger('refresh');
44881
44882                    this.setup();
44883
44884                    this.optionsLogic();
44885
44886                    this.$element.addClass(this.options.refreshClass);
44887
44888                    this.update();
44889
44890                    this.$element.removeClass(this.options.refreshClass);
44891
44892                    this.leave('refreshing');
44893                    this.trigger('refreshed');
44894                };
44895
44896                /**
44897                 * Checks window `resize` event.
44898                 * @protected
44899                 */
44900                Owl.prototype.onThrottledResize = function() {
44901                    window.clearTimeout(this.resizeTimer);
44902                    this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
44903                };
44904
44905                /**
44906                 * Checks window `resize` event.
44907                 * @protected
44908                 */
44909                Owl.prototype.onResize = function() {
44910                    if (!this._items.length) {
44911                        return false;
44912                    }
44913
44914                    if (this._width === this.$element.width()) {
44915                        return false;
44916                    }
44917
44918                    if (!this.isVisible()) {
44919                        return false;
44920                    }
44921
44922                    this.enter('resizing');
44923
44924                    if (this.trigger('resize').isDefaultPrevented()) {
44925                        this.leave('resizing');
44926                        return false;
44927                    }
44928
44929                    this.invalidate('width');
44930
44931                    this.refresh();
44932
44933                    this.leave('resizing');
44934                    this.trigger('resized');
44935                };
44936
44937                /**
44938                 * Registers event handlers.
44939                 * @todo Check `msPointerEnabled`
44940                 * @todo #261
44941                 * @protected
44942                 */
44943                Owl.prototype.registerEventHandlers = function() {
44944                    if ($.support.transition) {
44945                        this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
44946                    }
44947
44948                    if (this.settings.responsive !== false) {
44949                        this.on(window, 'resize', this._handlers.onThrottledResize);
44950                    }
44951
44952                    if (this.settings.mouseDrag) {
44953                        this.$element.addClass(this.options.dragClass);
44954                        this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
44955                        this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false });
44956                    }
44957
44958                    if (this.settings.touchDrag){
44959                        this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
44960                        this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
44961                    }
44962                };
44963
44964                /**
44965                 * Handles `touchstart` and `mousedown` events.
44966                 * @todo Horizontal swipe threshold as option
44967                 * @todo #261
44968                 * @protected
44969                 * @param {Event} event - The event arguments.
44970                 */
44971                Owl.prototype.onDragStart = function(event) {
44972                    var stage = null;
44973
44974                    if (event.which === 3) {
44975                        return;
44976                    }
44977
44978                    if ($.support.transform) {
44979                        stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
44980                        stage = {
44981                            x: stage[stage.length === 16 ? 12 : 4],
44982                            y: stage[stage.length === 16 ? 13 : 5]
44983                        };
44984                    } else {
44985                        stage = this.$stage.position();
44986                        stage = {
44987                            x: this.settings.rtl ?
44988                                stage.left + this.$stage.width() - this.width() + this.settings.margin :
44989                                stage.left,
44990                            y: stage.top
44991                        };
44992                    }
44993
44994                    if (this.is('animating')) {
44995                        $.support.transform ? this.animate(stage.x) : this.$stage.stop()
44996                        this.invalidate('position');
44997                    }
44998
44999                    this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');
45000
45001                    this.speed(0);
45002
45003                    this._drag.time = new Date().getTime();
45004                    this._drag.target = $(event.target);
45005                    this._drag.stage.start = stage;
45006                    this._drag.stage.current = stage;
45007                    this._drag.pointer = this.pointer(event);
45008
45009                    $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));
45010
45011                    $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) {
45012                        var delta = this.difference(this._drag.pointer, this.pointer(event));
45013
45014                        $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));
45015
45016                        if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
45017                            return;
45018                        }
45019
45020                        event.preventDefault();
45021
45022                        this.enter('dragging');
45023                        this.trigger('drag');
45024                    }, this));
45025                };
45026
45027                /**
45028                 * Handles the `touchmove` and `mousemove` events.
45029                 * @todo #261
45030                 * @protected
45031                 * @param {Event} event - The event arguments.
45032                 */
45033                Owl.prototype.onDragMove = function(event) {
45034                    var minimum = null,
45035                        maximum = null,
45036                        pull = null,
45037                        delta = this.difference(this._drag.pointer, this.pointer(event)),
45038                        stage = this.difference(this._drag.stage.start, delta);
45039
45040                    if (!this.is('dragging')) {
45041                        return;
45042                    }
45043
45044                    event.preventDefault();
45045
45046                    if (this.settings.loop) {
45047                        minimum = this.coordinates(this.minimum());
45048                        maximum = this.coordinates(this.maximum() + 1) - minimum;
45049                        stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum;
45050                    } else {
45051                        minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
45052                        maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
45053                        pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
45054                        stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
45055                    }
45056
45057                    this._drag.stage.current = stage;
45058
45059                    this.animate(stage.x);
45060                };
45061
45062                /**
45063                 * Handles the `touchend` and `mouseup` events.
45064                 * @todo #261
45065                 * @todo Threshold for click event
45066                 * @protected
45067                 * @param {Event} event - The event arguments.
45068                 */
45069                Owl.prototype.onDragEnd = function(event) {
45070                    var delta = this.difference(this._drag.pointer, this.pointer(event)),
45071                        stage = this._drag.stage.current,
45072                        direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';
45073
45074                    $(document).off('.owl.core');
45075
45076                    this.$element.removeClass(this.options.grabClass);
45077
45078                    if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
45079                        this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
45080                        this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
45081                        this.invalidate('position');
45082                        this.update();
45083
45084                        this._drag.direction = direction;
45085
45086                        if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
45087                            this._drag.target.one('click.owl.core', function() { return false; });
45088                        }
45089                    }
45090
45091                    if (!this.is('dragging')) {
45092                        return;
45093                    }
45094
45095                    this.leave('dragging');
45096                    this.trigger('dragged');
45097                };
45098
45099                /**
45100                 * Gets absolute position of the closest item for a coordinate.
45101                 * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
45102                 * @protected
45103                 * @param {Number} coordinate - The coordinate in pixel.
45104                 * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
45105                 * @return {Number} - The absolute position of the closest item.
45106                 */
45107                Owl.prototype.closest = function(coordinate, direction) {
45108                    var position = -1,
45109                        pull = 30,
45110                        width = this.width(),
45111                        coordinates = this.coordinates();
45112
45113                    if (!this.settings.freeDrag) {
45114                        // check closest item
45115                        $.each(coordinates, $.proxy(function(index, value) {
45116                            // on a left pull, check on current index
45117                            if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
45118                                position = index;
45119                                // on a right pull, check on previous index
45120                                // to do so, subtract width from value and set position = index + 1
45121                            } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
45122                                position = index + 1;
45123                            } else if (this.op(coordinate, '<', value)
45124                                && this.op(coordinate, '>', coordinates[index + 1] !== undefined ? coordinates[index + 1] : value - width)) {
45125                                position = direction === 'left' ? index + 1 : index;
45126                            }
45127                            return position === -1;
45128                        }, this));
45129                    }
45130
45131                    if (!this.settings.loop) {
45132                        // non loop boundries
45133                        if (this.op(coordinate, '>', coordinates[this.minimum()])) {
45134                            position = coordinate = this.minimum();
45135                        } else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
45136                            position = coordinate = this.maximum();
45137                        }
45138                    }
45139
45140                    return position;
45141                };
45142
45143                /**
45144                 * Animates the stage.
45145                 * @todo #270
45146                 * @public
45147                 * @param {Number} coordinate - The coordinate in pixels.
45148                 */
45149                Owl.prototype.animate = function(coordinate) {
45150                    var animate = this.speed() > 0;
45151
45152                    this.is('animating') && this.onTransitionEnd();
45153
45154                    if (animate) {
45155                        this.enter('animating');
45156                        this.trigger('translate');
45157                    }
45158
45159                    if ($.support.transform3d && $.support.transition) {
45160                        this.$stage.css({
45161                            transform: 'translate3d(' + coordinate + 'px,0px,0px)',
45162                            transition: (this.speed() / 1000) + 's' + (
45163                                this.settings.slideTransition ? ' ' + this.settings.slideTransition : ''
45164                            )
45165                        });
45166                    } else if (animate) {
45167                        this.$stage.animate({
45168                            left: coordinate + 'px'
45169                        }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
45170                    } else {
45171                        this.$stage.css({
45172                            left: coordinate + 'px'
45173                        });
45174                    }
45175                };
45176
45177                /**
45178                 * Checks whether the carousel is in a specific state or not.
45179                 * @param {String} state - The state to check.
45180                 * @returns {Boolean} - The flag which indicates if the carousel is busy.
45181                 */
45182                Owl.prototype.is = function(state) {
45183                    return this._states.current[state] && this._states.current[state] > 0;
45184                };
45185
45186                /**
45187                 * Sets the absolute position of the current item.
45188                 * @public
45189                 * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
45190                 * @returns {Number} - The absolute position of the current item.
45191                 */
45192                Owl.prototype.current = function(position) {
45193                    if (position === undefined) {
45194                        return this._current;
45195                    }
45196
45197                    if (this._items.length === 0) {
45198                        return undefined;
45199                    }
45200
45201                    position = this.normalize(position);
45202
45203                    if (this._current !== position) {
45204                        var event = this.trigger('change', { property: { name: 'position', value: position } });
45205
45206                        if (event.data !== undefined) {
45207                            position = this.normalize(event.data);
45208                        }
45209
45210                        this._current = position;
45211
45212                        this.invalidate('position');
45213
45214                        this.trigger('changed', { property: { name: 'position', value: this._current } });
45215                    }
45216
45217                    return this._current;
45218                };
45219
45220                /**
45221                 * Invalidates the given part of the update routine.
45222                 * @param {String} [part] - The part to invalidate.
45223                 * @returns {Array.<String>} - The invalidated parts.
45224                 */
45225                Owl.prototype.invalidate = function(part) {
45226                    if ($.type(part) === 'string') {
45227                        this._invalidated[part] = true;
45228                        this.is('valid') && this.leave('valid');
45229                    }
45230                    return $.map(this._invalidated, function(v, i) { return i });
45231                };
45232
45233                /**
45234                 * Resets the absolute position of the current item.
45235                 * @public
45236                 * @param {Number} position - The absolute position of the new item.
45237                 */
45238                Owl.prototype.reset = function(position) {
45239                    position = this.normalize(position);
45240
45241                    if (position === undefined) {
45242                        return;
45243                    }
45244
45245                    this._speed = 0;
45246                    this._current = position;
45247
45248                    this.suppress([ 'translate', 'translated' ]);
45249
45250                    this.animate(this.coordinates(position));
45251
45252                    this.release([ 'translate', 'translated' ]);
45253                };
45254
45255                /**
45256                 * Normalizes an absolute or a relative position of an item.
45257                 * @public
45258                 * @param {Number} position - The absolute or relative position to normalize.
45259                 * @param {Boolean} [relative=false] - Whether the given position is relative or not.
45260                 * @returns {Number} - The normalized position.
45261                 */
45262                Owl.prototype.normalize = function(position, relative) {
45263                    var n = this._items.length,
45264                        m = relative ? 0 : this._clones.length;
45265
45266                    if (!this.isNumeric(position) || n < 1) {
45267                        position = undefined;
45268                    } else if (position < 0 || position >= n + m) {
45269                        position = ((position - m / 2) % n + n) % n + m / 2;
45270                    }
45271
45272                    return position;
45273                };
45274
45275                /**
45276                 * Converts an absolute position of an item into a relative one.
45277                 * @public
45278                 * @param {Number} position - The absolute position to convert.
45279                 * @returns {Number} - The converted position.
45280                 */
45281                Owl.prototype.relative = function(position) {
45282                    position -= this._clones.length / 2;
45283                    return this.normalize(position, true);
45284                };
45285
45286                /**
45287                 * Gets the maximum position for the current item.
45288                 * @public
45289                 * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
45290                 * @returns {Number}
45291                 */
45292                Owl.prototype.maximum = function(relative) {
45293                    var settings = this.settings,
45294                        maximum = this._coordinates.length,
45295                        iterator,
45296                        reciprocalItemsWidth,
45297                        elementWidth;
45298
45299                    if (settings.loop) {
45300                        maximum = this._clones.length / 2 + this._items.length - 1;
45301                    } else if (settings.autoWidth || settings.merge) {
45302                        iterator = this._items.length;
45303                        if (iterator) {
45304                            reciprocalItemsWidth = this._items[--iterator].width();
45305                            elementWidth = this.$element.width();
45306                            while (iterator--) {
45307                                reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin;
45308                                if (reciprocalItemsWidth > elementWidth) {
45309                                    break;
45310                                }
45311                            }
45312                        }
45313                        maximum = iterator + 1;
45314                    } else if (settings.center) {
45315                        maximum = this._items.length - 1;
45316                    } else {
45317                        maximum = this._items.length - settings.items;
45318                    }
45319
45320                    if (relative) {
45321                        maximum -= this._clones.length / 2;
45322                    }
45323
45324                    return Math.max(maximum, 0);
45325                };
45326
45327                /**
45328                 * Gets the minimum position for the current item.
45329                 * @public
45330                 * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
45331                 * @returns {Number}
45332                 */
45333                Owl.prototype.minimum = function(relative) {
45334                    return relative ? 0 : this._clones.length / 2;
45335                };
45336
45337                /**
45338                 * Gets an item at the specified relative position.
45339                 * @public
45340                 * @param {Number} [position] - The relative position of the item.
45341                 * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
45342                 */
45343                Owl.prototype.items = function(position) {
45344                    if (position === undefined) {
45345                        return this._items.slice();
45346                    }
45347
45348                    position = this.normalize(position, true);
45349                    return this._items[position];
45350                };
45351
45352                /**
45353                 * Gets an item at the specified relative position.
45354                 * @public
45355                 * @param {Number} [position] - The relative position of the item.
45356                 * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
45357                 */
45358                Owl.prototype.mergers = function(position) {
45359                    if (position === undefined) {
45360                        return this._mergers.slice();
45361                    }
45362
45363                    position = this.normalize(position, true);
45364                    return this._mergers[position];
45365                };
45366
45367                /**
45368                 * Gets the absolute positions of clones for an item.
45369                 * @public
45370                 * @param {Number} [position] - The relative position of the item.
45371                 * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
45372                 */
45373                Owl.prototype.clones = function(position) {
45374                    var odd = this._clones.length / 2,
45375                        even = odd + this._items.length,
45376                        map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 };
45377
45378                    if (position === undefined) {
45379                        return $.map(this._clones, function(v, i) { return map(i) });
45380                    }
45381
45382                    return $.map(this._clones, function(v, i) { return v === position ? map(i) : null });
45383                };
45384
45385                /**
45386                 * Sets the current animation speed.
45387                 * @public
45388                 * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
45389                 * @returns {Number} - The current animation speed in milliseconds.
45390                 */
45391                Owl.prototype.speed = function(speed) {
45392                    if (speed !== undefined) {
45393                        this._speed = speed;
45394                    }
45395
45396                    return this._speed;
45397                };
45398
45399                /**
45400                 * Gets the coordinate of an item.
45401                 * @todo The name of this method is missleanding.
45402                 * @public
45403                 * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
45404                 * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
45405                 */
45406                Owl.prototype.coordinates = function(position) {
45407                    var multiplier = 1,
45408                        newPosition = position - 1,
45409                        coordinate;
45410
45411                    if (position === undefined) {
45412                        return $.map(this._coordinates, $.proxy(function(coordinate, index) {
45413                            return this.coordinates(index);
45414                        }, this));
45415                    }
45416
45417                    if (this.settings.center) {
45418                        if (this.settings.rtl) {
45419                            multiplier = -1;
45420                            newPosition = position + 1;
45421                        }
45422
45423                        coordinate = this._coordinates[position];
45424                        coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
45425                    } else {
45426                        coordinate = this._coordinates[newPosition] || 0;
45427                    }
45428
45429                    coordinate = Math.ceil(coordinate);
45430
45431                    return coordinate;
45432                };
45433
45434                /**
45435                 * Calculates the speed for a translation.
45436                 * @protected
45437                 * @param {Number} from - The absolute position of the start item.
45438                 * @param {Number} to - The absolute position of the target item.
45439                 * @param {Number} [factor=undefined] - The time factor in milliseconds.
45440                 * @returns {Number} - The time in milliseconds for the translation.
45441                 */
45442                Owl.prototype.duration = function(from, to, factor) {
45443                    if (factor === 0) {
45444                        return 0;
45445                    }
45446
45447                    return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed));
45448                };
45449
45450                /**
45451                 * Slides to the specified item.
45452                 * @public
45453                 * @param {Number} position - The position of the item.
45454                 * @param {Number} [speed] - The time in milliseconds for the transition.
45455                 */
45456                Owl.prototype.to = function(position, speed) {
45457                    var current = this.current(),
45458                        revert = null,
45459                        distance = position - this.relative(current),
45460                        direction = (distance > 0) - (distance < 0),
45461                        items = this._items.length,
45462                        minimum = this.minimum(),
45463                        maximum = this.maximum();
45464
45465                    if (this.settings.loop) {
45466                        if (!this.settings.rewind && Math.abs(distance) > items / 2) {
45467                            distance += direction * -1 * items;
45468                        }
45469
45470                        position = current + distance;
45471                        revert = ((position - minimum) % items + items) % items + minimum;
45472
45473                        if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
45474                            current = revert - distance;
45475                            position = revert;
45476                            this.reset(current);
45477                        }
45478                    } else if (this.settings.rewind) {
45479                        maximum += 1;
45480                        position = (position % maximum + maximum) % maximum;
45481                    } else {
45482                        position = Math.max(minimum, Math.min(maximum, position));
45483                    }
45484
45485                    this.speed(this.duration(current, position, speed));
45486                    this.current(position);
45487
45488                    if (this.isVisible()) {
45489                        this.update();
45490                    }
45491                };
45492
45493                /**
45494                 * Slides to the next item.
45495                 * @public
45496                 * @param {Number} [speed] - The time in milliseconds for the transition.
45497                 */
45498                Owl.prototype.next = function(speed) {
45499                    speed = speed || false;
45500                    this.to(this.relative(this.current()) + 1, speed);
45501                };
45502
45503                /**
45504                 * Slides to the previous item.
45505                 * @public
45506                 * @param {Number} [speed] - The time in milliseconds for the transition.
45507                 */
45508                Owl.prototype.prev = function(speed) {
45509                    speed = speed || false;
45510                    this.to(this.relative(this.current()) - 1, speed);
45511                };
45512
45513                /**
45514                 * Handles the end of an animation.
45515                 * @protected
45516                 * @param {Event} event - The event arguments.
45517                 */
45518                Owl.prototype.onTransitionEnd = function(event) {
45519
45520                    // if css2 animation then event object is undefined
45521                    if (event !== undefined) {
45522                        event.stopPropagation();
45523
45524                        // Catch only owl-stage transitionEnd event
45525                        if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
45526                            return false;
45527                        }
45528                    }
45529
45530                    this.leave('animating');
45531                    this.trigger('translated');
45532                };
45533
45534                /**
45535                 * Gets viewport width.
45536                 * @protected
45537                 * @return {Number} - The width in pixel.
45538                 */
45539                Owl.prototype.viewport = function() {
45540                    var width;
45541                    if (this.options.responsiveBaseElement !== window) {
45542                        width = $(this.options.responsiveBaseElement).width();
45543                    } else if (window.innerWidth) {
45544                        width = window.innerWidth;
45545                    } else if (document.documentElement && document.documentElement.clientWidth) {
45546                        width = document.documentElement.clientWidth;
45547                    } else {
45548                        console.warn('Can not detect viewport width.');
45549                    }
45550                    return width;
45551                };
45552
45553                /**
45554                 * Replaces the current content.
45555                 * @public
45556                 * @param {HTMLElement|jQuery|String} content - The new content.
45557                 */
45558                Owl.prototype.replace = function(content) {
45559                    this.$stage.empty();
45560                    this._items = [];
45561
45562                    if (content) {
45563                        content = (content instanceof jQuery) ? content : $(content);
45564                    }
45565
45566                    if (this.settings.nestedItemSelector) {
45567                        content = content.find('.' + this.settings.nestedItemSelector);
45568                    }
45569
45570                    content.filter(function() {
45571                        return this.nodeType === 1;
45572                    }).each($.proxy(function(index, item) {
45573                        item = this.prepare(item);
45574                        this.$stage.append(item);
45575                        this._items.push(item);
45576                        this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
45577                    }, this));
45578
45579                    this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);
45580
45581                    this.invalidate('items');
45582                };
45583
45584                /**
45585                 * Adds an item.
45586                 * @todo Use `item` instead of `content` for the event arguments.
45587                 * @public
45588                 * @param {HTMLElement|jQuery|String} content - The item content to add.
45589                 * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
45590                 */
45591                Owl.prototype.add = function(content, position) {
45592                    var current = this.relative(this._current);
45593
45594                    position = position === undefined ? this._items.length : this.normalize(position, true);
45595                    content = content instanceof jQuery ? content : $(content);
45596
45597                    this.trigger('add', { content: content, position: position });
45598
45599                    content = this.prepare(content);
45600
45601                    if (this._items.length === 0 || position === this._items.length) {
45602                        this._items.length === 0 && this.$stage.append(content);
45603                        this._items.length !== 0 && this._items[position - 1].after(content);
45604                        this._items.push(content);
45605                        this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
45606                    } else {
45607                        this._items[position].before(content);
45608                        this._items.splice(position, 0, content);
45609                        this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
45610                    }
45611
45612                    this._items[current] && this.reset(this._items[current].index());
45613
45614                    this.invalidate('items');
45615
45616                    this.trigger('added', { content: content, position: position });
45617                };
45618
45619                /**
45620                 * Removes an item by its position.
45621                 * @todo Use `item` instead of `content` for the event arguments.
45622                 * @public
45623                 * @param {Number} position - The relative position of the item to remove.
45624                 */
45625                Owl.prototype.remove = function(position) {
45626                    position = this.normalize(position, true);
45627
45628                    if (position === undefined) {
45629                        return;
45630                    }
45631
45632                    this.trigger('remove', { content: this._items[position], position: position });
45633
45634                    this._items[position].remove();
45635                    this._items.splice(position, 1);
45636                    this._mergers.splice(position, 1);
45637
45638                    this.invalidate('items');
45639
45640                    this.trigger('removed', { content: null, position: position });
45641                };
45642
45643                /**
45644                 * Preloads images with auto width.
45645                 * @todo Replace by a more generic approach
45646                 * @protected
45647                 */
45648                Owl.prototype.preloadAutoWidthImages = function(images) {
45649                    images.each($.proxy(function(i, element) {
45650                        this.enter('pre-loading');
45651                        element = $(element);
45652                        $(new Image()).one('load', $.proxy(function(e) {
45653                            element.attr('src', e.target.src);
45654                            element.css('opacity', 1);
45655                            this.leave('pre-loading');
45656                            !this.is('pre-loading') && !this.is('initializing') && this.refresh();
45657                        }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
45658                    }, this));
45659                };
45660
45661                /**
45662                 * Destroys the carousel.
45663                 * @public
45664                 */
45665                Owl.prototype.destroy = function() {
45666
45667                    this.$element.off('.owl.core');
45668                    this.$stage.off('.owl.core');
45669                    $(document).off('.owl.core');
45670
45671                    if (this.settings.responsive !== false) {
45672                        window.clearTimeout(this.resizeTimer);
45673                        this.off(window, 'resize', this._handlers.onThrottledResize);
45674                    }
45675
45676                    for (var i in this._plugins) {
45677                        this._plugins[i].destroy();
45678                    }
45679
45680                    this.$stage.children('.cloned').remove();
45681
45682                    this.$stage.unwrap();
45683                    this.$stage.children().contents().unwrap();
45684                    this.$stage.children().unwrap();
45685                    this.$stage.remove();
45686                    this.$element
45687                        .removeClass(this.options.refreshClass)
45688                        .removeClass(this.options.loadingClass)
45689                        .removeClass(this.options.loadedClass)
45690                        .removeClass(this.options.rtlClass)
45691                        .removeClass(this.options.dragClass)
45692                        .removeClass(this.options.grabClass)
45693                        .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), ''))
45694                        .removeData('owl.carousel');
45695                };
45696
45697                /**
45698                 * Operators to calculate right-to-left and left-to-right.
45699                 * @protected
45700                 * @param {Number} [a] - The left side operand.
45701                 * @param {String} [o] - The operator.
45702                 * @param {Number} [b] - The right side operand.
45703                 */
45704                Owl.prototype.op = function(a, o, b) {
45705                    var rtl = this.settings.rtl;
45706                    switch (o) {
45707                        case '<':
45708                            return rtl ? a > b : a < b;
45709                        case '>':
45710                            return rtl ? a < b : a > b;
45711                        case '>=':
45712                            return rtl ? a <= b : a >= b;
45713                        case '<=':
45714                            return rtl ? a >= b : a <= b;
45715                        default:
45716                            break;
45717                    }
45718                };
45719
45720                /**
45721                 * Attaches to an internal event.
45722                 * @protected
45723                 * @param {HTMLElement} element - The event source.
45724                 * @param {String} event - The event name.
45725                 * @param {Function} listener - The event handler to attach.
45726                 * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
45727                 */
45728                Owl.prototype.on = function(element, event, listener, capture) {
45729                    if (element.addEventListener) {
45730                        element.addEventListener(event, listener, capture);
45731                    } else if (element.attachEvent) {
45732                        element.attachEvent('on' + event, listener);
45733                    }
45734                };
45735
45736                /**
45737                 * Detaches from an internal event.
45738                 * @protected
45739                 * @param {HTMLElement} element - The event source.
45740                 * @param {String} event - The event name.
45741                 * @param {Function} listener - The attached event handler to detach.
45742                 * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
45743                 */
45744                Owl.prototype.off = function(element, event, listener, capture) {
45745                    if (element.removeEventListener) {
45746                        element.removeEventListener(event, listener, capture);
45747                    } else if (element.detachEvent) {
45748                        element.detachEvent('on' + event, listener);
45749                    }
45750                };
45751
45752                /**
45753                 * Triggers a public event.
45754                 * @todo Remove `status`, `relatedTarget` should be used instead.
45755                 * @protected
45756                 * @param {String} name - The event name.
45757                 * @param {*} [data=null] - The event data.
45758                 * @param {String} [namespace=carousel] - The event namespace.
45759                 * @param {String} [state] - The state which is associated with the event.
45760                 * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
45761                 * @returns {Event} - The event arguments.
45762                 */
45763                Owl.prototype.trigger = function(name, data, namespace, state, enter) {
45764                    var status = {
45765                        item: { count: this._items.length, index: this.current() }
45766                    }, handler = $.camelCase(
45767                        $.grep([ 'on', name, namespace ], function(v) { return v })
45768                            .join('-').toLowerCase()
45769                    ), event = $.Event(
45770                        [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(),
45771                        $.extend({ relatedTarget: this }, status, data)
45772                    );
45773
45774                    if (!this._supress[name]) {
45775                        $.each(this._plugins, function(name, plugin) {
45776                            if (plugin.onTrigger) {
45777                                plugin.onTrigger(event);
45778                            }
45779                        });
45780
45781                        this.register({ type: Owl.Type.Event, name: name });
45782                        this.$element.trigger(event);
45783
45784                        if (this.settings && typeof this.settings[handler] === 'function') {
45785                            this.settings[handler].call(this, event);
45786                        }
45787                    }
45788
45789                    return event;
45790                };
45791
45792                /**
45793                 * Enters a state.
45794                 * @param name - The state name.
45795                 */
45796                Owl.prototype.enter = function(name) {
45797                    $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
45798                        if (this._states.current[name] === undefined) {
45799                            this._states.current[name] = 0;
45800                        }
45801
45802                        this._states.current[name]++;
45803                    }, this));
45804                };
45805
45806                /**
45807                 * Leaves a state.
45808                 * @param name - The state name.
45809                 */
45810                Owl.prototype.leave = function(name) {
45811                    $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
45812                        this._states.current[name]--;
45813                    }, this));
45814                };
45815
45816                /**
45817                 * Registers an event or state.
45818                 * @public
45819                 * @param {Object} object - The event or state to register.
45820                 */
45821                Owl.prototype.register = function(object) {
45822                    if (object.type === Owl.Type.Event) {
45823                        if (!$.event.special[object.name]) {
45824                            $.event.special[object.name] = {};
45825                        }
45826
45827                        if (!$.event.special[object.name].owl) {
45828                            var _default = $.event.special[object.name]._default;
45829                            $.event.special[object.name]._default = function(e) {
45830                                if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
45831                                    return _default.apply(this, arguments);
45832                                }
45833                                return e.namespace && e.namespace.indexOf('owl') > -1;
45834                            };
45835                            $.event.special[object.name].owl = true;
45836                        }
45837                    } else if (object.type === Owl.Type.State) {
45838                        if (!this._states.tags[object.name]) {
45839                            this._states.tags[object.name] = object.tags;
45840                        } else {
45841                            this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
45842                        }
45843
45844                        this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) {
45845                            return $.inArray(tag, this._states.tags[object.name]) === i;
45846                        }, this));
45847                    }
45848                };
45849
45850                /**
45851                 * Suppresses events.
45852                 * @protected
45853                 * @param {Array.<String>} events - The events to suppress.
45854                 */
45855                Owl.prototype.suppress = function(events) {
45856                    $.each(events, $.proxy(function(index, event) {
45857                        this._supress[event] = true;
45858                    }, this));
45859                };
45860
45861                /**
45862                 * Releases suppressed events.
45863                 * @protected
45864                 * @param {Array.<String>} events - The events to release.
45865                 */
45866                Owl.prototype.release = function(events) {
45867                    $.each(events, $.proxy(function(index, event) {
45868                        delete this._supress[event];
45869                    }, this));
45870                };
45871
45872                /**
45873                 * Gets unified pointer coordinates from event.
45874                 * @todo #261
45875                 * @protected
45876                 * @param {Event} - The `mousedown` or `touchstart` event.
45877                 * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
45878                 */
45879                Owl.prototype.pointer = function(event) {
45880                    var result = { x: null, y: null };
45881
45882                    event = event.originalEvent || event || window.event;
45883
45884                    event = event.touches && event.touches.length ?
45885                        event.touches[0] : event.changedTouches && event.changedTouches.length ?
45886                            event.changedTouches[0] : event;
45887
45888                    if (event.pageX) {
45889                        result.x = event.pageX;
45890                        result.y = event.pageY;
45891                    } else {
45892                        result.x = event.clientX;
45893                        result.y = event.clientY;
45894                    }
45895
45896                    return result;
45897                };
45898
45899                /**
45900                 * Determines if the input is a Number or something that can be coerced to a Number
45901                 * @protected
45902                 * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
45903                 * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
45904                 */
45905                Owl.prototype.isNumeric = function(number) {
45906                    return !isNaN(parseFloat(number));
45907                };
45908
45909                /**
45910                 * Gets the difference of two vectors.
45911                 * @todo #261
45912                 * @protected
45913                 * @param {Object} - The first vector.
45914                 * @param {Object} - The second vector.
45915                 * @returns {Object} - The difference.
45916                 */
45917                Owl.prototype.difference = function(first, second) {
45918                    return {
45919                        x: first.x - second.x,
45920                        y: first.y - second.y
45921                    };
45922                };
45923
45924                /**
45925                 * The jQuery Plugin for the Owl Carousel
45926                 * @todo Navigation plugin `next` and `prev`
45927                 * @public
45928                 */
45929                $.fn.owlCarousel = function(option) {
45930                    var args = Array.prototype.slice.call(arguments, 1);
45931
45932                    return this.each(function() {
45933                        var $this = $(this),
45934                            data = $this.data('owl.carousel');
45935
45936                        if (!data) {
45937                            data = new Owl(this, typeof option == 'object' && option);
45938                            $this.data('owl.carousel', data);
45939
45940                            $.each([
45941                                'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'
45942                            ], function(i, event) {
45943                                data.register({ type: Owl.Type.Event, name: event });
45944                                data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) {
45945                                    if (e.namespace && e.relatedTarget !== this) {
45946                                        this.suppress([ event ]);
45947                                        data[event].apply(this, [].slice.call(arguments, 1));
45948                                        this.release([ event ]);
45949                                    }
45950                                }, data));
45951                            });
45952                        }
45953
45954                        if (typeof option == 'string' && option.charAt(0) !== '_') {
45955                            data[option].apply(data, args);
45956                        }
45957                    });
45958                };
45959
45960                /**
45961                 * The constructor for the jQuery Plugin
45962                 * @public
45963                 */
45964                $.fn.owlCarousel.Constructor = Owl;
45965
45966            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
45967
45968            /**
45969             * AutoRefresh Plugin
45970             * @version 2.3.4
45971             * @author Artus Kolanowski
45972             * @author David Deutsch
45973             * @license The MIT License (MIT)
45974             */
45975            ;(function($, window, document, undefined) {
45976
45977                /**
45978                 * Creates the auto refresh plugin.
45979                 * @class The Auto Refresh Plugin
45980                 * @param {Owl} carousel - The Owl Carousel
45981                 */
45982                var AutoRefresh = function(carousel) {
45983                    /**
45984                     * Reference to the core.
45985                     * @protected
45986                     * @type {Owl}
45987                     */
45988                    this._core = carousel;
45989
45990                    /**
45991                     * Refresh interval.
45992                     * @protected
45993                     * @type {number}
45994                     */
45995                    this._interval = null;
45996
45997                    /**
45998                     * Whether the element is currently visible or not.
45999                     * @protected
46000                     * @type {Boolean}
46001                     */
46002                    this._visible = null;
46003
46004                    /**
46005                     * All event handlers.
46006                     * @protected
46007                     * @type {Object}
46008                     */
46009                    this._handlers = {
46010                        'initialized.owl.carousel': $.proxy(function(e) {
46011                            if (e.namespace && this._core.settings.autoRefresh) {
46012                                this.watch();
46013                            }
46014                        }, this)
46015                    };
46016
46017                    // set default options
46018                    this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);
46019
46020                    // register event handlers
46021                    this._core.$element.on(this._handlers);
46022                };
46023
46024                /**
46025                 * Default options.
46026                 * @public
46027                 */
46028                AutoRefresh.Defaults = {
46029                    autoRefresh: true,
46030                    autoRefreshInterval: 500
46031                };
46032
46033                /**
46034                 * Watches the element.
46035                 */
46036                AutoRefresh.prototype.watch = function() {
46037                    if (this._interval) {
46038                        return;
46039                    }
46040
46041                    this._visible = this._core.isVisible();
46042                    this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
46043                };
46044
46045                /**
46046                 * Refreshes the element.
46047                 */
46048                AutoRefresh.prototype.refresh = function() {
46049                    if (this._core.isVisible() === this._visible) {
46050                        return;
46051                    }
46052
46053                    this._visible = !this._visible;
46054
46055                    this._core.$element.toggleClass('owl-hidden', !this._visible);
46056
46057                    this._visible && (this._core.invalidate('width') && this._core.refresh());
46058                };
46059
46060                /**
46061                 * Destroys the plugin.
46062                 */
46063                AutoRefresh.prototype.destroy = function() {
46064                    var handler, property;
46065
46066                    window.clearInterval(this._interval);
46067
46068                    for (handler in this._handlers) {
46069                        this._core.$element.off(handler, this._handlers[handler]);
46070                    }
46071                    for (property in Object.getOwnPropertyNames(this)) {
46072                        typeof this[property] != 'function' && (this[property] = null);
46073                    }
46074                };
46075
46076                $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
46077
46078            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
46079
46080            /**
46081             * Lazy Plugin
46082             * @version 2.3.4
46083             * @author Bartosz Wojciechowski
46084             * @author David Deutsch
46085             * @license The MIT License (MIT)
46086             */
46087            ;(function($, window, document, undefined) {
46088
46089                /**
46090                 * Creates the lazy plugin.
46091                 * @class The Lazy Plugin
46092                 * @param {Owl} carousel - The Owl Carousel
46093                 */
46094                var Lazy = function(carousel) {
46095
46096                    /**
46097                     * Reference to the core.
46098                     * @protected
46099                     * @type {Owl}
46100                     */
46101                    this._core = carousel;
46102
46103                    /**
46104                     * Already loaded items.
46105                     * @protected
46106                     * @type {Array.<jQuery>}
46107                     */
46108                    this._loaded = [];
46109
46110                    /**
46111                     * Event handlers.
46112                     * @protected
46113                     * @type {Object}
46114                     */
46115                    this._handlers = {
46116                        'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) {
46117                            if (!e.namespace) {
46118                                return;
46119                            }
46120
46121                            if (!this._core.settings || !this._core.settings.lazyLoad) {
46122                                return;
46123                            }
46124
46125                            if ((e.property && e.property.name == 'position') || e.type == 'initialized') {
46126                                var settings = this._core.settings,
46127                                    n = (settings.center && Math.ceil(settings.items / 2) || settings.items),
46128                                    i = ((settings.center && n * -1) || 0),
46129                                    position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
46130                                    clones = this._core.clones().length,
46131                                    load = $.proxy(function(i, v) { this.load(v) }, this);
46132                                //TODO: Need documentation for this new option
46133                                if (settings.lazyLoadEager > 0) {
46134                                    n += settings.lazyLoadEager;
46135                                    // If the carousel is looping also preload images that are to the "left"
46136                                    if (settings.loop) {
46137                                        position -= settings.lazyLoadEager;
46138                                        n++;
46139                                    }
46140                                }
46141
46142                                while (i++ < n) {
46143                                    this.load(clones / 2 + this._core.relative(position));
46144                                    clones && $.each(this._core.clones(this._core.relative(position)), load);
46145                                    position++;
46146                                }
46147                            }
46148                        }, this)
46149                    };
46150
46151                    // set the default options
46152                    this._core.options = $.extend({}, Lazy.Defaults, this._core.options);
46153
46154                    // register event handler
46155                    this._core.$element.on(this._handlers);
46156                };
46157
46158                /**
46159                 * Default options.
46160                 * @public
46161                 */
46162                Lazy.Defaults = {
46163                    lazyLoad: false,
46164                    lazyLoadEager: 0
46165                };
46166
46167                /**
46168                 * Loads all resources of an item at the specified position.
46169                 * @param {Number} position - The absolute position of the item.
46170                 * @protected
46171                 */
46172                Lazy.prototype.load = function(position) {
46173                    var $item = this._core.$stage.children().eq(position),
46174                        $elements = $item && $item.find('.owl-lazy');
46175
46176                    if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
46177                        return;
46178                    }
46179
46180                    $elements.each($.proxy(function(index, element) {
46181                        var $element = $(element), image,
46182                            url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src') || $element.attr('data-srcset');
46183
46184                        this._core.trigger('load', { element: $element, url: url }, 'lazy');
46185
46186                        if ($element.is('img')) {
46187                            $element.one('load.owl.lazy', $.proxy(function() {
46188                                $element.css('opacity', 1);
46189                                this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
46190                            }, this)).attr('src', url);
46191                        } else if ($element.is('source')) {
46192                            $element.one('load.owl.lazy', $.proxy(function() {
46193                                this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
46194                            }, this)).attr('srcset', url);
46195                        } else {
46196                            image = new Image();
46197                            image.onload = $.proxy(function() {
46198                                $element.css({
46199                                    'background-image': 'url("' + url + '")',
46200                                    'opacity': '1'
46201                                });
46202                                this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
46203                            }, this);
46204                            image.src = url;
46205                        }
46206                    }, this));
46207
46208                    this._loaded.push($item.get(0));
46209                };
46210
46211                /**
46212                 * Destroys the plugin.
46213                 * @public
46214                 */
46215                Lazy.prototype.destroy = function() {
46216                    var handler, property;
46217
46218                    for (handler in this.handlers) {
46219                        this._core.$element.off(handler, this.handlers[handler]);
46220                    }
46221                    for (property in Object.getOwnPropertyNames(this)) {
46222                        typeof this[property] != 'function' && (this[property] = null);
46223                    }
46224                };
46225
46226                $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
46227
46228            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
46229
46230            /**
46231             * AutoHeight Plugin
46232             * @version 2.3.4
46233             * @author Bartosz Wojciechowski
46234             * @author David Deutsch
46235             * @license The MIT License (MIT)
46236             */
46237            ;(function($, window, document, undefined) {
46238
46239                /**
46240                 * Creates the auto height plugin.
46241                 * @class The Auto Height Plugin
46242                 * @param {Owl} carousel - The Owl Carousel
46243                 */
46244                var AutoHeight = function(carousel) {
46245                    /**
46246                     * Reference to the core.
46247                     * @protected
46248                     * @type {Owl}
46249                     */
46250                    this._core = carousel;
46251
46252                    this._previousHeight = null;
46253
46254                    /**
46255                     * All event handlers.
46256                     * @protected
46257                     * @type {Object}
46258                     */
46259                    this._handlers = {
46260                        'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) {
46261                            if (e.namespace && this._core.settings.autoHeight) {
46262                                this.update();
46263                            }
46264                        }, this),
46265                        'changed.owl.carousel': $.proxy(function(e) {
46266                            if (e.namespace && this._core.settings.autoHeight && e.property.name === 'position'){
46267                                this.update();
46268                            }
46269                        }, this),
46270                        'loaded.owl.lazy': $.proxy(function(e) {
46271                            if (e.namespace && this._core.settings.autoHeight
46272                                && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
46273                                this.update();
46274                            }
46275                        }, this)
46276                    };
46277
46278                    // set default options
46279                    this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);
46280
46281                    // register event handlers
46282                    this._core.$element.on(this._handlers);
46283                    this._intervalId = null;
46284                    var refThis = this;
46285
46286                    // These changes have been taken from a PR by gavrochelegnou proposed in #1575
46287                    // and have been made compatible with the latest jQuery version
46288                    $(window).on('load', function() {
46289                        if (refThis._core.settings.autoHeight) {
46290                            refThis.update();
46291                        }
46292                    });
46293
46294                    // Autoresize the height of the carousel when window is resized
46295                    // When carousel has images, the height is dependent on the width
46296                    // and should also change on resize
46297                    $(window).resize(function() {
46298                        if (refThis._core.settings.autoHeight) {
46299                            if (refThis._intervalId != null) {
46300                                clearTimeout(refThis._intervalId);
46301                            }
46302
46303                            refThis._intervalId = setTimeout(function() {
46304                                refThis.update();
46305                            }, 250);
46306                        }
46307                    });
46308
46309                };
46310
46311                /**
46312                 * Default options.
46313                 * @public
46314                 */
46315                AutoHeight.Defaults = {
46316                    autoHeight: false,
46317                    autoHeightClass: 'owl-height'
46318                };
46319
46320                /**
46321                 * Updates the view.
46322                 */
46323                AutoHeight.prototype.update = function() {
46324                    var start = this._core._current,
46325                        end = start + this._core.settings.items,
46326                        lazyLoadEnabled = this._core.settings.lazyLoad,
46327                        visible = this._core.$stage.children().toArray().slice(start, end),
46328                        heights = [],
46329                        maxheight = 0;
46330
46331                    $.each(visible, function(index, item) {
46332                        heights.push($(item).height());
46333                    });
46334
46335                    maxheight = Math.max.apply(null, heights);
46336
46337                    if (maxheight <= 1 && lazyLoadEnabled && this._previousHeight) {
46338                        maxheight = this._previousHeight;
46339                    }
46340
46341                    this._previousHeight = maxheight;
46342
46343                    this._core.$stage.parent()
46344                        .height(maxheight)
46345                        .addClass(this._core.settings.autoHeightClass);
46346                };
46347
46348                AutoHeight.prototype.destroy = function() {
46349                    var handler, property;
46350
46351                    for (handler in this._handlers) {
46352                        this._core.$element.off(handler, this._handlers[handler]);
46353                    }
46354                    for (property in Object.getOwnPropertyNames(this)) {
46355                        typeof this[property] !== 'function' && (this[property] = null);
46356                    }
46357                };
46358
46359                $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
46360
46361            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
46362
46363            /**
46364             * Video Plugin
46365             * @version 2.3.4
46366             * @author Bartosz Wojciechowski
46367             * @author David Deutsch
46368             * @license The MIT License (MIT)
46369             */
46370            ;(function($, window, document, undefined) {
46371
46372                /**
46373                 * Creates the video plugin.
46374                 * @class The Video Plugin
46375                 * @param {Owl} carousel - The Owl Carousel
46376                 */
46377                var Video = function(carousel) {
46378                    /**
46379                     * Reference to the core.
46380                     * @protected
46381                     * @type {Owl}
46382                     */
46383                    this._core = carousel;
46384
46385                    /**
46386                     * Cache all video URLs.
46387                     * @protected
46388                     * @type {Object}
46389                     */
46390                    this._videos = {};
46391
46392                    /**
46393                     * Current playing item.
46394                     * @protected
46395                     * @type {jQuery}
46396                     */
46397                    this._playing = null;
46398
46399                    /**
46400                     * All event handlers.
46401                     * @todo The cloned content removale is too late
46402                     * @protected
46403                     * @type {Object}
46404                     */
46405                    this._handlers = {
46406                        'initialized.owl.carousel': $.proxy(function(e) {
46407                            if (e.namespace) {
46408                                this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] });
46409                            }
46410                        }, this),
46411                        'resize.owl.carousel': $.proxy(function(e) {
46412                            if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
46413                                e.preventDefault();
46414                            }
46415                        }, this),
46416                        'refreshed.owl.carousel': $.proxy(function(e) {
46417                            if (e.namespace && this._core.is('resizing')) {
46418                                this._core.$stage.find('.cloned .owl-video-frame').remove();
46419                            }
46420                        }, this),
46421                        'changed.owl.carousel': $.proxy(function(e) {
46422                            if (e.namespace && e.property.name === 'position' && this._playing) {
46423                                this.stop();
46424                            }
46425                        }, this),
46426                        'prepared.owl.carousel': $.proxy(function(e) {
46427                            if (!e.namespace) {
46428                                return;
46429                            }
46430
46431                            var $element = $(e.content).find('.owl-video');
46432
46433                            if ($element.length) {
46434                                $element.css('display', 'none');
46435                                this.fetch($element, $(e.content));
46436                            }
46437                        }, this)
46438                    };
46439
46440                    // set default options
46441                    this._core.options = $.extend({}, Video.Defaults, this._core.options);
46442
46443                    // register event handlers
46444                    this._core.$element.on(this._handlers);
46445
46446                    this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) {
46447                        this.play(e);
46448                    }, this));
46449                };
46450
46451                /**
46452                 * Default options.
46453                 * @public
46454                 */
46455                Video.Defaults = {
46456                    video: false,
46457                    videoHeight: false,
46458                    videoWidth: false
46459                };
46460
46461                /**
46462                 * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
46463                 * @protected
46464                 * @param {jQuery} target - The target containing the video data.
46465                 * @param {jQuery} item - The item containing the video.
46466                 */
46467                Video.prototype.fetch = function(target, item) {
46468                    var type = (function() {
46469                            if (target.attr('data-vimeo-id')) {
46470                                return 'vimeo';
46471                            } else if (target.attr('data-vzaar-id')) {
46472                                return 'vzaar'
46473                            } else {
46474                                return 'youtube';
46475                            }
46476                        })(),
46477                        id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
46478                        width = target.attr('data-width') || this._core.settings.videoWidth,
46479                        height = target.attr('data-height') || this._core.settings.videoHeight,
46480                        url = target.attr('href');
46481
46482                    if (url) {
46483
46484                        /*
46485					Parses the id's out of the following urls (and probably more):
46486					https://www.youtube.com/watch?v=:id
46487					https://youtu.be/:id
46488					https://vimeo.com/:id
46489					https://vimeo.com/channels/:channel/:id
46490					https://vimeo.com/groups/:group/videos/:id
46491					https://app.vzaar.com/videos/:id
46492
46493					Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
46494			*/
46495
46496                        id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
46497
46498                        if (id[3].indexOf('youtu') > -1) {
46499                            type = 'youtube';
46500                        } else if (id[3].indexOf('vimeo') > -1) {
46501                            type = 'vimeo';
46502                        } else if (id[3].indexOf('vzaar') > -1) {
46503                            type = 'vzaar';
46504                        } else {
46505                            throw new Error('Video URL not supported.');
46506                        }
46507                        id = id[6];
46508                    } else {
46509                        throw new Error('Missing video URL.');
46510                    }
46511
46512                    this._videos[url] = {
46513                        type: type,
46514                        id: id,
46515                        width: width,
46516                        height: height
46517                    };
46518
46519                    item.attr('data-video', url);
46520
46521                    this.thumbnail(target, this._videos[url]);
46522                };
46523
46524                /**
46525                 * Creates video thumbnail.
46526                 * @protected
46527                 * @param {jQuery} target - The target containing the video data.
46528                 * @param {Object} info - The video info object.
46529                 * @see `fetch`
46530                 */
46531                Video.prototype.thumbnail = function(target, video) {
46532                    var tnLink,
46533                        icon,
46534                        path,
46535                        dimensions = video.width && video.height ? 'width:' + video.width + 'px;height:' + video.height + 'px;' : '',
46536                        customTn = target.find('img'),
46537                        srcType = 'src',
46538                        lazyClass = '',
46539                        settings = this._core.settings,
46540                        create = function(path) {
46541                            icon = '<div class="owl-video-play-icon"></div>';
46542
46543                            if (settings.lazyLoad) {
46544                                tnLink = $('<div/>',{
46545                                    "class": 'owl-video-tn ' + lazyClass,
46546                                    "srcType": path
46547                                });
46548                            } else {
46549                                tnLink = $( '<div/>', {
46550                                    "class": "owl-video-tn",
46551                                    "style": 'opacity:1;background-image:url(' + path + ')'
46552                                });
46553                            }
46554                            target.after(tnLink);
46555                            target.after(icon);
46556                        };
46557
46558                    // wrap video content into owl-video-wrapper div
46559                    target.wrap( $( '<div/>', {
46560                        "class": "owl-video-wrapper",
46561                        "style": dimensions
46562                    }));
46563
46564                    if (this._core.settings.lazyLoad) {
46565                        srcType = 'data-src';
46566                        lazyClass = 'owl-lazy';
46567                    }
46568
46569                    // custom thumbnail
46570                    if (customTn.length) {
46571                        create(customTn.attr(srcType));
46572                        customTn.remove();
46573                        return false;
46574                    }
46575
46576                    if (video.type === 'youtube') {
46577                        path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
46578                        create(path);
46579                    } else if (video.type === 'vimeo') {
46580                        $.ajax({
46581                            type: 'GET',
46582                            url: '//vimeo.com/api/v2/video/' + video.id + '.json',
46583                            jsonp: 'callback',
46584                            dataType: 'jsonp',
46585                            success: function(data) {
46586                                path = data[0].thumbnail_large;
46587                                create(path);
46588                            }
46589                        });
46590                    } else if (video.type === 'vzaar') {
46591                        $.ajax({
46592                            type: 'GET',
46593                            url: '//vzaar.com/api/videos/' + video.id + '.json',
46594                            jsonp: 'callback',
46595                            dataType: 'jsonp',
46596                            success: function(data) {
46597                                path = data.framegrab_url;
46598                                create(path);
46599                            }
46600                        });
46601                    }
46602                };
46603
46604                /**
46605                 * Stops the current video.
46606                 * @public
46607                 */
46608                Video.prototype.stop = function() {
46609                    this._core.trigger('stop', null, 'video');
46610                    this._playing.find('.owl-video-frame').remove();
46611                    this._playing.removeClass('owl-video-playing');
46612                    this._playing = null;
46613                    this._core.leave('playing');
46614                    this._core.trigger('stopped', null, 'video');
46615                };
46616
46617                /**
46618                 * Starts the current video.
46619                 * @public
46620                 * @param {Event} event - The event arguments.
46621                 */
46622                Video.prototype.play = function(event) {
46623                    var target = $(event.target),
46624                        item = target.closest('.' + this._core.settings.itemClass),
46625                        video = this._videos[item.attr('data-video')],
46626                        width = video.width || '100%',
46627                        height = video.height || this._core.$stage.height(),
46628                        html,
46629                        iframe;
46630
46631                    if (this._playing) {
46632                        return;
46633                    }
46634
46635                    this._core.enter('playing');
46636                    this._core.trigger('play', null, 'video');
46637
46638                    item = this._core.items(this._core.relative(item.index()));
46639
46640                    this._core.reset(item.index());
46641
46642                    html = $( '<iframe frameborder="0" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>' );
46643                    html.attr( 'height', height );
46644                    html.attr( 'width', width );
46645                    if (video.type === 'youtube') {
46646                        html.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id );
46647                    } else if (video.type === 'vimeo') {
46648                        html.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' );
46649                    } else if (video.type === 'vzaar') {
46650                        html.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' );
46651                    }
46652
46653                    iframe = $(html).wrap( '<div class="owl-video-frame" />' ).insertAfter(item.find('.owl-video'));
46654
46655                    this._playing = item.addClass('owl-video-playing');
46656                };
46657
46658                /**
46659                 * Checks whether an video is currently in full screen mode or not.
46660                 * @todo Bad style because looks like a readonly method but changes members.
46661                 * @protected
46662                 * @returns {Boolean}
46663                 */
46664                Video.prototype.isInFullScreen = function() {
46665                    var element = document.fullscreenElement || document.mozFullScreenElement ||
46666                        document.webkitFullscreenElement;
46667
46668                    return element && $(element).parent().hasClass('owl-video-frame');
46669                };
46670
46671                /**
46672                 * Destroys the plugin.
46673                 */
46674                Video.prototype.destroy = function() {
46675                    var handler, property;
46676
46677                    this._core.$element.off('click.owl.video');
46678
46679                    for (handler in this._handlers) {
46680                        this._core.$element.off(handler, this._handlers[handler]);
46681                    }
46682                    for (property in Object.getOwnPropertyNames(this)) {
46683                        typeof this[property] != 'function' && (this[property] = null);
46684                    }
46685                };
46686
46687                $.fn.owlCarousel.Constructor.Plugins.Video = Video;
46688
46689            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
46690
46691            /**
46692             * Animate Plugin
46693             * @version 2.3.4
46694             * @author Bartosz Wojciechowski
46695             * @author David Deutsch
46696             * @license The MIT License (MIT)
46697             */
46698            ;(function($, window, document, undefined) {
46699
46700                /**
46701                 * Creates the animate plugin.
46702                 * @class The Navigation Plugin
46703                 * @param {Owl} scope - The Owl Carousel
46704                 */
46705                var Animate = function(scope) {
46706                    this.core = scope;
46707                    this.core.options = $.extend({}, Animate.Defaults, this.core.options);
46708                    this.swapping = true;
46709                    this.previous = undefined;
46710                    this.next = undefined;
46711
46712                    this.handlers = {
46713                        'change.owl.carousel': $.proxy(function(e) {
46714                            if (e.namespace && e.property.name == 'position') {
46715                                this.previous = this.core.current();
46716                                this.next = e.property.value;
46717                            }
46718                        }, this),
46719                        'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) {
46720                            if (e.namespace) {
46721                                this.swapping = e.type == 'translated';
46722                            }
46723                        }, this),
46724                        'translate.owl.carousel': $.proxy(function(e) {
46725                            if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
46726                                this.swap();
46727                            }
46728                        }, this)
46729                    };
46730
46731                    this.core.$element.on(this.handlers);
46732                };
46733
46734                /**
46735                 * Default options.
46736                 * @public
46737                 */
46738                Animate.Defaults = {
46739                    animateOut: false,
46740                    animateIn: false
46741                };
46742
46743                /**
46744                 * Toggles the animation classes whenever an translations starts.
46745                 * @protected
46746                 * @returns {Boolean|undefined}
46747                 */
46748                Animate.prototype.swap = function() {
46749
46750                    if (this.core.settings.items !== 1) {
46751                        return;
46752                    }
46753
46754                    if (!$.support.animation || !$.support.transition) {
46755                        return;
46756                    }
46757
46758                    this.core.speed(0);
46759
46760                    var left,
46761                        clear = $.proxy(this.clear, this),
46762                        previous = this.core.$stage.children().eq(this.previous),
46763                        next = this.core.$stage.children().eq(this.next),
46764                        incoming = this.core.settings.animateIn,
46765                        outgoing = this.core.settings.animateOut;
46766
46767                    if (this.core.current() === this.previous) {
46768                        return;
46769                    }
46770
46771                    if (outgoing) {
46772                        left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
46773                        previous.one($.support.animation.end, clear)
46774                            .css( { 'left': left + 'px' } )
46775                            .addClass('animated owl-animated-out')
46776                            .addClass(outgoing);
46777                    }
46778
46779                    if (incoming) {
46780                        next.one($.support.animation.end, clear)
46781                            .addClass('animated owl-animated-in')
46782                            .addClass(incoming);
46783                    }
46784                };
46785
46786                Animate.prototype.clear = function(e) {
46787                    $(e.target).css( { 'left': '' } )
46788                        .removeClass('animated owl-animated-out owl-animated-in')
46789                        .removeClass(this.core.settings.animateIn)
46790                        .removeClass(this.core.settings.animateOut);
46791                    this.core.onTransitionEnd();
46792                };
46793
46794                /**
46795                 * Destroys the plugin.
46796                 * @public
46797                 */
46798                Animate.prototype.destroy = function() {
46799                    var handler, property;
46800
46801                    for (handler in this.handlers) {
46802                        this.core.$element.off(handler, this.handlers[handler]);
46803                    }
46804                    for (property in Object.getOwnPropertyNames(this)) {
46805                        typeof this[property] != 'function' && (this[property] = null);
46806                    }
46807                };
46808
46809                $.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
46810
46811            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
46812
46813            /**
46814             * Autoplay Plugin
46815             * @version 2.3.4
46816             * @author Bartosz Wojciechowski
46817             * @author Artus Kolanowski
46818             * @author David Deutsch
46819             * @author Tom De Caluwé
46820             * @license The MIT License (MIT)
46821             */
46822            ;(function($, window, document, undefined) {
46823
46824                /**
46825                 * Creates the autoplay plugin.
46826                 * @class The Autoplay Plugin
46827                 * @param {Owl} scope - The Owl Carousel
46828                 */
46829                var Autoplay = function(carousel) {
46830                    /**
46831                     * Reference to the core.
46832                     * @protected
46833                     * @type {Owl}
46834                     */
46835                    this._core = carousel;
46836
46837                    /**
46838                     * The autoplay timeout id.
46839                     * @type {Number}
46840                     */
46841                    this._call = null;
46842
46843                    /**
46844                     * Depending on the state of the plugin, this variable contains either
46845                     * the start time of the timer or the current timer value if it's
46846                     * paused. Since we start in a paused state we initialize the timer
46847                     * value.
46848                     * @type {Number}
46849                     */
46850                    this._time = 0;
46851
46852                    /**
46853                     * Stores the timeout currently used.
46854                     * @type {Number}
46855                     */
46856                    this._timeout = 0;
46857
46858                    /**
46859                     * Indicates whenever the autoplay is paused.
46860                     * @type {Boolean}
46861                     */
46862                    this._paused = true;
46863
46864                    /**
46865                     * All event handlers.
46866                     * @protected
46867                     * @type {Object}
46868                     */
46869                    this._handlers = {
46870                        'changed.owl.carousel': $.proxy(function(e) {
46871                            if (e.namespace && e.property.name === 'settings') {
46872                                if (this._core.settings.autoplay) {
46873                                    this.play();
46874                                } else {
46875                                    this.stop();
46876                                }
46877                            } else if (e.namespace && e.property.name === 'position' && this._paused) {
46878                                // Reset the timer. This code is triggered when the position
46879                                // of the carousel was changed through user interaction.
46880                                this._time = 0;
46881                            }
46882                        }, this),
46883                        'initialized.owl.carousel': $.proxy(function(e) {
46884                            if (e.namespace && this._core.settings.autoplay) {
46885                                this.play();
46886                            }
46887                        }, this),
46888                        'play.owl.autoplay': $.proxy(function(e, t, s) {
46889                            if (e.namespace) {
46890                                this.play(t, s);
46891                            }
46892                        }, this),
46893                        'stop.owl.autoplay': $.proxy(function(e) {
46894                            if (e.namespace) {
46895                                this.stop();
46896                            }
46897                        }, this),
46898                        'mouseover.owl.autoplay': $.proxy(function() {
46899                            if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
46900                                this.pause();
46901                            }
46902                        }, this),
46903                        'mouseleave.owl.autoplay': $.proxy(function() {
46904                            if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
46905                                this.play();
46906                            }
46907                        }, this),
46908                        'touchstart.owl.core': $.proxy(function() {
46909                            if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
46910                                this.pause();
46911                            }
46912                        }, this),
46913                        'touchend.owl.core': $.proxy(function() {
46914                            if (this._core.settings.autoplayHoverPause) {
46915                                this.play();
46916                            }
46917                        }, this)
46918                    };
46919
46920                    // register event handlers
46921                    this._core.$element.on(this._handlers);
46922
46923                    // set default options
46924                    this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
46925                };
46926
46927                /**
46928                 * Default options.
46929                 * @public
46930                 */
46931                Autoplay.Defaults = {
46932                    autoplay: false,
46933                    autoplayTimeout: 5000,
46934                    autoplayHoverPause: false,
46935                    autoplaySpeed: false
46936                };
46937
46938                /**
46939                 * Transition to the next slide and set a timeout for the next transition.
46940                 * @private
46941                 * @param {Number} [speed] - The animation speed for the animations.
46942                 */
46943                Autoplay.prototype._next = function(speed) {
46944                    this._call = window.setTimeout(
46945                        $.proxy(this._next, this, speed),
46946                        this._timeout * (Math.round(this.read() / this._timeout) + 1) - this.read()
46947                    );
46948
46949                    if (this._core.is('interacting') || document.hidden) {
46950                        return;
46951                    }
46952                    this._core.next(speed || this._core.settings.autoplaySpeed);
46953                }
46954
46955                /**
46956                 * Reads the current timer value when the timer is playing.
46957                 * @public
46958                 */
46959                Autoplay.prototype.read = function() {
46960                    return new Date().getTime() - this._time;
46961                };
46962
46963                /**
46964                 * Starts the autoplay.
46965                 * @public
46966                 * @param {Number} [timeout] - The interval before the next animation starts.
46967                 * @param {Number} [speed] - The animation speed for the animations.
46968                 */
46969                Autoplay.prototype.play = function(timeout, speed) {
46970                    var elapsed;
46971
46972                    if (!this._core.is('rotating')) {
46973                        this._core.enter('rotating');
46974                    }
46975
46976                    timeout = timeout || this._core.settings.autoplayTimeout;
46977
46978                    // Calculate the elapsed time since the last transition. If the carousel
46979                    // wasn't playing this calculation will yield zero.
46980                    elapsed = Math.min(this._time % (this._timeout || timeout), timeout);
46981
46982                    if (this._paused) {
46983                        // Start the clock.
46984                        this._time = this.read();
46985                        this._paused = false;
46986                    } else {
46987                        // Clear the active timeout to allow replacement.
46988                        window.clearTimeout(this._call);
46989                    }
46990
46991                    // Adjust the origin of the timer to match the new timeout value.
46992                    this._time += this.read() % timeout - elapsed;
46993
46994                    this._timeout = timeout;
46995                    this._call = window.setTimeout($.proxy(this._next, this, speed), timeout - elapsed);
46996                };
46997
46998                /**
46999                 * Stops the autoplay.
47000                 * @public
47001                 */
47002                Autoplay.prototype.stop = function() {
47003                    if (this._core.is('rotating')) {
47004                        // Reset the clock.
47005                        this._time = 0;
47006                        this._paused = true;
47007
47008                        window.clearTimeout(this._call);
47009                        this._core.leave('rotating');
47010                    }
47011                };
47012
47013                /**
47014                 * Pauses the autoplay.
47015                 * @public
47016                 */
47017                Autoplay.prototype.pause = function() {
47018                    if (this._core.is('rotating') && !this._paused) {
47019                        // Pause the clock.
47020                        this._time = this.read();
47021                        this._paused = true;
47022
47023                        window.clearTimeout(this._call);
47024                    }
47025                };
47026
47027                /**
47028                 * Destroys the plugin.
47029                 */
47030                Autoplay.prototype.destroy = function() {
47031                    var handler, property;
47032
47033                    this.stop();
47034
47035                    for (handler in this._handlers) {
47036                        this._core.$element.off(handler, this._handlers[handler]);
47037                    }
47038                    for (property in Object.getOwnPropertyNames(this)) {
47039                        typeof this[property] != 'function' && (this[property] = null);
47040                    }
47041                };
47042
47043                $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
47044
47045            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
47046
47047            /**
47048             * Navigation Plugin
47049             * @version 2.3.4
47050             * @author Artus Kolanowski
47051             * @author David Deutsch
47052             * @license The MIT License (MIT)
47053             */
47054            ;(function($, window, document, undefined) {
47055                'use strict';
47056
47057                /**
47058                 * Creates the navigation plugin.
47059                 * @class The Navigation Plugin
47060                 * @param {Owl} carousel - The Owl Carousel.
47061                 */
47062                var Navigation = function(carousel) {
47063                    /**
47064                     * Reference to the core.
47065                     * @protected
47066                     * @type {Owl}
47067                     */
47068                    this._core = carousel;
47069
47070                    /**
47071                     * Indicates whether the plugin is initialized or not.
47072                     * @protected
47073                     * @type {Boolean}
47074                     */
47075                    this._initialized = false;
47076
47077                    /**
47078                     * The current paging indexes.
47079                     * @protected
47080                     * @type {Array}
47081                     */
47082                    this._pages = [];
47083
47084                    /**
47085                     * All DOM elements of the user interface.
47086                     * @protected
47087                     * @type {Object}
47088                     */
47089                    this._controls = {};
47090
47091                    /**
47092                     * Markup for an indicator.
47093                     * @protected
47094                     * @type {Array.<String>}
47095                     */
47096                    this._templates = [];
47097
47098                    /**
47099                     * The carousel element.
47100                     * @type {jQuery}
47101                     */
47102                    this.$element = this._core.$element;
47103
47104                    /**
47105                     * Overridden methods of the carousel.
47106                     * @protected
47107                     * @type {Object}
47108                     */
47109                    this._overrides = {
47110                        next: this._core.next,
47111                        prev: this._core.prev,
47112                        to: this._core.to
47113                    };
47114
47115                    /**
47116                     * All event handlers.
47117                     * @protected
47118                     * @type {Object}
47119                     */
47120                    this._handlers = {
47121                        'prepared.owl.carousel': $.proxy(function(e) {
47122                            if (e.namespace && this._core.settings.dotsData) {
47123                                this._templates.push('<div class="' + this._core.settings.dotClass + '">' +
47124                                    $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
47125                            }
47126                        }, this),
47127                        'added.owl.carousel': $.proxy(function(e) {
47128                            if (e.namespace && this._core.settings.dotsData) {
47129                                this._templates.splice(e.position, 0, this._templates.pop());
47130                            }
47131                        }, this),
47132                        'remove.owl.carousel': $.proxy(function(e) {
47133                            if (e.namespace && this._core.settings.dotsData) {
47134                                this._templates.splice(e.position, 1);
47135                            }
47136                        }, this),
47137                        'changed.owl.carousel': $.proxy(function(e) {
47138                            if (e.namespace && e.property.name == 'position') {
47139                                this.draw();
47140                            }
47141                        }, this),
47142                        'initialized.owl.carousel': $.proxy(function(e) {
47143                            if (e.namespace && !this._initialized) {
47144                                this._core.trigger('initialize', null, 'navigation');
47145                                this.initialize();
47146                                this.update();
47147                                this.draw();
47148                                this._initialized = true;
47149                                this._core.trigger('initialized', null, 'navigation');
47150                            }
47151                        }, this),
47152                        'refreshed.owl.carousel': $.proxy(function(e) {
47153                            if (e.namespace && this._initialized) {
47154                                this._core.trigger('refresh', null, 'navigation');
47155                                this.update();
47156                                this.draw();
47157                                this._core.trigger('refreshed', null, 'navigation');
47158                            }
47159                        }, this)
47160                    };
47161
47162                    // set default options
47163                    this._core.options = $.extend({}, Navigation.Defaults, this._core.options);
47164
47165                    // register event handlers
47166                    this.$element.on(this._handlers);
47167                };
47168
47169                /**
47170                 * Default options.
47171                 * @public
47172                 * @todo Rename `slideBy` to `navBy`
47173                 */
47174                Navigation.Defaults = {
47175                    nav: false,
47176                    navText: [
47177                        '<span aria-label="' + 'Previous' + '">&#x2039;</span>',
47178                        '<span aria-label="' + 'Next' + '">&#x203a;</span>'
47179                    ],
47180                    navSpeed: false,
47181                    navElement: 'button type="button" role="presentation"',
47182                    navContainer: false,
47183                    navContainerClass: 'owl-nav',
47184                    navClass: [
47185                        'owl-prev',
47186                        'owl-next'
47187                    ],
47188                    slideBy: 1,
47189                    dotClass: 'owl-dot',
47190                    dotsClass: 'owl-dots',
47191                    dots: true,
47192                    dotsEach: false,
47193                    dotsData: false,
47194                    dotsSpeed: false,
47195                    dotsContainer: false
47196                };
47197
47198                /**
47199                 * Initializes the layout of the plugin and extends the carousel.
47200                 * @protected
47201                 */
47202                Navigation.prototype.initialize = function() {
47203                    var override,
47204                        settings = this._core.settings;
47205
47206                    // create DOM structure for relative navigation
47207                    this._controls.$relative = (settings.navContainer ? $(settings.navContainer)
47208                        : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');
47209
47210                    this._controls.$previous = $('<' + settings.navElement + '>')
47211                        .addClass(settings.navClass[0])
47212                        .html(settings.navText[0])
47213                        .prependTo(this._controls.$relative)
47214                        .on('click', $.proxy(function(e) {
47215                            this.prev(settings.navSpeed);
47216                        }, this));
47217                    this._controls.$next = $('<' + settings.navElement + '>')
47218                        .addClass(settings.navClass[1])
47219                        .html(settings.navText[1])
47220                        .appendTo(this._controls.$relative)
47221                        .on('click', $.proxy(function(e) {
47222                            this.next(settings.navSpeed);
47223                        }, this));
47224
47225                    // create DOM structure for absolute navigation
47226                    if (!settings.dotsData) {
47227                        this._templates = [ $('<button role="button">')
47228                            .addClass(settings.dotClass)
47229                            .append($('<span>'))
47230                            .prop('outerHTML') ];
47231                    }
47232
47233                    this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer)
47234                        : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');
47235
47236                    this._controls.$absolute.on('click', 'button', $.proxy(function(e) {
47237                        var index = $(e.target).parent().is(this._controls.$absolute)
47238                            ? $(e.target).index() : $(e.target).parent().index();
47239
47240                        e.preventDefault();
47241
47242                        this.to(index, settings.dotsSpeed);
47243                    }, this));
47244
47245                    /*$el.on('focusin', function() {
47246			$(document).off(".carousel");
47247
47248			$(document).on('keydown.carousel', function(e) {
47249				if(e.keyCode == 37) {
47250					$el.trigger('prev.owl')
47251				}
47252				if(e.keyCode == 39) {
47253					$el.trigger('next.owl')
47254				}
47255			});
47256		});*/
47257
47258                    // override public methods of the carousel
47259                    for (override in this._overrides) {
47260                        this._core[override] = $.proxy(this[override], this);
47261                    }
47262                };
47263
47264                /**
47265                 * Destroys the plugin.
47266                 * @protected
47267                 */
47268                Navigation.prototype.destroy = function() {
47269                    var handler, control, property, override, settings;
47270                    settings = this._core.settings;
47271
47272                    for (handler in this._handlers) {
47273                        this.$element.off(handler, this._handlers[handler]);
47274                    }
47275                    for (control in this._controls) {
47276                        if (control === '$relative' && settings.navContainer) {
47277                            this._controls[control].html('');
47278                        } else {
47279                            this._controls[control].remove();
47280                        }
47281                    }
47282                    for (override in this.overides) {
47283                        this._core[override] = this._overrides[override];
47284                    }
47285                    for (property in Object.getOwnPropertyNames(this)) {
47286                        typeof this[property] != 'function' && (this[property] = null);
47287                    }
47288                };
47289
47290                /**
47291                 * Updates the internal state.
47292                 * @protected
47293                 */
47294                Navigation.prototype.update = function() {
47295                    var i, j, k,
47296                        lower = this._core.clones().length / 2,
47297                        upper = lower + this._core.items().length,
47298                        maximum = this._core.maximum(true),
47299                        settings = this._core.settings,
47300                        size = settings.center || settings.autoWidth || settings.dotsData
47301                            ? 1 : settings.dotsEach || settings.items;
47302
47303                    if (settings.slideBy !== 'page') {
47304                        settings.slideBy = Math.min(settings.slideBy, settings.items);
47305                    }
47306
47307                    if (settings.dots || settings.slideBy == 'page') {
47308                        this._pages = [];
47309
47310                        for (i = lower, j = 0, k = 0; i < upper; i++) {
47311                            if (j >= size || j === 0) {
47312                                this._pages.push({
47313                                    start: Math.min(maximum, i - lower),
47314                                    end: i - lower + size - 1
47315                                });
47316                                if (Math.min(maximum, i - lower) === maximum) {
47317                                    break;
47318                                }
47319                                j = 0, ++k;
47320                            }
47321                            j += this._core.mergers(this._core.relative(i));
47322                        }
47323                    }
47324                };
47325
47326                /**
47327                 * Draws the user interface.
47328                 * @todo The option `dotsData` wont work.
47329                 * @protected
47330                 */
47331                Navigation.prototype.draw = function() {
47332                    var difference,
47333                        settings = this._core.settings,
47334                        disabled = this._core.items().length <= settings.items,
47335                        index = this._core.relative(this._core.current()),
47336                        loop = settings.loop || settings.rewind;
47337
47338                    this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);
47339
47340                    if (settings.nav) {
47341                        this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
47342                        this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
47343                    }
47344
47345                    this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);
47346
47347                    if (settings.dots) {
47348                        difference = this._pages.length - this._controls.$absolute.children().length;
47349
47350                        if (settings.dotsData && difference !== 0) {
47351                            this._controls.$absolute.html(this._templates.join(''));
47352                        } else if (difference > 0) {
47353                            this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
47354                        } else if (difference < 0) {
47355                            this._controls.$absolute.children().slice(difference).remove();
47356                        }
47357
47358                        this._controls.$absolute.find('.active').removeClass('active');
47359                        this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
47360                    }
47361                };
47362
47363                /**
47364                 * Extends event data.
47365                 * @protected
47366                 * @param {Event} event - The event object which gets thrown.
47367                 */
47368                Navigation.prototype.onTrigger = function(event) {
47369                    var settings = this._core.settings;
47370
47371                    event.page = {
47372                        index: $.inArray(this.current(), this._pages),
47373                        count: this._pages.length,
47374                        size: settings && (settings.center || settings.autoWidth || settings.dotsData
47375                            ? 1 : settings.dotsEach || settings.items)
47376                    };
47377                };
47378
47379                /**
47380                 * Gets the current page position of the carousel.
47381                 * @protected
47382                 * @returns {Number}
47383                 */
47384                Navigation.prototype.current = function() {
47385                    var current = this._core.relative(this._core.current());
47386                    return $.grep(this._pages, $.proxy(function(page, index) {
47387                        return page.start <= current && page.end >= current;
47388                    }, this)).pop();
47389                };
47390
47391                /**
47392                 * Gets the current succesor/predecessor position.
47393                 * @protected
47394                 * @returns {Number}
47395                 */
47396                Navigation.prototype.getPosition = function(successor) {
47397                    var position, length,
47398                        settings = this._core.settings;
47399
47400                    if (settings.slideBy == 'page') {
47401                        position = $.inArray(this.current(), this._pages);
47402                        length = this._pages.length;
47403                        successor ? ++position : --position;
47404                        position = this._pages[((position % length) + length) % length].start;
47405                    } else {
47406                        position = this._core.relative(this._core.current());
47407                        length = this._core.items().length;
47408                        successor ? position += settings.slideBy : position -= settings.slideBy;
47409                    }
47410
47411                    return position;
47412                };
47413
47414                /**
47415                 * Slides to the next item or page.
47416                 * @public
47417                 * @param {Number} [speed=false] - The time in milliseconds for the transition.
47418                 */
47419                Navigation.prototype.next = function(speed) {
47420                    $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
47421                };
47422
47423                /**
47424                 * Slides to the previous item or page.
47425                 * @public
47426                 * @param {Number} [speed=false] - The time in milliseconds for the transition.
47427                 */
47428                Navigation.prototype.prev = function(speed) {
47429                    $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
47430                };
47431
47432                /**
47433                 * Slides to the specified item or page.
47434                 * @public
47435                 * @param {Number} position - The position of the item or page.
47436                 * @param {Number} [speed] - The time in milliseconds for the transition.
47437                 * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
47438                 */
47439                Navigation.prototype.to = function(position, speed, standard) {
47440                    var length;
47441
47442                    if (!standard && this._pages.length) {
47443                        length = this._pages.length;
47444                        $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed);
47445                    } else {
47446                        $.proxy(this._overrides.to, this._core)(position, speed);
47447                    }
47448                };
47449
47450                $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
47451
47452            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
47453
47454            /**
47455             * Hash Plugin
47456             * @version 2.3.4
47457             * @author Artus Kolanowski
47458             * @author David Deutsch
47459             * @license The MIT License (MIT)
47460             */
47461            ;(function($, window, document, undefined) {
47462                'use strict';
47463
47464                /**
47465                 * Creates the hash plugin.
47466                 * @class The Hash Plugin
47467                 * @param {Owl} carousel - The Owl Carousel
47468                 */
47469                var Hash = function(carousel) {
47470                    /**
47471                     * Reference to the core.
47472                     * @protected
47473                     * @type {Owl}
47474                     */
47475                    this._core = carousel;
47476
47477                    /**
47478                     * Hash index for the items.
47479                     * @protected
47480                     * @type {Object}
47481                     */
47482                    this._hashes = {};
47483
47484                    /**
47485                     * The carousel element.
47486                     * @type {jQuery}
47487                     */
47488                    this.$element = this._core.$element;
47489
47490                    /**
47491                     * All event handlers.
47492                     * @protected
47493                     * @type {Object}
47494                     */
47495                    this._handlers = {
47496                        'initialized.owl.carousel': $.proxy(function(e) {
47497                            if (e.namespace && this._core.settings.startPosition === 'URLHash') {
47498                                $(window).trigger('hashchange.owl.navigation');
47499                            }
47500                        }, this),
47501                        'prepared.owl.carousel': $.proxy(function(e) {
47502                            if (e.namespace) {
47503                                var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');
47504
47505                                if (!hash) {
47506                                    return;
47507                                }
47508
47509                                this._hashes[hash] = e.content;
47510                            }
47511                        }, this),
47512                        'changed.owl.carousel': $.proxy(function(e) {
47513                            if (e.namespace && e.property.name === 'position') {
47514                                var current = this._core.items(this._core.relative(this._core.current())),
47515                                    hash = $.map(this._hashes, function(item, hash) {
47516                                        return item === current ? hash : null;
47517                                    }).join();
47518
47519                                if (!hash || window.location.hash.slice(1) === hash) {
47520                                    return;
47521                                }
47522
47523                                window.location.hash = hash;
47524                            }
47525                        }, this)
47526                    };
47527
47528                    // set default options
47529                    this._core.options = $.extend({}, Hash.Defaults, this._core.options);
47530
47531                    // register the event handlers
47532                    this.$element.on(this._handlers);
47533
47534                    // register event listener for hash navigation
47535                    $(window).on('hashchange.owl.navigation', $.proxy(function(e) {
47536                        var hash = window.location.hash.substring(1),
47537                            items = this._core.$stage.children(),
47538                            position = this._hashes[hash] && items.index(this._hashes[hash]);
47539
47540                        if (position === undefined || position === this._core.current()) {
47541                            return;
47542                        }
47543
47544                        this._core.to(this._core.relative(position), false, true);
47545                    }, this));
47546                };
47547
47548                /**
47549                 * Default options.
47550                 * @public
47551                 */
47552                Hash.Defaults = {
47553                    URLhashListener: false
47554                };
47555
47556                /**
47557                 * Destroys the plugin.
47558                 * @public
47559                 */
47560                Hash.prototype.destroy = function() {
47561                    var handler, property;
47562
47563                    $(window).off('hashchange.owl.navigation');
47564
47565                    for (handler in this._handlers) {
47566                        this._core.$element.off(handler, this._handlers[handler]);
47567                    }
47568                    for (property in Object.getOwnPropertyNames(this)) {
47569                        typeof this[property] != 'function' && (this[property] = null);
47570                    }
47571                };
47572
47573                $.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
47574
47575            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
47576
47577            /**
47578             * Support Plugin
47579             *
47580             * @version 2.3.4
47581             * @author Vivid Planet Software GmbH
47582             * @author Artus Kolanowski
47583             * @author David Deutsch
47584             * @license The MIT License (MIT)
47585             */
47586            ;(function($, window, document, undefined) {
47587
47588                var style = $('<support>').get(0).style,
47589                    prefixes = 'Webkit Moz O ms'.split(' '),
47590                    events = {
47591                        transition: {
47592                            end: {
47593                                WebkitTransition: 'webkitTransitionEnd',
47594                                MozTransition: 'transitionend',
47595                                OTransition: 'oTransitionEnd',
47596                                transition: 'transitionend'
47597                            }
47598                        },
47599                        animation: {
47600                            end: {
47601                                WebkitAnimation: 'webkitAnimationEnd',
47602                                MozAnimation: 'animationend',
47603                                OAnimation: 'oAnimationEnd',
47604                                animation: 'animationend'
47605                            }
47606                        }
47607                    },
47608                    tests = {
47609                        csstransforms: function() {
47610                            return !!test('transform');
47611                        },
47612                        csstransforms3d: function() {
47613                            return !!test('perspective');
47614                        },
47615                        csstransitions: function() {
47616                            return !!test('transition');
47617                        },
47618                        cssanimations: function() {
47619                            return !!test('animation');
47620                        }
47621                    };
47622
47623                function test(property, prefixed) {
47624                    var result = false,
47625                        upper = property.charAt(0).toUpperCase() + property.slice(1);
47626
47627                    $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) {
47628                        if (style[property] !== undefined) {
47629                            result = prefixed ? property : true;
47630                            return false;
47631                        }
47632                    });
47633
47634                    return result;
47635                }
47636
47637                function prefixed(property) {
47638                    return test(property, true);
47639                }
47640
47641                if (tests.csstransitions()) {
47642                    /* jshint -W053 */
47643                    $.support.transition = new String(prefixed('transition'))
47644                    $.support.transition.end = events.transition.end[ $.support.transition ];
47645                }
47646
47647                if (tests.cssanimations()) {
47648                    /* jshint -W053 */
47649                    $.support.animation = new String(prefixed('animation'))
47650                    $.support.animation.end = events.animation.end[ $.support.animation ];
47651                }
47652
47653                if (tests.csstransforms()) {
47654                    /* jshint -W053 */
47655                    $.support.transform = new String(prefixed('transform'));
47656                    $.support.transform3d = tests.csstransforms3d();
47657                }
47658
47659            })(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
47660
47661
47662            /***/ }),
47663
47664        
vendor: 7,597 bytes, lines 47664-47858
47664/***/ "./node_modules/process/browser.js":
47665        /*!*****************************************!*\
47666  !*** ./node_modules/process/browser.js ***!
47667  \*****************************************/
47668        /***/ (function(module) {
47669
47670// shim for using process in browser
47671            var process = module.exports = {};
47672
47673// cached from whatever global is present so that test runners that stub it
47674// don't break things.  But we need to wrap it in a try catch in case it is
47675// wrapped in strict mode code which doesn't define any globals.  It's inside a
47676// function because try/catches deoptimize in certain engines.
47677
47678            var cachedSetTimeout;
47679            var cachedClearTimeout;
47680
47681            function defaultSetTimout() {
47682                throw new Error('setTimeout has not been defined');
47683            }
47684            function defaultClearTimeout () {
47685                throw new Error('clearTimeout has not been defined');
47686            }
47687            (function () {
47688                try {
47689                    if (typeof setTimeout === 'function') {
47690                        cachedSetTimeout = setTimeout;
47691                    } else {
47692                        cachedSetTimeout = defaultSetTimout;
47693                    }
47694                } catch (e) {
47695                    cachedSetTimeout = defaultSetTimout;
47696                }
47697                try {
47698                    if (typeof clearTimeout === 'function') {
47699                        cachedClearTimeout = clearTimeout;
47700                    } else {
47701                        cachedClearTimeout = defaultClearTimeout;
47702                    }
47703                } catch (e) {
47704                    cachedClearTimeout = defaultClearTimeout;
47705                }
47706            } ())
47707            function runTimeout(fun) {
47708                if (cachedSetTimeout === setTimeout) {
47709                    //normal enviroments in sane situations
47710                    return setTimeout(fun, 0);
47711                }
47712                // if setTimeout wasn't available but was latter defined
47713                if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
47714                    cachedSetTimeout = setTimeout;
47715                    return setTimeout(fun, 0);
47716                }
47717                try {
47718                    // when when somebody has screwed with setTimeout but no I.E. maddness
47719                    return cachedSetTimeout(fun, 0);
47720                } catch(e){
47721                    try {
47722                        // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
47723                        return cachedSetTimeout.call(null, fun, 0);
47724                    } catch(e){
47725                        // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
47726                        return cachedSetTimeout.call(this, fun, 0);
47727                    }
47728                }
47729
47730
47731            }
47732            function runClearTimeout(marker) {
47733                if (cachedClearTimeout === clearTimeout) {
47734                    //normal enviroments in sane situations
47735                    return clearTimeout(marker);
47736                }
47737                // if clearTimeout wasn't available but was latter defined
47738                if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
47739                    cachedClearTimeout = clearTimeout;
47740                    return clearTimeout(marker);
47741                }
47742                try {
47743                    // when when somebody has screwed with setTimeout but no I.E. maddness
47744                    return cachedClearTimeout(marker);
47745                } catch (e){
47746                    try {
47747                        // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
47748                        return cachedClearTimeout.call(null, marker);
47749                    } catch (e){
47750                        // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
47751                        // Some versions of I.E. have different rules for clearTimeout vs setTimeout
47752                        return cachedClearTimeout.call(this, marker);
47753                    }
47754                }
47755
47756
47757
47758            }
47759            var queue = [];
47760            var draining = false;
47761            var currentQueue;
47762            var queueIndex = -1;
47763
47764            function cleanUpNextTick() {
47765                if (!draining || !currentQueue) {
47766                    return;
47767                }
47768                draining = false;
47769                if (currentQueue.length) {
47770                    queue = currentQueue.concat(queue);
47771                } else {
47772                    queueIndex = -1;
47773                }
47774                if (queue.length) {
47775                    drainQueue();
47776                }
47777            }
47778
47779            function drainQueue() {
47780                if (draining) {
47781                    return;
47782                }
47783                var timeout = runTimeout(cleanUpNextTick);
47784                draining = true;
47785
47786                var len = queue.length;
47787                while(len) {
47788                    currentQueue = queue;
47789                    queue = [];
47790                    while (++queueIndex < len) {
47791                        if (currentQueue) {
47792                            currentQueue[queueIndex].run();
47793                        }
47794                    }
47795                    queueIndex = -1;
47796                    len = queue.length;
47797                }
47798                currentQueue = null;
47799                draining = false;
47800                runClearTimeout(timeout);
47801            }
47802
47803            process.nextTick = function (fun) {
47804                var args = new Array(arguments.length - 1);
47805                if (arguments.length > 1) {
47806                    for (var i = 1; i < arguments.length; i++) {
47807                        args[i - 1] = arguments[i];
47808                    }
47809                }
47810                queue.push(new Item(fun, args));
47811                if (queue.length === 1 && !draining) {
47812                    runTimeout(drainQueue);
47813                }
47814            };
47815
47816// v8 likes predictible objects
47817            function Item(fun, array) {
47818                this.fun = fun;
47819                this.array = array;
47820            }
47821            Item.prototype.run = function () {
47822                this.fun.apply(null, this.array);
47823            };
47824            process.title = 'browser';
47825            process.browser = true;
47826            process.env = {};
47827            process.argv = [];
47828            process.version = ''; // empty string to avoid regexp issues
47829            process.versions = {};
47830
47831            function noop() {}
47832
47833            process.on = noop;
47834            process.addListener = noop;
47835            process.once = noop;
47836            process.off = noop;
47837            process.removeListener = noop;
47838            process.removeAllListeners = noop;
47839            process.emit = noop;
47840            process.prependListener = noop;
47841            process.prependOnceListener = noop;
47842
47843            process.listeners = function (name) { return [] }
47844
47845            process.binding = function (name) {
47846                throw new Error('process.binding is not supported');
47847            };
47848
47849            process.cwd = function () { return '/' };
47850            process.chdir = function (dir) {
47851                throw new Error('process.chdir is not supported');
47852            };
47853            process.umask = function() { return 0; };
47854
47855
47856            /***/ }),
47857
47858        
vendor: 3,220 bytes, lines 47858-47900
47858/***/ "./src/js/modules/_animations.mjs":
47859        /*!****************************************!*\
47860  !*** ./src/js/modules/_animations.mjs ***!
47861  \****************************************/
47862        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
47863
47864            "use strict";
47865            __webpack_require__.r(__webpack_exports__);
47866            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
47867                /* harmony export */   animateInView: function() { return /* binding */ animateInView; }
47868                /* harmony export */ });
47869            function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
47870            function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
47871            function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
47872            function animateInView() {
47873                // isInViewport
47874                function isInViewport(elem) {
47875                    var bounding = elem.getBoundingClientRect();
47876                    return bounding.top >= 0 && bounding.left >= 0 && bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) && bounding.right <= (window.innerWidth || document.documentElement.clientWidth);
47877                }
47878
47879                // if section is in view, add class in-view
47880                var sections = document.querySelectorAll("section");
47881                var _iterator = _createForOfIteratorHelper(sections),
47882                    _step;
47883                try {
47884                    for (_iterator.s(); !(_step = _iterator.n()).done;) {
47885                        var section = _step.value;
47886                        var s = section;
47887                        if (isInViewport(s)) {
47888                            s.classList.add("in-view");
47889                        }
47890                    }
47891                } catch (err) {
47892                    _iterator.e(err);
47893                } finally {
47894                    _iterator.f();
47895                }
47896            }
47897
47898            /***/ }),
47899
47900        
47900/***/ "./src/js/modules/_carousels.mjs":
47901        /*!***************************************!*\
47902  !*** ./src/js/modules/_carousels.mjs ***!
47903  \***************************************/
47904        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
47905
47906            "use strict";
47907            __webpack_require__.r(__webpack_exports__);
47908            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
47909                /* harmony export */   owl: function() { return /* binding */ owl; }
47910                /* harmony export */ });
47911            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
47912            function owl() {
47913                // owl carousel photoalbum
47914                $(".photoalbum").owlCarousel({
47915                    loop: true,
47916                    margin: 20,
47917                    nav: true,
47918                    dots: true,
47919                    items: 4,
47920                    navText: ['<svg width="27" height="43" viewBox="0 0 57 43" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M39.389 6.88699e-06L-3.71092e-06 21.224L39.389 42.447L39.389 30.6L21.189 20.8L39.389 11L39.389 6.88699e-06Z" fill="#E1A8C9"/><path d="M39.3252 21.2227L56.2602 30.3478L56.2602 12.0938L39.3252 21.2227Z" fill="#E1A8C9"/></svg>', '<svg width="27" height="43" viewBox="0 0 57 43" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.8708 42.4473L56.2598 21.2233L16.8708 0.000267029V11.8473L35.0708 21.6473L16.8708 31.4473V42.4473Z" fill="#E1A8C9"/><path d="M16.9346 21.2245L-0.000427246 12.0995L-0.000427246 30.3535L16.9346 21.2245Z" fill="#E1A8C9"/></svg>'],
47921                    responsive: {
47922                        0: {
47923                            items: 1
47924                        },
47925                        600: {
47926                            items: 2
47927                        },
47928                        1000: {
47929                            items: 4
47930                        }
47931                    }
47932                });
47933                $('.owl-hero').owlCarousel({
47934                    loop: true,
47935                    margin: 0,
47936                    dots: false,
47937                    items: 1,
47938                    nav: true,
47939                    navText: ["", ""],
47940                    smartSpeed: 2000,
47941                    autoplay: true,
47942                    autoplayTimeout: 5000,
47943                    autoplayHoverPause: true
47944                });
47945                $('.owl-one').owlCarousel({
47946                    loop: true,
47947                    margin: 0,
47948                    dots: false,
47949                    items: 1,
47950                    nav: false,
47951                    smartSpeed: 2000,
47952                    autoplay: true,
47953                    autoplayTimeout: 3000,
47954                    autoplayHoverPause: true
47955                });
47956                $('.owl-4').owlCarousel({
47957                    loop: true,
47958                    margin: 20,
47959                    nav: true,
47960                    navText: ['', ''],
47961                    dots: false,
47962                    responsive: {
47963                        0: {
47964                            items: 1.3,
47965                            dots: true,
47966                            loop: true
47967                        },
47968                        600: {
47969                            items: 3,
47970                            loop: true
47971                        },
47972                        1000: {
47973                            items: 2.3,
47974                            loop: true
47975                        },
47976                        1600: {
47977                            items: 3.3,
47978                            loop: true
47979                        }
47980                    }
47981                });
47982                $('.owl-3').owlCarousel({
47983                    loop: true,
47984                    margin: 20,
47985                    nav: true,
47986                    navText: ['', ''],
47987                    dots: false,
47988                    responsive: {
47989                        0: {
47990                            items: 1,
47991                            dots: true,
47992                            loop: true
47993                        },
47994                        600: {
47995                            items: 2,
47996                            loop: true
47997                        },
47998                        1000: {
47999                            items: 2,
48000                            loop: true
48001                        },
48002                        1600: {
48003                            items: 3,
48004                            loop: true
48005                        }
48006                    }
48007                });
48008                $('.owl-uitgelicht').owlCarousel({
48009                    loop: true,
48010                    margin: 20,
48011                    nav: true,
48012                    navText: ['', ''],
48013                    dots: false,
48014                    responsive: {
48015                        0: {
48016                            items: 1.3,
48017                            dots: true,
48018                            loop: true
48019                        },
48020                        1000: {
48021                            items: 2.3,
48022                            loop: true
48023                        },
48024                        1600: {
48025                            items: 3.3,
48026                            loop: true
48027                        }
48028                    }
48029                });
48030            }
48031
48032            /***/ }),
48033
48034        
48034/***/ "./src/js/modules/_clipboard.mjs":
48035        /*!***************************************!*\
48036  !*** ./src/js/modules/_clipboard.mjs ***!
48037  \***************************************/
48038        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
48039
48040            "use strict";
48041            __webpack_require__.r(__webpack_exports__);
48042            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48043                /* harmony export */   copyToClipboard: function() { return /* binding */ copyToClipboard; }
48044                /* harmony export */ });
48045            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
48046            function copyToClipboard() {
48047                var toastTrigger = document.getElementById("liveToastBtn");
48048                var toastLiveExample = document.getElementById("liveToast");
48049                $("#copylink").on("click", function () {
48050                    var link = $(this).data("link");
48051                    navigator.clipboard.writeText(link).then(function () {
48052                        console.log("Async: Copying to clipboard was successful!");
48053                        console.log(link);
48054                        var toast = new bootstrap.Toast(toastLiveExample);
48055                        toast.show();
48056                    }, function (err) {
48057                        console.error("Async: Could not copy text: ", err);
48058
48059                        // Fallback if browser doesn't support async clipboard API
48060                        var textArea = document.createElement("textarea");
48061                        textArea.value = link;
48062                        document.body.appendChild(textArea);
48063                        textArea.focus();
48064                        textArea.select();
48065                        try {
48066                            document.execCommand("copy");
48067                            alert("Copied!");
48068                        } catch (err) {
48069                            console.log("Oops, unable to copy");
48070                        }
48071                    });
48072                });
48073            }
48074
48075            /***/ }),
48076
48077        
48077/***/ "./src/js/modules/_header.mjs":
48078        /*!************************************!*\
48079  !*** ./src/js/modules/_header.mjs ***!
48080  \************************************/
48081        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
48082
48083            "use strict";
48084            __webpack_require__.r(__webpack_exports__);
48085            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48086                /* harmony export */   searchbar: function() { return /* binding */ searchbar; }
48087                /* harmony export */ });
48088            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
48089            function searchbar() {
48090                $('.js-search-trigger').on('click', function () {
48091                    $(this).toggleClass('active');
48092                    $('.js-search-target').toggleClass('active');
48093                    $('.js-search-target input').focus();
48094                });
48095            }
48096
48097            /***/ }),
48098
48099        
48099/***/ "./src/js/modules/_mobile-filters-sidebar.mjs":
48100        /*!****************************************************!*\
48101  !*** ./src/js/modules/_mobile-filters-sidebar.mjs ***!
48102  \****************************************************/
48103        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
48104
48105            "use strict";
48106            __webpack_require__.r(__webpack_exports__);
48107            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48108                /* harmony export */   mobileFilterbar: function() { return /* binding */ mobileFilterbar; },
48109                /* harmony export */   toggleMobileFilterbar: function() { return /* binding */ toggleMobileFilterbar; }
48110                /* harmony export */ });
48111            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
48112            function mobileFilterbar() {
48113                if ($(window).width() < 992) {
48114                    $(".move-filters-here").prepend($(".filter-sidebar"));
48115                } else {
48116                    $(".wrapper").prepend($(".filter-sidebar"));
48117                }
48118            }
48119            function toggleMobileFilterbar() {
48120                $("#mobile_filter").on("click", function () {
48121                    console.log('clicked');
48122                    $(".mobile-filter-bar").toggleClass("active");
48123                });
48124            }
48125
48126            /***/ }),
48127
48128        
48128/***/ "./src/js/modules/_navbar.mjs":
48129        /*!************************************!*\
48130  !*** ./src/js/modules/_navbar.mjs ***!
48131  \************************************/
48132        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
48133
48134            "use strict";
48135            __webpack_require__.r(__webpack_exports__);
48136            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48137                /* harmony export */   mobileNav: function() { return /* binding */ mobileNav; },
48138                /* harmony export */   navbar: function() { return /* binding */ navbar; }
48139                /* harmony export */ });
48140            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
48141            function navbar() {
48142                // if scrolled 100px from top, add class to navbar
48143                if (window.scrollY > 100) {
48144                    $(".page-header").addClass("scrolled");
48145                }
48146                // if scrolled less than 100px from top, remove class from navbar
48147                else {
48148                    $(".page-header").removeClass("scrolled");
48149                }
48150            }
48151            function mobileNav() {
48152                // new mobile menu
48153                // $('.mobile-menu-submenu').prepend('<li class="back"><span>Terug</span></li>');
48154
48155                $('.mobile-menu-trigger').click(function () {
48156                    $(this).toggleClass('active');
48157                    $('.mobile-menu').toggleClass('active');
48158                });
48159                $('.has-submenu').click(function () {
48160                    $(this).addClass('active');
48161                    $(this).find(' > .mobile-menu-submenu').addClass('active');
48162                });
48163                $('.has-submenu').each(function () {
48164                    var submenutitle = $(this).find('.dropdown-title').html();
48165                    $(this).find('.mobile-menu-submenu').prepend('<li class="back" role="presentation"><span>' + submenutitle + '</span><hr></li>');
48166                    $(this).find('.back').click(function () {
48167                        $(this).parent().removeClass('active');
48168                        $(this).parent().parent().removeClass('active');
48169                        return false;
48170                    });
48171                });
48172            }
48173
48174            /***/ }),
48175
48176        
48176/***/ "./src/js/modules/_serviceWorker.mjs":
48177        /*!*******************************************!*\
48178  !*** ./src/js/modules/_serviceWorker.mjs ***!
48179  \*******************************************/
48180        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
48181
48182            "use strict";
48183            __webpack_require__.r(__webpack_exports__);
48184            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48185                /* harmony export */   serviceWorker: function() { return /* binding */ serviceWorker; }
48186                /* harmony export */ });
48187            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
48188            function serviceWorker() {
48189                $(document).ready(function (e) {
48190                    if ('serviceWorker' in navigator) {
48191                        navigator.serviceWorker.register('/serviceWorker.js').then(function (registration) {
48192                            // Registration was successful
48193                            //console.log('ServiceWorker registration successful with scope: ', registration.scope);
48194                        })["catch"](function (err) {
48195                            // registration failed
48196                            console.log('ServiceWorker registration failed: ', err);
48197                        });
48198                    }
48199                });
48200                return 'serviceWorker';
48201            }
48202
48203            /***/ }),
48204
48205        
48205/***/ "./src/js/modules/_validate.mjs":
48206        /*!**************************************!*\
48207  !*** ./src/js/modules/_validate.mjs ***!
48208  \**************************************/
48209        /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
48210
48211            "use strict";
48212            __webpack_require__.r(__webpack_exports__);
48213            /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48214                /* harmony export */   validate: function() { return /* binding */ validate; }
48215                /* harmony export */ });
48216            /* provided dependency */ var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
48217            function validate() {
48218                var language = navigator.language || navigator.userLanguage;
48219                $('form.validate').submit(function (e) {
48220                    e.preventDefault();
48221                    var form = $(this);
48222                    if (form.find('input[name="gender"]').length === 0) {
48223                        alert('Honeypot field is missing...');
48224                        return false;
48225                    }
48226                    if (form.find('.feedback').length === 0) {
48227                        alert("<div> with class '.feedback' is missing...");
48228                        return false;
48229                    }
48230                    var button = form.find('button[type="submit"]');
48231                    var url = form.attr('action');
48232                    var data = new FormData(this);
48233                    var feedback = form.find('.feedback');
48234                    var alert_message = feedback.find('.alert');
48235                    var html = '';
48236                    //var tooltip = form.find('.invalid-tooltip');
48237
48238                    var defaultButtonText = button.html();
48239                    var temporaryButtonValue = '<span class="loader"></span>';
48240                    button.html(temporaryButtonValue);
48241                    var controls = form.find('input[name!=gender], textarea, select');
48242                    $('.is-valid').each(function (index, value) {
48243                        $(this).removeClass('is-valid');
48244                    });
48245                    $('.is-invalid').each(function (index, value) {
48246                        $(this).removeClass('is-invalid');
48247                    });
48248
48249                    //tooltip.remove();
48250
48251                    feedback.hide(200, function () {
48252                        alert_message.remove();
48253                    });
48254                    axios.post(url, data, {
48255                        headers: {
48256                            'Content-Type': 'multipart/form-data'
48257                        }
48258                    }).then(function (response) {
48259                        var status = response.data.status;
48260                        var warnings = response.data.warnings;
48261                        var hasError = response.data.hasError;
48262                        var message = response.data.message;
48263                        if (response.data.redirect) {
48264                            window.location = response.data.redirect;
48265                            return false;
48266                        }
48267                        form.addClass('was-validated'); //uncomment and add required attribute to required fields for real-time client-side validation
48268
48269                        if (status === 'error') {
48270                            html += '<div class="alert alert-danger" role="alert">' + message + '</div>';
48271                        }
48272                        if (status === 'success') {
48273                            html += '<div class="alert alert-success" role="alert">' + message + '</div>';
48274                        }
48275                        feedback.html(html).show(200);
48276                        if (response.data.clear) {
48277                            form.trigger('reset');
48278                        }
48279                    })["catch"](function (error) {
48280                        console.log(error);
48281                        alert('Er is iets misgegaan, neem alstublieft contact op met de beheerder!');
48282                    });
48283                    button.html(defaultButtonText).attr('disabled', false);
48284                });
48285                $(document).on("DOMNodeInserted", ".btn-feedback-dismiss", function () {
48286                    $(this).click(function () {
48287                        $(this).parents('.feedback').hide(200, function () {
48288                            $(this).find('.alert').remove();
48289                        });
48290                    });
48291                });
48292                $(document).on("click", ".btn-feedback-dismiss", function () {
48293                    $(this).parents('.feedback').hide(200, function () {
48294                        $(this).find('.alert').remove();
48295                        $(this).closest('form').removeClass('was-validated');
48296                        $(this).closest('form').find('.is-invalid, .
48296is-valid').removeClass('is-invalid is-valid');
48297                    });
48298                });
48299                $('[id^=file-input]').change(function () {
48300                    var el = $(this);
48301                    var files = el[0].files;
48302                    var translation;
48303                    var label;
48304                    var translations = {};
48305                    translations['en-EN'] = 'files choosen';
48306                    translations['nl-NL'] = 'bestanden gekozen';
48307                    if (translations[language]) {
48308                        translation = translations[language];
48309                    } else {
48310                        translation = translations['en-EN'];
48311                    }
48312                    if (files.length > 1) {
48313                        label = files.length + ' ' + translation;
48314                    } else {
48315                        label = files[0].name;
48316                    }
48317                    $(this).prev('label').text(label);
48318                });
48319                return 'validate';
48320            }
48321
48322            /***/ })
48322
48323
48324        /******/ 	});
48325    /************************************************************************/
48326    /******/ 	// The module cache
48327    /******/ 	var __webpack_module_cache__ = {};
48328    /******/
48329    /******/ 	// The require function
48330    /******/ 	function __webpack_require__(moduleId) {
48331        /******/ 		// Check if module is in cache
48332        /******/ 		var cachedModule = __webpack_module_cache__[moduleId];
48333        /******/ 		if (cachedModule !== undefined) {
48334            /******/ 			return cachedModule.exports;
48335            /******/ 		}
48336        /******/ 		// Create a new module (and put it into the cache)
48337        /******/ 		var module = __webpack_module_cache__[moduleId] = {
48338            /******/ 			id: moduleId,
48339            /******/ 			loaded: false,
48340            /******/ 			exports: {}
48341            /******/ 		};
48342        /******/
48343        /******/ 		// Execute the module function
48344        /******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
48345        /******/
48346        /******/ 		// Flag the module as loaded
48347        /******/ 		module.loaded = true;
48348        /******/
48349        /******/ 		// Return the exports of the module
48350        /******/ 		return module.exports;
48351        /******/ 	}
48352    /******/
48353    /******/ 	// expose the modules object (__webpack_modules__)
48354    /******/ 	__webpack_require__.m = __webpack_modules__;
48355    /******/
48356    /************************************************************************/
48357    /******/ 	/* webpack/runtime/chunk loaded */
48358    /******/ 	!function() {
48359        /******/ 		var deferred = [];
48360        /******/ 		__webpack_require__.O = function(result, chunkIds, fn, priority) {
48361            /******/ 			if(chunkIds) {
48362                /******/ 				priority = priority || 0;
48363                /******/ 				for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
48364                /******/ 				deferred[i] = [chunkIds, fn, priority];
48365                /******/ 				return;
48366                /******/ 			}
48367            /******/ 			var notFulfilled = Infinity;
48368            /******/ 			for (var i = 0; i < deferred.length; i++) {
48369                /******/ 				var chunkIds = deferred[i][0];
48370                /******/ 				var fn = deferred[i][1];
48371                /******/ 				var priority = deferred[i][2];
48372                /******/ 				var fulfilled = true;
48373                /******/ 				for (var j = 0; j < chunkIds.length; j++) {
48374                    /******/ 					if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {
48375                        /******/ 						chunkIds.splice(j--, 1);
48376                        /******/ 					} else {
48377                        /******/ 						fulfilled = false;
48378                        /******/ 						if(priority < notFulfilled) notFulfilled = priority;
48379                        /******/ 					}
48380                    /******/ 				}
48381                /******/ 				if(fulfilled) {
48382                    /******/ 					deferred.splice(i--, 1)
48383                    /******/ 					var r = fn();
48384                    /******/ 					if (r !== undefined) result = r;
48385                    /******/ 				}
48386                /******/ 			}
48387            /******/ 			return result;
48388            /******/ 		};
48389        /******/ 	}();
48390    /******/
48391    /******/ 	/* webpack/runtime/compat get default export */
48392    /******/ 	!function() {
48393        /******/ 		// getDefaultExport function for compatibility with non-harmony modules
48394        /******/ 		__webpack_require__.n = function(module) {
48395            /******/ 			var getter = module && module.__esModule ?
48396                /******/ 				function() { return module['default']; } :
48397                /******/ 				function() { return module; };
48398            /******/ 			__webpack_require__.d(getter, { a: getter });
48399            /******/ 			return getter;
48400            /******/ 		};
48401        /******/ 	}();
48402    /******/
48403    /******/ 	/* webpack/runtime/define property getters */
48404    /******/ 	!function() {
48405        /******/ 		// define getter functions for harmony exports
48406        /******/ 		__webpack_require__.d = function(exports, definition) {
48407            /******/ 			for(var key in definition) {
48408                /******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
48409                    /******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
48410                    /******/ 				}
48411                /******/ 			}
48412            /******/ 		};
48413        /******/ 	}();
48414    /******/
48415    /******/ 	/* webpack/runtime/global */
48416    /******/ 	!function() {
48417        /******/ 		__webpack_require__.g = (function() {
48418            /******/ 			if (typeof globalThis === 'object') return globalThis;
48419            /******/ 			try {
48420                /******/ 				return this || new Function('return this')();
48421                /******/ 			} catch (e) {
48422                /******/ 				if (typeof window === 'object') return window;
48423                /******/ 			}
48424            /******/ 		})();
48425        /******/ 	}();
48426    /******/
48427    /******/ 	/* webpack/runtime/hasOwnProperty shorthand */
48428    /******/ 	!function() {
48429        /******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
48430        /******/ 	}();
48431    /******/
48432    /******/ 	/* webpack/runtime/make namespace object */
48433    /******/ 	!function() {
48434        /******/ 		// define __esModule on exports
48435        /******/ 		__webpack_require__.r = function(exports) {
48436            /******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
48437                /******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
48438                /******/ 			}
48439            /******/ 			Object.defineProperty(exports, '__esModule', { value: true });
48440            /******/ 		};
48441        /******/ 	}();
48442    /******/
48443    /******/ 	/* webpack/runtime/node module decorator */
48444    /******/ 	!function() {
48445        /******/ 		__webpack_require__.nmd = function(module) {
48446            /******/ 			module.paths = [];
48447            /******/ 			if (!module.children) module.children = [];
48448            /******/ 			return module;
48449            /******/ 		};
48450        /******/ 	}();
48451    /******/
48452    /******/ 	/* webpack/runtime/jsonp chunk loading */
48453    /******/ 	!function() {
48454        /******/ 		// no baseURI
48455        /******/
48456        /******/ 		// object to store loaded and loading chunks
48457        /******/ 		// undefined = chunk not loaded, null = chunk preloaded/prefetched
48458        /******/ 		// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
48459        /******/ 		var installedChunks = {
48460            /******/ 			"/assets/js/bundle": 0,
48461            /******/ 			"assets/css/style": 0
48462            /******/ 		};
48463        /******/
48464        /******/ 		// no chunk on demand loading
48465        /******/
48466        /******/ 		// no prefetching
48467        /******/
48468        /******/ 		// no preloaded
48469        /******/
48470        /******/ 		// no HMR
48471        /******/
48472        /******/ 		// no HMR manifest
48473        /******/
48474        /******/ 		__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };
48475        /******/
48476        /******/ 		// install a JSONP callback for chunk loading
48477        /******/ 		var webpackJsonpCallback = function(parentChunkLoadingFunction, data) {
48478            /******/ 			var chunkIds = data[0];
48479            /******/ 			var moreModules = data[1];
48480            /******/ 			var runtime = data[2];
48481            /******/ 			// add "moreModules" to the modules object,
48482            /******/ 			// then flag all "chunkIds" as loaded and fire callback
48483            /******/ 			var moduleId, chunkId, i = 0;
48484            /******/ 			if(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {
48485                /******/ 				for(moduleId in moreModules) {
48486                    /******/ 					if(__webpack_require__.o(moreModules, moduleId)) {
48487                        /******/ 						__webpack_require__.m[moduleId] = moreModules[moduleId];
48488                        /******/ 					}
48489                    /******/ 				}
48490                /******/ 				if(runtime) var result = runtime(__webpack_require__);
48491                /******/ 			}
48492            /******/ 			if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
48493            /******/ 			for(;i < chunkIds.length; i++) {
48494                /******/ 				chunkId = chunkIds[i];
48495                /******/ 				if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
48496                    /******/ 					installedChunks[chunkId][0]();
48497                    /******/ 				}
48498                /******/ 				installedChunks[chunkId] = 0;
48499                /******/ 			}
48500            /******/ 			return __webpack_require__.O(result);
48501            /******/ 		}
48502        /******/
48503        /******/ 		var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || [];
48504        /******/ 		chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
48505        /******/ 		chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
48506        /******/ 	}();
48507    /******/
48508    /************************************************************************/
48509    /******/
48510    /******/ 	// startup
48511    /******/ 	// Load entry module and return exports
48512    /******/ 	// This entry module depends on other loaded chunks and execution need to be delayed
48513    /******/ 	__webpack_require__.O(undefined, ["assets/css/style"], function() { return __webpack_require__("./src/js/app.js"); })
48514    /******/ 	var __webpack_exports__ = __webpack_require__.O(undefined, ["assets/css/style"], function() { return __webpack_require__("./src/sass/style.scss"); })
48515    /******/ 	__webpack_exports__ = __webpack_require__.O(__webpack_exports__);
48516    /******/
48517    /******/ })()
48518;
48519
48520$('.zoek-form').keyup(function(){
48521    var keyword = $(this).val(); // Get the keyword entered in the input
48522    if (keyword.length > 2) { // Only search if keyword length > 2
48523        $.ajax({
48524            url: '/Search/find', // PHP endpoint to handle the request
48525            method: 'POST',
48526            data: { keyword: keyword }, // Send the keyword as data
48527            dataType: 'json', // Expect JSON data from the server
48528            success: function (response) {
48529                console.log(response);
48530                // Clear the previous results
48531                $('#zoek-resultaten').empty();
48532
48533                // Check if there are any results
48534                if (response.length > 0) {
48535                    // Loop through the results and append them to the <ul>
48536                    $.each(response, function (index, item) {
48537                        $('#zoek-resultaten').append('<li>' + item + '</li>');
48538                    });
48539                } else {
48540                    $('#zoek-resultaten').append('<li>No results found</li>');
48541                }
48542            },
48543            error: function () {
48544                console.log('An error occurred.');
48545            }
48546        });
48547    } else {
48548        $('#zoek-resultaten').empty(); // Clear results if input is cleared
48549    }
48550});
48551$('[data-mega]').click(function(e){
48552    e.preventDefault();
48553    $('.full-menu').show();
48554    $('.submenu').hide();
48555    var id =  $(this).data('mega');
48556    var color =  $(this).data('color');
48557    $('.full-menu').removeClass('white');
48558    $('.full-menu').removeClass('yellow');
48559    $('.full-menu').removeClass('blue');
48560    $('.full-menu').removeClass('red');
48561    $('.full-menu').addClass(color);
48562    $('.mobile-nav').addClass('showPage2');
48563    $('#' + id).show();
48564    $('.backdrop').addClass('active');
48565});
48566
48567$('.backdrop').click(function(){
48568    $('.full-menu').hide();
48569    $('.backdrop').removeClass('active');
48570});
48571
48572$('.closeMenu').click(function(e){
48573    e.preventDefault();
48574    $('.full-menu').hide();
48575    $('.backdrop').removeClass('active');
48576});
48577
48578function toggleFullSearch(){
48579    search();
48580    $('.nav-items').addClass('isZoeken');
48581}
48582
48583
48584// Escape text from the search JSON before it is concatenated into HTML.
48585// item.preview is the exception: it is HTML that Search.php escapes itself.
48586function escapeHtml(value) {
48587    return String(value == null ? '' : value).replace(/[&<>"']/g, function (c) {
48588        return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
48589    });
48590}
48591
48592function search(query){
48593    $.ajax({
48594        url: '/search/find', // Replace with your endpoint
48595        method: 'POST',
48596        data: { search: query }, // Send the input data
48597        success: function (response) {
48598            // Clear previous results
48599            $('#zoek-resultaten').empty();
48600            $('#zoek-suggesties').empty();
48601
48602            let zoekresultaten;
48603            zoekresultaten = response.search;
48604            if (zoekresultaten) {
48605                zoekresultaten.forEach(function (item) {
48606                    if( item.type ) {
48607                        $('#zoek-resultaten').append('<li><a href="' + escapeHtml(item.url) + '"><div class="type">' + escapeHtml(item.type) + '</div><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>');
48608                    }else{
48609                        $('#zoek-resultaten').append('<li><a href="' + escapeHtml(item.url) + '"><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>');
48610                    }
48611                });
48612            }
48613            let suggesties;
48614            suggesties = response.suggesties;
48615            suggesties.forEach(function (item) {
48616                $('#zoek-suggesties').append('<li><a href="' + escapeHtml(item.url) + '">' + escapeHtml(item.title) + '</a></li>');
48617            });
48618
48619            if (suggesties.length == 0){
48620                $('#suggesties-container').hide();
48621            }else{
48622                $('#suggesties-container').show();
48623            }
48624
48625        },
48626        error: function (xhr) {
48627            console.error('Error:', xhr.responseText); // Log any error
48628        }
48629    });
48630}
48631
48632
48633$('.searchInputFull').keyup(function () {
48634    $.ajax({
48635        url: '/search/find', // Replace with your endpoint
48636        method: 'POST',
48637        data: { search: $('.searchInputFull').val() }, // Send the input data
48638        success: function (response) {
48639            // Clear previous results
48640
48641            let zoekresultaten;
48642            zoekresultaten = response.search;
48643            if (zoekresultaten) {
48644                zoekresultaten.forEach(function (item) {
48645                    if( item.type ) {
48646                        $('#full-search').append('<li><a href="' + escapeHtml(item.url) + '"><div class="type">' + escapeHtml(item.type) + '</div><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>');
48647                    }else{
48648                        $('#full-search').append('<li><a href="' + escapeHtml(item.url) + '"><div class="title">' + escapeHtml(item.title) + '</div><small class="preview">' + item.preview + '</small></a></li>');
48649                    }
48650                });
48651            }
48652        }
48653    });
48654});
48655$('.zoekveld-input').keyup(function () {
48656
48657    let query = $(this).val(); // Get the value of the input field
48658    if (query.length > 0) { $('.nav-items').addClass('isZoeken');}
48659    $('.zoek-resultaten').show();
48660    if (query.length > 1) {
48661        $('#zoek-suggesties').addClass('small');
48662        $('#title-suggesties').hide();
48663        $('header nav ul').show();
48664
48665        $('.zoekveld-header').val($(this).val()).focus();
48666        search(query);
48667    }else{
48668        $('#zoek-suggesties').removeClass('small');
48669        $('#title-suggesties').show();
48670    }
48671});
48672
48673$(document).click(function(event) {
48674    if (!$(event.target).closest('.nav-items').length) {
48675        // Your code to execute when body is clicked, except .zoek-resultaten
48676
48677        $('.nav-items').removeClass('isZoeken');
48678    }
48679});
48680

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.