Plugin Directory

Changeset 3148783


Ignore:
Timestamp:
09/09/2024 03:19:33 PM (18 months ago)
Author:
rashmiwp
Message:

Released version 0.1.1: Added free scroll, wrap-around, draggable, autoPlay speed, overlay, and custom styles for buttons.

Location:
flexi-flick
Files:
36 added
10 edited

Legend:

Unmodified
Added
Removed
  • flexi-flick/trunk/build/index.asset.php

    r3148052 r3148783  
    1 <?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'aa15f71f875ba9b941c8');
     1<?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'b13c703956af4633a37a');
  • flexi-flick/trunk/build/index.js

    r3148052 r3148783  
    5252      type: 'boolean',
    5353      default: true
     54    },
     55    draggable: {
     56      type: 'boolean',
     57      default: false
     58    },
     59    wrapAround: {
     60      type: 'boolean',
     61      default: false
     62    },
     63    freeScroll: {
     64      type: 'boolean',
     65      default: true
     66    },
     67    pauseAutoPlayOnHover: {
     68      type: 'boolean',
     69      default: false
     70    },
     71    autoPlay: {
     72      type: 'number',
     73      // Number input for autoPlay
     74      default: 0
    5475    }
    5576  },
     
    97118    }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, {
    98119      label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Show Arrows', 'flexiflick'),
     120      help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick'),
    99121      checked: attributes.showArrows,
    100122      onChange: value => setAttributes({
     
    103125    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, {
    104126      label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Show Pager', 'flexiflick'),
     127      help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick'),
    105128      checked: attributes.showPager,
    106129      onChange: value => setAttributes({
    107130        showPager: value
    108131      })
     132    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, {
     133      label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Wrap Around', 'flexiflick'),
     134      help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('At the end of cells, wrap-around to the other end for infinite scrolling.', 'flexiflick'),
     135      checked: attributes.wrapAround,
     136      onChange: value => setAttributes({
     137        wrapAround: value
     138      })
     139    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, {
     140      label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Draggable', 'flexiflick'),
     141      help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enables dragging and flicking. Enabled by default when carousel has 2 or more slides. more detail can be found here https://flickity.metafizzy.co/options', 'flexiflick'),
     142      checked: attributes.draggable,
     143      onChange: value => setAttributes({
     144        draggable: value
     145      })
     146    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, {
     147      label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Free Scroll', 'flexiflick'),
     148      help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enables content to be freely scrolled and flicked without aligning cells to an end position.', 'flexiflick'),
     149      checked: attributes.freeScroll,
     150      onChange: value => setAttributes({
     151        freeScroll: value
     152      })
     153    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, {
     154      label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Pause Auto Play On Hover', 'flexiflick'),
     155      help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Auto-playing will pause when the user hovers over the carousel.', 'flexiflick'),
     156      checked: attributes.pauseAutoPlayOnHover,
     157      onChange: value => setAttributes({
     158        pauseAutoPlayOnHover: value
     159      })
     160    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.TextControl, {
     161      label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('AutoPlay Speed (ms)', 'flexiflick'),
     162      help: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_8__.__)('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick'),
     163      value: attributes.autoPlay,
     164      onChange: autoPlay => setAttributes({
     165        autoPlay: parseInt(autoPlay) || 0
     166      }),
     167      type: "number"
    109168    }))), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
    110169      className: "flickity-placeholder"
  • flexi-flick/trunk/build/index.js.map

    r3148052 r3148783  
    1 {"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB;AACU;AACQ;AACe;AACX;AAC+B;AACV;AAC5B;AACD;AAEpC,MAAM;EAAEU;AAAkB,CAAC,GAAGC,EAAE,CAACC,MAAM;AAGvCF,iBAAiB,CAACD,6CAAa,EAAE;EAC7BK,KAAK,EAAEN,mDAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;EAC5CO,IAAI,EAAE,QAAQ;EACdC,QAAQ,EAAE,SAAS;EACnBC,UAAU,EAAE;IACRC,UAAU,EAAE;MACRC,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDC,SAAS,EAAE;MACPF,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb;EACJ,CAAC;EACLE,IAAIA,CAAC;IAAEL,UAAU;IAAEM;EAAc,CAAC,EAAE;IAChC,MAAMC,UAAU,GAAGnB,sEAAa,CAAC,CAAC;IAClC,MAAMoB,SAAS,GAAGvB,0DAAM,CAAC,CAAC;;IAE1B;IACA,MAAMwB,KAAK,GAAGvB,0DAAS,CAAEwB,MAAM,IAAK;MAChC,MAAMC,YAAY,GAAGD,MAAM,CAAC,MAAM,CAAC,CAACE,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,EAAE;QACrFC,QAAQ,EAAE,CAAC;QAAE;QACbC,MAAM,EAAE,IAAI,CAAE;MAClB,CAAC,CAAC;MAEF,IAAIH,YAAY,EAAE;QACd,OAAOA,YAAY,CAACI,GAAG,CAAEC,IAAI,KAAM;UAC/BC,EAAE,EAAED,IAAI,CAACC,EAAE;UACXpB,KAAK,EAAEmB,IAAI,CAACnB,KAAK,CAACqB,QAAQ;UAC1BC,OAAO,EAAEH,IAAI,CAACG,OAAO,CAACD,QAAQ;UAAE;UAChCE,kBAAkB,EAAEJ,IAAI,CAACK,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAEC,UAAU,IAAI;QACjF,CAAC,CAAC,CAAC;MACP;MAEA,OAAO,EAAE;IACb,CAAC,EAAE,EAAE,CAAC;IAENtC,6DAAS,CAAC,MAAM;MACR;MACA,IAAIyB,KAAK,CAACc,MAAM,GAAG,CAAC,IAAIf,SAAS,CAACgB,OAAO,EAAE;QACvC,MAAMC,gBAAgB,GAAG,IAAI1C,iDAAQ,CAACyB,SAAS,CAACgB,OAAO,EAAE;UACrDE,eAAe,EAAE1B,UAAU,CAACC,UAAU;UACtC0B,QAAQ,EAAE3B,UAAU,CAACI;QACzB,CAAC,CAAC;QAEF,OAAO,MAAM;UACTqB,gBAAgB,CAACG,OAAO,CAAC,CAAC;QAC9B,CAAC;MACL;IACJ,CAAC,EAAE,CAAC5B,UAAU,CAACC,UAAU,EAAED,UAAU,CAACI,SAAS,EAAEK,KAAK,CAAC,CAAC;IAG5D,OACIoB,oDAAA;MAAA,GAAStB;IAAU,GACXsB,oDAAA,CAAC1C,sEAAiB,QACd0C,oDAAA,CAACxC,4DAAS;MAACQ,KAAK,EAAEN,mDAAE,CAAC,iBAAiB,EAAE,YAAY;IAAE,GAClDsC,oDAAA,CAACvC,gEAAa;MACVwC,KAAK,EAAEvC,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvCwC,OAAO,EAAE/B,UAAU,CAACC,UAAW;MAC/B+B,QAAQ,EAAGC,KAAK,IAAK3B,aAAa,CAAC;QAAEL,UAAU,EAAEgC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFJ,oDAAA,CAACvC,gEAAa;MACVwC,KAAK,EAAEvC,mDAAE,CAAC,YAAY,EAAE,YAAY,CAAE;MACtCwC,OAAO,EAAE/B,UAAU,CAACI,SAAU;MAC9B4B,QAAQ,EAAGC,KAAK,IAAK3B,aAAa,CAAC;QAAEF,SAAS,EAAE6B;MAAM,CAAC;IAAE,CAC5D,CACM,CACI,CAAC,EACpBJ,oDAAA;MAAKK,SAAS,EAAC;IAAsB,GACjCL,oDAAA;MAAMM,GAAG,EAAE3B;IAAU,GACbqB,oDAAA;MAAKK,SAAS,EAAC;IAA8B,GACzCL,oDAAA,aAAI,qCAAuC,CAAC,EAC5CA,oDAAA,YAAG,sCAAuC,CAAC,EAC3CA,oDAAA,YAAI,iBAAiB7B,UAAU,CAACC,UAAU,GAAG,MAAM,GAAG,OAAO,IAAQ,CAAC,EACtE4B,oDAAA,YAAI,gBAAgB7B,UAAU,CAACI,SAAS,GAAG,MAAM,GAAG,OAAO,IAAQ,CAClE,CACR,CACJ,CACJ,CAAC;EAEd,CAAC;EACDgC,IAAIA,CAAA,EAAG;IACH,OAAO,IAAI,CAAC,CAAC;EACjB;AACJ,CAAC,CAAC;;;;;;;;;;ACjGF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnGF;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,SAAS;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0CAA0C,UAAU,KAAK,eAAe,IAAI,MAAM;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN,IAAI;AACJ;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnMF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACzIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,8DAAgB;AACtD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW,uBAAuB,WAAW;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7KF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,qDAAU;AAChD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACtDF;AACA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,qDAAU;AAC1B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,oDAAS;AACzB,QAAQ,mBAAO,CAAC,wDAAW;AAC3B;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;AACA;;AAEA;AACA,QAAQ,4BAA4B;AACpC,MAAM,SAAS;;AAEf;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D,wBAAwB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAgC;AACxC;AACA;AACA,kCAAkC;AAClC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,gCAAgC;AAC3C,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAQ,yBAAyB;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,yBAAyB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,OAAO;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;;AAEA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,yCAAyC,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA,uBAAuB,qBAAqB;AAC5C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,MAAM,gBAAgB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACt3BF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,8CAA8C;AAC9C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,QAAQ,aAAa;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ,IAAI,WAAW,OAAO,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnSF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,iEAAc;AAC9B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACrCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAyB;AAC9B,mBAAmB,mBAAO,CAAC,kDAAQ;AACnC,EAAE,mBAAO,CAAC,kDAAQ;AAClB,EAAE,mBAAO,CAAC,0EAAoB;AAC9B,EAAE,mBAAO,CAAC,4DAAa;AACvB,EAAE,mBAAO,CAAC,sDAAU;AACpB,EAAE,mBAAO,CAAC,wEAAmB;AAC7B,EAAE,mBAAO,CAAC,0DAAY;AACtB,EAAE,mBAAO,CAAC,kEAAgB;;AAE1B;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA,uBAAuB,SAAS;AAChC,0BAA0B,SAAS;AACnC,2BAA2B,SAAS,SAAS,YAAY;AACzD,SAAS,eAAe,YAAY,eAAe;;AAEnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACjKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,eAAe;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ,yBAAyB;;AAEjC;AACA,cAAc,GAAG;AACjB,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG;AACX,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;;AAEA,QAAQ,0BAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7DF;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,sCAAsC,mBAAO,CAAC,2DAAY;AAC1D,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;AACF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oBAAoB;AAC/B,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;;AC9UF;;;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;AChSF;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC7BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UEnDA;UACA;UACA;UACA;UACA","sources":["webpack://flexiflick/./src/index.js","webpack://flexiflick/./node_modules/ev-emitter/ev-emitter.js","webpack://flexiflick/./node_modules/fizzy-ui-utils/utils.js","webpack://flexiflick/./node_modules/flickity/js/add-remove-cell.js","webpack://flexiflick/./node_modules/flickity/js/animate.js","webpack://flexiflick/./node_modules/flickity/js/cell.js","webpack://flexiflick/./node_modules/flickity/js/core.js","webpack://flexiflick/./node_modules/flickity/js/drag.js","webpack://flexiflick/./node_modules/flickity/js/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/js/index.js","webpack://flexiflick/./node_modules/flickity/js/lazyload.js","webpack://flexiflick/./node_modules/flickity/js/page-dots.js","webpack://flexiflick/./node_modules/flickity/js/player.js","webpack://flexiflick/./node_modules/flickity/js/prev-next-button.js","webpack://flexiflick/./node_modules/flickity/js/slide.js","webpack://flexiflick/./node_modules/get-size/get-size.js","webpack://flexiflick/./node_modules/imagesloaded/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/dist/flickity.min.css","webpack://flexiflick/./src/style.scss","webpack://flexiflick/./node_modules/unidragger/unidragger.js","webpack://flexiflick/external window \"React\"","webpack://flexiflick/external window [\"wp\",\"blockEditor\"]","webpack://flexiflick/external window [\"wp\",\"components\"]","webpack://flexiflick/external window [\"wp\",\"data\"]","webpack://flexiflick/external window [\"wp\",\"element\"]","webpack://flexiflick/external window [\"wp\",\"i18n\"]","webpack://flexiflick/webpack/bootstrap","webpack://flexiflick/webpack/runtime/chunk loaded","webpack://flexiflick/webpack/runtime/compat get default export","webpack://flexiflick/webpack/runtime/define property getters","webpack://flexiflick/webpack/runtime/hasOwnProperty shorthand","webpack://flexiflick/webpack/runtime/make namespace object","webpack://flexiflick/webpack/runtime/jsonp chunk loading","webpack://flexiflick/webpack/before-startup","webpack://flexiflick/webpack/startup","webpack://flexiflick/webpack/after-startup"],"sourcesContent":["import './style.scss';\nimport Flickity from 'flickity';\nimport 'flickity/dist/flickity.min.css';\nimport { useEffect, useRef } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { InspectorControls, useBlockProps } from '@wordpress/block-editor';\nimport { PanelBody, ToggleControl } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport metadata from './block.json';\n\nconst { registerBlockType } = wp.blocks;\n\n\nregisterBlockType(metadata.name, {\n    title: __('FlexiFlick Slider', 'flexiflick'),\n    icon: 'slides',\n    category: 'widgets',\n    attributes: {\n        showArrows: {\n            type: 'boolean',\n            default: true,\n        },\n        showPager: {\n            type: 'boolean',\n            default: true,\n        },\n    },\nedit({ attributes, setAttributes }) {\n    const blockProps = useBlockProps();\n    const sliderRef = useRef();\n\n    // Fetch the custom post type content\n    const posts = useSelect((select) => {\n        const fetchedPosts = select('core').getEntityRecords('postType', 'flexiflick_slide_cpt', {\n            per_page: 3, // Limit the number of posts for the preview\n            _embed: true, // Embed related resources, such as the featured media\n        });\n\n        if (fetchedPosts) {\n            return fetchedPosts.map((post) => ({\n                id: post.id,\n                title: post.title.rendered,\n                content: post.content.rendered, // Use the body content instead of the excerpt\n                featured_media_url: post._embedded?.['wp:featuredmedia']?.[0]?.source_url || '',\n            }));\n        }\n\n        return [];\n    }, []);\n\n    useEffect(() => {\n            // Initialize Flickity only if posts are loaded\n            if (posts.length > 0 && sliderRef.current) {\n                const flickityInstance = new Flickity(sliderRef.current, {\n                    prevNextButtons: attributes.showArrows,\n                    pageDots: attributes.showPager,\n                });\n\n                return () => {\n                    flickityInstance.destroy();\n                };\n            }\n        }, [attributes.showArrows, attributes.showPager, posts]);\n\n\n    return (\n        <div {...blockProps}>\n                <InspectorControls>\n                    <PanelBody title={__('Slider Settings', 'flexiflick')}>\n                        <ToggleControl\n                            label={__('Show Arrows', 'flexiflick')}\n                            checked={attributes.showArrows}\n                            onChange={(value) => setAttributes({ showArrows: value })}\n                        />\n                        <ToggleControl\n                            label={__('Show Pager', 'flexiflick')}\n                            checked={attributes.showPager}\n                            onChange={(value) => setAttributes({ showPager: value })}\n                        />\n                    </PanelBody>\n                </InspectorControls>\n                <div className=\"flickity-placeholder\">\n                    <div  ref={sliderRef}>\n                            <div className=\"flickity-placeholder-content\">\n                                <h3>Flickity Responsive Slider/Carousel</h3>\n                                <p>....................................</p>\n                                <p>{`{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`}</p>\n                                <p>{`{ showPager: ${attributes.showPager ? 'True' : 'False'} }`}</p>\n                            </div>\n                    </div>\n                </div>\n            </div>\n    );\n    },\n    save() {\n        return null; // Rendered on the server.\n    },\n});\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // set events hash\n  let events = this._events = this._events || {};\n  // set listeners array\n  let listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( !listeners.includes( listener ) ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  let onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  let index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice( 0 );\n  args = args || [];\n  // once stuff\n  let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( let listener of listeners ) {\n    let isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n  return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( global );\n  } else {\n    // browser global\n    global.fizzyUIUtils = factory( global );\n  }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) return [];\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  let index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( elem.matches( selector ) ) return elem;\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n\n  return elems\n    // check that elem is an actual element\n    .filter( ( elem ) => elem instanceof HTMLElement )\n    .reduce( ( ffElems, elem ) => {\n      // add elem if no selector\n      if ( !selector ) {\n        ffElems.push( elem );\n        return ffElems;\n      }\n      // filter & find items if we have a selector\n      // filter\n      if ( elem.matches( selector ) ) {\n        ffElems.push( elem );\n      }\n      // find children\n      let childElems = elem.querySelectorAll( selector );\n      // concat childElems to filterFound array\n      ffElems = ffElems.concat( ...childElems );\n      return ffElems;\n    }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  let method = _class.prototype[ methodName ];\n  let timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    clearTimeout( this[ timeoutName ] );\n\n    let args = arguments;\n    this[ timeoutName ] = setTimeout( () => {\n      method.apply( this, args );\n      delete this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n  let readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( onDocReady );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', onDocReady );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    let dashedNamespace = utils.toDashed( namespace );\n    let dataAttr = 'data-' + dashedNamespace;\n    let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n    let jQuery = global.jQuery;\n\n    [ ...dataAttrElems ].forEach( ( elem ) => {\n      let attr = elem.getAttribute( dataAttr );\n      let options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n        }\n        return;\n      }\n      // initialize\n      let instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    } );\n\n  } );\n};\n\n// -----  ----- //\n\nreturn utils;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  let fragment = document.createDocumentFragment();\n  cells.forEach( ( cell ) => fragment.appendChild( cell.element ) );\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nlet proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n  let cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  let fragment = getCellsFragment( cells );\n  // append to slider\n  let isAppend = index === len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    let insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    let endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index );\n  this.positionSliderAtSelected();\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n  let cells = this.getCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( ( cell ) => {\n    cell.remove();\n    let index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  } );\n\n  this.cellChange( minCellIndex );\n  this.positionSliderAtSelected();\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  let cell = this.getCell( elem );\n  if ( !cell ) return;\n\n  cell.getSize();\n\n  let index = this.cells.indexOf( cell );\n  this.cellChange( index );\n  // do not position slider after lazy load\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex ) {\n  let prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex, try to maintain position & select previous selected element\n  let cell = this.getCell( prevSelectedElem );\n  if ( cell ) this.selectedIndex = this.getCellSlideIndex( cell );\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('fizzy-ui-utils') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory( window.fizzyUIUtils );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( utils ) {\n\n// -------------------------- animate -------------------------- //\n\nlet proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) return;\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  let previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) requestAnimationFrame( () => this.animate() );\n};\n\nproto.positionSlider = function() {\n  let x = this.x;\n  // wrap position around\n  if ( this.isWrapping ) {\n    x = utils.modulo( x, this.slideableWidth ) - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  if ( this.options.rightToLeft ) x = -x;\n  let translateX = this.getPositionValue( x );\n  // use 3D transforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    `translate3d(${translateX},0,0)` : `translateX(${translateX})`;\n};\n\nproto.dispatchScrollEvent = function() {\n  let firstSlide = this.slides[0];\n  if ( !firstSlide ) return;\n\n  let positionX = -this.x - firstSlide.target;\n  let progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) return;\n\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  let isResting = !this.isPointerDown &&\n      Math.round( this.x * 100 ) === Math.round( previousX * 100 );\n  if ( isResting ) this.restingFrames++;\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  let beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  let afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  cells.forEach( ( cell ) => {\n    let cellShift = gap > 0 ? shift : 0;\n    this._wrapShiftCell( cell, cellShift );\n    gap -= cell.size.outerWidth;\n  } );\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) return;\n\n  cells.forEach( ( cell ) => this._wrapShiftCell( cell, 0 ) );\n};\n\n// @param {Integer} shift - 0, 1, or -1\nproto._wrapShiftCell = function( cell, shift ) {\n  this._renderCellPosition( cell, cell.x + this.slideableWidth * shift );\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) return;\n\n  // change the position to drag position by applying force\n  let dragVelocity = this.dragX - this.x;\n  let dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  let dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) return;\n\n  let distance = this.selectedSlide.target * -1 - this.x;\n  let force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('get-size') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory( window.getSize );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( getSize ) {\n\nconst cellClassName = 'flickity-cell';\n\nfunction Cell( elem ) {\n  this.element = elem;\n  this.element.classList.add( cellClassName );\n\n  this.x = 0;\n  this.unselect();\n}\n\nlet proto = Cell.prototype;\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.classList.remove( cellClassName );\n  this.element.style.transform = '';\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\nproto.remove = function() {\n  this.element.remove();\n};\n\nreturn Cell;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n        require('get-size'),\n        require('fizzy-ui-utils'),\n        require('./cell'),\n        require('./slide'),\n        require('./animate'),\n    );\n  } else {\n    // browser global\n    let _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n        window,\n        window.EvEmitter,\n        window.getSize,\n        window.fizzyUIUtils,\n        _Flickity.Cell,\n        _Flickity.Slide,\n        _Flickity.animatePrototype,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n/* eslint-enable max-params */\n\n// vars\nconst { getComputedStyle, console } = window;\nlet { jQuery } = window;\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;\n// internal store of all Flickity intances\nlet instances = {};\n\nfunction Flickity( element, options ) {\n  let queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) console.error(`Bad element for Flickity: ${queryElement || element}`);\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    let instance = instances[ this.element.flickityGUID ];\n    if ( instance ) instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = { ...this.constructor.defaults };\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true,\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.create = {};\n\nlet proto = Flickity.prototype;\n// inherit EventEmitter\nObject.assign( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  let { resize, watchCSS, rightToLeft } = this.options;\n  // add id for Flickity.data\n  let id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.beginMargin = rightToLeft ? 'marginRight' : 'marginLeft';\n  this.endMargin = rightToLeft ? 'marginLeft' : 'marginRight';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n  // used for keyboard navigation\n  this.focusableElems = [ this.element ];\n\n  if ( resize || watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( let eventName in this.options.on ) {\n    let listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  for ( let method in Flickity.create ) {\n    Flickity.create[ method ].call( this );\n  }\n\n  if ( watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n  Object.assign( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) return;\n\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  let cellElems = this._filterFindCellElements( this.element.children );\n  this.slider.append( ...cellElems );\n  this.viewport.append( this.slider );\n  this.element.append( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  let slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  let cellElems = this._filterFindCellElements( elems );\n\n  // create new Cells for collection\n  return cellElems.map( ( cellElem ) => new Cell( cellElem ) );\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  let cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    let startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n\n  this.cells.slice( index ).forEach( ( cell ) => {\n    cell.x = cellX;\n    this._renderCellPosition( cell, cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  } );\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = this.cells.length ?\n    this.getLastSlide().target - this.slides[0].target : 0;\n};\n\nproto._renderCellPosition = function( cell, x ) {\n  // render position of cell with in slider\n  let sideOffset = this.options.rightToLeft ? -1 : 1;\n  let renderX = x * sideOffset;\n  if ( this.options.percentPosition ) renderX *= this.size.innerWidth / cell.size.width;\n  let positionValue = this.getPositionValue( renderX );\n  cell.element.style.transform = `translateX( ${positionValue} )`;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( ( cell ) => cell.getSize() );\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) return;\n\n  let { beginMargin, endMargin } = this;\n  let slide = new Slide( beginMargin, endMargin, this.cellAlign );\n  this.slides.push( slide );\n\n  let canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( ( cell, i ) => {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    let slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ endMargin ] );\n\n    if ( canCellFit( i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( beginMargin, endMargin, this.cellAlign );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  } );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  let { groupCells } = this.options;\n  if ( !groupCells ) return () => false;\n\n  if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    let number = parseInt( groupCells, 10 );\n    return ( i ) => ( i % number ) !== 0;\n  }\n  // default, group by width of slide\n  let percent = 1;\n  // parse '75%\n  let percentMatch = typeof groupCells == 'string' && groupCells.match( /^(\\d+)%$/ );\n  if ( percentMatch ) percent = parseInt( percentMatch[1], 10 ) / 100;\n  let groupWidth = ( this.size.innerWidth + 1 ) * percent;\n  return ( i, slideWidth ) => slideWidth <= groupWidth;\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nlet cellAlignShorthands = {\n  left: 0,\n  center: 0.5,\n  right: 1,\n};\n\nproto.setCellAlign = function() {\n  let { cellAlign, rightToLeft } = this.options;\n  let shorthand = cellAlignShorthands[ cellAlign ];\n  this.cellAlign = shorthand !== undefined ? shorthand : cellAlign;\n  if ( rightToLeft ) this.cellAlign = 1 - this.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( !this.options.setGallerySize ) return;\n\n  let height = this.options.adaptiveHeight && this.selectedSlide ?\n    this.selectedSlide.height : this.maxCellHeight;\n  this.viewport.style.height = `${height}px`;\n};\n\nproto._updateWrapShiftCells = function() {\n  // update isWrapping\n  this.isWrapping = this.getIsWrapping();\n  // only for wrap-around\n  if ( !this.isWrapping ) return;\n\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  let beforeGapX = this.cursorPosition;\n  let lastIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( beforeGapX, lastIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  let afterGapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( afterGapX, 0, 1 );\n};\n\nproto.getIsWrapping = function() {\n  let { wrapAround } = this.options;\n  if ( !wrapAround || this.slides.length < 2 ) return false;\n\n  if ( wrapAround !== 'fill' ) return true;\n  // check that slides can fit\n\n  let gapWidth = this.slideableWidth - this.size.innerWidth;\n  if ( gapWidth > this.size.innerWidth ) return true; // gap * 2x big, all good\n  // check that content width - shifting cell is bigger than viewport width\n  for ( let cell of this.cells ) {\n    if ( cell.size.outerWidth > gapWidth ) return false;\n  }\n  return true;\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  let cells = [];\n  while ( gapX > 0 ) {\n    let cell = this.cells[ cellIndex ];\n    if ( !cell ) break;\n\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain & wrap ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  let isContaining = this.options.contain && !this.isWrapping &&\n      this.cells.length;\n  if ( !isContaining ) return;\n\n  let contentWidth = this.slideableWidth - this.getLastCell().size[ this.endMargin ];\n  // content is less than gallery size\n  let isContentSmaller = contentWidth < this.size.innerWidth;\n  if ( isContentSmaller ) {\n    // all cells fit inside gallery\n    this.slides.forEach( ( slide ) => {\n      slide.target = contentWidth * this.cellAlign;\n    } );\n  } else {\n    // contain to bounds\n    let beginBound = this.cursorPosition + this.cells[0].size[ this.beginMargin ];\n    let endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n    this.slides.forEach( ( slide ) => {\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    } );\n  }\n};\n\n// ----- events ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  let emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    let $event = type;\n    if ( event ) {\n      // create jQuery event\n      let jQEvent = new jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\nconst unidraggerEvents = [\n  'dragStart',\n  'dragMove',\n  'dragEnd',\n  'pointerDown',\n  'pointerMove',\n  'pointerEnd',\n  'staticClick',\n];\n\nlet _emitEvent = proto.emitEvent;\nproto.emitEvent = function( eventName, args ) {\n  if ( eventName === 'staticClick' ) {\n    // add cellElem and cellIndex args to staticClick\n    let clickedCell = this.getParentCell( args[0].target );\n    let cellElem = clickedCell && clickedCell.element;\n    let cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n    args = args.concat( cellElem, cellIndex );\n  }\n  // do regular thing\n  _emitEvent.call( this, eventName, args );\n  // duck-punch in jQuery events for Unidragger events\n  let isUnidraggerEvent = unidraggerEvents.includes( eventName );\n  if ( !isUnidraggerEvent || !jQuery || !this.$element ) return;\n\n  eventName += this.options.namespaceJQueryEvents ? '.flickity' : '';\n  let event = args.shift( 0 );\n  let jQEvent = new jQuery.Event( event );\n  jQEvent.type = eventName;\n  this.$element.trigger( jQEvent, args );\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) return;\n\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.isWrapping || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) return;\n\n  let prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index !== prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  if ( !this.isWrapping ) return;\n\n  const { selectedIndex, slideableWidth, slides: { length } } = this;\n  // shift index for wrap, do not wrap dragSelect\n  if ( !this.isDragSelect ) {\n    let wrapIndex = utils.modulo( index, length );\n    // go to shortest\n    let delta = Math.abs( wrapIndex - selectedIndex );\n    let backWrapDelta = Math.abs( ( wrapIndex + length ) - selectedIndex );\n    let forewardWrapDelta = Math.abs( ( wrapIndex - length ) - selectedIndex );\n    if ( backWrapDelta < delta ) {\n      index += length;\n    } else if ( forewardWrapDelta < delta ) {\n      index -= length;\n    }\n  }\n\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= slideableWidth;\n  } else if ( index >= length ) {\n    this.x += slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  let slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) return;\n\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) this.selectedSlide.unselect();\n};\n\nproto.selectInitialIndex = function() {\n  let initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    let cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  let index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  let cell = this.queryCell( value );\n  if ( !cell ) return;\n\n  let index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slide that has cell\n  let cellSlide = this.slides.find( ( slide ) => slide.cells.includes( cell ) );\n  return this.slides.indexOf( cellSlide );\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( let cell of this.cells ) {\n    if ( cell.element === elem ) return cell;\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  return elems.map( ( elem ) => this.getCell( elem ) ).filter( Boolean );\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  let cell = this.getCell( elem );\n  if ( cell ) return cell;\n\n  // try to get parent cell elem\n  let closest = elem.closest('.flickity-slider > *');\n  return this.getCell( closest );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) return this.selectedSlide.getCellElements();\n\n  index = index === undefined ? this.selectedIndex : index;\n\n  let len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements(); // get all\n  }\n\n  let cellElems = [];\n  for ( let i = index - adjCount; i <= index + adjCount; i++ ) {\n    let slideIndex = this.isWrapping ? utils.modulo( i, len ) : i;\n    let slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  // do not select invalid selectors from hash: #123, #/. #791\n  let isSelectorString = typeof selector == 'string' && !selector.match( /^[#.]?[\\d/]/ );\n  if ( isSelectorString ) {\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  // #1177 disable resize behavior when animating or dragging for iOS 15\n  if ( !this.isActive || this.isAnimating || this.isDragging ) return;\n  this.getSize();\n  // wrap values\n  if ( this.isWrapping ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  let selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  if ( !this.options.watchCSS ) return;\n\n  let afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.includes('flickity') ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  let { activeElement } = document;\n  let handler = Flickity.keyboardHandlers[ event.key ];\n  // only work if element is in focus\n  if ( !this.options.accessibility || !activeElement || !handler ) return;\n\n  let isFocused = this.focusableElems.some( ( elem ) => activeElement === elem );\n  if ( isFocused ) handler.call( this );\n};\n\nFlickity.keyboardHandlers = {\n  ArrowLeft: function() {\n    this.uiChange();\n    let leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this[ leftMethod ]();\n  },\n  ArrowRight: function() {\n    this.uiChange();\n    let rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  this.element.focus({ preventScroll: true });\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) return;\n\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( ( cell ) => cell.destroy() );\n  this.viewport.remove();\n  // move child elements back into element\n  this.element.append( ...this.slider.children );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nObject.assign( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  if ( elem ) return instances[ elem.flickityGUID ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n  jQueryBridget( 'flickity', Flickity, jQuery );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./core'),\n        require('unidragger'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n        window,\n        window.Flickity,\n        window.Unidragger,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nObject.assign( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n} );\n\n// -------------------------- drag prototype -------------------------- //\n\nlet proto = Flickity.prototype;\nObject.assign( proto, Unidragger.prototype ); // inherit Unidragger\nproto.touchActionValue = '';\n\n// --------------------------  -------------------------- //\n\nFlickity.create.drag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  this.on( 'pointerDown', this.handlePointerDown );\n  this.on( 'pointerUp', this.handlePointerUp );\n  this.on( 'pointerDown', this.handlePointerDone );\n  this.on( 'dragStart', this.handleDragStart );\n  this.on( 'dragMove', this.handleDragMove );\n  this.on( 'dragEnd', this.handleDragEnd );\n  this.on( 'staticClick', this.handleStaticClick );\n  // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable === '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  this.element.classList.toggle( 'is-draggable', this.isDraggable );\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.handlePointerDown = function( event ) {\n  if ( !this.isDraggable ) {\n    // proceed for staticClick\n    this.bindActivePointerEvents( event );\n    return;\n  }\n\n  let isTouchStart = event.type === 'touchstart';\n  let isTouchPointer = event.pointerType === 'touch';\n  let isFocusNode = event.target.matches('input, textarea, select');\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) event.preventDefault();\n  if ( !isFocusNode ) this.focus();\n  // blur\n  if ( document.activeElement !== this.element ) document.activeElement.blur();\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n  this.bindActivePointerEvents( event );\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.handlePointerUp = function() {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n};\n\nproto.handlePointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.handleDragStart = function() {\n  if ( !this.isDraggable ) return;\n\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n};\n\nproto.handleDragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) return;\n\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  let direction = this.options.rightToLeft ? -1 : 1;\n  // wrap around move. #589\n  if ( this.isWrapping ) moveVector.x %= this.slideableWidth;\n  let dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.isWrapping ) {\n    // slow drag\n    let originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    let endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n  this.dragMoveTime = new Date();\n};\n\nproto.handleDragEnd = function() {\n  if ( !this.isDraggable ) return;\n\n  let { freeScroll } = this.options;\n  if ( freeScroll ) this.isFreeScrolling = true;\n  // set selectedIndex based on where flick will end up\n  let index = this.dragEndRestingSelect();\n\n  if ( freeScroll && !this.isWrapping ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    let restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !freeScroll && index === this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.isWrapping;\n  this.select( index );\n  delete this.isDragSelect;\n};\n\nproto.dragEndRestingSelect = function() {\n  let restingX = this.getRestingPosition();\n  // how far away from selected slide\n  let distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  let positiveResting = this._getClosestResting( restingX, distance, 1 );\n  let negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  return positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  let index = this.selectedIndex;\n  let minDistance = Infinity;\n  let condition = this.options.contain && !this.isWrapping ?\n    // if containing, keep going if distance is equal to minDistance\n    ( dist, minDist ) => dist <= minDist :\n    ( dist, minDist ) => dist < minDist;\n\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) break;\n\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment,\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n  let len = this.slides.length;\n  // wrap around if at least 2 slides\n  let isWrapAround = this.options.wrapAround && len > 1;\n  let slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  let slide = this.slides[ slideIndex ];\n  if ( !slide ) return null;\n\n  // add distance for wrap-around slides\n  let wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  let distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  let delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  let scroll = getScrollPosition();\n  let scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  let scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this.pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset,\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// imagesloaded\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('imagesloaded'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.imagesLoaded,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( Flickity, imagesLoaded ) {\n\nFlickity.create.imagesLoaded = function() {\n  this.on( 'activate', this.imagesLoaded );\n};\n\nFlickity.prototype.imagesLoaded = function() {\n  if ( !this.options.imagesLoaded ) return;\n\n  let onImagesLoadedProgress = ( instance, image ) => {\n    let cell = this.getParentCell( image.img );\n    this.cellSizeChange( cell && cell.element );\n    if ( !this.options.freeScroll ) this.positionSliderAtSelected();\n  };\n  imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v3.0.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2022 Metafizzy\n */\n\nif ( typeof module == 'object' && module.exports ) {\n  const Flickity = require('./core');\n  require('./drag');\n  require('./prev-next-button');\n  require('./page-dots');\n  require('./player');\n  require('./add-remove-cell');\n  require('./lazyload');\n  require('./imagesloaded');\n\n  module.exports = Flickity;\n}\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\nconst lazyAttr = 'data-flickity-lazyload';\nconst lazySrcAttr = `${lazyAttr}-src`;\nconst lazySrcsetAttr = `${lazyAttr}-srcset`;\nconst imgSelector = `img[${lazyAttr}], img[${lazySrcAttr}], ` +\n  `img[${lazySrcsetAttr}], source[${lazySrcsetAttr}]`;\n\nFlickity.create.lazyLoad = function() {\n  this.on( 'select', this.lazyLoad );\n\n  this.handleLazyLoadComplete = this.onLazyLoadComplete.bind( this );\n};\n\nlet proto = Flickity.prototype;\n\nproto.lazyLoad = function() {\n  let { lazyLoad } = this.options;\n  if ( !lazyLoad ) return;\n\n  // get adjacent cells, use lazyLoad option for adjacent count\n  let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  // lazy load images\n  this.getAdjacentCellElements( adjCount )\n    .map( getCellLazyImages )\n    .flat()\n    .forEach( ( img ) => new LazyLoader( img, this.handleLazyLoadComplete ) );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.matches('img') ) {\n    let cellAttr = cellElem.getAttribute( lazyAttr );\n    let cellSrcAttr = cellElem.getAttribute( lazySrcAttr );\n    let cellSrcsetAttr = cellElem.getAttribute( lazySrcsetAttr );\n    if ( cellAttr || cellSrcAttr || cellSrcsetAttr ) {\n      return cellElem;\n    }\n  }\n  // select lazy images in cell\n  return [ ...cellElem.querySelectorAll( imgSelector ) ];\n}\n\nproto.onLazyLoadComplete = function( img, event ) {\n  let cell = this.getParentCell( img );\n  let cellElem = cell && cell.element;\n  this.cellSizeChange( cellElem );\n\n  this.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Function} onComplete - callback function\n */\nfunction LazyLoader( img, onComplete ) {\n  this.img = img;\n  this.onComplete = onComplete;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  let src = this.img.getAttribute( lazyAttr ) ||\n    this.img.getAttribute( lazySrcAttr );\n  let srcset = this.img.getAttribute( lazySrcsetAttr );\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) this.img.setAttribute( 'srcset', srcset );\n  // remove attr\n  this.img.removeAttribute( lazyAttr );\n  this.img.removeAttribute( lazySrcAttr );\n  this.img.removeAttribute( lazySrcsetAttr );\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n  let mediaElem = this.img.parentNode.matches('picture') ? this.img.parentNode : this.img;\n  mediaElem.classList.add( className );\n\n  this.onComplete( this.img, event );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\nfunction PageDots() {\n  // create holder element\n  this.holder = document.createElement('div');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n}\n\nPageDots.prototype.setDots = function( slidesLength ) {\n  // get difference between number of slides and number of dots\n  let delta = slidesLength - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  let newDots = new Array( count ).fill()\n    .map( ( item, i ) => {\n      let dot = document.createElement('button');\n      dot.setAttribute( 'type', 'button' );\n      let num = i + 1 + this.dots.length;\n      dot.className = 'flickity-page-dot';\n      dot.textContent = `View slide ${num}`;\n      return dot;\n    } );\n\n  this.holder.append( ...newDots );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  let removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( ( dot ) => dot.remove() );\n};\n\nPageDots.prototype.updateSelected = function( index ) {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.classList.remove('is-selected');\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) return;\n\n  this.selectedDot = this.dots[ index ];\n  this.selectedDot.classList.add('is-selected');\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pageDots: true,\n} );\n\nFlickity.create.pageDots = function() {\n  if ( !this.options.pageDots ) return;\n\n  this.pageDots = new PageDots();\n  this.handlePageDotsClick = this.onPageDotsClick.bind( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePageDots = function() {\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n  this.pageDots.holder.addEventListener( 'click', this.handlePageDotsClick );\n  this.element.append( this.pageDots.holder );\n};\n\nproto.onPageDotsClick = function( event ) {\n  let index = this.pageDots.dots.indexOf( event.target );\n  if ( index === -1 ) return; // only dot clicks\n\n  this.uiChange();\n  this.select( index );\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected( this.selectedIndex );\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.dots.forEach( ( dot ) => {\n    utils.removeFrom( this.focusableElems, dot );\n  } );\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.holder.remove();\n  this.pageDots.holder.removeEventListener( 'click', this.handlePageDotsClick );\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( autoPlay, onTick ) {\n  this.autoPlay = autoPlay;\n  this.onTick = onTick;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state === 'playing' ) return;\n\n  // do not play if page is hidden, start playing when page is visible\n  let isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state !== 'playing' ) return;\n\n  // default to 3 seconds\n  let time = typeof this.autoPlay == 'number' ? this.autoPlay : 3000;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( () => {\n    this.onTick();\n    this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state === 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state === 'paused' ) this.play();\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  let isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pauseAutoPlayOnHover: true,\n} );\n\nFlickity.create.player = function() {\n  this.player = new Player( this.options.autoPlay, () => {\n    this.next( true );\n  } );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) return;\n\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) return;\n\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\nconst svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( increment, direction, arrowShape ) {\n  this.increment = increment;\n  this.direction = direction;\n  this.isPrevious = increment === 'previous';\n  this.isLeft = direction === 'left';\n  this._create( arrowShape );\n}\n\nPrevNextButton.prototype._create = function( arrowShape ) {\n  // properties\n  let element = this.element = document.createElement('button');\n  element.className = `flickity-button flickity-prev-next-button ${this.increment}`;\n  let label = this.isPrevious ? 'Previous' : 'Next';\n  // prevent button from submitting form https://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  element.setAttribute( 'aria-label', label );\n  // init as disabled\n  this.disable();\n  // create arrow\n  let svg = this.createSVG( label, arrowShape );\n  element.append( svg );\n};\n\nPrevNextButton.prototype.createSVG = function( label, arrowShape ) {\n  let svg = document.createElementNS( svgURI, 'svg' );\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  // add title #1189\n  let title = document.createElementNS( svgURI, 'title' );\n  title.append( label );\n  // add path\n  let path = document.createElementNS( svgURI, 'path' );\n  let pathMovements = getArrowMovements( arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180)' );\n  }\n  svg.append( title, path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) return shape;\n\n  let { x0, x1, x2, x3, y1, y2 } = shape;\n\n  // create movement string\n  return `M ${x0}, 50\n    L ${x1}, ${y1 + 50}\n    L ${x2}, ${y2 + 50}\n    L ${x3}, 50\n    L ${x2}, ${50 - y2}\n    L ${x1}, ${50 - y1}\n    Z`;\n}\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  this.element.removeAttribute('disabled');\n};\n\nPrevNextButton.prototype.disable = function() {\n  this.element.setAttribute( 'disabled', true );\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30,\n  },\n} );\n\nFlickity.create.prevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) return;\n\n  let { rightToLeft, arrowShape } = this.options;\n  let prevDirection = rightToLeft ? 'right' : 'left';\n  let nextDirection = rightToLeft ? 'left' : 'right';\n  this.prevButton = new PrevNextButton( 'previous', prevDirection, arrowShape );\n  this.nextButton = new PrevNextButton( 'next', nextDirection, arrowShape );\n  this.focusableElems.push( this.prevButton.element );\n  this.focusableElems.push( this.nextButton.element );\n\n  this.handlePrevButtonClick = () => {\n    this.uiChange();\n    this.previous();\n  };\n\n  this.handleNextButtonClick = () => {\n    this.uiChange();\n    this.next();\n  };\n\n  this.on( 'activate', this.activatePrevNextButtons );\n  this.on( 'select', this.updatePrevNextButtons );\n};\n\nlet proto = Flickity.prototype;\n\nproto.updatePrevNextButtons = function() {\n  let lastIndex = this.slides.length ? this.slides.length - 1 : 0;\n  this.updatePrevNextButton( this.prevButton, 0 );\n  this.updatePrevNextButton( this.nextButton, lastIndex );\n};\n\nproto.updatePrevNextButton = function( button, disabledIndex ) {\n  // enable is wrapAround and at least 2 slides\n  if ( this.isWrapping && this.slides.length > 1 ) {\n    button.enable();\n    return;\n  }\n\n  let isEnabled = this.selectedIndex !== disabledIndex;\n  button[ isEnabled ? 'enable' : 'disable' ]();\n  // if disabling button that is focused,\n  // shift focus to element to maintain keyboard accessibility\n  let isDisabledFocused = !isEnabled && document.activeElement === button.element;\n  if ( isDisabledFocused ) this.focus();\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.element.addEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.addEventListener( 'click', this.handleNextButtonClick );\n  this.element.append( this.prevButton.element, this.nextButton.element );\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.element.remove();\n  this.nextButton.element.remove();\n  this.prevButton.element.removeEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.removeEventListener( 'click', this.handleNextButtonClick );\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory() {\n\nfunction Slide( beginMargin, endMargin, cellAlign ) {\n  this.beginMargin = beginMargin;\n  this.endMargin = endMargin;\n  this.cellAlign = cellAlign;\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nlet proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length === 1 ) {\n    this.x = cell.x; // x comes from first cell\n    this.firstMargin = cell.size[ this.beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  let lastCell = this.getLastCell();\n  let lastMargin = lastCell ? lastCell.size[ this.endMargin ] : 0;\n  let slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( ( cell ) => cell.select() );\n};\n\nproto.unselect = function() {\n  this.cells.forEach( ( cell ) => cell.unselect() );\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * Infinite Scroll v2.0.4\n * measure size of elements\n * MIT license\n */\n\n( function( window, factory ) {\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n} )( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  let num = parseFloat( value );\n  // not a percent like '100%', and a number\n  let isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\n// -------------------------- measurements -------------------------- //\n\nlet measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth',\n];\n\nlet measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  let size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0,\n  };\n  measurements.forEach( ( measurement ) => {\n    size[ measurement ] = 0;\n  } );\n  return size;\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) elem = document.querySelector( elem );\n\n  // do not proceed on non-objects\n  let isElement = elem && typeof elem == 'object' && elem.nodeType;\n  if ( !isElement ) return;\n\n  let style = getComputedStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) return getZeroSize();\n\n  let size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  measurements.forEach( ( measurement ) => {\n    let value = style[ measurement ];\n    let num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  } );\n\n  let paddingWidth = size.paddingLeft + size.paddingRight;\n  let paddingHeight = size.paddingTop + size.paddingBottom;\n  let marginWidth = size.marginLeft + size.marginRight;\n  let marginHeight = size.marginTop + size.marginBottom;\n  let borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  let borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  // overwrite width and height if we can get it from style\n  let styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingWidth + borderWidth );\n  }\n\n  let styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n} );\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( window, require('ev-emitter') );\n  } else {\n    // browser global\n    window.imagesLoaded = factory( window, window.EvEmitter );\n  }\n\n} )( typeof window !== 'undefined' ? window : this,\n    function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n  // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n  if ( !( this instanceof ImagesLoaded ) ) {\n    return new ImagesLoaded( elem, options, onAlways );\n  }\n  // use elem as selector string\n  let queryElem = elem;\n  if ( typeof elem == 'string' ) {\n    queryElem = document.querySelectorAll( elem );\n  }\n  // bail if bad element\n  if ( !queryElem ) {\n    console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n    return;\n  }\n\n  this.elements = makeArray( queryElem );\n  this.options = {};\n  // shift arguments if no options set\n  if ( typeof options == 'function' ) {\n    onAlways = options;\n  } else {\n    Object.assign( this.options, options );\n  }\n\n  if ( onAlways ) this.on( 'always', onAlways );\n\n  this.getImages();\n  // add jQuery Deferred object\n  if ( $ ) this.jqDeferred = new $.Deferred();\n\n  // HACK check async to allow time to bind listeners\n  setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n  this.images = [];\n\n  // filter & find items if we have an item selector\n  this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n  // filter siblings\n  if ( elem.nodeName === 'IMG' ) {\n    this.addImage( elem );\n  }\n  // get background image on element\n  if ( this.options.background === true ) {\n    this.addElementBackgroundImages( elem );\n  }\n\n  // find children\n  // no non-element nodes, #143\n  let { nodeType } = elem;\n  if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n  let childImgs = elem.querySelectorAll('img');\n  // concat childElems to filterFound array\n  for ( let img of childImgs ) {\n    this.addImage( img );\n  }\n\n  // get child background images\n  if ( typeof this.options.background == 'string' ) {\n    let children = elem.querySelectorAll( this.options.background );\n    for ( let child of children ) {\n      this.addElementBackgroundImages( child );\n    }\n  }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n  let style = getComputedStyle( elem );\n  // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n  if ( !style ) return;\n\n  // get url inside url(\"...\")\n  let matches = reURL.exec( style.backgroundImage );\n  while ( matches !== null ) {\n    let url = matches && matches[2];\n    if ( url ) {\n      this.addBackground( url, elem );\n    }\n    matches = reURL.exec( style.backgroundImage );\n  }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n  let loadingImage = new LoadingImage( img );\n  this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n  let background = new Background( url, elem );\n  this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n  this.progressedCount = 0;\n  this.hasAnyBroken = false;\n  // complete if no images\n  if ( !this.images.length ) {\n    this.complete();\n    return;\n  }\n\n  /* eslint-disable-next-line func-style */\n  let onProgress = ( image, elem, message ) => {\n    // HACK - Chrome triggers event before object properties have changed. #83\n    setTimeout( () => {\n      this.progress( image, elem, message );\n    } );\n  };\n\n  this.images.forEach( function( loadingImage ) {\n    loadingImage.once( 'progress', onProgress );\n    loadingImage.check();\n  } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n  this.progressedCount++;\n  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n  // progress event\n  this.emitEvent( 'progress', [ this, image, elem ] );\n  if ( this.jqDeferred && this.jqDeferred.notify ) {\n    this.jqDeferred.notify( this, image );\n  }\n  // check if completed\n  if ( this.progressedCount === this.images.length ) {\n    this.complete();\n  }\n\n  if ( this.options.debug && console ) {\n    console.log( `progress: ${message}`, image, elem );\n  }\n};\n\nImagesLoaded.prototype.complete = function() {\n  let eventName = this.hasAnyBroken ? 'fail' : 'done';\n  this.isComplete = true;\n  this.emitEvent( eventName, [ this ] );\n  this.emitEvent( 'always', [ this ] );\n  if ( this.jqDeferred ) {\n    let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n    this.jqDeferred[ jqMethod ]( this );\n  }\n};\n\n// --------------------------  -------------------------- //\n\nfunction LoadingImage( img ) {\n  this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n  // If complete is true and browser supports natural sizes,\n  // try to check for image status manually.\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    // report based on naturalWidth\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    return;\n  }\n\n  // If none of the checks above matched, simulate loading on detached element.\n  this.proxyImage = new Image();\n  // add crossOrigin attribute. #204\n  if ( this.img.crossOrigin ) {\n    this.proxyImage.crossOrigin = this.img.crossOrigin;\n  }\n  this.proxyImage.addEventListener( 'load', this );\n  this.proxyImage.addEventListener( 'error', this );\n  // bind to image as well for Firefox. #191\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n  // check for non-zero, non-undefined naturalWidth\n  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n  return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  let { parentNode } = this.img;\n  // emit progress with parent <picture> or self <img>\n  let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n  this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nLoadingImage.prototype.onload = function() {\n  this.confirm( true, 'onload' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n  this.confirm( false, 'onerror' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n  this.proxyImage.removeEventListener( 'load', this );\n  this.proxyImage.removeEventListener( 'error', this );\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n  this.url = url;\n  this.element = element;\n  this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.img.src = this.url;\n  // check if image is already complete\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    this.unbindEvents();\n  }\n};\n\nBackground.prototype.unbindEvents = function() {\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n  jQuery = jQuery || window.jQuery;\n  if ( !jQuery ) return;\n\n  // set local variable\n  $ = jQuery;\n  // $().imagesLoaded()\n  $.fn.imagesLoaded = function( options, onAlways ) {\n    let instance = new ImagesLoaded( this, options, onAlways );\n    return instance.jqDeferred.promise( $( this ) );\n  };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// --------------------------  -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*!\n * Unidragger v3.0.1\n * Draggable base class\n * MIT license\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n        window,\n        window.EvEmitter,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) {\n\nfunction Unidragger() {}\n\n// inherit EvEmitter\nlet proto = Unidragger.prototype = Object.create( EvEmitter.prototype );\n\n// ----- bind start ----- //\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nlet startEvent, activeEvents;\nif ( 'ontouchstart' in window ) {\n  // HACK prefer Touch Events as you can preventDefault on touchstart to\n  // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n  startEvent = 'touchstart';\n  activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ];\n} else if ( window.PointerEvent ) {\n  // Pointer Events\n  startEvent = 'pointerdown';\n  activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ];\n} else {\n  // mouse events\n  startEvent = 'mousedown';\n  activeEvents = [ 'mousemove', 'mouseup' ];\n}\n\n// prototype so it can be overwriteable by Flickity\nproto.touchActionValue = 'none';\n\nproto.bindHandles = function() {\n  this._bindHandles( 'addEventListener', this.touchActionValue );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( 'removeEventListener', '' );\n};\n\n/**\n * Add or remove start event\n * @param {String} bindMethod - addEventListener or removeEventListener\n * @param {String} touchAction - value for touch-action CSS property\n */\nproto._bindHandles = function( bindMethod, touchAction ) {\n  this.handles.forEach( ( handle ) => {\n    handle[ bindMethod ]( startEvent, this );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) handle.style.touchAction = touchAction;\n  } );\n};\n\nproto.bindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.addEventListener( eventName, this );\n  } );\n};\n\nproto.unbindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.removeEventListener( eventName, this );\n  } );\n};\n\n// ----- event handler helpers ----- //\n\n// trigger method with matching pointer\nproto.withPointer = function( methodName, event ) {\n  if ( event.pointerId === this.pointerIdentifier ) {\n    this[ methodName ]( event, event );\n  }\n};\n\n// trigger method with matching touch\nproto.withTouch = function( methodName, event ) {\n  let touch;\n  for ( let changedTouch of event.changedTouches ) {\n    if ( changedTouch.identifier === this.pointerIdentifier ) {\n      touch = changedTouch;\n    }\n  }\n  if ( touch ) this[ methodName ]( event, touch );\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  this.pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this.pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this.pointerDown( event, event );\n};\n\n// nodes that have text fields\nconst cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ];\n// input types that do not have text fields\nconst clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ];\n\n/**\n * any time you set `event, pointer` it refers to:\n * @param {Event} event\n * @param {Event | Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  // dismiss multi-touch taps, right clicks, and clicks on text fields\n  let isCursorNode = cursorNodes.includes( event.target.nodeName );\n  let isClickType = clickTypes.includes( event.target.type );\n  let isOkayElement = !isCursorNode || isClickType;\n  let isOkay = !this.isPointerDown && !event.button && isOkayElement;\n  if ( !isOkay ) return;\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n  // track position for move\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  this.bindActivePointerEvents();\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// ----- move ----- //\n\nproto.onmousemove = function( event ) {\n  this.pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  this.withPointer( 'pointerMove', event );\n};\n\nproto.ontouchmove = function( event ) {\n  this.withTouch( 'pointerMove', event );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  let moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY,\n  };\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  // start drag if pointer has moved far enough to start drag\n  let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector );\n  if ( isDragStarting ) this.dragStart( event, pointer );\n  if ( this.isDragging ) this.dragMove( event, pointer, moveVector );\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- drag ----- //\n\nproto.dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  this.isPreventingClicks = true; // set flag to prevent clicks\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// ----- end ----- //\n\nproto.onmouseup = function( event ) {\n  this.pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  this.withPointer( 'pointerUp', event );\n};\n\nproto.ontouchend = function( event ) {\n  this.withTouch( 'pointerUp', event );\n};\n\nproto.pointerUp = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n\n  if ( this.isDragging ) {\n    this.dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this.staticClick( event, pointer );\n  }\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.isDragging = false; // reset flag\n  // re-enable clicking async\n  setTimeout( () => delete this.isPreventingClicks );\n\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// triggered on pointer up & pointer cancel\nproto.pointerDone = function() {\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n  this.unbindActivePointerEvents();\n  this.emitEvent('pointerDone');\n};\n\n// ----- cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  this.withPointer( 'pointerCancel', event );\n};\n\nproto.ontouchcancel = function( event ) {\n  this.withTouch( 'pointerCancel', event );\n};\n\nproto.pointerCancel = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- click ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) event.preventDefault();\n};\n\n// triggered after pointer down & up with no/tiny movement\nproto.staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  let isMouseup = event.type === 'mouseup';\n  if ( isMouseup && this.isIgnoringMouseUp ) return;\n\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( isMouseup ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 400ms\n    setTimeout( () => {\n      delete this.isIgnoringMouseUp;\n    }, 400 );\n  }\n};\n\n// -----  ----- //\n\nreturn Unidragger;\n\n} ) );\n","module.exports = window[\"React\"];","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0,\n\t\"./style-index\": 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkflexiflick\"] = self[\"webpackChunkflexiflick\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [\"./style-index\"], () => (__webpack_require__(\"./src/index.js\")))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["Flickity","useEffect","useRef","useSelect","InspectorControls","useBlockProps","PanelBody","ToggleControl","__","metadata","registerBlockType","wp","blocks","name","title","icon","category","attributes","showArrows","type","default","showPager","edit","setAttributes","blockProps","sliderRef","posts","select","fetchedPosts","getEntityRecords","per_page","_embed","map","post","id","rendered","content","featured_media_url","_embedded","source_url","length","current","flickityInstance","prevNextButtons","pageDots","destroy","createElement","label","checked","onChange","value","className","ref","save"],"sourceRoot":""}
     1{"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB;AACU;AACQ;AACe;AACX;AAC+B;AACI;AAC1C;AACD;AAEpC,MAAM;EAAEW;AAAkB,CAAC,GAAGC,EAAE,CAACC,MAAM;AAGvCF,iBAAiB,CAACD,6CAAa,EAAE;EAC7BK,KAAK,EAAEN,mDAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;EAC5CO,IAAI,EAAE,QAAQ;EACdC,QAAQ,EAAE,SAAS;EACnBC,UAAU,EAAE;IACRC,UAAU,EAAE;MACRC,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDC,SAAS,EAAE;MACPF,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDE,SAAS,EAAE;MACPH,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDG,UAAU,EAAE;MACRJ,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDI,UAAU,EAAE;MACRL,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDK,oBAAoB,EAAE;MAClBN,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDM,QAAQ,EAAE;MACNP,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb;EACJ,CAAC;EACLO,IAAIA,CAAC;IAAEV,UAAU;IAAEW;EAAc,CAAC,EAAE;IAChC,MAAMC,UAAU,GAAGzB,sEAAa,CAAC,CAAC;IAClC,MAAM0B,SAAS,GAAG7B,0DAAM,CAAC,CAAC;;IAE1B;IACA,MAAM8B,KAAK,GAAG7B,0DAAS,CAAE8B,MAAM,IAAK;MAChC,MAAMC,YAAY,GAAGD,MAAM,CAAC,MAAM,CAAC,CAACE,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,EAAE;QACrFC,QAAQ,EAAE,CAAC;QAAE;QACbC,MAAM,EAAE,IAAI,CAAE;MAClB,CAAC,CAAC;MAEF,IAAIH,YAAY,EAAE;QACd,OAAOA,YAAY,CAACI,GAAG,CAAEC,IAAI,KAAM;UAC/BC,EAAE,EAAED,IAAI,CAACC,EAAE;UACXzB,KAAK,EAAEwB,IAAI,CAACxB,KAAK,CAAC0B,QAAQ;UAC1BC,OAAO,EAAEH,IAAI,CAACG,OAAO,CAACD,QAAQ;UAAE;UAChCE,kBAAkB,EAAEJ,IAAI,CAACK,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAEC,UAAU,IAAI;QACjF,CAAC,CAAC,CAAC;MACP;MAEA,OAAO,EAAE;IACb,CAAC,EAAE,EAAE,CAAC;IAEN5C,6DAAS,CAAC,MAAM;MACR;MACA,IAAI+B,KAAK,CAACc,MAAM,GAAG,CAAC,IAAIf,SAAS,CAACgB,OAAO,EAAE;QACvC,MAAMC,gBAAgB,GAAG,IAAIhD,iDAAQ,CAAC+B,SAAS,CAACgB,OAAO,EAAE;UACrDE,eAAe,EAAE/B,UAAU,CAACC,UAAU;UACtC+B,QAAQ,EAAEhC,UAAU,CAACI;QACzB,CAAC,CAAC;QAEF,OAAO,MAAM;UACT0B,gBAAgB,CAACG,OAAO,CAAC,CAAC;QAC9B,CAAC;MACL;IACJ,CAAC,EAAE,CAACjC,UAAU,CAACC,UAAU,EAAED,UAAU,CAACI,SAAS,EAAEU,KAAK,CAAC,CAAC;IAG5D,OACIoB,oDAAA;MAAA,GAAStB;IAAU,GACXsB,oDAAA,CAAChD,sEAAiB,QACdgD,oDAAA,CAAC9C,4DAAS;MAACS,KAAK,EAAEN,mDAAE,CAAC,iBAAiB,EAAE,YAAY;IAAE,GAClD2C,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC6C,IAAI,EAAE7C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9F8C,OAAO,EAAErC,UAAU,CAACC,UAAW;MAC/BqC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEV,UAAU,EAAEsC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,YAAY,EAAE,YAAY,CAAE;MACtC6C,IAAI,EAAE7C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9F8C,OAAO,EAAErC,UAAU,CAACI,SAAU;MAC9BkC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEP,SAAS,EAAEmC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC6C,IAAI,EAAE7C,mDAAE,CAAC,2EAA2E,EAAE,YAAY,CAAE;MACpG8C,OAAO,EAAErC,UAAU,CAACM,UAAW;MAC/BgC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEL,UAAU,EAAEiC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,WAAW,EAAE,YAAY,CAAE;MACrC6C,IAAI,EAAE7C,mDAAE,CAAC,2JAA2J,EAAE,YAAY,CAAE;MACpL8C,OAAO,EAAErC,UAAU,CAACK,SAAU;MAC9BiC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEN,SAAS,EAAEkC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC6C,IAAI,EAAE7C,mDAAE,CAAC,8FAA8F,EAAE,YAAY,CAAE;MAEvH8C,OAAO,EAAErC,UAAU,CAACO,UAAW;MAC/B+B,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEJ,UAAU,EAAEgC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC7C,gEAAa;MACV8C,KAAK,EAAE5C,mDAAE,CAAC,0BAA0B,EAAE,YAAY,CAAE;MACpD6C,IAAI,EAAE7C,mDAAE,CAAC,iEAAiE,EAAE,YAAY,CAAE;MAC1F8C,OAAO,EAAErC,UAAU,CAACQ,oBAAqB;MACzC8B,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEH,oBAAoB,EAAE+B;MAAM,CAAC;IAAE,CACvE,CAAC,EACFL,oDAAA,CAAC5C,8DAAW;MACR6C,KAAK,EAAE5C,mDAAE,CAAC,qBAAqB,EAAE,YAAY,CAAE;MAC/C6C,IAAI,EAAE7C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9FgD,KAAK,EAAEvC,UAAU,CAACS,QAAS;MAC3B6B,QAAQ,EAAG7B,QAAQ,IAAKE,aAAa,CAAC;QAAEF,QAAQ,EAAE+B,QAAQ,CAAC/B,QAAQ,CAAC,IAAI;MAAE,CAAC,CAAE;MAC7EP,IAAI,EAAC;IAAQ,CAChB,CACM,CACI,CAAC,EACpBgC,oDAAA;MAAKO,SAAS,EAAC;IAAsB,GACjCP,oDAAA;MAAMQ,GAAG,EAAE7B;IAAU,GACbqB,oDAAA;MAAKO,SAAS,EAAC;IAA8B,GACzCP,oDAAA,aAAI,qCAAuC,CAAC,EAC5CA,oDAAA,YAAG,sCAAuC,CAAC,EAC3CA,oDAAA,YAAI,iBAAiBlC,UAAU,CAACC,UAAU,GAAG,MAAM,GAAG,OAAO,IAAQ,CAAC,EACtEiC,oDAAA,YAAI,gBAAgBlC,UAAU,CAACI,SAAS,GAAG,MAAM,GAAG,OAAO,IAAQ,CAClE,CACR,CACJ,CACJ,CAAC;EAEd,CAAC;EACDuC,IAAIA,CAAA,EAAG;IACH,OAAO,IAAI,CAAC,CAAC;EACjB;AACJ,CAAC,CAAC;;;;;;;;;;ACvJF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnGF;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,SAAS;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0CAA0C,UAAU,KAAK,eAAe,IAAI,MAAM;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN,IAAI;AACJ;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnMF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACzIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,8DAAgB;AACtD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW,uBAAuB,WAAW;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7KF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,qDAAU;AAChD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACtDF;AACA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,qDAAU;AAC1B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,oDAAS;AACzB,QAAQ,mBAAO,CAAC,wDAAW;AAC3B;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;AACA;;AAEA;AACA,QAAQ,4BAA4B;AACpC,MAAM,SAAS;;AAEf;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D,wBAAwB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAgC;AACxC;AACA;AACA,kCAAkC;AAClC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,gCAAgC;AAC3C,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAQ,yBAAyB;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,yBAAyB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,OAAO;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;;AAEA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,yCAAyC,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA,uBAAuB,qBAAqB;AAC5C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,MAAM,gBAAgB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACt3BF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,8CAA8C;AAC9C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,QAAQ,aAAa;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ,IAAI,WAAW,OAAO,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnSF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,iEAAc;AAC9B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACrCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAyB;AAC9B,mBAAmB,mBAAO,CAAC,kDAAQ;AACnC,EAAE,mBAAO,CAAC,kDAAQ;AAClB,EAAE,mBAAO,CAAC,0EAAoB;AAC9B,EAAE,mBAAO,CAAC,4DAAa;AACvB,EAAE,mBAAO,CAAC,sDAAU;AACpB,EAAE,mBAAO,CAAC,wEAAmB;AAC7B,EAAE,mBAAO,CAAC,0DAAY;AACtB,EAAE,mBAAO,CAAC,kEAAgB;;AAE1B;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA,uBAAuB,SAAS;AAChC,0BAA0B,SAAS;AACnC,2BAA2B,SAAS,SAAS,YAAY;AACzD,SAAS,eAAe,YAAY,eAAe;;AAEnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACjKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,eAAe;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ,yBAAyB;;AAEjC;AACA,cAAc,GAAG;AACjB,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG;AACX,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;;AAEA,QAAQ,0BAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7DF;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,sCAAsC,mBAAO,CAAC,2DAAY;AAC1D,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;AACF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oBAAoB;AAC/B,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;;AC9UF;;;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;AChSF;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC7BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UEnDA;UACA;UACA;UACA;UACA","sources":["webpack://flexiflick/./src/index.js","webpack://flexiflick/./node_modules/ev-emitter/ev-emitter.js","webpack://flexiflick/./node_modules/fizzy-ui-utils/utils.js","webpack://flexiflick/./node_modules/flickity/js/add-remove-cell.js","webpack://flexiflick/./node_modules/flickity/js/animate.js","webpack://flexiflick/./node_modules/flickity/js/cell.js","webpack://flexiflick/./node_modules/flickity/js/core.js","webpack://flexiflick/./node_modules/flickity/js/drag.js","webpack://flexiflick/./node_modules/flickity/js/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/js/index.js","webpack://flexiflick/./node_modules/flickity/js/lazyload.js","webpack://flexiflick/./node_modules/flickity/js/page-dots.js","webpack://flexiflick/./node_modules/flickity/js/player.js","webpack://flexiflick/./node_modules/flickity/js/prev-next-button.js","webpack://flexiflick/./node_modules/flickity/js/slide.js","webpack://flexiflick/./node_modules/get-size/get-size.js","webpack://flexiflick/./node_modules/imagesloaded/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/dist/flickity.min.css","webpack://flexiflick/./src/style.scss?75bd","webpack://flexiflick/./node_modules/unidragger/unidragger.js","webpack://flexiflick/external window \"React\"","webpack://flexiflick/external window [\"wp\",\"blockEditor\"]","webpack://flexiflick/external window [\"wp\",\"components\"]","webpack://flexiflick/external window [\"wp\",\"data\"]","webpack://flexiflick/external window [\"wp\",\"element\"]","webpack://flexiflick/external window [\"wp\",\"i18n\"]","webpack://flexiflick/webpack/bootstrap","webpack://flexiflick/webpack/runtime/chunk loaded","webpack://flexiflick/webpack/runtime/compat get default export","webpack://flexiflick/webpack/runtime/define property getters","webpack://flexiflick/webpack/runtime/hasOwnProperty shorthand","webpack://flexiflick/webpack/runtime/make namespace object","webpack://flexiflick/webpack/runtime/jsonp chunk loading","webpack://flexiflick/webpack/before-startup","webpack://flexiflick/webpack/startup","webpack://flexiflick/webpack/after-startup"],"sourcesContent":["import './style.scss';\nimport Flickity from 'flickity';\nimport 'flickity/dist/flickity.min.css';\nimport { useEffect, useRef } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { InspectorControls, useBlockProps } from '@wordpress/block-editor';\nimport { PanelBody, ToggleControl, TextControl  } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport metadata from './block.json';\n\nconst { registerBlockType } = wp.blocks;\n\n\nregisterBlockType(metadata.name, {\n    title: __('FlexiFlick Slider', 'flexiflick'),\n    icon: 'slides',\n    category: 'widgets',\n    attributes: {\n        showArrows: {\n            type: 'boolean',\n            default: true,\n        },\n        showPager: {\n            type: 'boolean',\n            default: true,\n        },\n        draggable: {\n            type: 'boolean',\n            default: false,\n        },\n        wrapAround: {\n            type: 'boolean',\n            default: false,\n        },\n        freeScroll: {\n            type: 'boolean',\n            default: true,\n        },\n        pauseAutoPlayOnHover: {\n            type: 'boolean',\n            default: false,\n        },\n        autoPlay: {\n            type: 'number',   // Number input for autoPlay\n            default: 0,\n        },\n    },\nedit({ attributes, setAttributes }) {\n    const blockProps = useBlockProps();\n    const sliderRef = useRef();\n\n    // Fetch the custom post type content\n    const posts = useSelect((select) => {\n        const fetchedPosts = select('core').getEntityRecords('postType', 'flexiflick_slide_cpt', {\n            per_page: 3, // Limit the number of posts for the preview\n            _embed: true, // Embed related resources, such as the featured media\n        });\n\n        if (fetchedPosts) {\n            return fetchedPosts.map((post) => ({\n                id: post.id,\n                title: post.title.rendered,\n                content: post.content.rendered, // Use the body content instead of the excerpt\n                featured_media_url: post._embedded?.['wp:featuredmedia']?.[0]?.source_url || '',\n            }));\n        }\n\n        return [];\n    }, []);\n\n    useEffect(() => {\n            // Initialize Flickity only if posts are loaded\n            if (posts.length > 0 && sliderRef.current) {\n                const flickityInstance = new Flickity(sliderRef.current, {\n                    prevNextButtons: attributes.showArrows,\n                    pageDots: attributes.showPager,\n                });\n\n                return () => {\n                    flickityInstance.destroy();\n                };\n            }\n        }, [attributes.showArrows, attributes.showPager, posts]);\n\n\n    return (\n        <div {...blockProps}>\n                <InspectorControls>\n                    <PanelBody title={__('Slider Settings', 'flexiflick')}>\n                        <ToggleControl\n                            label={__('Show Arrows', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            checked={attributes.showArrows}\n                            onChange={(value) => setAttributes({ showArrows: value })}\n                        />\n                        <ToggleControl\n                            label={__('Show Pager', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            checked={attributes.showPager}\n                            onChange={(value) => setAttributes({ showPager: value })}\n                        />\n                        <ToggleControl\n                            label={__('Wrap Around', 'flexiflick')}\n                            help={__('At the end of cells, wrap-around to the other end for infinite scrolling.', 'flexiflick')}\n                            checked={attributes.wrapAround}\n                            onChange={(value) => setAttributes({ wrapAround: value })}\n                        />\n                        <ToggleControl\n                            label={__('Draggable', 'flexiflick')}\n                            help={__('Enables dragging and flicking. Enabled by default when carousel has 2 or more slides. more detail can be found here https://flickity.metafizzy.co/options', 'flexiflick')}\n                            checked={attributes.draggable}\n                            onChange={(value) => setAttributes({ draggable: value })}\n                        />\n                        <ToggleControl\n                            label={__('Free Scroll', 'flexiflick')}\n                            help={__('Enables content to be freely scrolled and flicked without aligning cells to an end position.', 'flexiflick')}\n\n                            checked={attributes.freeScroll}\n                            onChange={(value) => setAttributes({ freeScroll: value })}\n                        />\n                        <ToggleControl\n                            label={__('Pause Auto Play On Hover', 'flexiflick')}\n                            help={__('Auto-playing will pause when the user hovers over the carousel.', 'flexiflick')}\n                            checked={attributes.pauseAutoPlayOnHover}\n                            onChange={(value) => setAttributes({ pauseAutoPlayOnHover: value })}\n                        />\n                        <TextControl\n                            label={__('AutoPlay Speed (ms)', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            value={attributes.autoPlay}\n                            onChange={(autoPlay) => setAttributes({ autoPlay: parseInt(autoPlay) || 0 })}\n                            type=\"number\"\n                        />\n                    </PanelBody>\n                </InspectorControls>\n                <div className=\"flickity-placeholder\">\n                    <div  ref={sliderRef}>\n                            <div className=\"flickity-placeholder-content\">\n                                <h3>Flickity Responsive Slider/Carousel</h3>\n                                <p>....................................</p>\n                                <p>{`{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`}</p>\n                                <p>{`{ showPager: ${attributes.showPager ? 'True' : 'False'} }`}</p>\n                            </div>\n                    </div>\n                </div>\n            </div>\n    );\n    },\n    save() {\n        return null; // Rendered on the server.\n    },\n});\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // set events hash\n  let events = this._events = this._events || {};\n  // set listeners array\n  let listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( !listeners.includes( listener ) ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  let onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  let index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice( 0 );\n  args = args || [];\n  // once stuff\n  let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( let listener of listeners ) {\n    let isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n  return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( global );\n  } else {\n    // browser global\n    global.fizzyUIUtils = factory( global );\n  }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) return [];\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  let index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( elem.matches( selector ) ) return elem;\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n\n  return elems\n    // check that elem is an actual element\n    .filter( ( elem ) => elem instanceof HTMLElement )\n    .reduce( ( ffElems, elem ) => {\n      // add elem if no selector\n      if ( !selector ) {\n        ffElems.push( elem );\n        return ffElems;\n      }\n      // filter & find items if we have a selector\n      // filter\n      if ( elem.matches( selector ) ) {\n        ffElems.push( elem );\n      }\n      // find children\n      let childElems = elem.querySelectorAll( selector );\n      // concat childElems to filterFound array\n      ffElems = ffElems.concat( ...childElems );\n      return ffElems;\n    }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  let method = _class.prototype[ methodName ];\n  let timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    clearTimeout( this[ timeoutName ] );\n\n    let args = arguments;\n    this[ timeoutName ] = setTimeout( () => {\n      method.apply( this, args );\n      delete this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n  let readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( onDocReady );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', onDocReady );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    let dashedNamespace = utils.toDashed( namespace );\n    let dataAttr = 'data-' + dashedNamespace;\n    let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n    let jQuery = global.jQuery;\n\n    [ ...dataAttrElems ].forEach( ( elem ) => {\n      let attr = elem.getAttribute( dataAttr );\n      let options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n        }\n        return;\n      }\n      // initialize\n      let instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    } );\n\n  } );\n};\n\n// -----  ----- //\n\nreturn utils;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  let fragment = document.createDocumentFragment();\n  cells.forEach( ( cell ) => fragment.appendChild( cell.element ) );\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nlet proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n  let cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  let fragment = getCellsFragment( cells );\n  // append to slider\n  let isAppend = index === len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    let insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    let endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index );\n  this.positionSliderAtSelected();\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n  let cells = this.getCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( ( cell ) => {\n    cell.remove();\n    let index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  } );\n\n  this.cellChange( minCellIndex );\n  this.positionSliderAtSelected();\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  let cell = this.getCell( elem );\n  if ( !cell ) return;\n\n  cell.getSize();\n\n  let index = this.cells.indexOf( cell );\n  this.cellChange( index );\n  // do not position slider after lazy load\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex ) {\n  let prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex, try to maintain position & select previous selected element\n  let cell = this.getCell( prevSelectedElem );\n  if ( cell ) this.selectedIndex = this.getCellSlideIndex( cell );\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('fizzy-ui-utils') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory( window.fizzyUIUtils );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( utils ) {\n\n// -------------------------- animate -------------------------- //\n\nlet proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) return;\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  let previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) requestAnimationFrame( () => this.animate() );\n};\n\nproto.positionSlider = function() {\n  let x = this.x;\n  // wrap position around\n  if ( this.isWrapping ) {\n    x = utils.modulo( x, this.slideableWidth ) - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  if ( this.options.rightToLeft ) x = -x;\n  let translateX = this.getPositionValue( x );\n  // use 3D transforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    `translate3d(${translateX},0,0)` : `translateX(${translateX})`;\n};\n\nproto.dispatchScrollEvent = function() {\n  let firstSlide = this.slides[0];\n  if ( !firstSlide ) return;\n\n  let positionX = -this.x - firstSlide.target;\n  let progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) return;\n\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  let isResting = !this.isPointerDown &&\n      Math.round( this.x * 100 ) === Math.round( previousX * 100 );\n  if ( isResting ) this.restingFrames++;\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  let beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  let afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  cells.forEach( ( cell ) => {\n    let cellShift = gap > 0 ? shift : 0;\n    this._wrapShiftCell( cell, cellShift );\n    gap -= cell.size.outerWidth;\n  } );\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) return;\n\n  cells.forEach( ( cell ) => this._wrapShiftCell( cell, 0 ) );\n};\n\n// @param {Integer} shift - 0, 1, or -1\nproto._wrapShiftCell = function( cell, shift ) {\n  this._renderCellPosition( cell, cell.x + this.slideableWidth * shift );\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) return;\n\n  // change the position to drag position by applying force\n  let dragVelocity = this.dragX - this.x;\n  let dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  let dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) return;\n\n  let distance = this.selectedSlide.target * -1 - this.x;\n  let force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('get-size') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory( window.getSize );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( getSize ) {\n\nconst cellClassName = 'flickity-cell';\n\nfunction Cell( elem ) {\n  this.element = elem;\n  this.element.classList.add( cellClassName );\n\n  this.x = 0;\n  this.unselect();\n}\n\nlet proto = Cell.prototype;\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.classList.remove( cellClassName );\n  this.element.style.transform = '';\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\nproto.remove = function() {\n  this.element.remove();\n};\n\nreturn Cell;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n        require('get-size'),\n        require('fizzy-ui-utils'),\n        require('./cell'),\n        require('./slide'),\n        require('./animate'),\n    );\n  } else {\n    // browser global\n    let _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n        window,\n        window.EvEmitter,\n        window.getSize,\n        window.fizzyUIUtils,\n        _Flickity.Cell,\n        _Flickity.Slide,\n        _Flickity.animatePrototype,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n/* eslint-enable max-params */\n\n// vars\nconst { getComputedStyle, console } = window;\nlet { jQuery } = window;\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;\n// internal store of all Flickity intances\nlet instances = {};\n\nfunction Flickity( element, options ) {\n  let queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) console.error(`Bad element for Flickity: ${queryElement || element}`);\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    let instance = instances[ this.element.flickityGUID ];\n    if ( instance ) instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = { ...this.constructor.defaults };\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true,\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.create = {};\n\nlet proto = Flickity.prototype;\n// inherit EventEmitter\nObject.assign( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  let { resize, watchCSS, rightToLeft } = this.options;\n  // add id for Flickity.data\n  let id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.beginMargin = rightToLeft ? 'marginRight' : 'marginLeft';\n  this.endMargin = rightToLeft ? 'marginLeft' : 'marginRight';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n  // used for keyboard navigation\n  this.focusableElems = [ this.element ];\n\n  if ( resize || watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( let eventName in this.options.on ) {\n    let listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  for ( let method in Flickity.create ) {\n    Flickity.create[ method ].call( this );\n  }\n\n  if ( watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n  Object.assign( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) return;\n\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  let cellElems = this._filterFindCellElements( this.element.children );\n  this.slider.append( ...cellElems );\n  this.viewport.append( this.slider );\n  this.element.append( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  let slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  let cellElems = this._filterFindCellElements( elems );\n\n  // create new Cells for collection\n  return cellElems.map( ( cellElem ) => new Cell( cellElem ) );\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  let cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    let startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n\n  this.cells.slice( index ).forEach( ( cell ) => {\n    cell.x = cellX;\n    this._renderCellPosition( cell, cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  } );\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = this.cells.length ?\n    this.getLastSlide().target - this.slides[0].target : 0;\n};\n\nproto._renderCellPosition = function( cell, x ) {\n  // render position of cell with in slider\n  let sideOffset = this.options.rightToLeft ? -1 : 1;\n  let renderX = x * sideOffset;\n  if ( this.options.percentPosition ) renderX *= this.size.innerWidth / cell.size.width;\n  let positionValue = this.getPositionValue( renderX );\n  cell.element.style.transform = `translateX( ${positionValue} )`;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( ( cell ) => cell.getSize() );\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) return;\n\n  let { beginMargin, endMargin } = this;\n  let slide = new Slide( beginMargin, endMargin, this.cellAlign );\n  this.slides.push( slide );\n\n  let canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( ( cell, i ) => {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    let slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ endMargin ] );\n\n    if ( canCellFit( i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( beginMargin, endMargin, this.cellAlign );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  } );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  let { groupCells } = this.options;\n  if ( !groupCells ) return () => false;\n\n  if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    let number = parseInt( groupCells, 10 );\n    return ( i ) => ( i % number ) !== 0;\n  }\n  // default, group by width of slide\n  let percent = 1;\n  // parse '75%\n  let percentMatch = typeof groupCells == 'string' && groupCells.match( /^(\\d+)%$/ );\n  if ( percentMatch ) percent = parseInt( percentMatch[1], 10 ) / 100;\n  let groupWidth = ( this.size.innerWidth + 1 ) * percent;\n  return ( i, slideWidth ) => slideWidth <= groupWidth;\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nlet cellAlignShorthands = {\n  left: 0,\n  center: 0.5,\n  right: 1,\n};\n\nproto.setCellAlign = function() {\n  let { cellAlign, rightToLeft } = this.options;\n  let shorthand = cellAlignShorthands[ cellAlign ];\n  this.cellAlign = shorthand !== undefined ? shorthand : cellAlign;\n  if ( rightToLeft ) this.cellAlign = 1 - this.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( !this.options.setGallerySize ) return;\n\n  let height = this.options.adaptiveHeight && this.selectedSlide ?\n    this.selectedSlide.height : this.maxCellHeight;\n  this.viewport.style.height = `${height}px`;\n};\n\nproto._updateWrapShiftCells = function() {\n  // update isWrapping\n  this.isWrapping = this.getIsWrapping();\n  // only for wrap-around\n  if ( !this.isWrapping ) return;\n\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  let beforeGapX = this.cursorPosition;\n  let lastIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( beforeGapX, lastIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  let afterGapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( afterGapX, 0, 1 );\n};\n\nproto.getIsWrapping = function() {\n  let { wrapAround } = this.options;\n  if ( !wrapAround || this.slides.length < 2 ) return false;\n\n  if ( wrapAround !== 'fill' ) return true;\n  // check that slides can fit\n\n  let gapWidth = this.slideableWidth - this.size.innerWidth;\n  if ( gapWidth > this.size.innerWidth ) return true; // gap * 2x big, all good\n  // check that content width - shifting cell is bigger than viewport width\n  for ( let cell of this.cells ) {\n    if ( cell.size.outerWidth > gapWidth ) return false;\n  }\n  return true;\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  let cells = [];\n  while ( gapX > 0 ) {\n    let cell = this.cells[ cellIndex ];\n    if ( !cell ) break;\n\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain & wrap ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  let isContaining = this.options.contain && !this.isWrapping &&\n      this.cells.length;\n  if ( !isContaining ) return;\n\n  let contentWidth = this.slideableWidth - this.getLastCell().size[ this.endMargin ];\n  // content is less than gallery size\n  let isContentSmaller = contentWidth < this.size.innerWidth;\n  if ( isContentSmaller ) {\n    // all cells fit inside gallery\n    this.slides.forEach( ( slide ) => {\n      slide.target = contentWidth * this.cellAlign;\n    } );\n  } else {\n    // contain to bounds\n    let beginBound = this.cursorPosition + this.cells[0].size[ this.beginMargin ];\n    let endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n    this.slides.forEach( ( slide ) => {\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    } );\n  }\n};\n\n// ----- events ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  let emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    let $event = type;\n    if ( event ) {\n      // create jQuery event\n      let jQEvent = new jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\nconst unidraggerEvents = [\n  'dragStart',\n  'dragMove',\n  'dragEnd',\n  'pointerDown',\n  'pointerMove',\n  'pointerEnd',\n  'staticClick',\n];\n\nlet _emitEvent = proto.emitEvent;\nproto.emitEvent = function( eventName, args ) {\n  if ( eventName === 'staticClick' ) {\n    // add cellElem and cellIndex args to staticClick\n    let clickedCell = this.getParentCell( args[0].target );\n    let cellElem = clickedCell && clickedCell.element;\n    let cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n    args = args.concat( cellElem, cellIndex );\n  }\n  // do regular thing\n  _emitEvent.call( this, eventName, args );\n  // duck-punch in jQuery events for Unidragger events\n  let isUnidraggerEvent = unidraggerEvents.includes( eventName );\n  if ( !isUnidraggerEvent || !jQuery || !this.$element ) return;\n\n  eventName += this.options.namespaceJQueryEvents ? '.flickity' : '';\n  let event = args.shift( 0 );\n  let jQEvent = new jQuery.Event( event );\n  jQEvent.type = eventName;\n  this.$element.trigger( jQEvent, args );\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) return;\n\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.isWrapping || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) return;\n\n  let prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index !== prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  if ( !this.isWrapping ) return;\n\n  const { selectedIndex, slideableWidth, slides: { length } } = this;\n  // shift index for wrap, do not wrap dragSelect\n  if ( !this.isDragSelect ) {\n    let wrapIndex = utils.modulo( index, length );\n    // go to shortest\n    let delta = Math.abs( wrapIndex - selectedIndex );\n    let backWrapDelta = Math.abs( ( wrapIndex + length ) - selectedIndex );\n    let forewardWrapDelta = Math.abs( ( wrapIndex - length ) - selectedIndex );\n    if ( backWrapDelta < delta ) {\n      index += length;\n    } else if ( forewardWrapDelta < delta ) {\n      index -= length;\n    }\n  }\n\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= slideableWidth;\n  } else if ( index >= length ) {\n    this.x += slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  let slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) return;\n\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) this.selectedSlide.unselect();\n};\n\nproto.selectInitialIndex = function() {\n  let initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    let cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  let index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  let cell = this.queryCell( value );\n  if ( !cell ) return;\n\n  let index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slide that has cell\n  let cellSlide = this.slides.find( ( slide ) => slide.cells.includes( cell ) );\n  return this.slides.indexOf( cellSlide );\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( let cell of this.cells ) {\n    if ( cell.element === elem ) return cell;\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  return elems.map( ( elem ) => this.getCell( elem ) ).filter( Boolean );\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  let cell = this.getCell( elem );\n  if ( cell ) return cell;\n\n  // try to get parent cell elem\n  let closest = elem.closest('.flickity-slider > *');\n  return this.getCell( closest );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) return this.selectedSlide.getCellElements();\n\n  index = index === undefined ? this.selectedIndex : index;\n\n  let len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements(); // get all\n  }\n\n  let cellElems = [];\n  for ( let i = index - adjCount; i <= index + adjCount; i++ ) {\n    let slideIndex = this.isWrapping ? utils.modulo( i, len ) : i;\n    let slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  // do not select invalid selectors from hash: #123, #/. #791\n  let isSelectorString = typeof selector == 'string' && !selector.match( /^[#.]?[\\d/]/ );\n  if ( isSelectorString ) {\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  // #1177 disable resize behavior when animating or dragging for iOS 15\n  if ( !this.isActive || this.isAnimating || this.isDragging ) return;\n  this.getSize();\n  // wrap values\n  if ( this.isWrapping ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  let selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  if ( !this.options.watchCSS ) return;\n\n  let afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.includes('flickity') ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  let { activeElement } = document;\n  let handler = Flickity.keyboardHandlers[ event.key ];\n  // only work if element is in focus\n  if ( !this.options.accessibility || !activeElement || !handler ) return;\n\n  let isFocused = this.focusableElems.some( ( elem ) => activeElement === elem );\n  if ( isFocused ) handler.call( this );\n};\n\nFlickity.keyboardHandlers = {\n  ArrowLeft: function() {\n    this.uiChange();\n    let leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this[ leftMethod ]();\n  },\n  ArrowRight: function() {\n    this.uiChange();\n    let rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  this.element.focus({ preventScroll: true });\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) return;\n\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( ( cell ) => cell.destroy() );\n  this.viewport.remove();\n  // move child elements back into element\n  this.element.append( ...this.slider.children );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nObject.assign( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  if ( elem ) return instances[ elem.flickityGUID ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n  jQueryBridget( 'flickity', Flickity, jQuery );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./core'),\n        require('unidragger'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n        window,\n        window.Flickity,\n        window.Unidragger,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nObject.assign( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n} );\n\n// -------------------------- drag prototype -------------------------- //\n\nlet proto = Flickity.prototype;\nObject.assign( proto, Unidragger.prototype ); // inherit Unidragger\nproto.touchActionValue = '';\n\n// --------------------------  -------------------------- //\n\nFlickity.create.drag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  this.on( 'pointerDown', this.handlePointerDown );\n  this.on( 'pointerUp', this.handlePointerUp );\n  this.on( 'pointerDown', this.handlePointerDone );\n  this.on( 'dragStart', this.handleDragStart );\n  this.on( 'dragMove', this.handleDragMove );\n  this.on( 'dragEnd', this.handleDragEnd );\n  this.on( 'staticClick', this.handleStaticClick );\n  // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable === '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  this.element.classList.toggle( 'is-draggable', this.isDraggable );\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.handlePointerDown = function( event ) {\n  if ( !this.isDraggable ) {\n    // proceed for staticClick\n    this.bindActivePointerEvents( event );\n    return;\n  }\n\n  let isTouchStart = event.type === 'touchstart';\n  let isTouchPointer = event.pointerType === 'touch';\n  let isFocusNode = event.target.matches('input, textarea, select');\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) event.preventDefault();\n  if ( !isFocusNode ) this.focus();\n  // blur\n  if ( document.activeElement !== this.element ) document.activeElement.blur();\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n  this.bindActivePointerEvents( event );\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.handlePointerUp = function() {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n};\n\nproto.handlePointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.handleDragStart = function() {\n  if ( !this.isDraggable ) return;\n\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n};\n\nproto.handleDragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) return;\n\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  let direction = this.options.rightToLeft ? -1 : 1;\n  // wrap around move. #589\n  if ( this.isWrapping ) moveVector.x %= this.slideableWidth;\n  let dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.isWrapping ) {\n    // slow drag\n    let originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    let endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n  this.dragMoveTime = new Date();\n};\n\nproto.handleDragEnd = function() {\n  if ( !this.isDraggable ) return;\n\n  let { freeScroll } = this.options;\n  if ( freeScroll ) this.isFreeScrolling = true;\n  // set selectedIndex based on where flick will end up\n  let index = this.dragEndRestingSelect();\n\n  if ( freeScroll && !this.isWrapping ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    let restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !freeScroll && index === this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.isWrapping;\n  this.select( index );\n  delete this.isDragSelect;\n};\n\nproto.dragEndRestingSelect = function() {\n  let restingX = this.getRestingPosition();\n  // how far away from selected slide\n  let distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  let positiveResting = this._getClosestResting( restingX, distance, 1 );\n  let negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  return positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  let index = this.selectedIndex;\n  let minDistance = Infinity;\n  let condition = this.options.contain && !this.isWrapping ?\n    // if containing, keep going if distance is equal to minDistance\n    ( dist, minDist ) => dist <= minDist :\n    ( dist, minDist ) => dist < minDist;\n\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) break;\n\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment,\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n  let len = this.slides.length;\n  // wrap around if at least 2 slides\n  let isWrapAround = this.options.wrapAround && len > 1;\n  let slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  let slide = this.slides[ slideIndex ];\n  if ( !slide ) return null;\n\n  // add distance for wrap-around slides\n  let wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  let distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  let delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  let scroll = getScrollPosition();\n  let scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  let scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this.pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset,\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// imagesloaded\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('imagesloaded'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.imagesLoaded,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( Flickity, imagesLoaded ) {\n\nFlickity.create.imagesLoaded = function() {\n  this.on( 'activate', this.imagesLoaded );\n};\n\nFlickity.prototype.imagesLoaded = function() {\n  if ( !this.options.imagesLoaded ) return;\n\n  let onImagesLoadedProgress = ( instance, image ) => {\n    let cell = this.getParentCell( image.img );\n    this.cellSizeChange( cell && cell.element );\n    if ( !this.options.freeScroll ) this.positionSliderAtSelected();\n  };\n  imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v3.0.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2022 Metafizzy\n */\n\nif ( typeof module == 'object' && module.exports ) {\n  const Flickity = require('./core');\n  require('./drag');\n  require('./prev-next-button');\n  require('./page-dots');\n  require('./player');\n  require('./add-remove-cell');\n  require('./lazyload');\n  require('./imagesloaded');\n\n  module.exports = Flickity;\n}\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\nconst lazyAttr = 'data-flickity-lazyload';\nconst lazySrcAttr = `${lazyAttr}-src`;\nconst lazySrcsetAttr = `${lazyAttr}-srcset`;\nconst imgSelector = `img[${lazyAttr}], img[${lazySrcAttr}], ` +\n  `img[${lazySrcsetAttr}], source[${lazySrcsetAttr}]`;\n\nFlickity.create.lazyLoad = function() {\n  this.on( 'select', this.lazyLoad );\n\n  this.handleLazyLoadComplete = this.onLazyLoadComplete.bind( this );\n};\n\nlet proto = Flickity.prototype;\n\nproto.lazyLoad = function() {\n  let { lazyLoad } = this.options;\n  if ( !lazyLoad ) return;\n\n  // get adjacent cells, use lazyLoad option for adjacent count\n  let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  // lazy load images\n  this.getAdjacentCellElements( adjCount )\n    .map( getCellLazyImages )\n    .flat()\n    .forEach( ( img ) => new LazyLoader( img, this.handleLazyLoadComplete ) );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.matches('img') ) {\n    let cellAttr = cellElem.getAttribute( lazyAttr );\n    let cellSrcAttr = cellElem.getAttribute( lazySrcAttr );\n    let cellSrcsetAttr = cellElem.getAttribute( lazySrcsetAttr );\n    if ( cellAttr || cellSrcAttr || cellSrcsetAttr ) {\n      return cellElem;\n    }\n  }\n  // select lazy images in cell\n  return [ ...cellElem.querySelectorAll( imgSelector ) ];\n}\n\nproto.onLazyLoadComplete = function( img, event ) {\n  let cell = this.getParentCell( img );\n  let cellElem = cell && cell.element;\n  this.cellSizeChange( cellElem );\n\n  this.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Function} onComplete - callback function\n */\nfunction LazyLoader( img, onComplete ) {\n  this.img = img;\n  this.onComplete = onComplete;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  let src = this.img.getAttribute( lazyAttr ) ||\n    this.img.getAttribute( lazySrcAttr );\n  let srcset = this.img.getAttribute( lazySrcsetAttr );\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) this.img.setAttribute( 'srcset', srcset );\n  // remove attr\n  this.img.removeAttribute( lazyAttr );\n  this.img.removeAttribute( lazySrcAttr );\n  this.img.removeAttribute( lazySrcsetAttr );\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n  let mediaElem = this.img.parentNode.matches('picture') ? this.img.parentNode : this.img;\n  mediaElem.classList.add( className );\n\n  this.onComplete( this.img, event );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\nfunction PageDots() {\n  // create holder element\n  this.holder = document.createElement('div');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n}\n\nPageDots.prototype.setDots = function( slidesLength ) {\n  // get difference between number of slides and number of dots\n  let delta = slidesLength - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  let newDots = new Array( count ).fill()\n    .map( ( item, i ) => {\n      let dot = document.createElement('button');\n      dot.setAttribute( 'type', 'button' );\n      let num = i + 1 + this.dots.length;\n      dot.className = 'flickity-page-dot';\n      dot.textContent = `View slide ${num}`;\n      return dot;\n    } );\n\n  this.holder.append( ...newDots );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  let removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( ( dot ) => dot.remove() );\n};\n\nPageDots.prototype.updateSelected = function( index ) {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.classList.remove('is-selected');\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) return;\n\n  this.selectedDot = this.dots[ index ];\n  this.selectedDot.classList.add('is-selected');\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pageDots: true,\n} );\n\nFlickity.create.pageDots = function() {\n  if ( !this.options.pageDots ) return;\n\n  this.pageDots = new PageDots();\n  this.handlePageDotsClick = this.onPageDotsClick.bind( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePageDots = function() {\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n  this.pageDots.holder.addEventListener( 'click', this.handlePageDotsClick );\n  this.element.append( this.pageDots.holder );\n};\n\nproto.onPageDotsClick = function( event ) {\n  let index = this.pageDots.dots.indexOf( event.target );\n  if ( index === -1 ) return; // only dot clicks\n\n  this.uiChange();\n  this.select( index );\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected( this.selectedIndex );\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.dots.forEach( ( dot ) => {\n    utils.removeFrom( this.focusableElems, dot );\n  } );\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.holder.remove();\n  this.pageDots.holder.removeEventListener( 'click', this.handlePageDotsClick );\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( autoPlay, onTick ) {\n  this.autoPlay = autoPlay;\n  this.onTick = onTick;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state === 'playing' ) return;\n\n  // do not play if page is hidden, start playing when page is visible\n  let isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state !== 'playing' ) return;\n\n  // default to 3 seconds\n  let time = typeof this.autoPlay == 'number' ? this.autoPlay : 3000;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( () => {\n    this.onTick();\n    this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state === 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state === 'paused' ) this.play();\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  let isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pauseAutoPlayOnHover: true,\n} );\n\nFlickity.create.player = function() {\n  this.player = new Player( this.options.autoPlay, () => {\n    this.next( true );\n  } );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) return;\n\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) return;\n\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\nconst svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( increment, direction, arrowShape ) {\n  this.increment = increment;\n  this.direction = direction;\n  this.isPrevious = increment === 'previous';\n  this.isLeft = direction === 'left';\n  this._create( arrowShape );\n}\n\nPrevNextButton.prototype._create = function( arrowShape ) {\n  // properties\n  let element = this.element = document.createElement('button');\n  element.className = `flickity-button flickity-prev-next-button ${this.increment}`;\n  let label = this.isPrevious ? 'Previous' : 'Next';\n  // prevent button from submitting form https://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  element.setAttribute( 'aria-label', label );\n  // init as disabled\n  this.disable();\n  // create arrow\n  let svg = this.createSVG( label, arrowShape );\n  element.append( svg );\n};\n\nPrevNextButton.prototype.createSVG = function( label, arrowShape ) {\n  let svg = document.createElementNS( svgURI, 'svg' );\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  // add title #1189\n  let title = document.createElementNS( svgURI, 'title' );\n  title.append( label );\n  // add path\n  let path = document.createElementNS( svgURI, 'path' );\n  let pathMovements = getArrowMovements( arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180)' );\n  }\n  svg.append( title, path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) return shape;\n\n  let { x0, x1, x2, x3, y1, y2 } = shape;\n\n  // create movement string\n  return `M ${x0}, 50\n    L ${x1}, ${y1 + 50}\n    L ${x2}, ${y2 + 50}\n    L ${x3}, 50\n    L ${x2}, ${50 - y2}\n    L ${x1}, ${50 - y1}\n    Z`;\n}\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  this.element.removeAttribute('disabled');\n};\n\nPrevNextButton.prototype.disable = function() {\n  this.element.setAttribute( 'disabled', true );\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30,\n  },\n} );\n\nFlickity.create.prevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) return;\n\n  let { rightToLeft, arrowShape } = this.options;\n  let prevDirection = rightToLeft ? 'right' : 'left';\n  let nextDirection = rightToLeft ? 'left' : 'right';\n  this.prevButton = new PrevNextButton( 'previous', prevDirection, arrowShape );\n  this.nextButton = new PrevNextButton( 'next', nextDirection, arrowShape );\n  this.focusableElems.push( this.prevButton.element );\n  this.focusableElems.push( this.nextButton.element );\n\n  this.handlePrevButtonClick = () => {\n    this.uiChange();\n    this.previous();\n  };\n\n  this.handleNextButtonClick = () => {\n    this.uiChange();\n    this.next();\n  };\n\n  this.on( 'activate', this.activatePrevNextButtons );\n  this.on( 'select', this.updatePrevNextButtons );\n};\n\nlet proto = Flickity.prototype;\n\nproto.updatePrevNextButtons = function() {\n  let lastIndex = this.slides.length ? this.slides.length - 1 : 0;\n  this.updatePrevNextButton( this.prevButton, 0 );\n  this.updatePrevNextButton( this.nextButton, lastIndex );\n};\n\nproto.updatePrevNextButton = function( button, disabledIndex ) {\n  // enable is wrapAround and at least 2 slides\n  if ( this.isWrapping && this.slides.length > 1 ) {\n    button.enable();\n    return;\n  }\n\n  let isEnabled = this.selectedIndex !== disabledIndex;\n  button[ isEnabled ? 'enable' : 'disable' ]();\n  // if disabling button that is focused,\n  // shift focus to element to maintain keyboard accessibility\n  let isDisabledFocused = !isEnabled && document.activeElement === button.element;\n  if ( isDisabledFocused ) this.focus();\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.element.addEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.addEventListener( 'click', this.handleNextButtonClick );\n  this.element.append( this.prevButton.element, this.nextButton.element );\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.element.remove();\n  this.nextButton.element.remove();\n  this.prevButton.element.removeEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.removeEventListener( 'click', this.handleNextButtonClick );\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory() {\n\nfunction Slide( beginMargin, endMargin, cellAlign ) {\n  this.beginMargin = beginMargin;\n  this.endMargin = endMargin;\n  this.cellAlign = cellAlign;\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nlet proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length === 1 ) {\n    this.x = cell.x; // x comes from first cell\n    this.firstMargin = cell.size[ this.beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  let lastCell = this.getLastCell();\n  let lastMargin = lastCell ? lastCell.size[ this.endMargin ] : 0;\n  let slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( ( cell ) => cell.select() );\n};\n\nproto.unselect = function() {\n  this.cells.forEach( ( cell ) => cell.unselect() );\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * Infinite Scroll v2.0.4\n * measure size of elements\n * MIT license\n */\n\n( function( window, factory ) {\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n} )( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  let num = parseFloat( value );\n  // not a percent like '100%', and a number\n  let isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\n// -------------------------- measurements -------------------------- //\n\nlet measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth',\n];\n\nlet measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  let size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0,\n  };\n  measurements.forEach( ( measurement ) => {\n    size[ measurement ] = 0;\n  } );\n  return size;\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) elem = document.querySelector( elem );\n\n  // do not proceed on non-objects\n  let isElement = elem && typeof elem == 'object' && elem.nodeType;\n  if ( !isElement ) return;\n\n  let style = getComputedStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) return getZeroSize();\n\n  let size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  measurements.forEach( ( measurement ) => {\n    let value = style[ measurement ];\n    let num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  } );\n\n  let paddingWidth = size.paddingLeft + size.paddingRight;\n  let paddingHeight = size.paddingTop + size.paddingBottom;\n  let marginWidth = size.marginLeft + size.marginRight;\n  let marginHeight = size.marginTop + size.marginBottom;\n  let borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  let borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  // overwrite width and height if we can get it from style\n  let styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingWidth + borderWidth );\n  }\n\n  let styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n} );\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( window, require('ev-emitter') );\n  } else {\n    // browser global\n    window.imagesLoaded = factory( window, window.EvEmitter );\n  }\n\n} )( typeof window !== 'undefined' ? window : this,\n    function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n  // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n  if ( !( this instanceof ImagesLoaded ) ) {\n    return new ImagesLoaded( elem, options, onAlways );\n  }\n  // use elem as selector string\n  let queryElem = elem;\n  if ( typeof elem == 'string' ) {\n    queryElem = document.querySelectorAll( elem );\n  }\n  // bail if bad element\n  if ( !queryElem ) {\n    console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n    return;\n  }\n\n  this.elements = makeArray( queryElem );\n  this.options = {};\n  // shift arguments if no options set\n  if ( typeof options == 'function' ) {\n    onAlways = options;\n  } else {\n    Object.assign( this.options, options );\n  }\n\n  if ( onAlways ) this.on( 'always', onAlways );\n\n  this.getImages();\n  // add jQuery Deferred object\n  if ( $ ) this.jqDeferred = new $.Deferred();\n\n  // HACK check async to allow time to bind listeners\n  setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n  this.images = [];\n\n  // filter & find items if we have an item selector\n  this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n  // filter siblings\n  if ( elem.nodeName === 'IMG' ) {\n    this.addImage( elem );\n  }\n  // get background image on element\n  if ( this.options.background === true ) {\n    this.addElementBackgroundImages( elem );\n  }\n\n  // find children\n  // no non-element nodes, #143\n  let { nodeType } = elem;\n  if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n  let childImgs = elem.querySelectorAll('img');\n  // concat childElems to filterFound array\n  for ( let img of childImgs ) {\n    this.addImage( img );\n  }\n\n  // get child background images\n  if ( typeof this.options.background == 'string' ) {\n    let children = elem.querySelectorAll( this.options.background );\n    for ( let child of children ) {\n      this.addElementBackgroundImages( child );\n    }\n  }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n  let style = getComputedStyle( elem );\n  // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n  if ( !style ) return;\n\n  // get url inside url(\"...\")\n  let matches = reURL.exec( style.backgroundImage );\n  while ( matches !== null ) {\n    let url = matches && matches[2];\n    if ( url ) {\n      this.addBackground( url, elem );\n    }\n    matches = reURL.exec( style.backgroundImage );\n  }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n  let loadingImage = new LoadingImage( img );\n  this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n  let background = new Background( url, elem );\n  this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n  this.progressedCount = 0;\n  this.hasAnyBroken = false;\n  // complete if no images\n  if ( !this.images.length ) {\n    this.complete();\n    return;\n  }\n\n  /* eslint-disable-next-line func-style */\n  let onProgress = ( image, elem, message ) => {\n    // HACK - Chrome triggers event before object properties have changed. #83\n    setTimeout( () => {\n      this.progress( image, elem, message );\n    } );\n  };\n\n  this.images.forEach( function( loadingImage ) {\n    loadingImage.once( 'progress', onProgress );\n    loadingImage.check();\n  } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n  this.progressedCount++;\n  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n  // progress event\n  this.emitEvent( 'progress', [ this, image, elem ] );\n  if ( this.jqDeferred && this.jqDeferred.notify ) {\n    this.jqDeferred.notify( this, image );\n  }\n  // check if completed\n  if ( this.progressedCount === this.images.length ) {\n    this.complete();\n  }\n\n  if ( this.options.debug && console ) {\n    console.log( `progress: ${message}`, image, elem );\n  }\n};\n\nImagesLoaded.prototype.complete = function() {\n  let eventName = this.hasAnyBroken ? 'fail' : 'done';\n  this.isComplete = true;\n  this.emitEvent( eventName, [ this ] );\n  this.emitEvent( 'always', [ this ] );\n  if ( this.jqDeferred ) {\n    let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n    this.jqDeferred[ jqMethod ]( this );\n  }\n};\n\n// --------------------------  -------------------------- //\n\nfunction LoadingImage( img ) {\n  this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n  // If complete is true and browser supports natural sizes,\n  // try to check for image status manually.\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    // report based on naturalWidth\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    return;\n  }\n\n  // If none of the checks above matched, simulate loading on detached element.\n  this.proxyImage = new Image();\n  // add crossOrigin attribute. #204\n  if ( this.img.crossOrigin ) {\n    this.proxyImage.crossOrigin = this.img.crossOrigin;\n  }\n  this.proxyImage.addEventListener( 'load', this );\n  this.proxyImage.addEventListener( 'error', this );\n  // bind to image as well for Firefox. #191\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n  // check for non-zero, non-undefined naturalWidth\n  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n  return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  let { parentNode } = this.img;\n  // emit progress with parent <picture> or self <img>\n  let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n  this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nLoadingImage.prototype.onload = function() {\n  this.confirm( true, 'onload' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n  this.confirm( false, 'onerror' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n  this.proxyImage.removeEventListener( 'load', this );\n  this.proxyImage.removeEventListener( 'error', this );\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n  this.url = url;\n  this.element = element;\n  this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.img.src = this.url;\n  // check if image is already complete\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    this.unbindEvents();\n  }\n};\n\nBackground.prototype.unbindEvents = function() {\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n  jQuery = jQuery || window.jQuery;\n  if ( !jQuery ) return;\n\n  // set local variable\n  $ = jQuery;\n  // $().imagesLoaded()\n  $.fn.imagesLoaded = function( options, onAlways ) {\n    let instance = new ImagesLoaded( this, options, onAlways );\n    return instance.jqDeferred.promise( $( this ) );\n  };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// --------------------------  -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*!\n * Unidragger v3.0.1\n * Draggable base class\n * MIT license\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n        window,\n        window.EvEmitter,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) {\n\nfunction Unidragger() {}\n\n// inherit EvEmitter\nlet proto = Unidragger.prototype = Object.create( EvEmitter.prototype );\n\n// ----- bind start ----- //\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nlet startEvent, activeEvents;\nif ( 'ontouchstart' in window ) {\n  // HACK prefer Touch Events as you can preventDefault on touchstart to\n  // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n  startEvent = 'touchstart';\n  activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ];\n} else if ( window.PointerEvent ) {\n  // Pointer Events\n  startEvent = 'pointerdown';\n  activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ];\n} else {\n  // mouse events\n  startEvent = 'mousedown';\n  activeEvents = [ 'mousemove', 'mouseup' ];\n}\n\n// prototype so it can be overwriteable by Flickity\nproto.touchActionValue = 'none';\n\nproto.bindHandles = function() {\n  this._bindHandles( 'addEventListener', this.touchActionValue );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( 'removeEventListener', '' );\n};\n\n/**\n * Add or remove start event\n * @param {String} bindMethod - addEventListener or removeEventListener\n * @param {String} touchAction - value for touch-action CSS property\n */\nproto._bindHandles = function( bindMethod, touchAction ) {\n  this.handles.forEach( ( handle ) => {\n    handle[ bindMethod ]( startEvent, this );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) handle.style.touchAction = touchAction;\n  } );\n};\n\nproto.bindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.addEventListener( eventName, this );\n  } );\n};\n\nproto.unbindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.removeEventListener( eventName, this );\n  } );\n};\n\n// ----- event handler helpers ----- //\n\n// trigger method with matching pointer\nproto.withPointer = function( methodName, event ) {\n  if ( event.pointerId === this.pointerIdentifier ) {\n    this[ methodName ]( event, event );\n  }\n};\n\n// trigger method with matching touch\nproto.withTouch = function( methodName, event ) {\n  let touch;\n  for ( let changedTouch of event.changedTouches ) {\n    if ( changedTouch.identifier === this.pointerIdentifier ) {\n      touch = changedTouch;\n    }\n  }\n  if ( touch ) this[ methodName ]( event, touch );\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  this.pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this.pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this.pointerDown( event, event );\n};\n\n// nodes that have text fields\nconst cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ];\n// input types that do not have text fields\nconst clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ];\n\n/**\n * any time you set `event, pointer` it refers to:\n * @param {Event} event\n * @param {Event | Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  // dismiss multi-touch taps, right clicks, and clicks on text fields\n  let isCursorNode = cursorNodes.includes( event.target.nodeName );\n  let isClickType = clickTypes.includes( event.target.type );\n  let isOkayElement = !isCursorNode || isClickType;\n  let isOkay = !this.isPointerDown && !event.button && isOkayElement;\n  if ( !isOkay ) return;\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n  // track position for move\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  this.bindActivePointerEvents();\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// ----- move ----- //\n\nproto.onmousemove = function( event ) {\n  this.pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  this.withPointer( 'pointerMove', event );\n};\n\nproto.ontouchmove = function( event ) {\n  this.withTouch( 'pointerMove', event );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  let moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY,\n  };\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  // start drag if pointer has moved far enough to start drag\n  let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector );\n  if ( isDragStarting ) this.dragStart( event, pointer );\n  if ( this.isDragging ) this.dragMove( event, pointer, moveVector );\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- drag ----- //\n\nproto.dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  this.isPreventingClicks = true; // set flag to prevent clicks\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// ----- end ----- //\n\nproto.onmouseup = function( event ) {\n  this.pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  this.withPointer( 'pointerUp', event );\n};\n\nproto.ontouchend = function( event ) {\n  this.withTouch( 'pointerUp', event );\n};\n\nproto.pointerUp = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n\n  if ( this.isDragging ) {\n    this.dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this.staticClick( event, pointer );\n  }\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.isDragging = false; // reset flag\n  // re-enable clicking async\n  setTimeout( () => delete this.isPreventingClicks );\n\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// triggered on pointer up & pointer cancel\nproto.pointerDone = function() {\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n  this.unbindActivePointerEvents();\n  this.emitEvent('pointerDone');\n};\n\n// ----- cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  this.withPointer( 'pointerCancel', event );\n};\n\nproto.ontouchcancel = function( event ) {\n  this.withTouch( 'pointerCancel', event );\n};\n\nproto.pointerCancel = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- click ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) event.preventDefault();\n};\n\n// triggered after pointer down & up with no/tiny movement\nproto.staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  let isMouseup = event.type === 'mouseup';\n  if ( isMouseup && this.isIgnoringMouseUp ) return;\n\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( isMouseup ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 400ms\n    setTimeout( () => {\n      delete this.isIgnoringMouseUp;\n    }, 400 );\n  }\n};\n\n// -----  ----- //\n\nreturn Unidragger;\n\n} ) );\n","module.exports = window[\"React\"];","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0,\n\t\"./style-index\": 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkflexiflick\"] = self[\"webpackChunkflexiflick\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [\"./style-index\"], () => (__webpack_require__(\"./src/index.js\")))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["Flickity","useEffect","useRef","useSelect","InspectorControls","useBlockProps","PanelBody","ToggleControl","TextControl","__","metadata","registerBlockType","wp","blocks","name","title","icon","category","attributes","showArrows","type","default","showPager","draggable","wrapAround","freeScroll","pauseAutoPlayOnHover","autoPlay","edit","setAttributes","blockProps","sliderRef","posts","select","fetchedPosts","getEntityRecords","per_page","_embed","map","post","id","rendered","content","featured_media_url","_embedded","source_url","length","current","flickityInstance","prevNextButtons","pageDots","destroy","createElement","label","help","checked","onChange","value","parseInt","className","ref","save"],"sourceRoot":""}
  • flexi-flick/trunk/build/style-index-rtl.css

    r3148052 r3148783  
    2121     object-fit: cover;
    2222  height: auto;
     23  filter: brightness(0.7);
    2324}
    2425
     
    2930  max-width: 1200px;
    3031  display: block;
     32}
     33
     34.flickity-slide:after {
     35  content: "";
     36  background: rgba(0, 0, 0, 0.6);
     37  display: block;
     38  width: 50%;
     39  height: 100%;
     40  position: absolute;
     41  z-index: -1;
    3142}
    3243
     
    6172  width: 12px !important;
    6273  border-radius: 8px !important;
     74}
     75
     76.flickity-slide-content .wp-block-button a {
     77  font-size: 16px !important;
     78  padding: 9px 30px;
     79  background: transparent !important;
     80  color: #fff !important;
     81  text-decoration: none !important;
     82  border: 1px solid #fff;
     83  border-radius: 999px;
     84}
     85
     86.flickity-slide-content .wp-block-button a:hover {
     87  background: transparent !important;
     88  color: #fff !important;
     89}
     90
     91.flickity-slide-content .wp-block-button a:after {
     92  background-position: 0%;
     93  background-repeat: no-repeat;
     94  background-size: contain;
     95  content: "";
     96  display: inline-flex;
     97  transition: width 0.1s ease-out;
     98  width: 0;
     99}
     100
     101.flickity-slide-content .wp-block-button a:hover:after {
     102  width: 17px;
     103  height: 17px;
     104  position: relative;
     105  top: 3px;
     106  right: 10px;
    63107}
    64108
  • flexi-flick/trunk/build/style-index.css

    r3148052 r3148783  
    2121     object-fit: cover;
    2222  height: auto;
     23  filter: brightness(0.7);
    2324}
    2425
     
    2930  max-width: 1200px;
    3031  display: block;
     32}
     33
     34.flickity-slide:after {
     35  content: "";
     36  background: rgba(0, 0, 0, 0.6);
     37  display: block;
     38  width: 50%;
     39  height: 100%;
     40  position: absolute;
     41  z-index: -1;
    3142}
    3243
     
    6172  width: 12px !important;
    6273  border-radius: 8px !important;
     74}
     75
     76.flickity-slide-content .wp-block-button a {
     77  font-size: 16px !important;
     78  padding: 9px 30px;
     79  background: transparent !important;
     80  color: #fff !important;
     81  text-decoration: none !important;
     82  border: 1px solid #fff;
     83  border-radius: 999px;
     84}
     85
     86.flickity-slide-content .wp-block-button a:hover {
     87  background: transparent !important;
     88  color: #fff !important;
     89}
     90
     91.flickity-slide-content .wp-block-button a:after {
     92  background-position: 100%;
     93  background-repeat: no-repeat;
     94  background-size: contain;
     95  content: "";
     96  display: inline-flex;
     97  transition: width 0.1s ease-out;
     98  width: 0;
     99}
     100
     101.flickity-slide-content .wp-block-button a:hover:after {
     102  width: 17px;
     103  height: 17px;
     104  position: relative;
     105  top: 3px;
     106  left: 10px;
    63107}
    64108
  • flexi-flick/trunk/build/style-index.css.map

    r3148052 r3148783  
    1 {"version":3,"file":"./style-index.css","mappings":";;;AAAA;;;;;EAAA;AAMA;EACC;EACA;EACG;AACJ;;AACA;EACC;EACA;EACA;EACA;KAAA;EACA;AAED;;AAAA;EACE;EACA;EACA;EACA;EACA;AAGF;;AAAA;EACC;;;;uBAAA;EAKA;EACG;EACA;EACA;EACA;EACA;EACA;EACA;AAGJ;;AADA;EACI;AAIJ;;AAFA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAKJ;;AAFA;EACI;IACI;EAKN;EAFE;IACI;EAIN;AACF;AAFA;EACI;EACA;EACA;EACA;EACA;EACA;AAIJ;;AADA;EACI;EACA;EACA;EACA;AAIJ;;AADA;EACI;AAIJ;;AAFA;EACC;EACG;AAKJ;;AAHA;EACC;AAMD;;AAJA;EACI;EACA;AAOJ;;AALA;EACE;EACA;EACA;EACA;EACA;AAQF;;AALA;EACE;AAQF,C","sources":["webpack://flexiflick/./src/style.scss"],"sourcesContent":["/**\n * The following styles get applied both on the front of your site\n * and in the editor.\n *\n * Replace them with your own styles or remove the file completely.\n */\n.flickity-wrap {\n\tposition: relative;\n\twidth: 100%;\n    max-width: 100% !important;\n}\n.flickity-wrap img {\n\tborder-radius: 15px;\n\twidth: 100%;\n\tdisplay: block;\n\tobject-fit: cover;\n\theight: auto;\n}\n.flickity-slide {\n  width: calc(85% - 60px);\n  margin-right: 10px;\n  border-radius: 5px;\n  max-width: 1200px;\n  display: block;\n  \n}\n.flickity-slide-content {\n\t/*position: absolute;\n\ttop: 0px;\n\twidth: 100%;\n\tpadding-left: 50px;\n\tpadding-right: 50px;*/\n\tposition: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    color: white; /* Adjust text color to contrast with the image */\n    padding: 10px; /* Optional: Add padding around the text */\n    box-sizing: border-box; /* Ensures padding is included in the element's total width and height */\n    width: 80%; /* Adjust to fit within the image */\n}\n.flickity-page-dots {\n    bottom: 20px !important;\n}\n.flickity-page-dots li {\n    background-color: #fff;\n    margin: 0px 5px !important;\n    height: 6px !important;\n    opacity: 1;\n    overflow: hidden;\n    position: relative;\n    transition: all .3s ease;\n    width: 12px !important;\n    border-radius: 8px !important;\n    \n}\n@keyframes bulletLoader {\n    0% {\n        width: 0\n    }\n\n    to {\n        width: 100%\n    }\n}\n.flickity-page-dots li:before {\n    background-color: #f6f6f6;\n    content: \"\";\n    height: 100%;\n    left: 0;\n    position: absolute;\n    width: 0\n}\n\n.flickity-page-dots li.is-selected {\n    position: relative;\n    width: 56px !important;\n    border-radius: 8px !important;\n    height: 6px !important;\n}\n\n.flickity-page-dots li.is-selected:before {\n    animation: bulletLoader 8s forwards\n}\n.flickity-wrap h2 {\n\tmargin-top: 0px !important;\n    margin-bottom: 10px !important;\n}\n.flickity-wrap h2, .flickity-wrap  p {\n\tcolor: #fff !important;\n}\n.flickity-page-dots .dot {\n    opacity: 0.6 !important;\n    background: #ccc !important;\n}\n.wp-block-flexiflick-slider-block {\n  background: #ccc;\n  color: #000 !important;\n  text-align: center;\n  padding: 30px;\n  border: 1px dotted #000;\n}\n\n.wp-block-flexiflick-slider-block h3 {\n  text-align: center;\n}\n"],"names":[],"sourceRoot":""}
     1{"version":3,"file":"./style-index.css","mappings":";;;AAAA;;;;;EAAA;AAMA;EACC;EACA;EACG;AACJ;;AACA;EACC;EACA;EACA;EACA;KAAA;EACA;EACG;AAEJ;;AAAA;EACE;EACA;EACA;EACA;EACA;AAGF;;AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAGJ;;AADA;EACC;;;;uBAAA;EAKA;EACG;EACA;EACA;EACA;EACA;EACA;EACA;AAIJ;;AAFA;EACI;AAKJ;;AAHA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAMJ;;AAHA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAMJ;;AAJA;EACI;EACA;AAOJ;;AALA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;AAOJ;;AALA;EACI;EACA;EACA;EACA;EACA;AAQJ;;AANA;EACI;IACI;EASN;EANE;IACI;EAQN;AACF;AANA;EACI;EACA;EACA;EACA;EACA;EACA;AAQJ;;AALA;EACI;EACA;EACA;EACA;AAQJ;;AALA;EACI;AAQJ;;AANA;EACC;EACG;AASJ;;AAPA;EACC;AAUD;;AARA;EACI;EACA;AAWJ;;AATA;EACE;EACA;EACA;EACA;EACA;AAYF;;AATA;EACE;AAYF,C","sources":["webpack://flexiflick/./src/style.scss"],"sourcesContent":["/**\n * The following styles get applied both on the front of your site\n * and in the editor.\n *\n * Replace them with your own styles or remove the file completely.\n */\n.flickity-wrap {\n\tposition: relative;\n\twidth: 100%;\n    max-width: 100% !important;\n}\n.flickity-wrap img {\n\tborder-radius: 15px;\n\twidth: 100%;\n\tdisplay: block;\n\tobject-fit: cover;\n\theight: auto;\n    filter: brightness(0.7);\n}\n.flickity-slide {\n  width: calc(85% - 60px);\n  margin-right: 10px;\n  border-radius: 5px;\n  max-width: 1200px;\n  display: block;\n  \n}\n.flickity-slide:after {\n    content: \"\";\n    background: rgba(0,0,0,0.6);\n    display: block;\n    width: 50%;\n    height: 100%;\n    position: absolute;\n    z-index: -1;\n}\n.flickity-slide-content {\n\t/*position: absolute;\n\ttop: 0px;\n\twidth: 100%;\n\tpadding-left: 50px;\n\tpadding-right: 50px;*/\n\tposition: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    color: white; /* Adjust text color to contrast with the image */\n    padding: 10px; /* Optional: Add padding around the text */\n    box-sizing: border-box; /* Ensures padding is included in the element's total width and height */\n    width: 80%; /* Adjust to fit within the image */\n}\n.flickity-page-dots {\n    bottom: 20px !important;\n}\n.flickity-page-dots li {\n    background-color: #fff;\n    margin: 0px 5px !important;\n    height: 6px !important;\n    opacity: 1;\n    overflow: hidden;\n    position: relative;\n    transition: all .3s ease;\n    width: 12px !important;\n    border-radius: 8px !important;\n    \n}\n.flickity-slide-content .wp-block-button a {\n    font-size: 16px !important;\n    padding: 9px 30px;\n    background: transparent !important;\n    color: #fff !important;\n    text-decoration: none !important;\n    border: 1px solid #fff;\n    border-radius: 999px;\n}\n.flickity-slide-content .wp-block-button a:hover {\n    background: transparent !important;\n    color: #fff !important;\n}\n.flickity-slide-content .wp-block-button a:after {\n    \n    background-position: 100%;\n    background-repeat: no-repeat;\n    background-size: contain;\n    content: \"\";\n    display: inline-flex;\n    transition: width .1s ease-out;\n    width: 0;\n}\n.flickity-slide-content .wp-block-button a:hover:after {\n    width: 17px;\n    height: 17px;\n    position: relative;\n    top: 3px;\n    left: 10px;\n}\n@keyframes bulletLoader {\n    0% {\n        width: 0\n    }\n\n    to {\n        width: 100%\n    }\n}\n.flickity-page-dots li:before {\n    background-color: #f6f6f6;\n    content: \"\";\n    height: 100%;\n    left: 0;\n    position: absolute;\n    width: 0\n}\n\n.flickity-page-dots li.is-selected {\n    position: relative;\n    width: 56px !important;\n    border-radius: 8px !important;\n    height: 6px !important;\n}\n\n.flickity-page-dots li.is-selected:before {\n    animation: bulletLoader 8s forwards\n}\n.flickity-wrap h2 {\n\tmargin-top: 0px !important;\n    margin-bottom: 10px !important;\n}\n.flickity-wrap h2, .flickity-wrap  p {\n\tcolor: #fff !important;\n}\n.flickity-page-dots .dot {\n    opacity: 0.6 !important;\n    background: #ccc !important;\n}\n.wp-block-flexiflick-slider-block {\n  background: #ccc;\n  color: #000 !important;\n  text-align: center;\n  padding: 30px;\n  border: 1px dotted #000;\n}\n\n.wp-block-flexiflick-slider-block h3 {\n  text-align: center;\n}\n"],"names":[],"sourceRoot":""}
  • flexi-flick/trunk/flexiflick.php

    r3148052 r3148783  
    55 * Requires at least: 6.1
    66 * Requires PHP:      7.0
    7  * Version:           0.1.0
     7 * Version:           0.1.1
    88 * Author:            rashmiwp
    99 * Author URI:        https://profiles.wordpress.org/rashmiwp/
     
    2121// Register Custom Post Type for Slides
    2222function flexiflick_create_slide_post_type() {
     23
    2324    $labels = array(
    24         'name' => 'FlexiFlick Slides',
    25         'singular_name' => 'Slide',
    26         'menu_name' => 'FlexiFlick Slides',
    27         'name_admin_bar' => 'Slide',
    28         'add_new' => 'Add New',
    29         'add_new_item' => 'Add New Slide',
    30         'new_item' => 'New Slide',
    31         'edit_item' => 'Edit Slide',
    32         'view_item' => 'View Slide',
    33         'all_items' => 'All Slides',
    34         'search_items' => 'Search Slides',
    35         'not_found' => 'No slides found.',
     25        'name'               => 'FlexiFlick Slides',
     26        'singular_name'      => 'Slide',
     27        'menu_name'          => 'FlexiFlick Slides',
     28        'name_admin_bar'     => 'Slide',
     29        'add_new'            => 'Add New',
     30        'add_new_item'       => 'Add New Slide',
     31        'new_item'           => 'New Slide',
     32        'edit_item'          => 'Edit Slide',
     33        'view_item'          => 'View Slide',
     34        'all_items'          => 'All Slides',
     35        'not_found'          => 'No slides found.',
    3636        'not_found_in_trash' => 'No slides found in Trash.',
    3737    );
     
    4040        'labels' => $labels,
    4141        'public' => true,
    42         'publicly_queryable' => true,
     42        'publicly_queryable' => false,
    4343        'show_ui' => true,
    4444        'show_in_menu' => true,
    4545        'query_var' => true,
    46         'rewrite' => array('slug' => 'flexiflick_slides'), // Updated slug
     46        'rewrite' => false, // Updated slug
    4747        'capability_type' => 'post',
    4848        'has_archive' => false,
     49        'exclude_from_search' => true,
    4950        'hierarchical' => false,
    5051        'menu_position' => null,
     
    7071                'default' => true,
    7172            ),
     73            'draggable' => array(
     74                'type'    => 'boolean',
     75                'default' => false,
     76            ),
     77            'wrapAround' => array(
     78                'type'    => 'boolean',
     79                'default' => false,
     80            ),
     81            'freeScroll' => array(
     82                'type'    => 'boolean',
     83                'default' => true,
     84            ),
     85            'pauseAutoPlayOnHover' => array(
     86                'type'    => 'boolean',
     87                'default' => false,
     88            ),
     89            'autoPlay' => array(  // New autoPlay setting
     90                'type'    => 'number',
     91                'default' => 0, // Default is 0 (no autoplay)
     92            ),
    7293        ),
    7394    ));
     
    86107
    87108    if ($slides->have_posts()) {
    88         echo '<div class="flickity-wrap"><div  data-flickity=\'{ "freeScroll": true, "autoPlay": true, "wrapAround": true, "pageDots": ' . ($attributes['showPager'] ? 'true' : 'false') . ', "prevNextButtons": ' . ($attributes['showArrows'] ? 'true' : 'false') . ' }\'>';
     109        echo '<div class="flickity-wrap"><div data-flickity=\'{
     110            "draggable": ' . esc_attr($attributes['draggable'] ? 'true' : 'false') . ',
     111            "freeScroll": ' . esc_attr($attributes['freeScroll'] ? 'true' : 'false') . ',
     112            "autoPlay": ' . esc_attr($attributes['autoPlay'] > 0 ? $attributes['autoPlay'] : 'false') . ',
     113            "wrapAround": ' . esc_attr($attributes['wrapAround'] ? 'true' : 'false') . ',
     114            "pageDots": ' . esc_attr($attributes['showPager'] ? 'true' : 'false') . ',
     115            "prevNextButtons": ' . esc_attr($attributes['showArrows'] ? 'true' : 'false') . '
     116        }\'>';
    89117        while ($slides->have_posts()) : $slides->the_post();
    90118            echo '<div class="flickity-slide">';
     
    106134// Enqueue Scripts and Styles
    107135function flexiflick_enqueue_scripts() {
    108     // Only enqueue on frontend and if the FlexiFlick block is being used
     136    // Only enqueue on the frontend and if the FlexiFlick block is being used or singular CPT page is loaded
    109137    if ( has_block( 'flexiflick/slider-block' ) || is_singular( 'flexiflick_slide_cpt' ) ) {
    110         // Enqueue the local CSS file
     138        // Enqueue the Flickity CSS file
    111139        wp_enqueue_style(
    112140            'flexiflick-flickity-css',
     
    115143            '2.2.1'
    116144        );
    117        
    118         // Enqueue the local JS file
     145
     146        // Add custom inline styles (arrows or button styles)
     147        wp_add_inline_style( 'flexiflick-flickity-css', flexiflick_custom_css() );
     148
     149        // Enqueue the Flickity JS file
    119150        wp_enqueue_script(
    120151            'flexiflick-flickity-js',
     
    124155            true
    125156        );
    126 
    127         // Source: https://github.com/metafizzy/flickity
    128157    }
    129158}
    130159add_action('wp_enqueue_scripts', 'flexiflick_enqueue_scripts');
     160
     161// Custom inline CSS function to add background image to buttons
     162function flexiflick_custom_css() {
     163    $image_url = plugins_url( 'assets/arrow-iconsvg.svg', __FILE__ );
     164    return "
     165        .flickity-slide-content .wp-block-button a:after {
     166            background-image: url('{$image_url}');
     167           
     168        }
     169    ";
     170}
  • flexi-flick/trunk/readme.txt

    r3148067 r3148783  
    33Tags:              block
    44Tested up to:      6.6
    5 Stable tag:        0.1.0
     5Stable tag:        0.1.1
    66License:           GPL-3.0-or-later
    77License URI:       https://www.gnu.org/licenses/gpl-3.0.html
     
    31316. Customize the slider settings in the block inspector.
    3232
    33 
    3433== Screenshots ==
    3534
     
    4443= 0.1.0 =
    4544* Release
     45= 0.1.1 =
     46* Added free scroll functionality for a smoother slide experience.
     47* Added wrap-around option to allow continuous sliding.
     48* Added draggable option to enable/disable manual slide dragging.
     49* Added autoPlay speed control, with an option to disable autoplay.
     50* Introduced an overlay design option for better visual aesthetics.
     51* Added new styles for navigation buttons.
    4652
    4753
  • flexi-flick/trunk/src/index.js

    r3148052 r3148783  
    55import { useSelect } from '@wordpress/data';
    66import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
    7 import { PanelBody, ToggleControl } from '@wordpress/components';
     7import { PanelBody, ToggleControl, TextControl } from '@wordpress/components';
    88import { __ } from '@wordpress/i18n';
    99import metadata from './block.json';
     
    2424            type: 'boolean',
    2525            default: true,
     26        },
     27        draggable: {
     28            type: 'boolean',
     29            default: false,
     30        },
     31        wrapAround: {
     32            type: 'boolean',
     33            default: false,
     34        },
     35        freeScroll: {
     36            type: 'boolean',
     37            default: true,
     38        },
     39        pauseAutoPlayOnHover: {
     40            type: 'boolean',
     41            default: false,
     42        },
     43        autoPlay: {
     44            type: 'number',   // Number input for autoPlay
     45            default: 0,
    2646        },
    2747    },
     
    7090                        <ToggleControl
    7191                            label={__('Show Arrows', 'flexiflick')}
     92                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}
    7293                            checked={attributes.showArrows}
    7394                            onChange={(value) => setAttributes({ showArrows: value })}
     
    7596                        <ToggleControl
    7697                            label={__('Show Pager', 'flexiflick')}
     98                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}
    7799                            checked={attributes.showPager}
    78100                            onChange={(value) => setAttributes({ showPager: value })}
     101                        />
     102                        <ToggleControl
     103                            label={__('Wrap Around', 'flexiflick')}
     104                            help={__('At the end of cells, wrap-around to the other end for infinite scrolling.', 'flexiflick')}
     105                            checked={attributes.wrapAround}
     106                            onChange={(value) => setAttributes({ wrapAround: value })}
     107                        />
     108                        <ToggleControl
     109                            label={__('Draggable', 'flexiflick')}
     110                            help={__('Enables dragging and flicking. Enabled by default when carousel has 2 or more slides. more detail can be found here https://flickity.metafizzy.co/options', 'flexiflick')}
     111                            checked={attributes.draggable}
     112                            onChange={(value) => setAttributes({ draggable: value })}
     113                        />
     114                        <ToggleControl
     115                            label={__('Free Scroll', 'flexiflick')}
     116                            help={__('Enables content to be freely scrolled and flicked without aligning cells to an end position.', 'flexiflick')}
     117
     118                            checked={attributes.freeScroll}
     119                            onChange={(value) => setAttributes({ freeScroll: value })}
     120                        />
     121                        <ToggleControl
     122                            label={__('Pause Auto Play On Hover', 'flexiflick')}
     123                            help={__('Auto-playing will pause when the user hovers over the carousel.', 'flexiflick')}
     124                            checked={attributes.pauseAutoPlayOnHover}
     125                            onChange={(value) => setAttributes({ pauseAutoPlayOnHover: value })}
     126                        />
     127                        <TextControl
     128                            label={__('AutoPlay Speed (ms)', 'flexiflick')}
     129                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}
     130                            value={attributes.autoPlay}
     131                            onChange={(autoPlay) => setAttributes({ autoPlay: parseInt(autoPlay) || 0 })}
     132                            type="number"
    79133                        />
    80134                    </PanelBody>
  • flexi-flick/trunk/src/style.scss

    r3148052 r3148783  
    1616    object-fit: cover;
    1717    height: auto;
     18    filter: brightness(0.7);
    1819}
    1920.flickity-slide {
     
    2425  display: block;
    2526 
     27}
     28.flickity-slide:after {
     29    content: "";
     30    background: rgba(0,0,0,0.6);
     31    display: block;
     32    width: 50%;
     33    height: 100%;
     34    position: absolute;
     35    z-index: -1;
    2636}
    2737.flickity-slide-content {
     
    5464    border-radius: 8px !important;
    5565   
     66}
     67.flickity-slide-content .wp-block-button a {
     68    font-size: 16px !important;
     69    padding: 9px 30px;
     70    background: transparent !important;
     71    color: #fff !important;
     72    text-decoration: none !important;
     73    border: 1px solid #fff;
     74    border-radius: 999px;
     75}
     76.flickity-slide-content .wp-block-button a:hover {
     77    background: transparent !important;
     78    color: #fff !important;
     79}
     80.flickity-slide-content .wp-block-button a:after {
     81   
     82    background-position: 100%;
     83    background-repeat: no-repeat;
     84    background-size: contain;
     85    content: "";
     86    display: inline-flex;
     87    transition: width .1s ease-out;
     88    width: 0;
     89}
     90.flickity-slide-content .wp-block-button a:hover:after {
     91    width: 17px;
     92    height: 17px;
     93    position: relative;
     94    top: 3px;
     95    left: 10px;
    5696}
    5797@keyframes bulletLoader {
Note: See TracChangeset for help on using the changeset viewer.