Ganteng Doang Upload Shell Gak Bisa


Linux server.jmdstrack.com 3.10.0-1160.119.1.el7.tuxcare.els10.x86_64 #1 SMP Fri Oct 11 21:40:41 UTC 2024 x86_64
/ home/ jmdstrac/ public_html/ devices/ public/ lib/

/home/jmdstrac/public_html/devices/public/lib/gridstack.js.map

{"version":3,"file":"gridstack.js","mappings":";;;;;;;AAAa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,mBAAmB;AACnB;AACA,wBAAwB,mBAAO,CAAC,EAAiB;AACjD,oBAAoB,mBAAO,CAAC,EAAa;AACzC,gBAAgB,mBAAO,CAAC,EAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,uDAAuD;AACvD,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0DAA0D;AACpF;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,oCAAoC,2BAA2B,EAAE,QAAQ;AACzE;AACA;AACA;AACA,mCAAmC;AACnC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,oEAAoE,WAAW,kBAAkB;AACjG;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,KAAK;AACL;AACA;AACA;AACA;AACA,mCAAmC,2BAA2B,EAAE,QAAQ;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE,mDAAmD;AACnD;AACA,iCAAiC;AACjC;AACA,2CAA2C;AAC3C,iCAAiC;AACjC;AACA;AACA;AACA,0EAA0E,YAAY,iBAAiB;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,sBAAsB;AACtB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,8CAA8C;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA,mCAAmC;AACnC,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,kCAAkC;AAClC,wDAAwD;AACxD,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,wCAAwC;AACxC;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,QAAQ,uCAAuC;AACrH;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,gCAAgC;AAChC;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,yCAAyC;AACzC;AACA;AACA;AACA;;;;;;;AC1oBa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,oBAAoB;AACpB;;;;;;;AC3Ba;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,uBAAuB;AACvB,gBAAgB,mBAAO,CAAC,EAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,6BAA6B;AAC7B,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,0DAA0D;AAC1D;AACA;AACA,uBAAuB;AACvB,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA,sEAAsE,cAAc,WAAW,iEAAiE,cAAc,qBAAqB;AACnM;AACA,wFAAwF,SAAS,0BAA0B;AAC3H;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F,cAAc,4BAA4B;AACrI;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,mFAAmF;AACnF;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,kDAAkD;AAClD;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,uCAAuC;AACvC,gCAAgC;AAChC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,iCAAiC;AACrF;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,iCAAiC;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,UAAU;AAC1F;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA,uCAAuC;AACvC,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,uBAAuB,OAAO;AACvE,SAAS;AACT,gCAAgC,SAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,eAAe;AACxD;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,yBAAyB;AACzB;AACA,uCAAuC;AACvC,+BAA+B;AAC/B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD,wBAAwB,sCAAsC;AAC9D,SAAS;AACT,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;;;;;;ACh5Ba;AACb;AACA;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAO,CAAC,EAAoB;AACvD,gBAAgB,mBAAO,CAAC,EAAS;AACjC,wBAAwB,mBAAO,CAAC,EAAiB;AACjD;AACA,aAAa,mBAAO,CAAC,EAAS;AAC9B,aAAa,mBAAO,CAAC,EAAS;AAC9B,aAAa,mBAAO,CAAC,EAAoB;AACzC,aAAa,mBAAO,CAAC,EAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,sBAAsB;AACtB,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,4CAA4C;AACjG;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA,eAAe;AACf,6CAA6C;AAC7C;AACA;AACA;AACA,qBAAqB;AACrB,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,mCAAmC;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,iDAAiD;AACjD;AACA,SAAS;AACT;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C,8GAA8G,KAAK;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,sBAAsB;AAC7H;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE,gEAAgE,0BAA0B,yCAAyC,QAAQ;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG,sCAAsC;AACtC;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA,gEAAgE;AAChE,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,UAAU,OAAO,SAAS,KAAK,OAAO,KAAK,MAAM;AACvG;AACA;AACA,6BAA6B;AAC7B,0DAA0D,mCAAmC;AAC7F;AACA;AACA,6BAA6B;AAC7B,0DAA0D,mBAAmB,cAAc,iBAAiB;AAC5G;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,sBAAsB;AACnE;AACA,4DAA4D,oBAAoB;AAChF;AACA;AACA,2DAA2D,6BAA6B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,mBAAmB;AACpH;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,SAAS;AAClH;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,8BAA8B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,4BAA4B,KAAK,oBAAoB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,WAAW,EAAE,eAAe;AACtG;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC,kCAAkC,4BAA4B;AAC9D,oEAAoE,MAAM,SAAS,QAAQ,UAAU,SAAS,QAAQ,MAAM;AAC5H,wEAAwE,MAAM,SAAS,QAAQ,UAAU,SAAS,QAAQ,MAAM;AAChI;AACA,sDAAsD,QAAQ,+BAA+B,MAAM;AACnG,sDAAsD,QAAQ,8BAA8B,MAAM;AAClG,sDAAsD,QAAQ,+BAA+B,QAAQ,UAAU,OAAO;AACtH,sDAAsD,QAAQ,8BAA8B,KAAK;AACjG,sDAAsD,QAAQ,6BAA6B,KAAK;AAChG,sDAAsD,QAAQ,8BAA8B,OAAO,UAAU,OAAO;AACpH;AACA;AACA;AACA;AACA;AACA,gDAAgD,WAAW,OAAO;AAClE;AACA,0DAA0D,OAAO,SAAS,MAAM,aAAa,iBAAiB,IAAI;AAClH,0DAA0D,OAAO,SAAS,EAAE,gBAAgB,EAAE;AAC9F,0DAA0D,OAAO,aAAa,EAAE,oBAAoB,EAAE;AACtG,0DAA0D,OAAO,aAAa,EAAE,oBAAoB,EAAE;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,mDAAmD;AACnD;AACA,iCAAiC;AACjC;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,2BAA2B;AAC3B;AACA,yBAAyB;AACzB;AACA,mCAAmC;AACnC;AACA,iEAAiE;AACjE;AACA,gEAAgE;AAChE;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;;;;;;ACh7Ca;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;;;;;;;ACrCa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,mBAAmB;AACnB,qBAAqB,mBAAO,CAAC,EAAc;AAC3C,mBAAmB,mBAAO,CAAC,EAAY;AACvC,uBAAuB,mBAAO,CAAC,EAAgB;AAC/C;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,qCAAqC,8CAA8C,YAAY;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,oCAAoC;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,+BAA+B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,mCAAmC;AAC5F;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,mCAAmC;AACnC;AACA;AACA,yCAAyC;AACzC;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,wBAAwB,YAAY;AACpC,oCAAoC;AACpC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gCAAgC,eAAe;AAC/C,4CAA4C,2CAA2C,+BAA+B;AACtH;AACA;AACA;AACA;;;;;;;AChTa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,mBAAmB;AACnB,qBAAqB,mBAAO,CAAC,EAAc;AAC3C,uBAAuB,mBAAO,CAAC,EAAgB;AAC/C,mBAAmB,mBAAO,CAAC,EAAY;AACvC;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,SAAS,QAAQ,+CAA+C;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,mCAAmC;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,SAAS,QAAQ,+CAA+C;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2G;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,kCAAkC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,yDAAyD,+BAA+B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD;AACA;AACA,mBAAmB;AACnB;;;;;;;ACvKa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,iBAAiB;AACjB,uBAAuB,mBAAO,CAAC,EAAgB;AAC/C,uBAAuB,mBAAO,CAAC,GAAgB;AAC/C,uBAAuB,mBAAO,CAAC,GAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;;;;;;AC9Fa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;;;;;;;ACVa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB,EAAE,SAAS;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;;;;;;ACjFa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,mBAAmB;AACnB,8BAA8B,mBAAO,CAAC,EAAuB;AAC7D,uBAAuB,mBAAO,CAAC,EAAgB;AAC/C,mBAAmB,mBAAO,CAAC,EAAY;AACvC,gBAAgB,mBAAO,CAAC,EAAU;AAClC;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iCAAiC,YAAY;AACjF;AACA;AACA,iBAAiB;AACjB,gCAAgC,6BAA6B,gBAAgB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,sCAAsC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,iCAAiC;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,qCAAqC;AAC9F;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,oBAAoB,YAAY;AAChC,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;;;;;;ACtRa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,kFAAkF;AAClF,oGAAoG;AACpG,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;AACD;;;;;;;AC7Fa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC,gBAAgB;AACvF,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,yBAAyB;AACzB,qBAAqB,mBAAO,CAAC,EAAc;AAC3C,qBAAqB,mBAAO,CAAC,EAAc;AAC3C,uBAAuB,mBAAO,CAAC,GAAiB;AAChD,gBAAgB,mBAAO,CAAC,EAAU;AAClC;AACA,aAAa,mBAAO,CAAC,GAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA;AACA;AACA,+EAA+E,0BAA0B,kBAAkB;AAC3H;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,qCAAqC,cAAc;AACnD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;;;;;;AC3Ia;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D;;;;;;;ACNa;AACb;AACA;AACA;AACA;AACA,8CAA6C,EAAE,aAAa,EAAC;AAC7D,aAAa,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,oBAAoB,GAAG,gBAAgB;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,oDAAoD;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,UAAU,EAAE,OAAO;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,eAAe,oBAAoB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,iDAAiD;AACjF;AACA;AACA,gCAAgC,4DAA4D;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;;;;;;;ACtZA;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;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;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACsC;AACtC,mBAAmB,gDAAS;AAC5B,mBAAO,CAAC,EAAuC;AAC/C,mBAAO,CAAC,GAAkC","sources":["webpack://@glpi/glpi/./node_modules/gridstack/dist/gridstack-dd.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/gridstack-ddi.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/gridstack-engine.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/gridstack.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-base-impl.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-draggable.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-droppable.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-element.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-manager.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-resizable-handle.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-resizable.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/dd-utils.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/h5/gridstack-dd-native.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/types.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/utils.js","webpack://@glpi/glpi/./node_modules/gridstack/dist/gridstack.min.css?8b5a","webpack://@glpi/glpi/webpack/bootstrap","webpack://@glpi/glpi/webpack/runtime/compat get default export","webpack://@glpi/glpi/webpack/runtime/define property getters","webpack://@glpi/glpi/webpack/runtime/hasOwnProperty shorthand","webpack://@glpi/glpi/webpack/runtime/make namespace object","webpack://@glpi/glpi/./lib/bundles/gridstack.js"],"sourcesContent":["\"use strict\";\r\n/**\r\n * gridstack-dd.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.GridStackDD = void 0;\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nconst gridstack_ddi_1 = require(\"./gridstack-ddi\");\r\nconst gridstack_1 = require(\"./gridstack\");\r\nconst utils_1 = require(\"./utils\");\r\n// TEST let count = 0;\r\n/**\r\n * Base class implementing common Grid drag'n'drop functionality, with domain specific subclass (h5 vs jq subclasses)\r\n */\r\nclass GridStackDD extends gridstack_ddi_1.GridStackDDI {\r\n    /** override to cast to correct type */\r\n    static get() {\r\n        return gridstack_ddi_1.GridStackDDI.get();\r\n    }\r\n    /** removes any drag&drop present (called during destroy) */\r\n    remove(el) {\r\n        this.draggable(el, 'destroy').resizable(el, 'destroy');\r\n        if (el.gridstackNode) {\r\n            delete el.gridstackNode._initDD; // reset our DD init flag\r\n        }\r\n        return this;\r\n    }\r\n}\r\nexports.GridStackDD = GridStackDD;\r\n/********************************************************************************\r\n * GridStack code that is doing drag&drop extracted here so main class is smaller\r\n * for static grid that don't do any of this work anyway. Saves about 10k.\r\n * https://www.typescriptlang.org/docs/handbook/declaration-merging.html\r\n * https://www.typescriptlang.org/docs/handbook/mixins.html\r\n ********************************************************************************/\r\n/** @internal called to add drag over to support widgets being added externally */\r\ngridstack_1.GridStack.prototype._setupAcceptWidget = function () {\r\n    // check if we need to disable things\r\n    if (this.opts.staticGrid || (!this.opts.acceptWidgets && !this.opts.removable)) {\r\n        GridStackDD.get().droppable(this.el, 'destroy');\r\n        return this;\r\n    }\r\n    // vars shared across all methods\r\n    let cellHeight, cellWidth;\r\n    let onDrag = (event, el, helper) => {\r\n        let node = el.gridstackNode;\r\n        if (!node)\r\n            return;\r\n        helper = helper || el;\r\n        let parent = this.el.getBoundingClientRect();\r\n        let { top, left } = helper.getBoundingClientRect();\r\n        left -= parent.left;\r\n        top -= parent.top;\r\n        let ui = { position: { top, left } };\r\n        if (node._temporaryRemoved) {\r\n            node.x = Math.max(0, Math.round(left / cellWidth));\r\n            node.y = Math.max(0, Math.round(top / cellHeight));\r\n            delete node.autoPosition;\r\n            this.engine.nodeBoundFix(node);\r\n            // don't accept *initial* location if doesn't fit #1419 (locked drop region, or can't grow), but maybe try if it will go somewhere\r\n            if (!this.engine.willItFit(node)) {\r\n                node.autoPosition = true; // ignore x,y and try for any slot...\r\n                if (!this.engine.willItFit(node)) {\r\n                    GridStackDD.get().off(el, 'drag'); // stop calling us\r\n                    return; // full grid or can't grow\r\n                }\r\n                if (node._willFitPos) {\r\n                    // use the auto position instead #1687\r\n                    utils_1.Utils.copyPos(node, node._willFitPos);\r\n                    delete node._willFitPos;\r\n                }\r\n            }\r\n            // re-use the existing node dragging method\r\n            this._onStartMoving(helper, event, ui, node, cellWidth, cellHeight);\r\n        }\r\n        else {\r\n            // re-use the existing node dragging that does so much of the collision detection\r\n            this._dragOrResize(helper, event, ui, node, cellWidth, cellHeight);\r\n        }\r\n    };\r\n    GridStackDD.get()\r\n        .droppable(this.el, {\r\n        accept: (el) => {\r\n            let node = el.gridstackNode;\r\n            // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\r\n            if ((node === null || node === void 0 ? void 0 : node.grid) === this)\r\n                return true;\r\n            if (!this.opts.acceptWidgets)\r\n                return false;\r\n            // prevent deeper nesting until rest of 992 can be fixed\r\n            if (node === null || node === void 0 ? void 0 : node.subGrid)\r\n                return false;\r\n            // check for accept method or class matching\r\n            let canAccept = true;\r\n            if (typeof this.opts.acceptWidgets === 'function') {\r\n                canAccept = this.opts.acceptWidgets(el);\r\n            }\r\n            else {\r\n                let selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets);\r\n                canAccept = el.matches(selector);\r\n            }\r\n            // finally check to make sure we actually have space left #1571\r\n            if (canAccept && node && this.opts.maxRow) {\r\n                let n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH }; // only width/height matters and autoPosition\r\n                canAccept = this.engine.willItFit(n);\r\n            }\r\n            return canAccept;\r\n        }\r\n    })\r\n        /**\r\n         * entering our grid area\r\n         */\r\n        .on(this.el, 'dropover', (event, el, helper) => {\r\n        // TEST console.log(`over ${this.el.gridstack.opts.id} ${count++}`);\r\n        let node = el.gridstackNode;\r\n        // ignore drop enter on ourself (unless we temporarily removed) which happens on a simple drag of our item\r\n        if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._temporaryRemoved) {\r\n            // delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\r\n            return false; // prevent parent from receiving msg (which may be a grid as well)\r\n        }\r\n        // fix #1578 when dragging fast, we may not get a leave on the previous grid so force one now\r\n        if ((node === null || node === void 0 ? void 0 : node.grid) && node.grid !== this && !node._temporaryRemoved) {\r\n            // TEST console.log('dropover without leave');\r\n            let otherGrid = node.grid;\r\n            otherGrid._leave(el, helper);\r\n        }\r\n        // cache cell dimensions (which don't change), position can animate if we removed an item in otherGrid that affects us...\r\n        cellWidth = this.cellWidth();\r\n        cellHeight = this.getCellHeight(true);\r\n        // load any element attributes if we don't have a node\r\n        if (!node) { // @ts-ignore private read only on ourself\r\n            node = this._readAttr(el);\r\n        }\r\n        if (!node.grid) {\r\n            node._isExternal = true;\r\n            el.gridstackNode = node;\r\n        }\r\n        // calculate the grid size based on element outer size\r\n        helper = helper || el;\r\n        let w = node.w || Math.round(helper.offsetWidth / cellWidth) || 1;\r\n        let h = node.h || Math.round(helper.offsetHeight / cellHeight) || 1;\r\n        // if the item came from another grid, make a copy and save the original info in case we go back there\r\n        if (node.grid && node.grid !== this) {\r\n            // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\r\n            // TEST console.log('dropover cloning node');\r\n            if (!el._gridstackNodeOrig)\r\n                el._gridstackNodeOrig = node; // shouldn't have multiple nested!\r\n            el.gridstackNode = node = Object.assign(Object.assign({}, node), { w, h, grid: this });\r\n            this.engine.cleanupNode(node)\r\n                .nodeBoundFix(node);\r\n            // restore some internal fields we need after clearing them all\r\n            node._initDD =\r\n                node._isExternal = // DOM needs to be re-parented on a drop\r\n                    node._temporaryRemoved = true; // so it can be inserted onDrag below\r\n        }\r\n        else {\r\n            node.w = w;\r\n            node.h = h;\r\n            node._temporaryRemoved = true; // so we can insert it\r\n        }\r\n        // clear any marked for complete removal (Note: don't check _isAboutToRemove as that is cleared above - just do it)\r\n        _itemRemoving(node.el, false);\r\n        GridStackDD.get().on(el, 'drag', onDrag);\r\n        // make sure this is called at least once when going fast #1578\r\n        onDrag(event, el, helper);\r\n        return false; // prevent parent from receiving msg (which may be a grid as well)\r\n    })\r\n        /**\r\n         * Leaving our grid area...\r\n         */\r\n        .on(this.el, 'dropout', (event, el, helper) => {\r\n        // TEST console.log(`out ${this.el.gridstack.opts.id} ${count++}`);\r\n        let node = el.gridstackNode;\r\n        if (!node)\r\n            return false;\r\n        // fix #1578 when dragging fast, we might get leave after other grid gets enter (which calls us to clean)\r\n        // so skip this one if we're not the active grid really..\r\n        if (!node.grid || node.grid === this) {\r\n            this._leave(el, helper);\r\n        }\r\n        return false; // prevent parent from receiving msg (which may be grid as well)\r\n    })\r\n        /**\r\n         * end - releasing the mouse\r\n         */\r\n        .on(this.el, 'drop', (event, el, helper) => {\r\n        let node = el.gridstackNode;\r\n        // ignore drop on ourself from ourself that didn't come from the outside - dragend will handle the simple move instead\r\n        if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._isExternal)\r\n            return false;\r\n        let wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419\r\n        this.placeholder.remove();\r\n        // notify previous grid of removal\r\n        // TEST console.log('drop delete _gridstackNodeOrig')\r\n        let origNode = el._gridstackNodeOrig;\r\n        delete el._gridstackNodeOrig;\r\n        if (wasAdded && origNode && origNode.grid && origNode.grid !== this) {\r\n            let oGrid = origNode.grid;\r\n            oGrid.engine.removedNodes.push(origNode);\r\n            oGrid._triggerRemoveEvent();\r\n        }\r\n        if (!node)\r\n            return false;\r\n        // use existing placeholder node as it's already in our list with drop location\r\n        if (wasAdded) {\r\n            this.engine.cleanupNode(node); // removes all internal _xyz values\r\n            node.grid = this;\r\n        }\r\n        GridStackDD.get().off(el, 'drag');\r\n        // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)\r\n        // as the helper will be nuked by jquery-ui otherwise\r\n        if (helper !== el) {\r\n            helper.remove();\r\n            el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\r\n            if (wasAdded) {\r\n                el = el.cloneNode(true);\r\n            }\r\n        }\r\n        else {\r\n            el.remove(); // reduce flicker as we change depth here, and size further down\r\n            GridStackDD.get().remove(el);\r\n        }\r\n        if (!wasAdded)\r\n            return false;\r\n        el.gridstackNode = node;\r\n        node.el = el;\r\n        // @ts-ignore\r\n        utils_1.Utils.copyPos(node, this._readAttr(this.placeholder)); // placeholder values as moving VERY fast can throw things off #1578\r\n        utils_1.Utils.removePositioningStyles(el); // @ts-ignore\r\n        this._writeAttr(el, node);\r\n        this.el.appendChild(el); // @ts-ignore\r\n        this._updateContainerHeight();\r\n        this.engine.addedNodes.push(node); // @ts-ignore\r\n        this._triggerAddEvent(); // @ts-ignore\r\n        this._triggerChangeEvent();\r\n        this.engine.endUpdate();\r\n        if (this._gsEventHandler['dropped']) {\r\n            this._gsEventHandler['dropped'](Object.assign(Object.assign({}, event), { type: 'dropped' }), origNode && origNode.grid ? origNode : undefined, node);\r\n        }\r\n        // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up\r\n        window.setTimeout(() => {\r\n            // IFF we are still there (some application will use as placeholder and insert their real widget instead and better call makeWidget())\r\n            if (node.el && node.el.parentElement) {\r\n                this._prepareDragDropByNode(node);\r\n            }\r\n            else {\r\n                this.engine.removeNode(node);\r\n            }\r\n        });\r\n        return false; // prevent parent from receiving msg (which may be grid as well)\r\n    });\r\n    return this;\r\n};\r\n/** @internal mark item for removal */\r\nfunction _itemRemoving(el, remove) {\r\n    let node = el ? el.gridstackNode : undefined;\r\n    if (!node || !node.grid)\r\n        return;\r\n    remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;\r\n    remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');\r\n}\r\n/** @internal called to setup a trash drop zone if the user specifies it */\r\ngridstack_1.GridStack.prototype._setupRemoveDrop = function () {\r\n    if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {\r\n        let trashEl = document.querySelector(this.opts.removable);\r\n        if (!trashEl)\r\n            return this;\r\n        // only register ONE drop-over/dropout callback for the 'trash', and it will\r\n        // update the passed in item and parent grid because the 'trash' is a shared resource anyway,\r\n        // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\r\n        if (!GridStackDD.get().isDroppable(trashEl)) {\r\n            GridStackDD.get().droppable(trashEl, this.opts.removableOptions)\r\n                .on(trashEl, 'dropover', (event, el) => _itemRemoving(el, true))\r\n                .on(trashEl, 'dropout', (event, el) => _itemRemoving(el, false));\r\n        }\r\n    }\r\n    return this;\r\n};\r\n/**\r\n * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.\r\n * Called during GridStack.init() as options, but can also be called directly (last param are cached) in case the toolbar\r\n * is dynamically create and needs to change later.\r\n **/\r\ngridstack_1.GridStack.setupDragIn = function (_dragIn, _dragInOptions) {\r\n    let dragIn;\r\n    let dragInOptions;\r\n    const dragInDefaultOptions = {\r\n        revert: 'invalid',\r\n        handle: '.grid-stack-item-content',\r\n        scroll: false,\r\n        appendTo: 'body'\r\n    };\r\n    // cache in the passed in values (form grid init?) so they don't have to resend them each time\r\n    if (_dragIn) {\r\n        dragIn = _dragIn;\r\n        dragInOptions = Object.assign(Object.assign({}, dragInDefaultOptions), (_dragInOptions || {}));\r\n    }\r\n    if (typeof dragIn !== 'string')\r\n        return;\r\n    let dd = GridStackDD.get();\r\n    utils_1.Utils.getElements(dragIn).forEach(el => {\r\n        if (!dd.isDraggable(el))\r\n            dd.dragIn(el, dragInOptions);\r\n    });\r\n};\r\n/** @internal prepares the element for drag&drop **/\r\ngridstack_1.GridStack.prototype._prepareDragDropByNode = function (node) {\r\n    let el = node.el;\r\n    let dd = GridStackDD.get();\r\n    // check for disabled grid first\r\n    if (this.opts.staticGrid || ((node.noMove || this.opts.disableDrag) && (node.noResize || this.opts.disableResize))) {\r\n        if (node._initDD) {\r\n            dd.remove(el); // nukes everything instead of just disable, will add some styles back next\r\n            delete node._initDD;\r\n        }\r\n        el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\r\n        return this;\r\n    }\r\n    if (!node._initDD) {\r\n        // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\r\n        let cellWidth;\r\n        let cellHeight;\r\n        /** called when item starts moving/resizing */\r\n        let onStartMoving = (event, ui) => {\r\n            // trigger any 'dragstart' / 'resizestart' manually\r\n            if (this._gsEventHandler[event.type]) {\r\n                this._gsEventHandler[event.type](event, event.target);\r\n            }\r\n            cellWidth = this.cellWidth();\r\n            cellHeight = this.getCellHeight(true); // force pixels for calculations\r\n            this._onStartMoving(el, event, ui, node, cellWidth, cellHeight);\r\n        };\r\n        /** called when item is being dragged/resized */\r\n        let dragOrResize = (event, ui) => {\r\n            this._dragOrResize(el, event, ui, node, cellWidth, cellHeight);\r\n        };\r\n        /** called when the item stops moving/resizing */\r\n        let onEndMoving = (event) => {\r\n            this.placeholder.remove();\r\n            delete node._moving;\r\n            delete node._lastTried;\r\n            // if the item has moved to another grid, we're done here\r\n            let target = event.target;\r\n            if (!target.gridstackNode || target.gridstackNode.grid !== this)\r\n                return;\r\n            node.el = target;\r\n            if (node._isAboutToRemove) {\r\n                let gridToNotify = el.gridstackNode.grid;\r\n                if (gridToNotify._gsEventHandler[event.type]) {\r\n                    gridToNotify._gsEventHandler[event.type](event, target);\r\n                }\r\n                dd.remove(el);\r\n                gridToNotify.engine.removedNodes.push(node);\r\n                gridToNotify._triggerRemoveEvent();\r\n                // break circular links and remove DOM\r\n                delete el.gridstackNode;\r\n                delete node.el;\r\n                el.remove();\r\n            }\r\n            else {\r\n                if (!node._temporaryRemoved) {\r\n                    // move to new placeholder location\r\n                    utils_1.Utils.removePositioningStyles(target); // @ts-ignore\r\n                    this._writePosAttr(target, node);\r\n                }\r\n                else {\r\n                    // got removed - restore item back to before dragging position\r\n                    utils_1.Utils.removePositioningStyles(target);\r\n                    utils_1.Utils.copyPos(node, node._orig); // @ts-ignore\r\n                    this._writePosAttr(target, node);\r\n                    this.engine.addNode(node);\r\n                }\r\n                if (this._gsEventHandler[event.type]) {\r\n                    this._gsEventHandler[event.type](event, target);\r\n                }\r\n            }\r\n            // @ts-ignore\r\n            this._extraDragRow = 0; // @ts-ignore\r\n            this._updateContainerHeight(); // @ts-ignore\r\n            this._triggerChangeEvent();\r\n            this.engine.endUpdate();\r\n        };\r\n        dd.draggable(el, {\r\n            start: onStartMoving,\r\n            stop: onEndMoving,\r\n            drag: dragOrResize\r\n        }).resizable(el, {\r\n            start: onStartMoving,\r\n            stop: onEndMoving,\r\n            resize: dragOrResize\r\n        });\r\n        node._initDD = true; // we've set DD support now\r\n    }\r\n    // finally fine tune move vs resize by disabling any part...\r\n    if (node.noMove || this.opts.disableDrag) {\r\n        dd.draggable(el, 'disable');\r\n        el.classList.add('ui-draggable-disabled');\r\n    }\r\n    else {\r\n        dd.draggable(el, 'enable');\r\n        el.classList.remove('ui-draggable-disabled');\r\n    }\r\n    if (node.noResize || this.opts.disableResize) {\r\n        dd.resizable(el, 'disable');\r\n        el.classList.add('ui-resizable-disabled');\r\n    }\r\n    else {\r\n        dd.resizable(el, 'enable');\r\n        el.classList.remove('ui-resizable-disabled');\r\n    }\r\n    return this;\r\n};\r\n/** @internal called when item is starting a drag/resize */\r\ngridstack_1.GridStack.prototype._onStartMoving = function (el, event, ui, node, cellWidth, cellHeight) {\r\n    this.engine.cleanNodes()\r\n        .beginUpdate(node);\r\n    // @ts-ignore\r\n    this._writePosAttr(this.placeholder, node);\r\n    this.el.appendChild(this.placeholder);\r\n    // TEST console.log('_onStartMoving placeholder')\r\n    node.el = this.placeholder;\r\n    node._lastUiPosition = ui.position;\r\n    node._prevYPix = ui.position.top;\r\n    node._moving = (event.type === 'dragstart'); // 'dropover' are not initially moving so they can go exactly where they enter (will push stuff out of the way)\r\n    delete node._lastTried;\r\n    if (event.type === 'dropover' && node._temporaryRemoved) {\r\n        // TEST console.log('engine.addNode x=' + node.x);\r\n        this.engine.addNode(node); // will add, fix collisions, update attr and clear _temporaryRemoved\r\n        node._moving = true; // AFTER, mark as moving object (wanted fix location before)\r\n    }\r\n    // set the min/max resize info\r\n    this.engine.cacheRects(cellWidth, cellHeight, this.opts.marginTop, this.opts.marginRight, this.opts.marginBottom, this.opts.marginLeft);\r\n    if (event.type === 'resizestart') {\r\n        let dd = GridStackDD.get()\r\n            .resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1))\r\n            .resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));\r\n        if (node.maxW) {\r\n            dd.resizable(el, 'option', 'maxWidth', cellWidth * node.maxW);\r\n        }\r\n        if (node.maxH) {\r\n            dd.resizable(el, 'option', 'maxHeight', cellHeight * node.maxH);\r\n        }\r\n    }\r\n};\r\n/** @internal called when item leaving our area by either cursor dropout event\r\n * or shape is outside our boundaries. remove it from us, and mark temporary if this was\r\n * our item to start with else restore prev node values from prev grid it came from.\r\n **/\r\ngridstack_1.GridStack.prototype._leave = function (el, helper) {\r\n    let node = el.gridstackNode;\r\n    if (!node)\r\n        return;\r\n    GridStackDD.get().off(el, 'drag'); // no need to track while being outside\r\n    // this gets called when cursor leaves and shape is outside, so only do this once\r\n    if (node._temporaryRemoved)\r\n        return;\r\n    node._temporaryRemoved = true;\r\n    this.engine.removeNode(node); // remove placeholder as well, otherwise it's a sign node is not in our list, which is a bigger issue\r\n    node.el = node._isExternal && helper ? helper : el; // point back to real item being dragged\r\n    if (this.opts.removable === true) { // boolean vs a class string\r\n        // item leaving us and we are supposed to remove on leave (no need to drag onto trash) mark it so\r\n        _itemRemoving(el, true);\r\n    }\r\n    // finally if item originally came from another grid, but left us, restore things back to prev info\r\n    if (el._gridstackNodeOrig) {\r\n        // TEST console.log('leave delete _gridstackNodeOrig')\r\n        el.gridstackNode = el._gridstackNodeOrig;\r\n        delete el._gridstackNodeOrig;\r\n    }\r\n    else if (node._isExternal) {\r\n        // item came from outside (like a toolbar) so nuke any node info\r\n        delete node.el;\r\n        delete el.gridstackNode;\r\n        // and restore all nodes back to original\r\n        this.engine.restoreInitial();\r\n    }\r\n};\r\n/** @internal called when item is being dragged/resized */\r\ngridstack_1.GridStack.prototype._dragOrResize = function (el, event, ui, node, cellWidth, cellHeight) {\r\n    let p = Object.assign({}, node._orig); // could be undefined (_isExternal) which is ok (drag only set x,y and w,h will default to node value)\r\n    let resizing;\r\n    let mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;\r\n    // if margins (which are used to pass mid point by) are large relative to cell height/width, reduce them down #1855\r\n    let mHeight = Math.round(cellHeight * 0.1), mWidth = Math.round(cellWidth * 0.1);\r\n    mLeft = Math.min(mLeft, mWidth);\r\n    mRight = Math.min(mRight, mWidth);\r\n    mTop = Math.min(mTop, mHeight);\r\n    mBottom = Math.min(mBottom, mHeight);\r\n    if (event.type === 'drag') {\r\n        if (node._temporaryRemoved)\r\n            return; // handled by dropover\r\n        let distance = ui.position.top - node._prevYPix;\r\n        node._prevYPix = ui.position.top;\r\n        utils_1.Utils.updateScrollPosition(el, ui.position, distance);\r\n        // get new position taking into account the margin in the direction we are moving! (need to pass mid point by margin)\r\n        let left = ui.position.left + (ui.position.left > node._lastUiPosition.left ? -mRight : mLeft);\r\n        let top = ui.position.top + (ui.position.top > node._lastUiPosition.top ? -mBottom : mTop);\r\n        p.x = Math.round(left / cellWidth);\r\n        p.y = Math.round(top / cellHeight);\r\n        // @ts-ignore// if we're at the bottom hitting something else, grow the grid so cursor doesn't leave when trying to place below others\r\n        let prev = this._extraDragRow;\r\n        if (this.engine.collide(node, p)) {\r\n            let row = this.getRow();\r\n            let extra = Math.max(0, (p.y + node.h) - row);\r\n            if (this.opts.maxRow && row + extra > this.opts.maxRow) {\r\n                extra = Math.max(0, this.opts.maxRow - row);\r\n            } // @ts-ignore\r\n            this._extraDragRow = extra; // @ts-ignore\r\n        }\r\n        else\r\n            this._extraDragRow = 0; // @ts-ignore\r\n        if (this._extraDragRow !== prev)\r\n            this._updateContainerHeight();\r\n        if (node.x === p.x && node.y === p.y)\r\n            return; // skip same\r\n        // DON'T skip one we tried as we might have failed because of coverage <50% before\r\n        // if (node._lastTried && node._lastTried.x === x && node._lastTried.y === y) return;\r\n    }\r\n    else if (event.type === 'resize') {\r\n        if (p.x < 0)\r\n            return;\r\n        // Scrolling page if needed\r\n        utils_1.Utils.updateScrollResize(event, el, cellHeight);\r\n        // get new size\r\n        p.w = Math.round((ui.size.width - mLeft) / cellWidth);\r\n        p.h = Math.round((ui.size.height - mTop) / cellHeight);\r\n        if (node.w === p.w && node.h === p.h)\r\n            return;\r\n        if (node._lastTried && node._lastTried.w === p.w && node._lastTried.h === p.h)\r\n            return; // skip one we tried (but failed)\r\n        // if we size on left/top side this might move us, so get possible new position as well\r\n        let left = ui.position.left + mLeft;\r\n        let top = ui.position.top + mTop;\r\n        p.x = Math.round(left / cellWidth);\r\n        p.y = Math.round(top / cellHeight);\r\n        resizing = true;\r\n    }\r\n    node._lastTried = p; // set as last tried (will nuke if we go there)\r\n    let rect = {\r\n        x: ui.position.left + mLeft,\r\n        y: ui.position.top + mTop,\r\n        w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,\r\n        h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom\r\n    };\r\n    if (this.engine.moveNodeCheck(node, Object.assign(Object.assign({}, p), { cellWidth, cellHeight, rect, resizing }))) {\r\n        node._lastUiPosition = ui.position;\r\n        this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);\r\n        delete node._skipDown;\r\n        if (resizing && node.subGrid) {\r\n            node.subGrid.onParentResize();\r\n        } // @ts-ignore\r\n        this._extraDragRow = 0; // @ts-ignore\r\n        this._updateContainerHeight();\r\n        let target = event.target; // @ts-ignore\r\n        this._writePosAttr(target, node);\r\n        if (this._gsEventHandler[event.type]) {\r\n            this._gsEventHandler[event.type](event, target);\r\n        }\r\n    }\r\n};\r\n/**\r\n * Enables/Disables moving.\r\n * @param els widget or selector to modify.\r\n * @param val if true widget will be draggable.\r\n */\r\ngridstack_1.GridStack.prototype.movable = function (els, val) {\r\n    if (this.opts.staticGrid)\r\n        return this; // can't move a static grid!\r\n    gridstack_1.GridStack.getElements(els).forEach(el => {\r\n        let node = el.gridstackNode;\r\n        if (!node)\r\n            return;\r\n        if (val)\r\n            delete node.noMove;\r\n        else\r\n            node.noMove = true;\r\n        this._prepareDragDropByNode(node); // init DD if need be, and adjust\r\n    });\r\n    return this;\r\n};\r\n/**\r\n * Enables/Disables resizing.\r\n * @param els  widget or selector to modify\r\n * @param val  if true widget will be resizable.\r\n */\r\ngridstack_1.GridStack.prototype.resizable = function (els, val) {\r\n    if (this.opts.staticGrid)\r\n        return this; // can't resize a static grid!\r\n    gridstack_1.GridStack.getElements(els).forEach(el => {\r\n        let node = el.gridstackNode;\r\n        if (!node)\r\n            return;\r\n        if (val)\r\n            delete node.noResize;\r\n        else\r\n            node.noResize = true;\r\n        this._prepareDragDropByNode(node); // init DD if need be, and adjust\r\n    });\r\n    return this;\r\n};\r\n/**\r\n  * Temporarily disables widgets moving/resizing.\r\n  * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\r\n  * Note: no-op for static grid\r\n  * This is a shortcut for:\r\n  * @example\r\n  *  grid.enableMove(false);\r\n  *  grid.enableResize(false);\r\n  */\r\ngridstack_1.GridStack.prototype.disable = function () {\r\n    if (this.opts.staticGrid)\r\n        return;\r\n    this.enableMove(false);\r\n    this.enableResize(false); // @ts-ignore\r\n    this._triggerEvent('disable');\r\n    return this;\r\n};\r\n/**\r\n  * Re-enables widgets moving/resizing - see disable().\r\n  * Note: no-op for static grid.\r\n  * This is a shortcut for:\r\n  * @example\r\n  *  grid.enableMove(true);\r\n  *  grid.enableResize(true);\r\n  */\r\ngridstack_1.GridStack.prototype.enable = function () {\r\n    if (this.opts.staticGrid)\r\n        return;\r\n    this.enableMove(true);\r\n    this.enableResize(true); // @ts-ignore\r\n    this._triggerEvent('enable');\r\n    return this;\r\n};\r\n/** Enables/disables widget moving. No-op for static grids. */\r\ngridstack_1.GridStack.prototype.enableMove = function (doEnable) {\r\n    if (this.opts.staticGrid)\r\n        return this; // can't move a static grid!\r\n    this.opts.disableDrag = !doEnable; // FIRST before we update children as grid overrides #1658\r\n    this.engine.nodes.forEach(n => this.movable(n.el, doEnable));\r\n    return this;\r\n};\r\n/** Enables/disables widget resizing. No-op for static grids. */\r\ngridstack_1.GridStack.prototype.enableResize = function (doEnable) {\r\n    if (this.opts.staticGrid)\r\n        return this; // can't size a static grid!\r\n    this.opts.disableResize = !doEnable; // FIRST before we update children as grid overrides #1658\r\n    this.engine.nodes.forEach(n => this.resizable(n.el, doEnable));\r\n    return this;\r\n};\r\n//# sourceMappingURL=gridstack-dd.js.map","\"use strict\";\r\n/**\r\n * gridstack-ddi.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.GridStackDDI = void 0;\r\n/**\r\n * Abstract Partial Interface API for drag'n'drop plugin - look at GridStackDD and HTML5 / Jquery implementation versions\r\n */\r\nclass GridStackDDI {\r\n    /** call this method to register your plugin instead of the default no-op one */\r\n    static registerPlugin(pluginClass) {\r\n        GridStackDDI.ddi = new pluginClass();\r\n        return GridStackDDI.ddi;\r\n    }\r\n    /** get the current registered plugin to use */\r\n    static get() {\r\n        return GridStackDDI.ddi || GridStackDDI.registerPlugin(GridStackDDI);\r\n    }\r\n    /** removes any drag&drop present (called during destroy) */\r\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n    remove(el) {\r\n        return this; // no-op for static grids\r\n    }\r\n}\r\nexports.GridStackDDI = GridStackDDI;\r\n//# sourceMappingURL=gridstack-ddi.js.map","\"use strict\";\r\n/**\r\n * gridstack-engine.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.GridStackEngine = void 0;\r\nconst utils_1 = require(\"./utils\");\r\n/**\r\n * Defines the GridStack engine that does most no DOM grid manipulation.\r\n * See GridStack methods and vars for descriptions.\r\n *\r\n * NOTE: values should not be modified directly - call the main GridStack API instead\r\n */\r\nclass GridStackEngine {\r\n    constructor(opts = {}) {\r\n        this.addedNodes = [];\r\n        this.removedNodes = [];\r\n        this.column = opts.column || 12;\r\n        this.onChange = opts.onChange;\r\n        this._float = opts.float;\r\n        this.maxRow = opts.maxRow;\r\n        this.nodes = opts.nodes || [];\r\n    }\r\n    batchUpdate() {\r\n        if (this.batchMode)\r\n            return this;\r\n        this.batchMode = true;\r\n        this._prevFloat = this._float;\r\n        this._float = true; // let things go anywhere for now... commit() will restore and possibly reposition\r\n        this.saveInitial(); // since begin update (which is called multiple times) won't do this\r\n        return this;\r\n    }\r\n    commit() {\r\n        if (!this.batchMode)\r\n            return this;\r\n        this.batchMode = false;\r\n        this._float = this._prevFloat;\r\n        delete this._prevFloat;\r\n        return this._packNodes()\r\n            ._notify();\r\n    }\r\n    // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip\r\n    _useEntireRowArea(node, nn) {\r\n        return !this.float && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);\r\n    }\r\n    /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.\r\n     * return true if we moved. */\r\n    _fixCollisions(node, nn = node, collide, opt = {}) {\r\n        this._sortNodes(-1); // from last to first, so recursive collision move items in the right order\r\n        collide = collide || this.collide(node, nn); // REAL area collide for swap and skip if none...\r\n        if (!collide)\r\n            return false;\r\n        // swap check: if we're actively moving in gravity mode, see if we collide with an object the same size\r\n        if (node._moving && !opt.nested && !this.float) {\r\n            if (this.swap(node, collide))\r\n                return true;\r\n        }\r\n        // during while() collisions MAKE SURE to check entire row so larger items don't leap frog small ones (push them all down starting last in grid)\r\n        let area = nn;\r\n        if (this._useEntireRowArea(node, nn)) {\r\n            area = { x: 0, w: this.column, y: nn.y, h: nn.h };\r\n            collide = this.collide(node, area, opt.skip); // force new hit\r\n        }\r\n        let didMove = false;\r\n        let newOpt = { nested: true, pack: false };\r\n        while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each\r\n            let moved;\r\n            // if colliding with a locked item OR moving down with top gravity (and collide could move up) -> skip past the collide,\r\n            // but remember that skip down so we only do this once (and push others otherwise).\r\n            if (collide.locked || node._moving && !node._skipDown && nn.y > node.y && !this.float &&\r\n                // can take space we had, or before where we're going\r\n                (!this.collide(collide, Object.assign(Object.assign({}, collide), { y: node.y }), node) || !this.collide(collide, Object.assign(Object.assign({}, collide), { y: nn.y - collide.h }), node))) {\r\n                node._skipDown = (node._skipDown || nn.y > node.y);\r\n                moved = this.moveNode(node, Object.assign(Object.assign(Object.assign({}, nn), { y: collide.y + collide.h }), newOpt));\r\n                if (collide.locked && moved) {\r\n                    utils_1.Utils.copyPos(nn, node); // moving after lock become our new desired location\r\n                }\r\n                else if (!collide.locked && moved && opt.pack) {\r\n                    // we moved after and will pack: do it now and keep the original drop location, but past the old collide to see what else we might push way\r\n                    this._packNodes();\r\n                    nn.y = collide.y + collide.h;\r\n                    utils_1.Utils.copyPos(node, nn);\r\n                }\r\n                didMove = didMove || moved;\r\n            }\r\n            else {\r\n                // move collide down *after* where we will be, ignoring where we are now (don't collide with us)\r\n                moved = this.moveNode(collide, Object.assign(Object.assign(Object.assign({}, collide), { y: nn.y + nn.h, skip: node }), newOpt));\r\n            }\r\n            if (!moved) {\r\n                return didMove;\r\n            } // break inf loop if we couldn't move after all (ex: maxRow, fixed)\r\n            collide = undefined;\r\n        }\r\n        return didMove;\r\n    }\r\n    /** return the nodes that intercept the given node. Optionally a different area can be used, as well as a second node to skip */\r\n    collide(skip, area = skip, skip2) {\r\n        return this.nodes.find(n => n !== skip && n !== skip2 && utils_1.Utils.isIntercepted(n, area));\r\n    }\r\n    collideAll(skip, area = skip, skip2) {\r\n        return this.nodes.filter(n => n !== skip && n !== skip2 && utils_1.Utils.isIntercepted(n, area));\r\n    }\r\n    /** does a pixel coverage collision, returning the node that has the most coverage that is >50% mid line */\r\n    collideCoverage(node, o, collides) {\r\n        if (!o.rect || !node._rect)\r\n            return;\r\n        let r0 = node._rect; // where started\r\n        let r = Object.assign({}, o.rect); // where we are\r\n        // update dragged rect to show where it's coming from (above or below, etc...)\r\n        if (r.y > r0.y) {\r\n            r.h += r.y - r0.y;\r\n            r.y = r0.y;\r\n        }\r\n        else {\r\n            r.h += r0.y - r.y;\r\n        }\r\n        if (r.x > r0.x) {\r\n            r.w += r.x - r0.x;\r\n            r.x = r0.x;\r\n        }\r\n        else {\r\n            r.w += r0.x - r.x;\r\n        }\r\n        let collide;\r\n        collides.forEach(n => {\r\n            if (n.locked || !n._rect)\r\n                return;\r\n            let r2 = n._rect; // overlapping target\r\n            let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE, overMax = 0.5; // need >50%\r\n            // depending on which side we started from, compute the overlap % of coverage\r\n            // (ex: from above/below we only compute the max horizontal line coverage)\r\n            if (r0.y < r2.y) { // from above\r\n                yOver = ((r.y + r.h) - r2.y) / r2.h;\r\n            }\r\n            else if (r0.y + r0.h > r2.y + r2.h) { // from below\r\n                yOver = ((r2.y + r2.h) - r.y) / r2.h;\r\n            }\r\n            if (r0.x < r2.x) { // from the left\r\n                xOver = ((r.x + r.w) - r2.x) / r2.w;\r\n            }\r\n            else if (r0.x + r0.w > r2.x + r2.w) { // from the right\r\n                xOver = ((r2.x + r2.w) - r.x) / r2.w;\r\n            }\r\n            let over = Math.min(xOver, yOver);\r\n            if (over > overMax) {\r\n                overMax = over;\r\n                collide = n;\r\n            }\r\n        });\r\n        return collide;\r\n    }\r\n    /** called to cache the nodes pixel rectangles used for collision detection during drag */\r\n    cacheRects(w, h, top, right, bottom, left) {\r\n        this.nodes.forEach(n => n._rect = {\r\n            y: n.y * h + top,\r\n            x: n.x * w + left,\r\n            w: n.w * w - left - right,\r\n            h: n.h * h - top - bottom\r\n        });\r\n        return this;\r\n    }\r\n    /** called to possibly swap between 2 nodes (same size or column, not locked, touching), returning true if successful */\r\n    swap(a, b) {\r\n        if (!b || b.locked || !a || a.locked)\r\n            return false;\r\n        function _doSwap() {\r\n            let x = b.x, y = b.y;\r\n            b.x = a.x;\r\n            b.y = a.y; // b -> a position\r\n            if (a.h != b.h) {\r\n                a.x = x;\r\n                a.y = b.y + b.h; // a -> goes after b\r\n            }\r\n            else if (a.w != b.w) {\r\n                a.x = b.x + b.w;\r\n                a.y = y; // a -> goes after b\r\n            }\r\n            else {\r\n                a.x = x;\r\n                a.y = y; // a -> old b position\r\n            }\r\n            a._dirty = b._dirty = true;\r\n            return true;\r\n        }\r\n        let touching; // remember if we called it (vs undefined)\r\n        // same size and same row or column, and touching\r\n        if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = utils_1.Utils.isTouching(a, b)))\r\n            return _doSwap();\r\n        if (touching === false)\r\n            return; // IFF ran test and fail, bail out\r\n        // check for taking same columns (but different height) and touching\r\n        if (a.w === b.w && a.x === b.x && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {\r\n            if (b.y < a.y) {\r\n                let t = a;\r\n                a = b;\r\n                b = t;\r\n            } // swap a <-> b vars so a is first\r\n            return _doSwap();\r\n        }\r\n        if (touching === false)\r\n            return;\r\n        // check if taking same row (but different width) and touching\r\n        if (a.h === b.h && a.y === b.y && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {\r\n            if (b.x < a.x) {\r\n                let t = a;\r\n                a = b;\r\n                b = t;\r\n            } // swap a <-> b vars so a is first\r\n            return _doSwap();\r\n        }\r\n        return false;\r\n    }\r\n    isAreaEmpty(x, y, w, h) {\r\n        let nn = { x: x || 0, y: y || 0, w: w || 1, h: h || 1 };\r\n        return !this.collide(nn);\r\n    }\r\n    /** re-layout grid items to reclaim any empty space */\r\n    compact() {\r\n        if (this.nodes.length === 0)\r\n            return this;\r\n        this.batchUpdate()\r\n            ._sortNodes();\r\n        let copyNodes = this.nodes;\r\n        this.nodes = []; // pretend we have no nodes to conflict layout to start with...\r\n        copyNodes.forEach(node => {\r\n            if (!node.locked) {\r\n                node.autoPosition = true;\r\n            }\r\n            this.addNode(node, false); // 'false' for add event trigger\r\n            node._dirty = true; // will force attr update\r\n        });\r\n        return this.commit();\r\n    }\r\n    /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */\r\n    set float(val) {\r\n        if (this._float === val)\r\n            return;\r\n        this._float = val || false;\r\n        if (!val) {\r\n            this._packNodes()._notify();\r\n        }\r\n    }\r\n    /** float getter method */\r\n    get float() { return this._float || false; }\r\n    /** @internal */\r\n    _sortNodes(dir) {\r\n        this.nodes = utils_1.Utils.sort(this.nodes, dir, this.column);\r\n        return this;\r\n    }\r\n    /** @internal called to top gravity pack the items back OR revert back to original Y positions when floating */\r\n    _packNodes() {\r\n        if (this.batchMode) {\r\n            return this;\r\n        }\r\n        this._sortNodes(); // first to last\r\n        if (this.float) {\r\n            // restore original Y pos\r\n            this.nodes.forEach(n => {\r\n                if (n._updating || n._orig === undefined || n.y === n._orig.y)\r\n                    return;\r\n                let newY = n.y;\r\n                while (newY > n._orig.y) {\r\n                    --newY;\r\n                    let collide = this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\r\n                    if (!collide) {\r\n                        n._dirty = true;\r\n                        n.y = newY;\r\n                    }\r\n                }\r\n            });\r\n        }\r\n        else {\r\n            // top gravity pack\r\n            this.nodes.forEach((n, i) => {\r\n                if (n.locked)\r\n                    return;\r\n                while (n.y > 0) {\r\n                    let newY = i === 0 ? 0 : n.y - 1;\r\n                    let canBeMoved = i === 0 || !this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\r\n                    if (!canBeMoved)\r\n                        break;\r\n                    // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\r\n                    // and move items back. The user 'change' CB should detect changes from the original\r\n                    // starting position instead.\r\n                    n._dirty = (n.y !== newY);\r\n                    n.y = newY;\r\n                }\r\n            });\r\n        }\r\n        return this;\r\n    }\r\n    /**\r\n     * given a random node, makes sure it's coordinates/values are valid in the current grid\r\n     * @param node to adjust\r\n     * @param resizing if out of bound, resize down or move into the grid to fit ?\r\n     */\r\n    prepareNode(node, resizing) {\r\n        node = node || {};\r\n        node._id = node._id || GridStackEngine._idSeq++;\r\n        // if we're missing position, have the grid position us automatically (before we set them to 0,0)\r\n        if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\r\n            node.autoPosition = true;\r\n        }\r\n        // assign defaults for missing required fields\r\n        let defaults = { x: 0, y: 0, w: 1, h: 1 };\r\n        utils_1.Utils.defaults(node, defaults);\r\n        if (!node.autoPosition) {\r\n            delete node.autoPosition;\r\n        }\r\n        if (!node.noResize) {\r\n            delete node.noResize;\r\n        }\r\n        if (!node.noMove) {\r\n            delete node.noMove;\r\n        }\r\n        // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\r\n        if (typeof node.x == 'string') {\r\n            node.x = Number(node.x);\r\n        }\r\n        if (typeof node.y == 'string') {\r\n            node.y = Number(node.y);\r\n        }\r\n        if (typeof node.w == 'string') {\r\n            node.w = Number(node.w);\r\n        }\r\n        if (typeof node.h == 'string') {\r\n            node.h = Number(node.h);\r\n        }\r\n        if (isNaN(node.x)) {\r\n            node.x = defaults.x;\r\n            node.autoPosition = true;\r\n        }\r\n        if (isNaN(node.y)) {\r\n            node.y = defaults.y;\r\n            node.autoPosition = true;\r\n        }\r\n        if (isNaN(node.w)) {\r\n            node.w = defaults.w;\r\n        }\r\n        if (isNaN(node.h)) {\r\n            node.h = defaults.h;\r\n        }\r\n        return this.nodeBoundFix(node, resizing);\r\n    }\r\n    /** part2 of preparing a node to fit inside our grid - checks  for x,y from grid dimensions */\r\n    nodeBoundFix(node, resizing) {\r\n        let before = node._orig || utils_1.Utils.copyPos({}, node);\r\n        if (node.maxW) {\r\n            node.w = Math.min(node.w, node.maxW);\r\n        }\r\n        if (node.maxH) {\r\n            node.h = Math.min(node.h, node.maxH);\r\n        }\r\n        if (node.minW && node.minW <= this.column) {\r\n            node.w = Math.max(node.w, node.minW);\r\n        }\r\n        if (node.minH) {\r\n            node.h = Math.max(node.h, node.minH);\r\n        }\r\n        if (node.w > this.column) {\r\n            // if user loaded a larger than allowed widget for current # of columns,\r\n            // remember it's full width so we can restore back (1 -> 12 column) #1655\r\n            // IFF we're not in the middle of column resizing!\r\n            if (this.column < 12 && !this._inColumnResize) {\r\n                node.w = Math.min(12, node.w);\r\n                this.cacheOneLayout(node, 12);\r\n            }\r\n            node.w = this.column;\r\n        }\r\n        else if (node.w < 1) {\r\n            node.w = 1;\r\n        }\r\n        if (this.maxRow && node.h > this.maxRow) {\r\n            node.h = this.maxRow;\r\n        }\r\n        else if (node.h < 1) {\r\n            node.h = 1;\r\n        }\r\n        if (node.x < 0) {\r\n            node.x = 0;\r\n        }\r\n        if (node.y < 0) {\r\n            node.y = 0;\r\n        }\r\n        if (node.x + node.w > this.column) {\r\n            if (resizing) {\r\n                node.w = this.column - node.x;\r\n            }\r\n            else {\r\n                node.x = this.column - node.w;\r\n            }\r\n        }\r\n        if (this.maxRow && node.y + node.h > this.maxRow) {\r\n            if (resizing) {\r\n                node.h = this.maxRow - node.y;\r\n            }\r\n            else {\r\n                node.y = this.maxRow - node.h;\r\n            }\r\n        }\r\n        if (!utils_1.Utils.samePos(node, before)) {\r\n            node._dirty = true;\r\n        }\r\n        return node;\r\n    }\r\n    getDirtyNodes(verify) {\r\n        // compare original x,y,w,h instead as _dirty can be a temporary state\r\n        if (verify) {\r\n            return this.nodes.filter(n => n._dirty && !utils_1.Utils.samePos(n, n._orig));\r\n        }\r\n        return this.nodes.filter(n => n._dirty);\r\n    }\r\n    /** @internal call this to call onChange CB with dirty nodes */\r\n    _notify(nodes, removeDOM = true) {\r\n        if (this.batchMode)\r\n            return this;\r\n        nodes = (nodes === undefined ? [] : (Array.isArray(nodes) ? nodes : [nodes]));\r\n        let dirtyNodes = nodes.concat(this.getDirtyNodes());\r\n        this.onChange && this.onChange(dirtyNodes, removeDOM);\r\n        return this;\r\n    }\r\n    /** @internal remove dirty and last tried info */\r\n    cleanNodes() {\r\n        if (this.batchMode)\r\n            return this;\r\n        this.nodes.forEach(n => {\r\n            delete n._dirty;\r\n            delete n._lastTried;\r\n        });\r\n        return this;\r\n    }\r\n    /** @internal called to save initial position/size to track real dirty state.\r\n     * Note: should be called right after we call change event (so next API is can detect changes)\r\n     * as well as right before we start move/resize/enter (so we can restore items to prev values) */\r\n    saveInitial() {\r\n        this.nodes.forEach(n => {\r\n            n._orig = utils_1.Utils.copyPos({}, n);\r\n            delete n._dirty;\r\n        });\r\n        this._hasLocked = this.nodes.some(n => n.locked);\r\n        return this;\r\n    }\r\n    /** @internal restore all the nodes back to initial values (called when we leave) */\r\n    restoreInitial() {\r\n        this.nodes.forEach(n => {\r\n            if (utils_1.Utils.samePos(n, n._orig))\r\n                return;\r\n            utils_1.Utils.copyPos(n, n._orig);\r\n            n._dirty = true;\r\n        });\r\n        this._notify();\r\n        return this;\r\n    }\r\n    /** call to add the given node to our list, fixing collision and re-packing */\r\n    addNode(node, triggerAddEvent = false) {\r\n        let dup = this.nodes.find(n => n._id === node._id);\r\n        if (dup)\r\n            return dup; // prevent inserting twice! return it instead.\r\n        // skip prepareNode if we're in middle of column resize (not new) but do check for bounds!\r\n        node = this._inColumnResize ? this.nodeBoundFix(node) : this.prepareNode(node);\r\n        delete node._temporaryRemoved;\r\n        delete node._removeDOM;\r\n        if (node.autoPosition) {\r\n            this._sortNodes();\r\n            for (let i = 0;; ++i) {\r\n                let x = i % this.column;\r\n                let y = Math.floor(i / this.column);\r\n                if (x + node.w > this.column) {\r\n                    continue;\r\n                }\r\n                let box = { x, y, w: node.w, h: node.h };\r\n                if (!this.nodes.find(n => utils_1.Utils.isIntercepted(box, n))) {\r\n                    node.x = x;\r\n                    node.y = y;\r\n                    delete node.autoPosition; // found our slot\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        this.nodes.push(node);\r\n        if (triggerAddEvent) {\r\n            this.addedNodes.push(node);\r\n        }\r\n        this._fixCollisions(node);\r\n        if (!this.batchMode) {\r\n            this._packNodes()._notify();\r\n        }\r\n        return node;\r\n    }\r\n    removeNode(node, removeDOM = true, triggerEvent = false) {\r\n        if (!this.nodes.find(n => n === node)) {\r\n            // TEST console.log(`Error: GridStackEngine.removeNode() node._id=${node._id} not found!`)\r\n            return this;\r\n        }\r\n        if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\r\n            this.removedNodes.push(node);\r\n        }\r\n        if (removeDOM)\r\n            node._removeDOM = true; // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\r\n        // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\r\n        this.nodes = this.nodes.filter(n => n !== node);\r\n        return this._packNodes()\r\n            ._notify(node);\r\n    }\r\n    removeAll(removeDOM = true) {\r\n        delete this._layouts;\r\n        if (this.nodes.length === 0)\r\n            return this;\r\n        removeDOM && this.nodes.forEach(n => n._removeDOM = true); // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\r\n        this.removedNodes = this.nodes;\r\n        this.nodes = [];\r\n        return this._notify(this.removedNodes);\r\n    }\r\n    /** checks if item can be moved (layout constrain) vs moveNode(), returning true if was able to move.\r\n     * In more complicated cases (maxRow) it will attempt at moving the item and fixing\r\n     * others in a clone first, then apply those changes if still within specs. */\r\n    moveNodeCheck(node, o) {\r\n        // if (node.locked) return false;\r\n        if (!this.changedPosConstrain(node, o))\r\n            return false;\r\n        o.pack = true;\r\n        // simpler case: move item directly...\r\n        if (!this.maxRow /* && !this._hasLocked*/) {\r\n            return this.moveNode(node, o);\r\n        }\r\n        // complex case: create a clone with NO maxRow (will check for out of bounds at the end)\r\n        let clonedNode;\r\n        let clone = new GridStackEngine({\r\n            column: this.column,\r\n            float: this.float,\r\n            nodes: this.nodes.map(n => {\r\n                if (n === node) {\r\n                    clonedNode = Object.assign({}, n);\r\n                    return clonedNode;\r\n                }\r\n                return Object.assign({}, n);\r\n            })\r\n        });\r\n        if (!clonedNode)\r\n            return false;\r\n        let canMove = clone.moveNode(clonedNode, o);\r\n        // if maxRow make sure we are still valid size\r\n        if (this.maxRow && canMove) {\r\n            canMove = (clone.getRow() <= this.maxRow);\r\n            // turns out we can't grow, then see if we can swap instead (ex: full grid) if we're not resizing\r\n            if (!canMove && !o.resizing) {\r\n                let collide = this.collide(node, o);\r\n                if (collide && this.swap(node, collide)) {\r\n                    this._notify();\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        if (!canMove)\r\n            return false;\r\n        // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!\r\n        // Note: we can't use the list directly as elements and other parts point to actual node, so copy content\r\n        clone.nodes.filter(n => n._dirty).forEach(c => {\r\n            let n = this.nodes.find(a => a._id === c._id);\r\n            if (!n)\r\n                return;\r\n            utils_1.Utils.copyPos(n, c);\r\n            n._dirty = true;\r\n        });\r\n        this._notify();\r\n        return true;\r\n    }\r\n    /** return true if can fit in grid height constrain only (always true if no maxRow) */\r\n    willItFit(node) {\r\n        delete node._willFitPos;\r\n        if (!this.maxRow)\r\n            return true;\r\n        // create a clone with NO maxRow and check if still within size\r\n        let clone = new GridStackEngine({\r\n            column: this.column,\r\n            float: this.float,\r\n            nodes: this.nodes.map(n => { return Object.assign({}, n); })\r\n        });\r\n        let n = Object.assign({}, node); // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687\r\n        this.cleanupNode(n);\r\n        delete n.el;\r\n        delete n._id;\r\n        delete n.content;\r\n        delete n.grid;\r\n        clone.addNode(n);\r\n        if (clone.getRow() <= this.maxRow) {\r\n            node._willFitPos = utils_1.Utils.copyPos({}, n);\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /** true if x,y or w,h are different after clamping to min/max */\r\n    changedPosConstrain(node, p) {\r\n        // make sure w,h are set\r\n        p.w = p.w || node.w;\r\n        p.h = p.h || node.h;\r\n        if (node.x !== p.x || node.y !== p.y)\r\n            return true;\r\n        // check constrained w,h\r\n        if (node.maxW) {\r\n            p.w = Math.min(p.w, node.maxW);\r\n        }\r\n        if (node.maxH) {\r\n            p.h = Math.min(p.h, node.maxH);\r\n        }\r\n        if (node.minW) {\r\n            p.w = Math.max(p.w, node.minW);\r\n        }\r\n        if (node.minH) {\r\n            p.h = Math.max(p.h, node.minH);\r\n        }\r\n        return (node.w !== p.w || node.h !== p.h);\r\n    }\r\n    /** return true if the passed in node was actually moved (checks for no-op and locked) */\r\n    moveNode(node, o) {\r\n        if (!node || /*node.locked ||*/ !o)\r\n            return false;\r\n        if (o.pack === undefined)\r\n            o.pack = true;\r\n        // constrain the passed in values and check if we're still changing our node\r\n        if (typeof o.x !== 'number') {\r\n            o.x = node.x;\r\n        }\r\n        if (typeof o.y !== 'number') {\r\n            o.y = node.y;\r\n        }\r\n        if (typeof o.w !== 'number') {\r\n            o.w = node.w;\r\n        }\r\n        if (typeof o.h !== 'number') {\r\n            o.h = node.h;\r\n        }\r\n        let resizing = (node.w !== o.w || node.h !== o.h);\r\n        let nn = utils_1.Utils.copyPos({}, node, true); // get min/max out first, then opt positions next\r\n        utils_1.Utils.copyPos(nn, o);\r\n        nn = this.nodeBoundFix(nn, resizing);\r\n        utils_1.Utils.copyPos(o, nn);\r\n        if (utils_1.Utils.samePos(node, o))\r\n            return false;\r\n        let prevPos = utils_1.Utils.copyPos({}, node);\r\n        // during while() collisions make sure to check entire row so larger items don't leap frog small ones (push them all down)\r\n        let area = nn;\r\n        // if (this._useEntireRowArea(node, nn)) {\r\n        //   area = {x: 0, w: this.column, y: nn.y, h: nn.h};\r\n        // }\r\n        // check if we will need to fix collision at our new location\r\n        let collides = this.collideAll(node, area, o.skip);\r\n        let needToMove = true;\r\n        if (collides.length) {\r\n            // now check to make sure we actually collided over 50% surface area while dragging\r\n            let collide = node._moving && !o.nested ? this.collideCoverage(node, o, collides) : collides[0];\r\n            if (collide) {\r\n                needToMove = !this._fixCollisions(node, nn, collide, o); // check if already moved...\r\n            }\r\n            else {\r\n                needToMove = false; // we didn't cover >50% for a move, skip...\r\n            }\r\n        }\r\n        // now move (to the original ask vs the collision version which might differ) and repack things\r\n        if (needToMove) {\r\n            node._dirty = true;\r\n            utils_1.Utils.copyPos(node, nn);\r\n        }\r\n        if (o.pack) {\r\n            this._packNodes()\r\n                ._notify();\r\n        }\r\n        return !utils_1.Utils.samePos(node, prevPos); // pack might have moved things back\r\n    }\r\n    getRow() {\r\n        return this.nodes.reduce((row, n) => Math.max(row, n.y + n.h), 0);\r\n    }\r\n    beginUpdate(node) {\r\n        if (!node._updating) {\r\n            node._updating = true;\r\n            delete node._skipDown;\r\n            if (!this.batchMode)\r\n                this.saveInitial();\r\n        }\r\n        return this;\r\n    }\r\n    endUpdate() {\r\n        let n = this.nodes.find(n => n._updating);\r\n        if (n) {\r\n            delete n._updating;\r\n            delete n._skipDown;\r\n        }\r\n        return this;\r\n    }\r\n    /** saves a copy of the largest column layout (eg 12 even when rendering oneColumnMode, so we don't loose orig layout),\r\n     * returning a list of widgets for serialization */\r\n    save(saveElement = true) {\r\n        var _a;\r\n        // use the highest layout for any saved info so we can have full detail on reload #1849\r\n        let len = (_a = this._layouts) === null || _a === void 0 ? void 0 : _a.length;\r\n        let layout = len && this.column !== (len - 1) ? this._layouts[len - 1] : null;\r\n        let list = [];\r\n        this._sortNodes();\r\n        this.nodes.forEach(n => {\r\n            let wl = layout === null || layout === void 0 ? void 0 : layout.find(l => l._id === n._id);\r\n            let w = Object.assign({}, n);\r\n            // use layout info instead if set\r\n            if (wl) {\r\n                w.x = wl.x;\r\n                w.y = wl.y;\r\n                w.w = wl.w;\r\n            }\r\n            // delete internals\r\n            for (let key in w) {\r\n                if (key[0] === '_' || w[key] === null || w[key] === undefined)\r\n                    delete w[key];\r\n            }\r\n            delete w.grid;\r\n            if (!saveElement)\r\n                delete w.el;\r\n            // delete default values (will be re-created on read)\r\n            if (!w.autoPosition)\r\n                delete w.autoPosition;\r\n            if (!w.noResize)\r\n                delete w.noResize;\r\n            if (!w.noMove)\r\n                delete w.noMove;\r\n            if (!w.locked)\r\n                delete w.locked;\r\n            list.push(w);\r\n        });\r\n        return list;\r\n    }\r\n    /** @internal called whenever a node is added or moved - updates the cached layouts */\r\n    layoutsNodesChange(nodes) {\r\n        if (!this._layouts || this._inColumnResize)\r\n            return this;\r\n        // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\r\n        this._layouts.forEach((layout, column) => {\r\n            if (!layout || column === this.column)\r\n                return this;\r\n            if (column < this.column) {\r\n                this._layouts[column] = undefined;\r\n            }\r\n            else {\r\n                // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\r\n                // NOTE: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. #1785\r\n                let ratio = column / this.column;\r\n                nodes.forEach(node => {\r\n                    if (!node._orig)\r\n                        return; // didn't change (newly added ?)\r\n                    let n = layout.find(l => l._id === node._id);\r\n                    if (!n)\r\n                        return; // no cache for new nodes. Will use those values.\r\n                    // Y changed, push down same amount\r\n                    // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\r\n                    if (node.y !== node._orig.y) {\r\n                        n.y += (node.y - node._orig.y);\r\n                    }\r\n                    // X changed, scale from new position\r\n                    if (node.x !== node._orig.x) {\r\n                        n.x = Math.round(node.x * ratio);\r\n                    }\r\n                    // width changed, scale from new width\r\n                    if (node.w !== node._orig.w) {\r\n                        n.w = Math.round(node.w * ratio);\r\n                    }\r\n                    // ...height always carries over from cache\r\n                });\r\n            }\r\n        });\r\n        return this;\r\n    }\r\n    /**\r\n     * @internal Called to scale the widget width & position up/down based on the column change.\r\n     * Note we store previous layouts (especially original ones) to make it possible to go\r\n     * from say 12 -> 1 -> 12 and get back to where we were.\r\n     *\r\n     * @param prevColumn previous number of columns\r\n     * @param column  new column number\r\n     * @param nodes different sorted list (ex: DOM order) instead of current list\r\n     * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n     * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n     */\r\n    updateNodeWidths(prevColumn, column, nodes, layout = 'moveScale') {\r\n        var _a;\r\n        if (!this.nodes.length || !column || prevColumn === column)\r\n            return this;\r\n        // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data\r\n        this.cacheLayout(this.nodes, prevColumn);\r\n        this.batchUpdate(); // do this EARLY as it will call saveInitial() so we can detect where we started for _dirty and collision\r\n        let newNodes = [];\r\n        // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout\r\n        let domOrder = false;\r\n        if (column === 1 && (nodes === null || nodes === void 0 ? void 0 : nodes.length)) {\r\n            domOrder = true;\r\n            let top = 0;\r\n            nodes.forEach(n => {\r\n                n.x = 0;\r\n                n.w = 1;\r\n                n.y = Math.max(n.y, top);\r\n                top = n.y + n.h;\r\n            });\r\n            newNodes = nodes;\r\n            nodes = [];\r\n        }\r\n        else {\r\n            nodes = utils_1.Utils.sort(this.nodes, -1, prevColumn); // current column reverse sorting so we can insert last to front (limit collision)\r\n        }\r\n        // see if we have cached previous layout IFF we are going up in size (restore) otherwise always\r\n        // generate next size down from where we are (looks more natural as you gradually size down).\r\n        let cacheNodes = [];\r\n        if (column > prevColumn) {\r\n            cacheNodes = this._layouts[column] || [];\r\n            // ...if not, start with the largest layout (if not already there) as down-scaling is more accurate\r\n            // by pretending we came from that larger column by assigning those values as starting point\r\n            let lastIndex = this._layouts.length - 1;\r\n            if (!cacheNodes.length && prevColumn !== lastIndex && ((_a = this._layouts[lastIndex]) === null || _a === void 0 ? void 0 : _a.length)) {\r\n                prevColumn = lastIndex;\r\n                this._layouts[lastIndex].forEach(cacheNode => {\r\n                    let n = nodes.find(n => n._id === cacheNode._id);\r\n                    if (n) {\r\n                        // still current, use cache info positions\r\n                        n.x = cacheNode.x;\r\n                        n.y = cacheNode.y;\r\n                        n.w = cacheNode.w;\r\n                    }\r\n                });\r\n            }\r\n        }\r\n        // if we found cache re-use those nodes that are still current\r\n        cacheNodes.forEach(cacheNode => {\r\n            let j = nodes.findIndex(n => n._id === cacheNode._id);\r\n            if (j !== -1) {\r\n                // still current, use cache info positions\r\n                nodes[j].x = cacheNode.x;\r\n                nodes[j].y = cacheNode.y;\r\n                nodes[j].w = cacheNode.w;\r\n                newNodes.push(nodes[j]);\r\n                nodes.splice(j, 1);\r\n            }\r\n        });\r\n        // ...and add any extra non-cached ones\r\n        if (nodes.length) {\r\n            if (typeof layout === 'function') {\r\n                layout(column, prevColumn, newNodes, nodes);\r\n            }\r\n            else if (!domOrder) {\r\n                let ratio = column / prevColumn;\r\n                let move = (layout === 'move' || layout === 'moveScale');\r\n                let scale = (layout === 'scale' || layout === 'moveScale');\r\n                nodes.forEach(node => {\r\n                    // NOTE: x + w could be outside of the grid, but addNode() below will handle that\r\n                    node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\r\n                    node.w = ((column === 1 || prevColumn === 1) ? 1 :\r\n                        scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\r\n                    newNodes.push(node);\r\n                });\r\n                nodes = [];\r\n            }\r\n        }\r\n        // finally re-layout them in reverse order (to get correct placement)\r\n        newNodes = utils_1.Utils.sort(newNodes, -1, column);\r\n        this._inColumnResize = true; // prevent cache update\r\n        this.nodes = []; // pretend we have no nodes to start with (add() will use same structures) to simplify layout\r\n        newNodes.forEach(node => {\r\n            this.addNode(node, false); // 'false' for add event trigger\r\n            delete node._orig; // make sure the commit doesn't try to restore things back to original\r\n        });\r\n        this.commit();\r\n        delete this._inColumnResize;\r\n        return this;\r\n    }\r\n    /**\r\n     * call to cache the given layout internally to the given location so we can restore back when column changes size\r\n     * @param nodes list of nodes\r\n     * @param column corresponding column index to save it under\r\n     * @param clear if true, will force other caches to be removed (default false)\r\n     */\r\n    cacheLayout(nodes, column, clear = false) {\r\n        let copy = [];\r\n        nodes.forEach((n, i) => {\r\n            n._id = n._id || GridStackEngine._idSeq++; // make sure we have an id in case this is new layout, else re-use id already set\r\n            copy[i] = { x: n.x, y: n.y, w: n.w, _id: n._id }; // only thing we change is x,y,w and id to find it back\r\n        });\r\n        this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\r\n        this._layouts[column] = copy;\r\n        return this;\r\n    }\r\n    /**\r\n     * call to cache the given node layout internally to the given location so we can restore back when column changes size\r\n     * @param node single node to cache\r\n     * @param column corresponding column index to save it under\r\n     */\r\n    cacheOneLayout(n, column) {\r\n        n._id = n._id || GridStackEngine._idSeq++;\r\n        let layout = { x: n.x, y: n.y, w: n.w, _id: n._id };\r\n        this._layouts = this._layouts || [];\r\n        this._layouts[column] = this._layouts[column] || [];\r\n        let index = this._layouts[column].findIndex(l => l._id === n._id);\r\n        index === -1 ? this._layouts[column].push(layout) : this._layouts[column][index] = layout;\r\n        return this;\r\n    }\r\n    /** called to remove all internal values but the _id */\r\n    cleanupNode(node) {\r\n        for (let prop in node) {\r\n            if (prop[0] === '_' && prop !== '_id')\r\n                delete node[prop];\r\n        }\r\n        return this;\r\n    }\r\n}\r\nexports.GridStackEngine = GridStackEngine;\r\n/** @internal unique global internal _id counter NOT starting at 0 */\r\nGridStackEngine._idSeq = 1;\r\n//# sourceMappingURL=gridstack-engine.js.map","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}));\r\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.GridStack = void 0;\r\n/*!\r\n * GridStack 5.0\r\n * https://gridstackjs.com/\r\n *\r\n * Copyright (c) 2021 Alain Dumesny\r\n * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE\r\n */\r\nconst gridstack_engine_1 = require(\"./gridstack-engine\");\r\nconst utils_1 = require(\"./utils\");\r\nconst gridstack_ddi_1 = require(\"./gridstack-ddi\");\r\n// export all dependent file as well to make it easier for users to just import the main file\r\n__exportStar(require(\"./types\"), exports);\r\n__exportStar(require(\"./utils\"), exports);\r\n__exportStar(require(\"./gridstack-engine\"), exports);\r\n__exportStar(require(\"./gridstack-ddi\"), exports);\r\n// default values for grid options - used during init and when saving out\r\nconst GridDefaults = {\r\n    column: 12,\r\n    minRow: 0,\r\n    maxRow: 0,\r\n    itemClass: 'grid-stack-item',\r\n    placeholderClass: 'grid-stack-placeholder',\r\n    placeholderText: '',\r\n    handle: '.grid-stack-item-content',\r\n    handleClass: null,\r\n    styleInHead: false,\r\n    cellHeight: 'auto',\r\n    cellHeightThrottle: 100,\r\n    margin: 10,\r\n    auto: true,\r\n    minWidth: 768,\r\n    float: false,\r\n    staticGrid: false,\r\n    animate: true,\r\n    alwaysShowResizeHandle: false,\r\n    resizable: {\r\n        autoHide: true,\r\n        handles: 'se'\r\n    },\r\n    draggable: {\r\n        handle: '.grid-stack-item-content',\r\n        scroll: false,\r\n        appendTo: 'body'\r\n    },\r\n    disableDrag: false,\r\n    disableResize: false,\r\n    rtl: 'auto',\r\n    removable: false,\r\n    removableOptions: {\r\n        accept: '.grid-stack-item'\r\n    },\r\n    marginUnit: 'px',\r\n    cellHeightUnit: 'px',\r\n    disableOneColumnMode: false,\r\n    oneColumnModeDomSort: false\r\n};\r\n/**\r\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\r\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\r\n * @example\r\n * <div class=\"grid-stack\">\r\n *   <div class=\"grid-stack-item\">\r\n *     <div class=\"grid-stack-item-content\">Item 1</div>\r\n *   </div>\r\n * </div>\r\n */\r\nclass GridStack {\r\n    /**\r\n     * Construct a grid item from the given element and options\r\n     * @param el\r\n     * @param opts\r\n     */\r\n    constructor(el, opts = {}) {\r\n        /** @internal */\r\n        this._gsEventHandler = {};\r\n        /** @internal extra row added when dragging at the bottom of the grid */\r\n        this._extraDragRow = 0;\r\n        this.el = el; // exposed HTML element to the user\r\n        opts = opts || {}; // handles null/undefined/0\r\n        // if row property exists, replace minRow and maxRow instead\r\n        if (opts.row) {\r\n            opts.minRow = opts.maxRow = opts.row;\r\n            delete opts.row;\r\n        }\r\n        let rowAttr = utils_1.Utils.toNumber(el.getAttribute('gs-row'));\r\n        // flag only valid in sub-grids (handled by parent, not here)\r\n        if (opts.column === 'auto') {\r\n            delete opts.column;\r\n        }\r\n        // elements attributes override any passed options (like CSS style) - merge the two together\r\n        let defaults = Object.assign(Object.assign({}, utils_1.Utils.cloneDeep(GridDefaults)), { column: utils_1.Utils.toNumber(el.getAttribute('gs-column')) || 12, minRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-min-row')) || 0, maxRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-max-row')) || 0, staticGrid: utils_1.Utils.toBool(el.getAttribute('gs-static')) || false, _styleSheetClass: 'grid-stack-instance-' + (Math.random() * 10000).toFixed(0), alwaysShowResizeHandle: opts.alwaysShowResizeHandle || false, resizable: {\r\n                autoHide: !(opts.alwaysShowResizeHandle || false),\r\n                handles: 'se'\r\n            }, draggable: {\r\n                handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || '.grid-stack-item-content',\r\n                scroll: false,\r\n                appendTo: 'body'\r\n            }, removableOptions: {\r\n                accept: '.' + (opts.itemClass || 'grid-stack-item')\r\n            } });\r\n        if (el.getAttribute('gs-animate')) { // default to true, but if set to false use that instead\r\n            defaults.animate = utils_1.Utils.toBool(el.getAttribute('gs-animate'));\r\n        }\r\n        this.opts = utils_1.Utils.defaults(opts, defaults);\r\n        opts = null; // make sure we use this.opts instead\r\n        this.initMargin(); // part of settings defaults...\r\n        // Now check if we're loading into 1 column mode FIRST so we don't do un-necessary work (like cellHeight = width / 12 then go 1 column)\r\n        if (this.opts.column !== 1 && !this.opts.disableOneColumnMode && this._widthOrContainer() <= this.opts.minWidth) {\r\n            this._prevColumn = this.getColumn();\r\n            this.opts.column = 1;\r\n        }\r\n        if (this.opts.rtl === 'auto') {\r\n            this.opts.rtl = (el.style.direction === 'rtl');\r\n        }\r\n        if (this.opts.rtl) {\r\n            this.el.classList.add('grid-stack-rtl');\r\n        }\r\n        // check if we're been nested, and if so update our style and keep pointer around (used during save)\r\n        let parentGridItemEl = utils_1.Utils.closestByClass(this.el, GridDefaults.itemClass);\r\n        if (parentGridItemEl && parentGridItemEl.gridstackNode) {\r\n            this.opts._isNested = parentGridItemEl.gridstackNode;\r\n            this.opts._isNested.subGrid = this;\r\n            parentGridItemEl.classList.add('grid-stack-nested');\r\n            this.el.classList.add('grid-stack-nested');\r\n        }\r\n        this._isAutoCellHeight = (this.opts.cellHeight === 'auto');\r\n        if (this._isAutoCellHeight || this.opts.cellHeight === 'initial') {\r\n            // make the cell content square initially (will use resize/column event to keep it square)\r\n            this.cellHeight(undefined, false);\r\n        }\r\n        else {\r\n            // append unit if any are set\r\n            if (typeof this.opts.cellHeight == 'number' && this.opts.cellHeightUnit && this.opts.cellHeightUnit !== GridDefaults.cellHeightUnit) {\r\n                this.opts.cellHeight = this.opts.cellHeight + this.opts.cellHeightUnit;\r\n                delete this.opts.cellHeightUnit;\r\n            }\r\n            this.cellHeight(this.opts.cellHeight, false);\r\n        }\r\n        this.el.classList.add(this.opts._styleSheetClass);\r\n        this._setStaticClass();\r\n        this.engine = new gridstack_engine_1.GridStackEngine({\r\n            column: this.getColumn(),\r\n            float: this.opts.float,\r\n            maxRow: this.opts.maxRow,\r\n            onChange: (cbNodes) => {\r\n                let maxH = 0;\r\n                this.engine.nodes.forEach(n => { maxH = Math.max(maxH, n.y + n.h); });\r\n                cbNodes.forEach(n => {\r\n                    let el = n.el;\r\n                    if (!el)\r\n                        return;\r\n                    if (n._removeDOM) {\r\n                        if (el)\r\n                            el.remove();\r\n                        delete n._removeDOM;\r\n                    }\r\n                    else {\r\n                        this._writePosAttr(el, n);\r\n                    }\r\n                });\r\n                this._updateStyles(false, maxH); // false = don't recreate, just append if need be\r\n            }\r\n        });\r\n        if (this.opts.auto) {\r\n            this.batchUpdate(); // prevent in between re-layout #1535 TODO: this only set float=true, need to prevent collision check...\r\n            let elements = [];\r\n            this.getGridItems().forEach(el => {\r\n                let x = parseInt(el.getAttribute('gs-x'));\r\n                let y = parseInt(el.getAttribute('gs-y'));\r\n                elements.push({\r\n                    el,\r\n                    // if x,y are missing (autoPosition) add them to end of list - but keep their respective DOM order\r\n                    i: (Number.isNaN(x) ? 1000 : x) + (Number.isNaN(y) ? 1000 : y) * this.getColumn()\r\n                });\r\n            });\r\n            elements.sort((a, b) => a.i - b.i).forEach(e => this._prepareElement(e.el));\r\n            this.commit();\r\n        }\r\n        this.setAnimation(this.opts.animate);\r\n        this._updateStyles();\r\n        if (this.opts.column != 12) {\r\n            this.el.classList.add('grid-stack-' + this.opts.column);\r\n        }\r\n        // legacy support to appear 'per grid` options when really global.\r\n        if (this.opts.dragIn)\r\n            GridStack.setupDragIn(this.opts.dragIn, this.opts.dragInOptions);\r\n        delete this.opts.dragIn;\r\n        delete this.opts.dragInOptions;\r\n        this._setupRemoveDrop();\r\n        this._setupAcceptWidget();\r\n        this._updateWindowResizeEvent();\r\n    }\r\n    /**\r\n     * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\r\n     * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\r\n     * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.\r\n     * @param options grid options (optional)\r\n     * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\r\n     *\r\n     * @example\r\n     * let grid = GridStack.init();\r\n     *\r\n     * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\r\n     * let grid = document.querySelector('.grid-stack').gridstack;\r\n     */\r\n    static init(options = {}, elOrString = '.grid-stack') {\r\n        let el = GridStack.getGridElement(elOrString);\r\n        if (!el) {\r\n            if (typeof elOrString === 'string') {\r\n                console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\r\n                    '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n            }\r\n            else {\r\n                console.error('GridStack.init() no grid element was passed.');\r\n            }\r\n            return null;\r\n        }\r\n        if (!el.gridstack) {\r\n            el.gridstack = new GridStack(el, utils_1.Utils.cloneDeep(options));\r\n        }\r\n        return el.gridstack;\r\n    }\r\n    /**\r\n     * Will initialize a list of elements (given a selector) and return an array of grids.\r\n     * @param options grid options (optional)\r\n     * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)\r\n     *\r\n     * @example\r\n     * let grids = GridStack.initAll();\r\n     * grids.forEach(...)\r\n     */\r\n    static initAll(options = {}, selector = '.grid-stack') {\r\n        let grids = [];\r\n        GridStack.getGridElements(selector).forEach(el => {\r\n            if (!el.gridstack) {\r\n                el.gridstack = new GridStack(el, utils_1.Utils.cloneDeep(options));\r\n                delete options.dragIn;\r\n                delete options.dragInOptions; // only need to be done once (really a static global thing, not per grid)\r\n            }\r\n            grids.push(el.gridstack);\r\n        });\r\n        if (grids.length === 0) {\r\n            console.error('GridStack.initAll() no grid was found with selector \"' + selector + '\" - element missing or wrong selector ?' +\r\n                '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\r\n        }\r\n        return grids;\r\n    }\r\n    /**\r\n     * call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then\r\n     * grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from\r\n     * JSON serialized data, including options.\r\n     * @param parent HTML element parent to the grid\r\n     * @param opt grids options used to initialize the grid, and list of children\r\n     */\r\n    static addGrid(parent, opt = {}) {\r\n        if (!parent)\r\n            return null;\r\n        // create the grid element, but check if the passed 'parent' already has grid styling and should be used instead\r\n        let el = parent;\r\n        if (!parent.classList.contains('grid-stack')) {\r\n            let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n            doc.body.innerHTML = `<div class=\"grid-stack ${opt.class || ''}\"></div>`;\r\n            el = doc.body.children[0];\r\n            parent.appendChild(el);\r\n        }\r\n        // create grid class and load any children\r\n        let grid = GridStack.init(opt, el);\r\n        if (grid.opts.children) {\r\n            let children = grid.opts.children;\r\n            delete grid.opts.children;\r\n            grid.load(children);\r\n        }\r\n        return grid;\r\n    }\r\n    /** @internal create placeholder DIV as needed */\r\n    get placeholder() {\r\n        if (!this._placeholder) {\r\n            let placeholderChild = document.createElement('div'); // child so padding match item-content\r\n            placeholderChild.className = 'placeholder-content';\r\n            if (this.opts.placeholderText) {\r\n                placeholderChild.innerHTML = this.opts.placeholderText;\r\n            }\r\n            this._placeholder = document.createElement('div');\r\n            this._placeholder.classList.add(this.opts.placeholderClass, GridDefaults.itemClass, this.opts.itemClass);\r\n            this.placeholder.appendChild(placeholderChild);\r\n        }\r\n        return this._placeholder;\r\n    }\r\n    /**\r\n     * add a new widget and returns it.\r\n     *\r\n     * Widget will be always placed even if result height is more than actual grid height.\r\n     * You need to use `willItFit()` before calling addWidget for additional check.\r\n     * See also `makeWidget()`.\r\n     *\r\n     * @example\r\n     * let grid = GridStack.init();\r\n     * grid.addWidget({w: 3, content: 'hello'});\r\n     * grid.addWidget('<div class=\"grid-stack-item\"><div class=\"grid-stack-item-content\">hello</div></div>', {w: 3});\r\n     *\r\n     * @param el  GridStackWidget (which can have content string as well), html element, or string definition to add\r\n     * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget\r\n     */\r\n    addWidget(els, options) {\r\n        // support legacy call for now ?\r\n        if (arguments.length > 2) {\r\n            console.warn('gridstack.ts: `addWidget(el, x, y, width...)` is deprecated. Use `addWidget({x, y, w, content, ...})`. It will be removed soon');\r\n            // eslint-disable-next-line prefer-rest-params\r\n            let a = arguments, i = 1, opt = { x: a[i++], y: a[i++], w: a[i++], h: a[i++], autoPosition: a[i++],\r\n                minW: a[i++], maxW: a[i++], minH: a[i++], maxH: a[i++], id: a[i++] };\r\n            return this.addWidget(els, opt);\r\n        }\r\n        function isGridStackWidget(w) {\r\n            return w.x !== undefined || w.y !== undefined || w.w !== undefined || w.h !== undefined || w.content !== undefined ? true : false;\r\n        }\r\n        let el;\r\n        if (typeof els === 'string') {\r\n            let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n            doc.body.innerHTML = els;\r\n            el = doc.body.children[0];\r\n        }\r\n        else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {\r\n            let content = els ? els.content || '' : '';\r\n            options = els;\r\n            let doc = document.implementation.createHTMLDocument(''); // IE needs a param\r\n            doc.body.innerHTML = `<div class=\"grid-stack-item ${this.opts.itemClass || ''}\"><div class=\"grid-stack-item-content\">${content}</div></div>`;\r\n            el = doc.body.children[0];\r\n        }\r\n        else {\r\n            el = els;\r\n        }\r\n        // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos\r\n        // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz) before adding the node.\r\n        // So make sure we load any DOM attributes that are not specified in passed in options (which override)\r\n        let domAttr = this._readAttr(el);\r\n        options = utils_1.Utils.cloneDeep(options) || {}; // make a copy before we modify in case caller re-uses it\r\n        utils_1.Utils.defaults(options, domAttr);\r\n        let node = this.engine.prepareNode(options);\r\n        this._writeAttr(el, options);\r\n        if (this._insertNotAppend) {\r\n            this.el.prepend(el);\r\n        }\r\n        else {\r\n            this.el.appendChild(el);\r\n        }\r\n        // similar to makeWidget() that doesn't read attr again and worse re-create a new node and loose any _id\r\n        this._prepareElement(el, true, options);\r\n        this._updateContainerHeight();\r\n        // check if nested grid definition is present\r\n        if (node.subGrid && !node.subGrid.el) { // see if there is a sub-grid to create too\r\n            // if column special case it set, remember that flag and set default\r\n            let autoColumn;\r\n            let ops = node.subGrid;\r\n            if (ops.column === 'auto') {\r\n                ops.column = node.w;\r\n                ops.disableOneColumnMode = true; // driven by parent\r\n                autoColumn = true;\r\n            }\r\n            let content = node.el.querySelector('.grid-stack-item-content');\r\n            node.subGrid = GridStack.addGrid(content, node.subGrid);\r\n            if (autoColumn) {\r\n                node.subGrid._autoColumn = true;\r\n            }\r\n        }\r\n        this._triggerAddEvent();\r\n        this._triggerChangeEvent();\r\n        return el;\r\n    }\r\n    /**\r\n    /**\r\n     * saves the current layout returning a list of widgets for serialization which might include any nested grids.\r\n     * @param saveContent if true (default) the latest html inside .grid-stack-content will be saved to GridStackWidget.content field, else it will\r\n     * be removed.\r\n     * @param saveGridOpt if true (default false), save the grid options itself, so you can call the new GridStack.addGrid()\r\n     * to recreate everything from scratch. GridStackOptions.children would then contain the widget list instead.\r\n     * @returns list of widgets or full grid option, including .children list of widgets\r\n     */\r\n    save(saveContent = true, saveGridOpt = false) {\r\n        // return copied nodes we can modify at will...\r\n        let list = this.engine.save(saveContent);\r\n        // check for HTML content and nested grids\r\n        list.forEach(n => {\r\n            if (saveContent && n.el && !n.subGrid) { // sub-grid are saved differently, not plain content\r\n                let sub = n.el.querySelector('.grid-stack-item-content');\r\n                n.content = sub ? sub.innerHTML : undefined;\r\n                if (!n.content)\r\n                    delete n.content;\r\n            }\r\n            else {\r\n                if (!saveContent) {\r\n                    delete n.content;\r\n                }\r\n                // check for nested grid\r\n                if (n.subGrid) {\r\n                    n.subGrid = n.subGrid.save(saveContent, true);\r\n                }\r\n            }\r\n            delete n.el;\r\n        });\r\n        // check if save entire grid options (needed for recursive) + children...\r\n        if (saveGridOpt) {\r\n            let o = utils_1.Utils.cloneDeep(this.opts);\r\n            // delete default values that will be recreated on launch\r\n            if (o.marginBottom === o.marginTop && o.marginRight === o.marginLeft && o.marginTop === o.marginRight) {\r\n                o.margin = o.marginTop;\r\n                delete o.marginTop;\r\n                delete o.marginRight;\r\n                delete o.marginBottom;\r\n                delete o.marginLeft;\r\n            }\r\n            if (o.rtl === (this.el.style.direction === 'rtl')) {\r\n                o.rtl = 'auto';\r\n            }\r\n            if (this._isAutoCellHeight) {\r\n                o.cellHeight = 'auto';\r\n            }\r\n            if (this._autoColumn) {\r\n                o.column = 'auto';\r\n                delete o.disableOneColumnMode;\r\n            }\r\n            utils_1.Utils.removeInternalAndSame(o, GridDefaults);\r\n            o.children = list;\r\n            return o;\r\n        }\r\n        return list;\r\n    }\r\n    /**\r\n     * load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.\r\n     *\r\n     * @param layout list of widgets definition to update/create\r\n     * @param addAndRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving\r\n     * the user control of insertion.\r\n     *\r\n     * @example\r\n     * see http://gridstackjs.com/demo/serialization.html\r\n     **/\r\n    load(layout, addAndRemove = true) {\r\n        let items = GridStack.Utils.sort([...layout], -1, this._prevColumn || this.getColumn()); // make copy before we mod/sort\r\n        this._insertNotAppend = true; // since create in reverse order...\r\n        // if we're loading a layout into 1 column (_prevColumn is set only when going to 1) and items don't fit, make sure to save\r\n        // the original wanted layout so we can scale back up correctly #1471\r\n        if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(n => (n.x + n.w) > this.opts.column)) {\r\n            this._ignoreLayoutsNodeChange = true; // skip layout update\r\n            this.engine.cacheLayout(items, this._prevColumn, true);\r\n        }\r\n        let removed = [];\r\n        this.batchUpdate();\r\n        // see if any items are missing from new layout and need to be removed first\r\n        if (addAndRemove) {\r\n            let copyNodes = [...this.engine.nodes]; // don't loop through array you modify\r\n            copyNodes.forEach(n => {\r\n                let item = items.find(w => n.id === w.id);\r\n                if (!item) {\r\n                    if (typeof (addAndRemove) === 'function') {\r\n                        addAndRemove(this, n, false);\r\n                    }\r\n                    else {\r\n                        removed.push(n); // batch keep track\r\n                        this.removeWidget(n.el, true, false);\r\n                    }\r\n                }\r\n            });\r\n        }\r\n        // now add/update the widgets\r\n        items.forEach(w => {\r\n            let item = (w.id || w.id === 0) ? this.engine.nodes.find(n => n.id === w.id) : undefined;\r\n            if (item) {\r\n                this.update(item.el, w);\r\n                if (w.subGrid && w.subGrid.children) { // update any sub grid as well\r\n                    let sub = item.el.querySelector('.grid-stack');\r\n                    if (sub && sub.gridstack) {\r\n                        sub.gridstack.load(w.subGrid.children); // TODO: support updating grid options ?\r\n                        this._insertNotAppend = true; // got reset by above call\r\n                    }\r\n                }\r\n            }\r\n            else if (addAndRemove) {\r\n                if (typeof (addAndRemove) === 'function') {\r\n                    w = addAndRemove(this, w, true).gridstackNode;\r\n                }\r\n                else {\r\n                    w = this.addWidget(w).gridstackNode;\r\n                }\r\n            }\r\n        });\r\n        this.engine.removedNodes = removed;\r\n        this.commit();\r\n        // after commit, clear that flag\r\n        delete this._ignoreLayoutsNodeChange;\r\n        delete this._insertNotAppend;\r\n        return this;\r\n    }\r\n    /**\r\n     * Initializes batch updates. You will see no changes until `commit()` method is called.\r\n     */\r\n    batchUpdate() {\r\n        this.engine.batchUpdate();\r\n        return this;\r\n    }\r\n    /**\r\n     * Gets current cell height.\r\n     */\r\n    getCellHeight(forcePixel = false) {\r\n        if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\r\n            (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\r\n            return this.opts.cellHeight;\r\n        }\r\n        // else get first cell height\r\n        let el = this.el.querySelector('.' + this.opts.itemClass);\r\n        if (el) {\r\n            let height = utils_1.Utils.toNumber(el.getAttribute('gs-h'));\r\n            return Math.round(el.offsetHeight / height);\r\n        }\r\n        // else do entire grid and # of rows (but doesn't work if min-height is the actual constrain)\r\n        let rows = parseInt(this.el.getAttribute('gs-current-row'));\r\n        return rows ? Math.round(this.el.getBoundingClientRect().height / rows) : this.opts.cellHeight;\r\n    }\r\n    /**\r\n     * Update current cell height - see `GridStackOptions.cellHeight` for format.\r\n     * This method rebuilds an internal CSS style sheet.\r\n     * Note: You can expect performance issues if call this method too often.\r\n     *\r\n     * @param val the cell height. If not passed (undefined), cells content will be made square (match width minus margin),\r\n     * if pass 0 the CSS will be generated by the application instead.\r\n     * @param update (Optional) if false, styles will not be updated\r\n     *\r\n     * @example\r\n     * grid.cellHeight(100); // same as 100px\r\n     * grid.cellHeight('70px');\r\n     * grid.cellHeight(grid.cellWidth() * 1.2);\r\n     */\r\n    cellHeight(val, update = true) {\r\n        // if not called internally, check if we're changing mode\r\n        if (update && val !== undefined) {\r\n            if (this._isAutoCellHeight !== (val === 'auto')) {\r\n                this._isAutoCellHeight = (val === 'auto');\r\n                this._updateWindowResizeEvent();\r\n            }\r\n        }\r\n        if (val === 'initial' || val === 'auto') {\r\n            val = undefined;\r\n        }\r\n        // make item content be square\r\n        if (val === undefined) {\r\n            let marginDiff = -this.opts.marginRight - this.opts.marginLeft\r\n                + this.opts.marginTop + this.opts.marginBottom;\r\n            val = this.cellWidth() + marginDiff;\r\n        }\r\n        let data = utils_1.Utils.parseHeight(val);\r\n        if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {\r\n            return this;\r\n        }\r\n        this.opts.cellHeightUnit = data.unit;\r\n        this.opts.cellHeight = data.h;\r\n        if (update) {\r\n            this._updateStyles(true, this.getRow()); // true = force re-create, for that # of rows\r\n        }\r\n        return this;\r\n    }\r\n    /** Gets current cell width. */\r\n    cellWidth() {\r\n        return this._widthOrContainer() / this.getColumn();\r\n    }\r\n    /** return our expected width (or parent) for 1 column check */\r\n    _widthOrContainer() {\r\n        // use `offsetWidth` or `clientWidth` (no scrollbar) ?\r\n        // https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\r\n        return (this.el.clientWidth || this.el.parentElement.clientWidth || window.innerWidth);\r\n    }\r\n    /**\r\n     * Finishes batch updates. Updates DOM nodes. You must call it after batchUpdate.\r\n     */\r\n    commit() {\r\n        this.engine.commit();\r\n        this._triggerRemoveEvent();\r\n        this._triggerAddEvent();\r\n        this._triggerChangeEvent();\r\n        return this;\r\n    }\r\n    /** re-layout grid items to reclaim any empty space */\r\n    compact() {\r\n        this.engine.compact();\r\n        this._triggerChangeEvent();\r\n        return this;\r\n    }\r\n    /**\r\n     * set the number of columns in the grid. Will update existing widgets to conform to new number of columns,\r\n     * as well as cache the original layout so you can revert back to previous positions without loss.\r\n     * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11],\r\n     * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns)\r\n     * @param column - Integer > 0 (default 12).\r\n     * @param layout specify the type of re-layout that will happen (position, size, etc...).\r\n     * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\r\n     */\r\n    column(column, layout = 'moveScale') {\r\n        if (column < 1 || this.opts.column === column)\r\n            return this;\r\n        let oldColumn = this.getColumn();\r\n        // if we go into 1 column mode (which happens if we're sized less than minW unless disableOneColumnMode is on)\r\n        // then remember the original columns so we can restore.\r\n        if (column === 1) {\r\n            this._prevColumn = oldColumn;\r\n        }\r\n        else {\r\n            delete this._prevColumn;\r\n        }\r\n        this.el.classList.remove('grid-stack-' + oldColumn);\r\n        this.el.classList.add('grid-stack-' + column);\r\n        this.opts.column = this.engine.column = column;\r\n        // update the items now - see if the dom order nodes should be passed instead (else default to current list)\r\n        let domNodes;\r\n        if (column === 1 && this.opts.oneColumnModeDomSort) {\r\n            domNodes = [];\r\n            this.getGridItems().forEach(el => {\r\n                if (el.gridstackNode) {\r\n                    domNodes.push(el.gridstackNode);\r\n                }\r\n            });\r\n            if (!domNodes.length) {\r\n                domNodes = undefined;\r\n            }\r\n        }\r\n        this.engine.updateNodeWidths(oldColumn, column, domNodes, layout);\r\n        if (this._isAutoCellHeight)\r\n            this.cellHeight();\r\n        // and trigger our event last...\r\n        this._ignoreLayoutsNodeChange = true; // skip layout update\r\n        this._triggerChangeEvent();\r\n        delete this._ignoreLayoutsNodeChange;\r\n        return this;\r\n    }\r\n    /**\r\n     * get the number of columns in the grid (default 12)\r\n     */\r\n    getColumn() {\r\n        return this.opts.column;\r\n    }\r\n    /** returns an array of grid HTML elements (no placeholder) - used to iterate through our children in DOM order */\r\n    getGridItems() {\r\n        return Array.from(this.el.children)\r\n            .filter((el) => el.matches('.' + this.opts.itemClass) && !el.matches('.' + this.opts.placeholderClass));\r\n    }\r\n    /**\r\n     * Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.\r\n     * @param removeDOM if `false` grid and items HTML elements will not be removed from the DOM (Optional. Default `true`).\r\n     */\r\n    destroy(removeDOM = true) {\r\n        if (!this.el)\r\n            return; // prevent multiple calls\r\n        this._updateWindowResizeEvent(true);\r\n        this.setStatic(true, false); // permanently removes DD but don't set CSS class (we're going away)\r\n        this.setAnimation(false);\r\n        if (!removeDOM) {\r\n            this.removeAll(removeDOM);\r\n            this.el.classList.remove(this.opts._styleSheetClass);\r\n        }\r\n        else {\r\n            this.el.parentNode.removeChild(this.el);\r\n        }\r\n        this._removeStylesheet();\r\n        this.el.removeAttribute('gs-current-row');\r\n        delete this.opts._isNested;\r\n        delete this.opts;\r\n        delete this._placeholder;\r\n        delete this.engine;\r\n        delete this.el.gridstack; // remove circular dependency that would prevent a freeing\r\n        delete this.el;\r\n        return this;\r\n    }\r\n    /**\r\n     * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html)\r\n     */\r\n    float(val) {\r\n        this.engine.float = val;\r\n        this._triggerChangeEvent();\r\n        return this;\r\n    }\r\n    /**\r\n     * get the current float mode\r\n     */\r\n    getFloat() {\r\n        return this.engine.float;\r\n    }\r\n    /**\r\n     * Get the position of the cell under a pixel on screen.\r\n     * @param position the position of the pixel to resolve in\r\n     * absolute coordinates, as an object with top and left properties\r\n     * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).\r\n     * Useful when grid is within `position: relative` element\r\n     *\r\n     * Returns an object with properties `x` and `y` i.e. the column and row in the grid.\r\n     */\r\n    getCellFromPixel(position, useDocRelative = false) {\r\n        let box = this.el.getBoundingClientRect();\r\n        // console.log(`getBoundingClientRect left: ${box.left} top: ${box.top} w: ${box.w} h: ${box.h}`)\r\n        let containerPos;\r\n        if (useDocRelative) {\r\n            containerPos = { top: box.top + document.documentElement.scrollTop, left: box.left };\r\n            // console.log(`getCellFromPixel scrollTop: ${document.documentElement.scrollTop}`)\r\n        }\r\n        else {\r\n            containerPos = { top: this.el.offsetTop, left: this.el.offsetLeft };\r\n            // console.log(`getCellFromPixel offsetTop: ${containerPos.left} offsetLeft: ${containerPos.top}`)\r\n        }\r\n        let relativeLeft = position.left - containerPos.left;\r\n        let relativeTop = position.top - containerPos.top;\r\n        let columnWidth = (box.width / this.getColumn());\r\n        let rowHeight = (box.height / parseInt(this.el.getAttribute('gs-current-row')));\r\n        return { x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight) };\r\n    }\r\n    /** returns the current number of rows, which will be at least `minRow` if set */\r\n    getRow() {\r\n        return Math.max(this.engine.getRow(), this.opts.minRow);\r\n    }\r\n    /**\r\n     * Checks if specified area is empty.\r\n     * @param x the position x.\r\n     * @param y the position y.\r\n     * @param w the width of to check\r\n     * @param h the height of to check\r\n     */\r\n    isAreaEmpty(x, y, w, h) {\r\n        return this.engine.isAreaEmpty(x, y, w, h);\r\n    }\r\n    /**\r\n     * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets.\r\n     * If you want gridstack to add the elements for you, use `addWidget()` instead.\r\n     * Makes the given element a widget and returns it.\r\n     * @param els widget or single selector to convert.\r\n     *\r\n     * @example\r\n     * let grid = GridStack.init();\r\n     * grid.el.appendChild('<div id=\"gsi-1\" gs-w=\"3\"></div>');\r\n     * grid.makeWidget('#gsi-1');\r\n     */\r\n    makeWidget(els) {\r\n        let el = GridStack.getElement(els);\r\n        this._prepareElement(el, true);\r\n        this._updateContainerHeight();\r\n        this._triggerAddEvent();\r\n        this._triggerChangeEvent();\r\n        return el;\r\n    }\r\n    /**\r\n     * Event handler that extracts our CustomEvent data out automatically for receiving custom\r\n     * notifications (see doc for supported events)\r\n     * @param name of the event (see possible values) or list of names space separated\r\n     * @param callback function called with event and optional second/third param\r\n     * (see README documentation for each signature).\r\n     *\r\n     * @example\r\n     * grid.on('added', function(e, items) { log('added ', items)} );\r\n     * or\r\n     * grid.on('added removed change', function(e, items) { log(e.type, items)} );\r\n     *\r\n     * Note: in some cases it is the same as calling native handler and parsing the event.\r\n     * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} );\r\n     *\r\n     */\r\n    on(name, callback) {\r\n        // check for array of names being passed instead\r\n        if (name.indexOf(' ') !== -1) {\r\n            let names = name.split(' ');\r\n            names.forEach(name => this.on(name, callback));\r\n            return this;\r\n        }\r\n        if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n            // native CustomEvent handlers - cash the generic handlers so we can easily remove\r\n            let noData = (name === 'enable' || name === 'disable');\r\n            if (noData) {\r\n                this._gsEventHandler[name] = (event) => callback(event);\r\n            }\r\n            else {\r\n                this._gsEventHandler[name] = (event) => callback(event, event.detail);\r\n            }\r\n            this.el.addEventListener(name, this._gsEventHandler[name]);\r\n        }\r\n        else if (name === 'drag' || name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resize' || name === 'resizestop' || name === 'dropped') {\r\n            // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.\r\n            // do same for start event to make it easier...\r\n            this._gsEventHandler[name] = callback;\r\n        }\r\n        else {\r\n            console.log('GridStack.on(' + name + ') event not supported, but you can still use $(\".grid-stack\").on(...) while jquery-ui is still used internally.');\r\n        }\r\n        return this;\r\n    }\r\n    /**\r\n     * unsubscribe from the 'on' event below\r\n     * @param name of the event (see possible values)\r\n     */\r\n    off(name) {\r\n        // check for array of names being passed instead\r\n        if (name.indexOf(' ') !== -1) {\r\n            let names = name.split(' ');\r\n            names.forEach(name => this.off(name));\r\n            return this;\r\n        }\r\n        if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\r\n            // remove native CustomEvent handlers\r\n            if (this._gsEventHandler[name]) {\r\n                this.el.removeEventListener(name, this._gsEventHandler[name]);\r\n            }\r\n        }\r\n        delete this._gsEventHandler[name];\r\n        return this;\r\n    }\r\n    /**\r\n     * Removes widget from the grid.\r\n     * @param el  widget or selector to modify\r\n     * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).\r\n     * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\r\n     */\r\n    removeWidget(els, removeDOM = true, triggerEvent = true) {\r\n        GridStack.getElements(els).forEach(el => {\r\n            if (el.parentElement !== this.el)\r\n                return; // not our child!\r\n            let node = el.gridstackNode;\r\n            // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272\r\n            if (!node) {\r\n                node = this.engine.nodes.find(n => el === n.el);\r\n            }\r\n            if (!node)\r\n                return;\r\n            // remove our DOM data (circular link) and drag&drop permanently\r\n            delete el.gridstackNode;\r\n            gridstack_ddi_1.GridStackDDI.get().remove(el);\r\n            this.engine.removeNode(node, removeDOM, triggerEvent);\r\n            if (removeDOM && el.parentElement) {\r\n                el.remove(); // in batch mode engine.removeNode doesn't call back to remove DOM\r\n            }\r\n        });\r\n        if (triggerEvent) {\r\n            this._triggerRemoveEvent();\r\n            this._triggerChangeEvent();\r\n        }\r\n        return this;\r\n    }\r\n    /**\r\n     * Removes all widgets from the grid.\r\n     * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).\r\n     */\r\n    removeAll(removeDOM = true) {\r\n        // always remove our DOM data (circular link) before list gets emptied and drag&drop permanently\r\n        this.engine.nodes.forEach(n => {\r\n            delete n.el.gridstackNode;\r\n            gridstack_ddi_1.GridStackDDI.get().remove(n.el);\r\n        });\r\n        this.engine.removeAll(removeDOM);\r\n        this._triggerRemoveEvent();\r\n        return this;\r\n    }\r\n    /**\r\n     * Toggle the grid animation state.  Toggles the `grid-stack-animate` class.\r\n     * @param doAnimate if true the grid will animate.\r\n     */\r\n    setAnimation(doAnimate) {\r\n        if (doAnimate) {\r\n            this.el.classList.add('grid-stack-animate');\r\n        }\r\n        else {\r\n            this.el.classList.remove('grid-stack-animate');\r\n        }\r\n        return this;\r\n    }\r\n    /**\r\n     * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.\r\n     * Also toggle the grid-stack-static class.\r\n     * @param val if true the grid become static.\r\n     */\r\n    setStatic(val, updateClass = true) {\r\n        if (this.opts.staticGrid === val)\r\n            return this;\r\n        this.opts.staticGrid = val;\r\n        this._setupRemoveDrop();\r\n        this._setupAcceptWidget();\r\n        this.engine.nodes.forEach(n => this._prepareDragDropByNode(n)); // either delete or init Drag&drop\r\n        if (updateClass) {\r\n            this._setStaticClass();\r\n        }\r\n        return this;\r\n    }\r\n    /**\r\n     * Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.\r\n     * @param els  widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)\r\n     * @param opt new widget options (x,y,w,h, etc..). Only those set will be updated.\r\n     */\r\n    update(els, opt) {\r\n        // support legacy call for now ?\r\n        if (arguments.length > 2) {\r\n            console.warn('gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update(el, {x, w, content, ...})`. It will be removed soon');\r\n            // eslint-disable-next-line prefer-rest-params\r\n            let a = arguments, i = 1;\r\n            opt = { x: a[i++], y: a[i++], w: a[i++], h: a[i++] };\r\n            return this.update(els, opt);\r\n        }\r\n        GridStack.getElements(els).forEach(el => {\r\n            if (!el || !el.gridstackNode)\r\n                return;\r\n            let n = el.gridstackNode;\r\n            let w = utils_1.Utils.cloneDeep(opt); // make a copy we can modify in case they re-use it or multiple items\r\n            delete w.autoPosition;\r\n            // move/resize widget if anything changed\r\n            let keys = ['x', 'y', 'w', 'h'];\r\n            let m;\r\n            if (keys.some(k => w[k] !== undefined && w[k] !== n[k])) {\r\n                m = {};\r\n                keys.forEach(k => {\r\n                    m[k] = (w[k] !== undefined) ? w[k] : n[k];\r\n                    delete w[k];\r\n                });\r\n            }\r\n            // for a move as well IFF there is any min/max fields set\r\n            if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {\r\n                m = {}; // will use node position but validate values\r\n            }\r\n            // check for content changing\r\n            if (w.content) {\r\n                let sub = el.querySelector('.grid-stack-item-content');\r\n                if (sub && sub.innerHTML !== w.content) {\r\n                    sub.innerHTML = w.content;\r\n                }\r\n                delete w.content;\r\n            }\r\n            // any remaining fields are assigned, but check for dragging changes, resize constrain\r\n            let changed = false;\r\n            let ddChanged = false;\r\n            for (const key in w) {\r\n                if (key[0] !== '_' && n[key] !== w[key]) {\r\n                    n[key] = w[key];\r\n                    changed = true;\r\n                    ddChanged = ddChanged || (!this.opts.staticGrid && (key === 'noResize' || key === 'noMove' || key === 'locked'));\r\n                }\r\n            }\r\n            // finally move the widget\r\n            if (m) {\r\n                this.engine.cleanNodes()\r\n                    .beginUpdate(n)\r\n                    .moveNode(n, m);\r\n                this._updateContainerHeight();\r\n                this._triggerChangeEvent();\r\n                this.engine.endUpdate();\r\n            }\r\n            if (changed) { // move will only update x,y,w,h so update the rest too\r\n                this._writeAttr(el, n);\r\n            }\r\n            if (ddChanged) {\r\n                this._prepareDragDropByNode(n);\r\n            }\r\n        });\r\n        return this;\r\n    }\r\n    /**\r\n     * Updates the margins which will set all 4 sides at once - see `GridStackOptions.margin` for format options (CSS string format of 1,2,4 values or single number).\r\n     * @param value margin value\r\n     */\r\n    margin(value) {\r\n        let isMultiValue = (typeof value === 'string' && value.split(' ').length > 1);\r\n        // check if we can skip re-creating our CSS file... won't check if multi values (too much hassle)\r\n        if (!isMultiValue) {\r\n            let data = utils_1.Utils.parseHeight(value);\r\n            if (this.opts.marginUnit === data.unit && this.opts.margin === data.h)\r\n                return;\r\n        }\r\n        // re-use existing margin handling\r\n        this.opts.margin = value;\r\n        this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = undefined;\r\n        this.initMargin();\r\n        this._updateStyles(true); // true = force re-create\r\n        return this;\r\n    }\r\n    /** returns current margin number value (undefined if 4 sides don't match) */\r\n    getMargin() { return this.opts.margin; }\r\n    /**\r\n     * Returns true if the height of the grid will be less than the vertical\r\n     * constraint. Always returns true if grid doesn't have height constraint.\r\n     * @param node contains x,y,w,h,auto-position options\r\n     *\r\n     * @example\r\n     * if (grid.willItFit(newWidget)) {\r\n     *   grid.addWidget(newWidget);\r\n     * } else {\r\n     *   alert('Not enough free space to place the widget');\r\n     * }\r\n     */\r\n    willItFit(node) {\r\n        // support legacy call for now\r\n        if (arguments.length > 1) {\r\n            console.warn('gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon');\r\n            // eslint-disable-next-line prefer-rest-params\r\n            let a = arguments, i = 0, w = { x: a[i++], y: a[i++], w: a[i++], h: a[i++], autoPosition: a[i++] };\r\n            return this.willItFit(w);\r\n        }\r\n        return this.engine.willItFit(node);\r\n    }\r\n    /** @internal */\r\n    _triggerChangeEvent() {\r\n        if (this.engine.batchMode)\r\n            return this;\r\n        let elements = this.engine.getDirtyNodes(true); // verify they really changed\r\n        if (elements && elements.length) {\r\n            if (!this._ignoreLayoutsNodeChange) {\r\n                this.engine.layoutsNodesChange(elements);\r\n            }\r\n            this._triggerEvent('change', elements);\r\n        }\r\n        this.engine.saveInitial(); // we called, now reset initial values & dirty flags\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _triggerAddEvent() {\r\n        if (this.engine.batchMode)\r\n            return this;\r\n        if (this.engine.addedNodes && this.engine.addedNodes.length > 0) {\r\n            if (!this._ignoreLayoutsNodeChange) {\r\n                this.engine.layoutsNodesChange(this.engine.addedNodes);\r\n            }\r\n            // prevent added nodes from also triggering 'change' event (which is called next)\r\n            this.engine.addedNodes.forEach(n => { delete n._dirty; });\r\n            this._triggerEvent('added', this.engine.addedNodes);\r\n            this.engine.addedNodes = [];\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _triggerRemoveEvent() {\r\n        if (this.engine.batchMode)\r\n            return this;\r\n        if (this.engine.removedNodes && this.engine.removedNodes.length > 0) {\r\n            this._triggerEvent('removed', this.engine.removedNodes);\r\n            this.engine.removedNodes = [];\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _triggerEvent(name, data) {\r\n        let event = data ? new CustomEvent(name, { bubbles: false, detail: data }) : new Event(name);\r\n        this.el.dispatchEvent(event);\r\n        return this;\r\n    }\r\n    /** @internal called to delete the current dynamic style sheet used for our layout */\r\n    _removeStylesheet() {\r\n        if (this._styles) {\r\n            utils_1.Utils.removeStylesheet(this._styles._id);\r\n            delete this._styles;\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal updated/create the CSS styles for row based layout and initial margin setting */\r\n    _updateStyles(forceUpdate = false, maxH) {\r\n        // call to delete existing one if we change cellHeight / margin\r\n        if (forceUpdate) {\r\n            this._removeStylesheet();\r\n        }\r\n        this._updateContainerHeight();\r\n        // if user is telling us they will handle the CSS themselves by setting heights to 0. Do we need this opts really ??\r\n        if (this.opts.cellHeight === 0) {\r\n            return this;\r\n        }\r\n        let cellHeight = this.opts.cellHeight;\r\n        let cellHeightUnit = this.opts.cellHeightUnit;\r\n        let prefix = `.${this.opts._styleSheetClass} > .${this.opts.itemClass}`;\r\n        // create one as needed\r\n        if (!this._styles) {\r\n            let id = 'gridstack-style-' + (Math.random() * 100000).toFixed();\r\n            // insert style to parent (instead of 'head' by default) to support WebComponent\r\n            let styleLocation = this.opts.styleInHead ? undefined : this.el.parentNode;\r\n            this._styles = utils_1.Utils.createStylesheet(id, styleLocation);\r\n            if (!this._styles)\r\n                return this;\r\n            this._styles._id = id;\r\n            this._styles._max = 0;\r\n            // these are done once only\r\n            utils_1.Utils.addCSSRule(this._styles, prefix, `min-height: ${cellHeight}${cellHeightUnit}`);\r\n            // content margins\r\n            let top = this.opts.marginTop + this.opts.marginUnit;\r\n            let bottom = this.opts.marginBottom + this.opts.marginUnit;\r\n            let right = this.opts.marginRight + this.opts.marginUnit;\r\n            let left = this.opts.marginLeft + this.opts.marginUnit;\r\n            let content = `${prefix} > .grid-stack-item-content`;\r\n            let placeholder = `.${this.opts._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;\r\n            utils_1.Utils.addCSSRule(this._styles, content, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n            utils_1.Utils.addCSSRule(this._styles, placeholder, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);\r\n            // resize handles offset (to match margin)\r\n            utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-ne`, `right: ${right}`);\r\n            utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-e`, `right: ${right}`);\r\n            utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-se`, `right: ${right}; bottom: ${bottom}`);\r\n            utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-nw`, `left: ${left}`);\r\n            utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-w`, `left: ${left}`);\r\n            utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-sw`, `left: ${left}; bottom: ${bottom}`);\r\n        }\r\n        // now update the height specific fields\r\n        maxH = maxH || this._styles._max;\r\n        if (maxH > this._styles._max) {\r\n            let getHeight = (rows) => (cellHeight * rows) + cellHeightUnit;\r\n            for (let i = this._styles._max + 1; i <= maxH; i++) { // start at 1\r\n                let h = getHeight(i);\r\n                utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-y=\"${i - 1}\"]`, `top: ${getHeight(i - 1)}`); // start at 0\r\n                utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-h=\"${i}\"]`, `height: ${h}`);\r\n                utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-min-h=\"${i}\"]`, `min-height: ${h}`);\r\n                utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-max-h=\"${i}\"]`, `max-height: ${h}`);\r\n            }\r\n            this._styles._max = maxH;\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _updateContainerHeight() {\r\n        if (!this.engine || this.engine.batchMode)\r\n            return this;\r\n        let row = this.getRow() + this._extraDragRow; // checks for minRow already\r\n        // check for css min height\r\n        // Note: we don't handle %,rem correctly so comment out, beside we don't need need to create un-necessary\r\n        // rows as the CSS will make us bigger than our set height if needed... not sure why we had this.\r\n        // let cssMinHeight = parseInt(getComputedStyle(this.el)['min-height']);\r\n        // if (cssMinHeight > 0) {\r\n        //   let minRow = Math.round(cssMinHeight / this.getCellHeight(true));\r\n        //   if (row < minRow) {\r\n        //     row = minRow;\r\n        //   }\r\n        // }\r\n        this.el.setAttribute('gs-current-row', String(row));\r\n        if (row === 0) {\r\n            this.el.style.removeProperty('height');\r\n            return this;\r\n        }\r\n        let cellHeight = this.opts.cellHeight;\r\n        let unit = this.opts.cellHeightUnit;\r\n        if (!cellHeight)\r\n            return this;\r\n        this.el.style.height = row * cellHeight + unit;\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _prepareElement(el, triggerAddEvent = false, node) {\r\n        if (!node) {\r\n            el.classList.add(this.opts.itemClass);\r\n            node = this._readAttr(el);\r\n        }\r\n        el.gridstackNode = node;\r\n        node.el = el;\r\n        node.grid = this;\r\n        let copy = Object.assign({}, node);\r\n        node = this.engine.addNode(node, triggerAddEvent);\r\n        // write node attr back in case there was collision or we have to fix bad values during addNode()\r\n        if (!utils_1.Utils.same(node, copy)) {\r\n            this._writeAttr(el, node);\r\n        }\r\n        this._prepareDragDropByNode(node);\r\n        return this;\r\n    }\r\n    /** @internal call to write position x,y,w,h attributes back to element */\r\n    _writePosAttr(el, n) {\r\n        if (n.x !== undefined && n.x !== null) {\r\n            el.setAttribute('gs-x', String(n.x));\r\n        }\r\n        if (n.y !== undefined && n.y !== null) {\r\n            el.setAttribute('gs-y', String(n.y));\r\n        }\r\n        if (n.w) {\r\n            el.setAttribute('gs-w', String(n.w));\r\n        }\r\n        if (n.h) {\r\n            el.setAttribute('gs-h', String(n.h));\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal call to write any default attributes back to element */\r\n    _writeAttr(el, node) {\r\n        if (!node)\r\n            return this;\r\n        this._writePosAttr(el, node);\r\n        let attrs /*: GridStackWidget but strings */ = {\r\n            autoPosition: 'gs-auto-position',\r\n            minW: 'gs-min-w',\r\n            minH: 'gs-min-h',\r\n            maxW: 'gs-max-w',\r\n            maxH: 'gs-max-h',\r\n            noResize: 'gs-no-resize',\r\n            noMove: 'gs-no-move',\r\n            locked: 'gs-locked',\r\n            id: 'gs-id',\r\n            resizeHandles: 'gs-resize-handles'\r\n        };\r\n        for (const key in attrs) {\r\n            if (node[key]) { // 0 is valid for x,y only but done above already and not in list anyway\r\n                el.setAttribute(attrs[key], String(node[key]));\r\n            }\r\n            else {\r\n                el.removeAttribute(attrs[key]);\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal call to read any default attributes from element */\r\n    _readAttr(el) {\r\n        let node = {};\r\n        node.x = utils_1.Utils.toNumber(el.getAttribute('gs-x'));\r\n        node.y = utils_1.Utils.toNumber(el.getAttribute('gs-y'));\r\n        node.w = utils_1.Utils.toNumber(el.getAttribute('gs-w'));\r\n        node.h = utils_1.Utils.toNumber(el.getAttribute('gs-h'));\r\n        node.maxW = utils_1.Utils.toNumber(el.getAttribute('gs-max-w'));\r\n        node.minW = utils_1.Utils.toNumber(el.getAttribute('gs-min-w'));\r\n        node.maxH = utils_1.Utils.toNumber(el.getAttribute('gs-max-h'));\r\n        node.minH = utils_1.Utils.toNumber(el.getAttribute('gs-min-h'));\r\n        node.autoPosition = utils_1.Utils.toBool(el.getAttribute('gs-auto-position'));\r\n        node.noResize = utils_1.Utils.toBool(el.getAttribute('gs-no-resize'));\r\n        node.noMove = utils_1.Utils.toBool(el.getAttribute('gs-no-move'));\r\n        node.locked = utils_1.Utils.toBool(el.getAttribute('gs-locked'));\r\n        node.resizeHandles = el.getAttribute('gs-resize-handles');\r\n        node.id = el.getAttribute('gs-id');\r\n        // remove any key not found (null or false which is default)\r\n        for (const key in node) {\r\n            if (!node.hasOwnProperty(key))\r\n                return;\r\n            if (!node[key] && node[key] !== 0) { // 0 can be valid value (x,y only really)\r\n                delete node[key];\r\n            }\r\n        }\r\n        return node;\r\n    }\r\n    /** @internal */\r\n    _setStaticClass() {\r\n        let classes = ['grid-stack-static'];\r\n        if (this.opts.staticGrid) {\r\n            this.el.classList.add(...classes);\r\n            this.el.setAttribute('gs-static', 'true');\r\n        }\r\n        else {\r\n            this.el.classList.remove(...classes);\r\n            this.el.removeAttribute('gs-static');\r\n        }\r\n        return this;\r\n    }\r\n    /**\r\n     * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off\r\n     * and remember the prev columns we used, or get our count from parent, as well as check for auto cell height (square)\r\n     */\r\n    onParentResize() {\r\n        if (!this.el || !this.el.clientWidth)\r\n            return; // return if we're gone or no size yet (will get called again)\r\n        let changedColumn = false;\r\n        // see if we're nested and take our column count from our parent....\r\n        if (this._autoColumn && this.opts._isNested) {\r\n            if (this.opts.column !== this.opts._isNested.w) {\r\n                changedColumn = true;\r\n                this.column(this.opts._isNested.w, 'none');\r\n            }\r\n        }\r\n        else {\r\n            // else check for 1 column in/out behavior\r\n            let oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.minWidth;\r\n            if ((this.opts.column === 1) !== oneColumn) {\r\n                changedColumn = true;\r\n                if (this.opts.animate) {\r\n                    this.setAnimation(false);\r\n                } // 1 <-> 12 is too radical, turn off animation\r\n                this.column(oneColumn ? 1 : this._prevColumn);\r\n                if (this.opts.animate) {\r\n                    this.setAnimation(true);\r\n                }\r\n            }\r\n        }\r\n        // make the cells content square again\r\n        if (this._isAutoCellHeight) {\r\n            if (!changedColumn && this.opts.cellHeightThrottle) {\r\n                if (!this._cellHeightThrottle) {\r\n                    this._cellHeightThrottle = utils_1.Utils.throttle(() => this.cellHeight(), this.opts.cellHeightThrottle);\r\n                }\r\n                this._cellHeightThrottle();\r\n            }\r\n            else {\r\n                // immediate update if we've changed column count or have no threshold\r\n                this.cellHeight();\r\n            }\r\n        }\r\n        // finally update any nested grids\r\n        this.engine.nodes.forEach(n => {\r\n            if (n.subGrid) {\r\n                n.subGrid.onParentResize();\r\n            }\r\n        });\r\n        return this;\r\n    }\r\n    /** add or remove the window size event handler */\r\n    _updateWindowResizeEvent(forceRemove = false) {\r\n        // only add event if we're not nested (parent will call us) and we're auto sizing cells or supporting oneColumn (i.e. doing work)\r\n        const workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode) && !this.opts._isNested;\r\n        if (!forceRemove && workTodo && !this._windowResizeBind) {\r\n            this._windowResizeBind = this.onParentResize.bind(this); // so we can properly remove later\r\n            window.addEventListener('resize', this._windowResizeBind);\r\n        }\r\n        else if ((forceRemove || !workTodo) && this._windowResizeBind) {\r\n            window.removeEventListener('resize', this._windowResizeBind);\r\n            delete this._windowResizeBind; // remove link to us so we can free\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal convert a potential selector into actual element */\r\n    static getElement(els = '.grid-stack-item') { return utils_1.Utils.getElement(els); }\r\n    /** @internal */\r\n    static getElements(els = '.grid-stack-item') { return utils_1.Utils.getElements(els); }\r\n    /** @internal */\r\n    static getGridElement(els) { return GridStack.getElement(els); }\r\n    /** @internal */\r\n    static getGridElements(els) { return utils_1.Utils.getElements(els); }\r\n    /** @internal initialize margin top/bottom/left/right and units */\r\n    initMargin() {\r\n        let data;\r\n        let margin = 0;\r\n        // support passing multiple values like CSS (ex: '5px 10px 0 20px')\r\n        let margins = [];\r\n        if (typeof this.opts.margin === 'string') {\r\n            margins = this.opts.margin.split(' ');\r\n        }\r\n        if (margins.length === 2) { // top/bot, left/right like CSS\r\n            this.opts.marginTop = this.opts.marginBottom = margins[0];\r\n            this.opts.marginLeft = this.opts.marginRight = margins[1];\r\n        }\r\n        else if (margins.length === 4) { // Clockwise like CSS\r\n            this.opts.marginTop = margins[0];\r\n            this.opts.marginRight = margins[1];\r\n            this.opts.marginBottom = margins[2];\r\n            this.opts.marginLeft = margins[3];\r\n        }\r\n        else {\r\n            data = utils_1.Utils.parseHeight(this.opts.margin);\r\n            this.opts.marginUnit = data.unit;\r\n            margin = this.opts.margin = data.h;\r\n        }\r\n        // see if top/bottom/left/right need to be set as well\r\n        if (this.opts.marginTop === undefined) {\r\n            this.opts.marginTop = margin;\r\n        }\r\n        else {\r\n            data = utils_1.Utils.parseHeight(this.opts.marginTop);\r\n            this.opts.marginTop = data.h;\r\n            delete this.opts.margin;\r\n        }\r\n        if (this.opts.marginBottom === undefined) {\r\n            this.opts.marginBottom = margin;\r\n        }\r\n        else {\r\n            data = utils_1.Utils.parseHeight(this.opts.marginBottom);\r\n            this.opts.marginBottom = data.h;\r\n            delete this.opts.margin;\r\n        }\r\n        if (this.opts.marginRight === undefined) {\r\n            this.opts.marginRight = margin;\r\n        }\r\n        else {\r\n            data = utils_1.Utils.parseHeight(this.opts.marginRight);\r\n            this.opts.marginRight = data.h;\r\n            delete this.opts.margin;\r\n        }\r\n        if (this.opts.marginLeft === undefined) {\r\n            this.opts.marginLeft = margin;\r\n        }\r\n        else {\r\n            data = utils_1.Utils.parseHeight(this.opts.marginLeft);\r\n            this.opts.marginLeft = data.h;\r\n            delete this.opts.margin;\r\n        }\r\n        this.opts.marginUnit = data.unit; // in case side were spelled out, use those units instead...\r\n        if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {\r\n            this.opts.margin = this.opts.marginTop; // makes it easier to check for no-ops in setMargin()\r\n        }\r\n        return this;\r\n    }\r\n    /*\r\n     * drag&drop empty stubs that will be implemented in gridstack-dd.ts for non static grid\r\n     * so we don't incur the load unless needed.\r\n     * NOTE: had to make those methods public in order to define them else as\r\n     *   GridStack.prototype._setupAcceptWidget = function()\r\n     * maybe there is a better way ????\r\n     */\r\n    /* eslint-disable @typescript-eslint/no-unused-vars */\r\n    /**\r\n     * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.\r\n     * Called during GridStack.init() as options, but can also be called directly (last param are cached) in case the toolbar\r\n     * is dynamically create and needs to change later.\r\n     * @param dragIn string selector (ex: '.sidebar .grid-stack-item')\r\n     * @param dragInOptions options - see DDDragInOpt. (default: {revert: 'invalid', handle: '.grid-stack-item-content', scroll: false, appendTo: 'body'}\r\n     **/\r\n    static setupDragIn(dragIn, dragInOptions) { }\r\n    /**\r\n     * Enables/Disables dragging by the user of specific grid element. If you want all items, and have it affect future items, use enableMove() instead. No-op for static grids.\r\n     * IF you are looking to prevent an item from moving (due to being pushed around by another during collision) use locked property instead.\r\n     * @param els widget or selector to modify.\r\n     * @param val if true widget will be draggable.\r\n     */\r\n    movable(els, val) { return this; }\r\n    /**\r\n     * Enables/Disables user resizing of specific grid element. If you want all items, and have it affect future items, use enableResize() instead. No-op for static grids.\r\n     * @param els  widget or selector to modify\r\n     * @param val  if true widget will be resizable.\r\n     */\r\n    resizable(els, val) { return this; }\r\n    /**\r\n     * Temporarily disables widgets moving/resizing.\r\n     * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\r\n     * Note: no-op for static grid\r\n     * This is a shortcut for:\r\n     * @example\r\n     *  grid.enableMove(false);\r\n     *  grid.enableResize(false);\r\n     */\r\n    disable() { return this; }\r\n    /**\r\n     * Re-enables widgets moving/resizing - see disable().\r\n     * Note: no-op for static grid.\r\n     * This is a shortcut for:\r\n     * @example\r\n     *  grid.enableMove(true);\r\n     *  grid.enableResize(true);\r\n     */\r\n    enable() { return this; }\r\n    /**\r\n     * Enables/disables widget moving. No-op for static grids.\r\n     */\r\n    enableMove(doEnable) { return this; }\r\n    /**\r\n     * Enables/disables widget resizing. No-op for static grids.\r\n     */\r\n    enableResize(doEnable) { return this; }\r\n    /** @internal called to add drag over support to support widgets */\r\n    _setupAcceptWidget() { return this; }\r\n    /** @internal called to setup a trash drop zone if the user specifies it */\r\n    _setupRemoveDrop() { return this; }\r\n    /** @internal prepares the element for drag&drop **/\r\n    _prepareDragDropByNode(node) { return this; }\r\n    /** @internal handles actual drag/resize start **/\r\n    _onStartMoving(el, event, ui, node, cellWidth, cellHeight) { return; }\r\n    /** @internal handles actual drag/resize **/\r\n    _dragOrResize(el, event, ui, node, cellWidth, cellHeight) { return; }\r\n    /** @internal called when a node leaves our area (mouse out or shape outside) **/\r\n    _leave(el, helper) { return; }\r\n}\r\nexports.GridStack = GridStack;\r\n/** scoping so users can call GridStack.Utils.sort() for example */\r\nGridStack.Utils = utils_1.Utils;\r\n/** scoping so users can call new GridStack.Engine(12) for example */\r\nGridStack.Engine = gridstack_engine_1.GridStackEngine;\r\n//# sourceMappingURL=gridstack.js.map","\"use strict\";\r\n/**\r\n * dd-base-impl.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDBaseImplement = void 0;\r\nclass DDBaseImplement {\r\n    constructor() {\r\n        /** @internal */\r\n        this._disabled = false;\r\n        /** @internal */\r\n        this._eventRegister = {};\r\n    }\r\n    /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */\r\n    get disabled() { return this._disabled; }\r\n    on(event, callback) {\r\n        this._eventRegister[event] = callback;\r\n    }\r\n    off(event) {\r\n        delete this._eventRegister[event];\r\n    }\r\n    enable() {\r\n        this._disabled = false;\r\n    }\r\n    disable() {\r\n        this._disabled = true;\r\n    }\r\n    destroy() {\r\n        delete this._eventRegister;\r\n    }\r\n    triggerEvent(eventName, event) {\r\n        if (!this.disabled && this._eventRegister && this._eventRegister[eventName])\r\n            return this._eventRegister[eventName](event);\r\n    }\r\n}\r\nexports.DDBaseImplement = DDBaseImplement;\r\n//# sourceMappingURL=dd-base-impl.js.map","\"use strict\";\r\n/**\r\n * dd-draggable.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDDraggable = void 0;\r\nconst dd_manager_1 = require(\"./dd-manager\");\r\nconst dd_utils_1 = require(\"./dd-utils\");\r\nconst dd_base_impl_1 = require(\"./dd-base-impl\");\r\nclass DDDraggable extends dd_base_impl_1.DDBaseImplement {\r\n    constructor(el, option = {}) {\r\n        super();\r\n        /** @internal */\r\n        this.dragging = false;\r\n        /** @internal TODO: set to public as called by DDDroppable! */\r\n        this.ui = () => {\r\n            const containmentEl = this.el.parentElement;\r\n            const containmentRect = containmentEl.getBoundingClientRect();\r\n            const offset = this.helper.getBoundingClientRect();\r\n            return {\r\n                position: {\r\n                    top: offset.top - containmentRect.top,\r\n                    left: offset.left - containmentRect.left\r\n                }\r\n                /* not used by GridStack for now...\r\n                helper: [this.helper], //The object arr representing the helper that's being dragged.\r\n                offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\r\n                */\r\n            };\r\n        };\r\n        this.el = el;\r\n        this.option = option;\r\n        // get the element that is actually supposed to be dragged by\r\n        let className = option.handle.substring(1);\r\n        this.dragEl = el.classList.contains(className) ? el : el.querySelector(option.handle) || el;\r\n        // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\r\n        this._dragStart = this._dragStart.bind(this);\r\n        this._drag = this._drag.bind(this);\r\n        this._dragEnd = this._dragEnd.bind(this);\r\n        this.enable();\r\n    }\r\n    on(event, callback) {\r\n        super.on(event, callback);\r\n    }\r\n    off(event) {\r\n        super.off(event);\r\n    }\r\n    enable() {\r\n        super.enable();\r\n        this.dragEl.draggable = true;\r\n        this.dragEl.addEventListener('dragstart', this._dragStart);\r\n        this.el.classList.remove('ui-draggable-disabled');\r\n        this.el.classList.add('ui-draggable');\r\n    }\r\n    disable(forDestroy = false) {\r\n        super.disable();\r\n        this.dragEl.removeAttribute('draggable');\r\n        this.dragEl.removeEventListener('dragstart', this._dragStart);\r\n        this.el.classList.remove('ui-draggable');\r\n        if (!forDestroy)\r\n            this.el.classList.add('ui-draggable-disabled');\r\n    }\r\n    destroy() {\r\n        if (this.dragging) {\r\n            // Destroy while dragging should remove dragend listener and manually trigger\r\n            // dragend, otherwise dragEnd can't perform dragstop because eventRegistry is\r\n            // destroyed.\r\n            this._dragEnd({});\r\n        }\r\n        this.disable(true);\r\n        delete this.el;\r\n        delete this.helper;\r\n        delete this.option;\r\n        super.destroy();\r\n    }\r\n    updateOption(opts) {\r\n        Object.keys(opts).forEach(key => this.option[key] = opts[key]);\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _dragStart(event) {\r\n        dd_manager_1.DDManager.dragElement = this;\r\n        this.helper = this._createHelper(event);\r\n        this._setupHelperContainmentStyle();\r\n        this.dragOffset = this._getDragOffset(event, this.el, this.helperContainment);\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { target: this.el, type: 'dragstart' });\r\n        if (this.helper !== this.el) {\r\n            this._setupDragFollowNodeNotifyStart(ev);\r\n            // immediately set external helper initial position to avoid flickering behavior and unnecessary looping in `_packNodes()`\r\n            this._dragFollow(event);\r\n        }\r\n        else {\r\n            this.dragFollowTimer = window.setTimeout(() => {\r\n                delete this.dragFollowTimer;\r\n                this._setupDragFollowNodeNotifyStart(ev);\r\n            }, 0);\r\n        }\r\n        this._cancelDragGhost(event);\r\n    }\r\n    /** @internal */\r\n    _setupDragFollowNodeNotifyStart(ev) {\r\n        this._setupHelperStyle();\r\n        document.addEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\r\n        this.dragEl.addEventListener('dragend', this._dragEnd);\r\n        if (this.option.start) {\r\n            this.option.start(ev, this.ui());\r\n        }\r\n        this.dragging = true;\r\n        this.helper.classList.add('ui-draggable-dragging');\r\n        this.triggerEvent('dragstart', ev);\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _drag(event) {\r\n        // Safari: prevent default to allow drop to happen instead of reverting back (with animation) and delaying dragend #1541\r\n        // https://stackoverflow.com/questions/61760755/how-to-fire-dragend-event-immediately\r\n        event.preventDefault();\r\n        this._dragFollow(event);\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { target: this.el, type: 'drag' });\r\n        if (this.option.drag) {\r\n            this.option.drag(ev, this.ui());\r\n        }\r\n        this.triggerEvent('drag', ev);\r\n    }\r\n    /** @internal */\r\n    _dragEnd(event) {\r\n        if (this.dragFollowTimer) {\r\n            clearTimeout(this.dragFollowTimer);\r\n            delete this.dragFollowTimer;\r\n            return;\r\n        }\r\n        else {\r\n            if (this.paintTimer) {\r\n                cancelAnimationFrame(this.paintTimer);\r\n            }\r\n            document.removeEventListener('dragover', this._drag, DDDraggable.dragEventListenerOption);\r\n            this.dragEl.removeEventListener('dragend', this._dragEnd);\r\n        }\r\n        this.dragging = false;\r\n        this.helper.classList.remove('ui-draggable-dragging');\r\n        this.helperContainment.style.position = this.parentOriginStylePosition || null;\r\n        if (this.helper === this.el) {\r\n            this._removeHelperStyle();\r\n        }\r\n        else {\r\n            this.helper.remove();\r\n        }\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { target: this.el, type: 'dragstop' });\r\n        if (this.option.stop) {\r\n            this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\r\n        }\r\n        this.triggerEvent('dragstop', ev);\r\n        delete dd_manager_1.DDManager.dragElement;\r\n        delete this.helper;\r\n    }\r\n    /** @internal create a clone copy (or user defined method) of the original drag item if set */\r\n    _createHelper(event) {\r\n        let helper = this.el;\r\n        if (typeof this.option.helper === 'function') {\r\n            helper = this.option.helper(event);\r\n        }\r\n        else if (this.option.helper === 'clone') {\r\n            helper = dd_utils_1.DDUtils.clone(this.el);\r\n        }\r\n        if (!document.body.contains(helper)) {\r\n            dd_utils_1.DDUtils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentNode : this.option.appendTo);\r\n        }\r\n        if (helper === this.el) {\r\n            this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\r\n        }\r\n        return helper;\r\n    }\r\n    /** @internal */\r\n    _setupHelperStyle() {\r\n        // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593\r\n        const rec = this.helper.getBoundingClientRect();\r\n        const style = this.helper.style;\r\n        style.pointerEvents = 'none';\r\n        style['min-width'] = 0; // since we no longer relative to our parent and we don't resize anyway (normally 100/#column %)\r\n        style.width = this.dragOffset.width + 'px';\r\n        style.height = this.dragOffset.height + 'px';\r\n        style.willChange = 'left, top';\r\n        style.position = 'fixed'; // let us drag between grids by not clipping as parent .grid-stack is position: 'relative'\r\n        style.left = rec.left + 'px';\r\n        style.top = rec.top + 'px';\r\n        style.transition = 'none'; // show up instantly\r\n        setTimeout(() => {\r\n            if (this.helper) {\r\n                style.transition = null; // recover animation\r\n            }\r\n        }, 0);\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _removeHelperStyle() {\r\n        // don't bother restoring styles if we're gonna remove anyway...\r\n        let node = this.helper ? this.helper.gridstackNode : undefined;\r\n        if (this.dragElementOriginStyle && (!node || !node._isAboutToRemove)) {\r\n            DDDraggable.originStyleProp.forEach(prop => {\r\n                this.helper.style[prop] = this.dragElementOriginStyle[prop] || null;\r\n            });\r\n            // show up instantly otherwise we animate to off the grid when switching back to 'absolute' from 'fixed'\r\n            this.helper.style.transition = 'none';\r\n            setTimeout(() => {\r\n                if (this.helper) {\r\n                    this.helper.style.transition = this.dragElementOriginStyle['transition']; // recover animation\r\n                }\r\n            }, 0);\r\n        }\r\n        delete this.dragElementOriginStyle;\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _dragFollow(event) {\r\n        if (this.paintTimer) {\r\n            cancelAnimationFrame(this.paintTimer);\r\n        }\r\n        this.paintTimer = requestAnimationFrame(() => {\r\n            delete this.paintTimer;\r\n            const offset = this.dragOffset;\r\n            let containmentRect = { left: 0, top: 0 };\r\n            if (this.helper.style.position === 'absolute') {\r\n                const { left, top } = this.helperContainment.getBoundingClientRect();\r\n                containmentRect = { left, top };\r\n            }\r\n            this.helper.style.left = event.clientX + offset.offsetLeft - containmentRect.left + 'px';\r\n            this.helper.style.top = event.clientY + offset.offsetTop - containmentRect.top + 'px';\r\n        });\r\n    }\r\n    /** @internal */\r\n    _setupHelperContainmentStyle() {\r\n        this.helperContainment = this.helper.parentElement;\r\n        if (this.helper.style.position !== 'fixed') {\r\n            this.parentOriginStylePosition = this.helperContainment.style.position;\r\n            if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {\r\n                this.helperContainment.style.position = 'relative';\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal prevent the default ghost image to be created (which has wrong as we move the helper/element instead\r\n     * (legacy jquery UI code updates the top/left of the item).\r\n     * TODO: maybe use mouse event instead of HTML5 drag as we have to work around it anyway, or change code to not update\r\n     * the actual grid-item but move the ghost image around (and special case jq version) ?\r\n     **/\r\n    _cancelDragGhost(e) {\r\n        /* doesn't seem to do anything...\r\n        let t = e.dataTransfer;\r\n        t.effectAllowed = 'none';\r\n        t.dropEffect = 'none';\r\n        t.setData('text', '');\r\n        */\r\n        // NOTE: according to spec (and required by Safari see #1540) the image has to be visible in the browser (in dom and not hidden) so make it a 1px div\r\n        let img = document.createElement('div');\r\n        img.style.width = '1px';\r\n        img.style.height = '1px';\r\n        img.style.position = 'fixed'; // prevent unwanted scrollbar\r\n        document.body.appendChild(img);\r\n        e.dataTransfer.setDragImage(img, 0, 0);\r\n        setTimeout(() => document.body.removeChild(img)); // nuke once drag had a chance to grab this 'image'\r\n        e.stopPropagation();\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _getDragOffset(event, el, parent) {\r\n        // in case ancestor has transform/perspective css properties that change the viewpoint\r\n        let xformOffsetX = 0;\r\n        let xformOffsetY = 0;\r\n        if (parent) {\r\n            const testEl = document.createElement('div');\r\n            dd_utils_1.DDUtils.addElStyles(testEl, {\r\n                opacity: '0',\r\n                position: 'fixed',\r\n                top: 0 + 'px',\r\n                left: 0 + 'px',\r\n                width: '1px',\r\n                height: '1px',\r\n                zIndex: '-999999',\r\n            });\r\n            parent.appendChild(testEl);\r\n            const testElPosition = testEl.getBoundingClientRect();\r\n            parent.removeChild(testEl);\r\n            xformOffsetX = testElPosition.left;\r\n            xformOffsetY = testElPosition.top;\r\n            // TODO: scale ?\r\n        }\r\n        const targetOffset = el.getBoundingClientRect();\r\n        return {\r\n            left: targetOffset.left,\r\n            top: targetOffset.top,\r\n            offsetLeft: -event.clientX + targetOffset.left - xformOffsetX,\r\n            offsetTop: -event.clientY + targetOffset.top - xformOffsetY,\r\n            width: targetOffset.width,\r\n            height: targetOffset.height\r\n        };\r\n    }\r\n}\r\nexports.DDDraggable = DDDraggable;\r\n/** @internal #1541 can't have {passive: true} on Safari as otherwise it reverts animate back to old location on drop */\r\nDDDraggable.dragEventListenerOption = true; // DDUtils.isEventSupportPassiveOption ? { capture: true, passive: true } : true;\r\n/** @internal */\r\nDDDraggable.originStyleProp = ['transition', 'pointerEvents', 'position',\r\n    'left', 'top', 'opacity', 'zIndex', 'width', 'height', 'willChange', 'min-width'];\r\n//# sourceMappingURL=dd-draggable.js.map","\"use strict\";\r\n/**\r\n * dd-droppable.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDDroppable = void 0;\r\nconst dd_manager_1 = require(\"./dd-manager\");\r\nconst dd_base_impl_1 = require(\"./dd-base-impl\");\r\nconst dd_utils_1 = require(\"./dd-utils\");\r\n// TEST let count = 0;\r\nclass DDDroppable extends dd_base_impl_1.DDBaseImplement {\r\n    constructor(el, opts = {}) {\r\n        super();\r\n        this.el = el;\r\n        this.option = opts;\r\n        // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\r\n        this._dragEnter = this._dragEnter.bind(this);\r\n        this._dragOver = this._dragOver.bind(this);\r\n        this._dragLeave = this._dragLeave.bind(this);\r\n        this._drop = this._drop.bind(this);\r\n        this.el.classList.add('ui-droppable');\r\n        this.el.addEventListener('dragenter', this._dragEnter);\r\n        this._setupAccept();\r\n    }\r\n    on(event, callback) {\r\n        super.on(event, callback);\r\n    }\r\n    off(event) {\r\n        super.off(event);\r\n    }\r\n    enable() {\r\n        if (!this.disabled)\r\n            return;\r\n        super.enable();\r\n        this.el.classList.remove('ui-droppable-disabled');\r\n        this.el.addEventListener('dragenter', this._dragEnter);\r\n    }\r\n    disable(forDestroy = false) {\r\n        if (this.disabled)\r\n            return;\r\n        super.disable();\r\n        if (!forDestroy)\r\n            this.el.classList.add('ui-droppable-disabled');\r\n        this.el.removeEventListener('dragenter', this._dragEnter);\r\n    }\r\n    destroy() {\r\n        this._removeLeaveCallbacks();\r\n        this.disable(true);\r\n        this.el.classList.remove('ui-droppable');\r\n        this.el.classList.remove('ui-droppable-disabled');\r\n        super.destroy();\r\n    }\r\n    updateOption(opts) {\r\n        Object.keys(opts).forEach(key => this.option[key] = opts[key]);\r\n        this._setupAccept();\r\n        return this;\r\n    }\r\n    /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\r\n    _dragEnter(event) {\r\n        // TEST console.log(`${count++} Enter ${(this.el as GridHTMLElement).gridstack.opts.id}`);\r\n        if (!this._canDrop())\r\n            return;\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        // ignore multiple 'dragenter' as we go over existing items\r\n        if (this.moving)\r\n            return;\r\n        this.moving = true;\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { target: this.el, type: 'dropover' });\r\n        if (this.option.over) {\r\n            this.option.over(ev, this._ui(dd_manager_1.DDManager.dragElement));\r\n        }\r\n        this.triggerEvent('dropover', ev);\r\n        this.el.addEventListener('dragover', this._dragOver);\r\n        this.el.addEventListener('drop', this._drop);\r\n        this.el.addEventListener('dragleave', this._dragLeave);\r\n        // Update: removed that as it causes nested grids to no receive dragenter events when parent drags and sets this for #992. not seeing cursor flicker (chrome).\r\n        // this.el.classList.add('ui-droppable-over');\r\n        // make sure when we enter this, that the last one gets a leave to correctly cleanup as we don't always do\r\n        if (DDDroppable.lastActive && DDDroppable.lastActive !== this) {\r\n            DDDroppable.lastActive._dragLeave(event, true);\r\n        }\r\n        DDDroppable.lastActive = this;\r\n    }\r\n    /** @internal called when an moving to drop item is being dragged over - do nothing but eat the event */\r\n    _dragOver(event) {\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n    }\r\n    /** @internal called when the item is leaving our area, stop tracking if we had moving item */\r\n    _dragLeave(event, forceLeave) {\r\n        var _a;\r\n        // TEST console.log(`${count++} Leave ${(this.el as GridHTMLElement).gridstack.opts.id}`);\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        // ignore leave events on our children (we get them when starting to drag our items)\r\n        // but exclude nested grids since we would still be leaving ourself, \r\n        // but don't handle leave if we're dragging a nested grid around\r\n        if (!forceLeave) {\r\n            let onChild = dd_utils_1.DDUtils.inside(event, this.el);\r\n            let drag = dd_manager_1.DDManager.dragElement.el;\r\n            if (onChild && !((_a = drag.gridstackNode) === null || _a === void 0 ? void 0 : _a.subGrid)) { // dragging a nested grid ?\r\n                let nestedEl = this.el.gridstack.engine.nodes.filter(n => n.subGrid).map(n => n.subGrid.el);\r\n                onChild = !nestedEl.some(el => dd_utils_1.DDUtils.inside(event, el));\r\n            }\r\n            if (onChild)\r\n                return;\r\n        }\r\n        if (this.moving) {\r\n            const ev = dd_utils_1.DDUtils.initEvent(event, { target: this.el, type: 'dropout' });\r\n            if (this.option.out) {\r\n                this.option.out(ev, this._ui(dd_manager_1.DDManager.dragElement));\r\n            }\r\n            this.triggerEvent('dropout', ev);\r\n        }\r\n        this._removeLeaveCallbacks();\r\n        if (DDDroppable.lastActive === this) {\r\n            delete DDDroppable.lastActive;\r\n        }\r\n    }\r\n    /** @internal item is being dropped on us - call the client drop event */\r\n    _drop(event) {\r\n        if (!this.moving)\r\n            return; // should not have received event...\r\n        event.preventDefault();\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { target: this.el, type: 'drop' });\r\n        if (this.option.drop) {\r\n            this.option.drop(ev, this._ui(dd_manager_1.DDManager.dragElement));\r\n        }\r\n        this.triggerEvent('drop', ev);\r\n        this._removeLeaveCallbacks();\r\n    }\r\n    /** @internal called to remove callbacks when leaving or dropping */\r\n    _removeLeaveCallbacks() {\r\n        if (!this.moving) {\r\n            return;\r\n        }\r\n        delete this.moving;\r\n        this.el.removeEventListener('dragover', this._dragOver);\r\n        this.el.removeEventListener('drop', this._drop);\r\n        this.el.removeEventListener('dragleave', this._dragLeave);\r\n        // Update: removed that as it causes nested grids to no receive dragenter events when parent drags and sets this for #992. not seeing cursor flicker (chrome).\r\n        // this.el.classList.remove('ui-droppable-over');\r\n    }\r\n    /** @internal */\r\n    _canDrop() {\r\n        return dd_manager_1.DDManager.dragElement && (!this.accept || this.accept(dd_manager_1.DDManager.dragElement.el));\r\n    }\r\n    /** @internal */\r\n    _setupAccept() {\r\n        if (this.option.accept && typeof this.option.accept === 'string') {\r\n            this.accept = (el) => {\r\n                return el.matches(this.option.accept);\r\n            };\r\n        }\r\n        else {\r\n            this.accept = this.option.accept;\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _ui(drag) {\r\n        return Object.assign({ draggable: drag.el }, drag.ui());\r\n    }\r\n}\r\nexports.DDDroppable = DDDroppable;\r\n//# sourceMappingURL=dd-droppable.js.map","\"use strict\";\r\n/**\r\n * dd-elements.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDElement = void 0;\r\nconst dd_resizable_1 = require(\"./dd-resizable\");\r\nconst dd_draggable_1 = require(\"./dd-draggable\");\r\nconst dd_droppable_1 = require(\"./dd-droppable\");\r\nclass DDElement {\r\n    constructor(el) {\r\n        this.el = el;\r\n    }\r\n    static init(el) {\r\n        if (!el.ddElement) {\r\n            el.ddElement = new DDElement(el);\r\n        }\r\n        return el.ddElement;\r\n    }\r\n    on(eventName, callback) {\r\n        if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\r\n            this.ddDraggable.on(eventName, callback);\r\n        }\r\n        else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\r\n            this.ddDroppable.on(eventName, callback);\r\n        }\r\n        else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\r\n            this.ddResizable.on(eventName, callback);\r\n        }\r\n        return this;\r\n    }\r\n    off(eventName) {\r\n        if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\r\n            this.ddDraggable.off(eventName);\r\n        }\r\n        else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\r\n            this.ddDroppable.off(eventName);\r\n        }\r\n        else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\r\n            this.ddResizable.off(eventName);\r\n        }\r\n        return this;\r\n    }\r\n    setupDraggable(opts) {\r\n        if (!this.ddDraggable) {\r\n            this.ddDraggable = new dd_draggable_1.DDDraggable(this.el, opts);\r\n        }\r\n        else {\r\n            this.ddDraggable.updateOption(opts);\r\n        }\r\n        return this;\r\n    }\r\n    cleanDraggable() {\r\n        if (this.ddDraggable) {\r\n            this.ddDraggable.destroy();\r\n            delete this.ddDraggable;\r\n        }\r\n        return this;\r\n    }\r\n    setupResizable(opts) {\r\n        if (!this.ddResizable) {\r\n            this.ddResizable = new dd_resizable_1.DDResizable(this.el, opts);\r\n        }\r\n        else {\r\n            this.ddResizable.updateOption(opts);\r\n        }\r\n        return this;\r\n    }\r\n    cleanResizable() {\r\n        if (this.ddResizable) {\r\n            this.ddResizable.destroy();\r\n            delete this.ddResizable;\r\n        }\r\n        return this;\r\n    }\r\n    setupDroppable(opts) {\r\n        if (!this.ddDroppable) {\r\n            this.ddDroppable = new dd_droppable_1.DDDroppable(this.el, opts);\r\n        }\r\n        else {\r\n            this.ddDroppable.updateOption(opts);\r\n        }\r\n        return this;\r\n    }\r\n    cleanDroppable() {\r\n        if (this.ddDroppable) {\r\n            this.ddDroppable.destroy();\r\n            delete this.ddDroppable;\r\n        }\r\n        return this;\r\n    }\r\n}\r\nexports.DDElement = DDElement;\r\n//# sourceMappingURL=dd-element.js.map","\"use strict\";\r\n/**\r\n * dd-manager.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDManager = void 0;\r\nclass DDManager {\r\n}\r\nexports.DDManager = DDManager;\r\n//# sourceMappingURL=dd-manager.js.map","\"use strict\";\r\n/**\r\n * dd-resizable-handle.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDResizableHandle = void 0;\r\nclass DDResizableHandle {\r\n    constructor(host, direction, option) {\r\n        /** @internal true after we've moved enough pixels to start a resize */\r\n        this.moving = false;\r\n        this.host = host;\r\n        this.dir = direction;\r\n        this.option = option;\r\n        // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\r\n        this._mouseDown = this._mouseDown.bind(this);\r\n        this._mouseMove = this._mouseMove.bind(this);\r\n        this._mouseUp = this._mouseUp.bind(this);\r\n        this._init();\r\n    }\r\n    /** @internal */\r\n    _init() {\r\n        const el = document.createElement('div');\r\n        el.classList.add('ui-resizable-handle');\r\n        el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\r\n        el.style.zIndex = '100';\r\n        el.style.userSelect = 'none';\r\n        this.el = el;\r\n        this.host.appendChild(this.el);\r\n        this.el.addEventListener('mousedown', this._mouseDown);\r\n        return this;\r\n    }\r\n    /** call this when resize handle needs to be removed and cleaned up */\r\n    destroy() {\r\n        if (this.moving)\r\n            this._mouseUp(this.mouseDownEvent);\r\n        this.el.removeEventListener('mousedown', this._mouseDown);\r\n        this.host.removeChild(this.el);\r\n        delete this.el;\r\n        delete this.host;\r\n        return this;\r\n    }\r\n    /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\r\n    _mouseDown(e) {\r\n        e.preventDefault();\r\n        this.mouseDownEvent = e;\r\n        document.addEventListener('mousemove', this._mouseMove, true); // capture, not bubble\r\n        document.addEventListener('mouseup', this._mouseUp);\r\n    }\r\n    /** @internal */\r\n    _mouseMove(e) {\r\n        let s = this.mouseDownEvent;\r\n        // don't start unless we've moved at least 3 pixels\r\n        if (!this.moving && Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\r\n            this.moving = true;\r\n            this._triggerEvent('start', this.mouseDownEvent);\r\n        }\r\n        else if (this.moving) {\r\n            this._triggerEvent('move', e);\r\n        }\r\n    }\r\n    /** @internal */\r\n    _mouseUp(e) {\r\n        if (this.moving) {\r\n            this._triggerEvent('stop', e);\r\n        }\r\n        document.removeEventListener('mousemove', this._mouseMove, true);\r\n        document.removeEventListener('mouseup', this._mouseUp);\r\n        delete this.moving;\r\n        delete this.mouseDownEvent;\r\n    }\r\n    /** @internal */\r\n    _triggerEvent(name, event) {\r\n        if (this.option[name])\r\n            this.option[name](event);\r\n        return this;\r\n    }\r\n}\r\nexports.DDResizableHandle = DDResizableHandle;\r\n/** @internal */\r\nDDResizableHandle.prefix = 'ui-resizable-';\r\n//# sourceMappingURL=dd-resizable-handle.js.map","\"use strict\";\r\n/**\r\n * dd-resizable.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDResizable = void 0;\r\nconst dd_resizable_handle_1 = require(\"./dd-resizable-handle\");\r\nconst dd_base_impl_1 = require(\"./dd-base-impl\");\r\nconst dd_utils_1 = require(\"./dd-utils\");\r\nconst utils_1 = require(\"../utils\");\r\nclass DDResizable extends dd_base_impl_1.DDBaseImplement {\r\n    constructor(el, opts = {}) {\r\n        super();\r\n        /** @internal */\r\n        this._showHandlers = () => {\r\n            this.el.classList.remove('ui-resizable-autohide');\r\n        };\r\n        /** @internal */\r\n        this._hideHandlers = () => {\r\n            this.el.classList.add('ui-resizable-autohide');\r\n        };\r\n        /** @internal */\r\n        this._ui = () => {\r\n            const containmentEl = this.el.parentElement;\r\n            const containmentRect = containmentEl.getBoundingClientRect();\r\n            const newRect = {\r\n                width: this.originalRect.width,\r\n                height: this.originalRect.height + this.scrolled,\r\n                left: this.originalRect.left,\r\n                top: this.originalRect.top - this.scrolled\r\n            };\r\n            const rect = this.temporalRect || newRect;\r\n            return {\r\n                position: {\r\n                    left: rect.left - containmentRect.left,\r\n                    top: rect.top - containmentRect.top\r\n                },\r\n                size: {\r\n                    width: rect.width,\r\n                    height: rect.height\r\n                }\r\n                /* Gridstack ONLY needs position set above... keep around in case.\r\n                element: [this.el], // The object representing the element to be resized\r\n                helper: [], // TODO: not support yet - The object representing the helper that's being resized\r\n                originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\r\n                originalPosition: { // The position represented as { left, top } before the resizable is resized\r\n                  left: this.originalRect.left - containmentRect.left,\r\n                  top: this.originalRect.top - containmentRect.top\r\n                },\r\n                originalSize: { // The size represented as { width, height } before the resizable is resized\r\n                  width: this.originalRect.width,\r\n                  height: this.originalRect.height\r\n                }\r\n                */\r\n            };\r\n        };\r\n        this.el = el;\r\n        this.option = opts;\r\n        this.enable();\r\n        this._setupAutoHide();\r\n        this._setupHandlers();\r\n    }\r\n    on(event, callback) {\r\n        super.on(event, callback);\r\n    }\r\n    off(event) {\r\n        super.off(event);\r\n    }\r\n    enable() {\r\n        super.enable();\r\n        this.el.classList.add('ui-resizable');\r\n        this.el.classList.remove('ui-resizable-disabled');\r\n    }\r\n    disable() {\r\n        super.disable();\r\n        this.el.classList.add('ui-resizable-disabled');\r\n        this.el.classList.remove('ui-resizable');\r\n    }\r\n    destroy() {\r\n        this._removeHandlers();\r\n        if (this.option.autoHide) {\r\n            this.el.removeEventListener('mouseover', this._showHandlers);\r\n            this.el.removeEventListener('mouseout', this._hideHandlers);\r\n        }\r\n        this.el.classList.remove('ui-resizable');\r\n        delete this.el;\r\n        super.destroy();\r\n    }\r\n    updateOption(opts) {\r\n        let updateHandles = (opts.handles && opts.handles !== this.option.handles);\r\n        let updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\r\n        Object.keys(opts).forEach(key => this.option[key] = opts[key]);\r\n        if (updateHandles) {\r\n            this._removeHandlers();\r\n            this._setupHandlers();\r\n        }\r\n        if (updateAutoHide) {\r\n            this._setupAutoHide();\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _setupAutoHide() {\r\n        if (this.option.autoHide) {\r\n            this.el.classList.add('ui-resizable-autohide');\r\n            // use mouseover/mouseout instead of mouseenter/mouseleave to get better performance;\r\n            this.el.addEventListener('mouseover', this._showHandlers);\r\n            this.el.addEventListener('mouseout', this._hideHandlers);\r\n        }\r\n        else {\r\n            this.el.classList.remove('ui-resizable-autohide');\r\n            this.el.removeEventListener('mouseover', this._showHandlers);\r\n            this.el.removeEventListener('mouseout', this._hideHandlers);\r\n        }\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _setupHandlers() {\r\n        let handlerDirection = this.option.handles || 'e,s,se';\r\n        if (handlerDirection === 'all') {\r\n            handlerDirection = 'n,e,s,w,se,sw,ne,nw';\r\n        }\r\n        this.handlers = handlerDirection.split(',')\r\n            .map(dir => dir.trim())\r\n            .map(dir => new dd_resizable_handle_1.DDResizableHandle(this.el, dir, {\r\n            start: (event) => {\r\n                this._resizeStart(event);\r\n            },\r\n            stop: (event) => {\r\n                this._resizeStop(event);\r\n            },\r\n            move: (event) => {\r\n                this._resizing(event, dir);\r\n            }\r\n        }));\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _resizeStart(event) {\r\n        this.originalRect = this.el.getBoundingClientRect();\r\n        this.scrollEl = utils_1.Utils.getScrollElement(this.el);\r\n        this.scrollY = this.scrollEl.scrollTop;\r\n        this.scrolled = 0;\r\n        this.startEvent = event;\r\n        this._setupHelper();\r\n        this._applyChange();\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { type: 'resizestart', target: this.el });\r\n        if (this.option.start) {\r\n            this.option.start(ev, this._ui());\r\n        }\r\n        this.el.classList.add('ui-resizable-resizing');\r\n        this.triggerEvent('resizestart', ev);\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _resizing(event, dir) {\r\n        this.scrolled = this.scrollEl.scrollTop - this.scrollY;\r\n        this.temporalRect = this._getChange(event, dir);\r\n        this._applyChange();\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { type: 'resize', target: this.el });\r\n        if (this.option.resize) {\r\n            this.option.resize(ev, this._ui());\r\n        }\r\n        this.triggerEvent('resize', ev);\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _resizeStop(event) {\r\n        const ev = dd_utils_1.DDUtils.initEvent(event, { type: 'resizestop', target: this.el });\r\n        if (this.option.stop) {\r\n            this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\r\n        }\r\n        this.el.classList.remove('ui-resizable-resizing');\r\n        this.triggerEvent('resizestop', ev);\r\n        this._cleanHelper();\r\n        delete this.startEvent;\r\n        delete this.originalRect;\r\n        delete this.temporalRect;\r\n        delete this.scrollY;\r\n        delete this.scrolled;\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _setupHelper() {\r\n        this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\r\n        this.parentOriginStylePosition = this.el.parentElement.style.position;\r\n        if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {\r\n            this.el.parentElement.style.position = 'relative';\r\n        }\r\n        this.el.style.position = 'absolute';\r\n        this.el.style.opacity = '0.8';\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _cleanHelper() {\r\n        DDResizable._originStyleProp.forEach((prop, i) => {\r\n            this.el.style[prop] = this.elOriginStyleVal[i] || null;\r\n        });\r\n        this.el.parentElement.style.position = this.parentOriginStylePosition || null;\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _getChange(event, dir) {\r\n        const oEvent = this.startEvent;\r\n        const newRect = {\r\n            width: this.originalRect.width,\r\n            height: this.originalRect.height + this.scrolled,\r\n            left: this.originalRect.left,\r\n            top: this.originalRect.top - this.scrolled\r\n        };\r\n        const offsetX = event.clientX - oEvent.clientX;\r\n        const offsetY = event.clientY - oEvent.clientY;\r\n        if (dir.indexOf('e') > -1) {\r\n            newRect.width += offsetX;\r\n        }\r\n        else if (dir.indexOf('w') > -1) {\r\n            newRect.width -= offsetX;\r\n            newRect.left += offsetX;\r\n        }\r\n        if (dir.indexOf('s') > -1) {\r\n            newRect.height += offsetY;\r\n        }\r\n        else if (dir.indexOf('n') > -1) {\r\n            newRect.height -= offsetY;\r\n            newRect.top += offsetY;\r\n        }\r\n        const constrain = this._constrainSize(newRect.width, newRect.height);\r\n        if (Math.round(newRect.width) !== Math.round(constrain.width)) { // round to ignore slight round-off errors\r\n            if (dir.indexOf('w') > -1) {\r\n                newRect.left += newRect.width - constrain.width;\r\n            }\r\n            newRect.width = constrain.width;\r\n        }\r\n        if (Math.round(newRect.height) !== Math.round(constrain.height)) {\r\n            if (dir.indexOf('n') > -1) {\r\n                newRect.top += newRect.height - constrain.height;\r\n            }\r\n            newRect.height = constrain.height;\r\n        }\r\n        return newRect;\r\n    }\r\n    /** @internal constrain the size to the set min/max values */\r\n    _constrainSize(oWidth, oHeight) {\r\n        const maxWidth = this.option.maxWidth || Number.MAX_SAFE_INTEGER;\r\n        const minWidth = this.option.minWidth || oWidth;\r\n        const maxHeight = this.option.maxHeight || Number.MAX_SAFE_INTEGER;\r\n        const minHeight = this.option.minHeight || oHeight;\r\n        const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\r\n        const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\r\n        return { width, height };\r\n    }\r\n    /** @internal */\r\n    _applyChange() {\r\n        let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\r\n        if (this.el.style.position === 'absolute') {\r\n            const containmentEl = this.el.parentElement;\r\n            const { left, top } = containmentEl.getBoundingClientRect();\r\n            containmentRect = { left, top, width: 0, height: 0 };\r\n        }\r\n        if (!this.temporalRect)\r\n            return this;\r\n        Object.keys(this.temporalRect).forEach(key => {\r\n            const value = this.temporalRect[key];\r\n            this.el.style[key] = value - containmentRect[key] + 'px';\r\n        });\r\n        return this;\r\n    }\r\n    /** @internal */\r\n    _removeHandlers() {\r\n        this.handlers.forEach(handle => handle.destroy());\r\n        delete this.handlers;\r\n        return this;\r\n    }\r\n}\r\nexports.DDResizable = DDResizable;\r\n/** @internal */\r\nDDResizable._originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\r\n//# sourceMappingURL=dd-resizable.js.map","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DDUtils = void 0;\r\n/**\r\n * dd-utils.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nclass DDUtils {\r\n    static clone(el) {\r\n        const node = el.cloneNode(true);\r\n        node.removeAttribute('id');\r\n        return node;\r\n    }\r\n    static appendTo(el, parent) {\r\n        let parentNode;\r\n        if (typeof parent === 'string') {\r\n            parentNode = document.querySelector(parent);\r\n        }\r\n        else {\r\n            parentNode = parent;\r\n        }\r\n        if (parentNode) {\r\n            parentNode.appendChild(el);\r\n        }\r\n    }\r\n    static setPositionRelative(el) {\r\n        if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {\r\n            el.style.position = \"relative\";\r\n        }\r\n    }\r\n    static addElStyles(el, styles) {\r\n        if (styles instanceof Object) {\r\n            for (const s in styles) {\r\n                if (styles.hasOwnProperty(s)) {\r\n                    if (Array.isArray(styles[s])) {\r\n                        // support fallback value\r\n                        styles[s].forEach(val => {\r\n                            el.style[s] = val;\r\n                        });\r\n                    }\r\n                    else {\r\n                        el.style[s] = styles[s];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    static initEvent(e, info) {\r\n        const evt = { type: info.type };\r\n        const obj = {\r\n            button: 0,\r\n            which: 0,\r\n            buttons: 1,\r\n            bubbles: true,\r\n            cancelable: true,\r\n            target: info.target ? info.target : e.target\r\n        };\r\n        // don't check for `instanceof DragEvent` as Safari use MouseEvent #1540\r\n        if (e.dataTransfer) {\r\n            evt['dataTransfer'] = e.dataTransfer; // workaround 'readonly' field.\r\n        }\r\n        ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].forEach(p => evt[p] = e[p]); // keys\r\n        ['pageX', 'pageY', 'clientX', 'clientY', 'screenX', 'screenY'].forEach(p => evt[p] = e[p]); // point info\r\n        return Object.assign(Object.assign({}, evt), obj);\r\n    }\r\n    /** returns true if event is inside the given element rectangle */\r\n    // Note: Safari Mac has null event.relatedTarget which causes #1684 so check if DragEvent is inside the coordinates instead\r\n    //    this.el.contains(event.relatedTarget as HTMLElement)\r\n    static inside(e, el) {\r\n        // srcElement, toElement, target: all set to placeholder when leaving simple grid, so we can't use that (Chrome)\r\n        let target = e.relatedTarget || e.fromElement;\r\n        if (!target) {\r\n            const { bottom, left, right, top } = el.getBoundingClientRect();\r\n            return (e.x < right && e.x > left && e.y < bottom && e.y > top);\r\n        }\r\n        return el.contains(target);\r\n    }\r\n}\r\nexports.DDUtils = DDUtils;\r\nDDUtils.isEventSupportPassiveOption = ((() => {\r\n    let supportsPassive = false;\r\n    let passiveTest = () => {\r\n        // do nothing\r\n    };\r\n    document.addEventListener('test', passiveTest, {\r\n        get passive() {\r\n            supportsPassive = true;\r\n            return true;\r\n        }\r\n    });\r\n    document.removeEventListener('test', passiveTest);\r\n    return supportsPassive;\r\n})());\r\n//# sourceMappingURL=dd-utils.js.map","\"use strict\";\r\n/**\r\n * gridstack-dd-native.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}));\r\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.GridStackDDNative = void 0;\r\nconst dd_manager_1 = require(\"./dd-manager\");\r\nconst dd_element_1 = require(\"./dd-element\");\r\nconst gridstack_dd_1 = require(\"../gridstack-dd\");\r\nconst utils_1 = require(\"../utils\");\r\n// export our base class (what user should use) and all associated types\r\n__exportStar(require(\"../gridstack-dd\"), exports);\r\n/**\r\n * HTML 5 Native DragDrop based drag'n'drop plugin.\r\n */\r\nclass GridStackDDNative extends gridstack_dd_1.GridStackDD {\r\n    resizable(el, opts, key, value) {\r\n        this._getDDElements(el).forEach(dEl => {\r\n            if (opts === 'disable' || opts === 'enable') {\r\n                dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\r\n            }\r\n            else if (opts === 'destroy') {\r\n                dEl.ddResizable && dEl.cleanResizable();\r\n            }\r\n            else if (opts === 'option') {\r\n                dEl.setupResizable({ [key]: value });\r\n            }\r\n            else {\r\n                const grid = dEl.el.gridstackNode.grid;\r\n                let handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles;\r\n                dEl.setupResizable(Object.assign(Object.assign(Object.assign({}, grid.opts.resizable), { handles: handles }), {\r\n                    start: opts.start,\r\n                    stop: opts.stop,\r\n                    resize: opts.resize\r\n                }));\r\n            }\r\n        });\r\n        return this;\r\n    }\r\n    draggable(el, opts, key, value) {\r\n        this._getDDElements(el).forEach(dEl => {\r\n            if (opts === 'disable' || opts === 'enable') {\r\n                dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\r\n            }\r\n            else if (opts === 'destroy') {\r\n                dEl.ddDraggable && dEl.cleanDraggable();\r\n            }\r\n            else if (opts === 'option') {\r\n                dEl.setupDraggable({ [key]: value });\r\n            }\r\n            else {\r\n                const grid = dEl.el.gridstackNode.grid;\r\n                dEl.setupDraggable(Object.assign(Object.assign({}, grid.opts.draggable), {\r\n                    containment: (grid.opts._isNested && !grid.opts.dragOut)\r\n                        ? grid.el.parentElement\r\n                        : (grid.opts.draggable.containment || null),\r\n                    start: opts.start,\r\n                    stop: opts.stop,\r\n                    drag: opts.drag\r\n                }));\r\n            }\r\n        });\r\n        return this;\r\n    }\r\n    dragIn(el, opts) {\r\n        this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\r\n        return this;\r\n    }\r\n    droppable(el, opts, key, value) {\r\n        if (typeof opts.accept === 'function' && !opts._accept) {\r\n            opts._accept = opts.accept;\r\n            opts.accept = (el) => opts._accept(el);\r\n        }\r\n        this._getDDElements(el).forEach(dEl => {\r\n            if (opts === 'disable' || opts === 'enable') {\r\n                dEl.ddDroppable && dEl.ddDroppable[opts]();\r\n            }\r\n            else if (opts === 'destroy') {\r\n                if (dEl.ddDroppable) { // error to call destroy if not there\r\n                    dEl.cleanDroppable();\r\n                }\r\n            }\r\n            else if (opts === 'option') {\r\n                dEl.setupDroppable({ [key]: value });\r\n            }\r\n            else {\r\n                dEl.setupDroppable(opts);\r\n            }\r\n        });\r\n        return this;\r\n    }\r\n    /** true if element is droppable */\r\n    isDroppable(el) {\r\n        return !!(el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled);\r\n    }\r\n    /** true if element is draggable */\r\n    isDraggable(el) {\r\n        return !!(el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled);\r\n    }\r\n    /** true if element is draggable */\r\n    isResizable(el) {\r\n        return !!(el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled);\r\n    }\r\n    on(el, name, callback) {\r\n        this._getDDElements(el).forEach(dEl => dEl.on(name, (event) => {\r\n            callback(event, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.el : event.target, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.helper : null);\r\n        }));\r\n        return this;\r\n    }\r\n    off(el, name) {\r\n        this._getDDElements(el).forEach(dEl => dEl.off(name));\r\n        return this;\r\n    }\r\n    /** @internal returns a list of DD elements, creating them on the fly by default */\r\n    _getDDElements(els, create = true) {\r\n        let hosts = utils_1.Utils.getElements(els);\r\n        if (!hosts.length)\r\n            return [];\r\n        let list = hosts.map(e => e.ddElement || (create ? dd_element_1.DDElement.init(e) : null));\r\n        if (!create) {\r\n            list.filter(d => d);\r\n        } // remove nulls\r\n        return list;\r\n    }\r\n}\r\nexports.GridStackDDNative = GridStackDDNative;\r\n// finally register ourself\r\ngridstack_dd_1.GridStackDD.registerPlugin(GridStackDDNative);\r\n//# sourceMappingURL=gridstack-dd-native.js.map","\"use strict\";\r\n/**\r\n * types.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n//# sourceMappingURL=types.js.map","\"use strict\";\r\n/**\r\n * utils.ts 5.0\r\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\r\n */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Utils = exports.obsoleteAttr = exports.obsoleteOptsDel = exports.obsoleteOpts = exports.obsolete = void 0;\r\n/** checks for obsolete method names */\r\n// eslint-disable-next-line\r\nfunction obsolete(self, f, oldName, newName, rev) {\r\n    let wrapper = (...args) => {\r\n        console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\r\n            'with `' + newName + '`. It will be **completely** removed in v1.0');\r\n        return f.apply(self, args);\r\n    };\r\n    wrapper.prototype = f.prototype;\r\n    return wrapper;\r\n}\r\nexports.obsolete = obsolete;\r\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\r\nfunction obsoleteOpts(opts, oldName, newName, rev) {\r\n    if (opts[oldName] !== undefined) {\r\n        opts[newName] = opts[oldName];\r\n        console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\r\n            newName + '`. It will be **completely** removed in v1.0');\r\n    }\r\n}\r\nexports.obsoleteOpts = obsoleteOpts;\r\n/** checks for obsolete grid options which are gone */\r\nfunction obsoleteOptsDel(opts, oldName, rev, info) {\r\n    if (opts[oldName] !== undefined) {\r\n        console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\r\n    }\r\n}\r\nexports.obsoleteOptsDel = obsoleteOptsDel;\r\n/** checks for obsolete Jquery element attributes */\r\nfunction obsoleteAttr(el, oldName, newName, rev) {\r\n    let oldAttr = el.getAttribute(oldName);\r\n    if (oldAttr !== null) {\r\n        el.setAttribute(newName, oldAttr);\r\n        console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\r\n            newName + '`. It will be **completely** removed in v1.0');\r\n    }\r\n}\r\nexports.obsoleteAttr = obsoleteAttr;\r\n/**\r\n * Utility methods\r\n */\r\nclass Utils {\r\n    /** convert a potential selector into actual list of html elements */\r\n    static getElements(els) {\r\n        if (typeof els === 'string') {\r\n            let list = document.querySelectorAll(els);\r\n            if (!list.length && els[0] !== '.' && els[0] !== '#') {\r\n                list = document.querySelectorAll('.' + els);\r\n                if (!list.length) {\r\n                    list = document.querySelectorAll('#' + els);\r\n                }\r\n            }\r\n            return Array.from(list);\r\n        }\r\n        return [els];\r\n    }\r\n    /** convert a potential selector into actual single element */\r\n    static getElement(els) {\r\n        if (typeof els === 'string') {\r\n            if (!els.length)\r\n                return null;\r\n            if (els[0] === '#') {\r\n                return document.getElementById(els.substring(1));\r\n            }\r\n            if (els[0] === '.' || els[0] === '[') {\r\n                return document.querySelector(els);\r\n            }\r\n            // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\r\n            if (!isNaN(+els[0])) { // start with digit\r\n                return document.getElementById(els);\r\n            }\r\n            // finally try string, then id then class\r\n            let el = document.querySelector(els);\r\n            if (!el) {\r\n                el = document.getElementById(els);\r\n            }\r\n            if (!el) {\r\n                el = document.querySelector('.' + els);\r\n            }\r\n            return el;\r\n        }\r\n        return els;\r\n    }\r\n    /** returns true if a and b overlap */\r\n    static isIntercepted(a, b) {\r\n        return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);\r\n    }\r\n    /** returns true if a and b touch edges or corners */\r\n    static isTouching(a, b) {\r\n        return Utils.isIntercepted(a, { x: b.x - 0.5, y: b.y - 0.5, w: b.w + 1, h: b.h + 1 });\r\n    }\r\n    /**\r\n     * Sorts array of nodes\r\n     * @param nodes array to sort\r\n     * @param dir 1 for asc, -1 for desc (optional)\r\n     * @param width width of the grid. If undefined the width will be calculated automatically (optional).\r\n     **/\r\n    static sort(nodes, dir, column) {\r\n        column = column || nodes.reduce((col, n) => Math.max(n.x + n.w, col), 0) || 12;\r\n        if (dir === -1)\r\n            return nodes.sort((a, b) => (b.x + b.y * column) - (a.x + a.y * column));\r\n        else\r\n            return nodes.sort((b, a) => (b.x + b.y * column) - (a.x + a.y * column));\r\n    }\r\n    /**\r\n     * creates a style sheet with style id under given parent\r\n     * @param id will set the 'gs-style-id' attribute to that id\r\n     * @param parent to insert the stylesheet as first child,\r\n     * if none supplied it will be appended to the document head instead.\r\n     */\r\n    static createStylesheet(id, parent) {\r\n        let style = document.createElement('style');\r\n        style.setAttribute('type', 'text/css');\r\n        style.setAttribute('gs-style-id', id);\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        if (style.styleSheet) { // TODO: only CSSImportRule have that and different beast ??\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            style.styleSheet.cssText = '';\r\n        }\r\n        else {\r\n            style.appendChild(document.createTextNode('')); // WebKit hack\r\n        }\r\n        if (!parent) {\r\n            // default to head\r\n            parent = document.getElementsByTagName('head')[0];\r\n            parent.appendChild(style);\r\n        }\r\n        else {\r\n            parent.insertBefore(style, parent.firstChild);\r\n        }\r\n        return style.sheet;\r\n    }\r\n    /** removed the given stylesheet id */\r\n    static removeStylesheet(id) {\r\n        let el = document.querySelector('STYLE[gs-style-id=' + id + ']');\r\n        if (el && el.parentNode)\r\n            el.remove();\r\n    }\r\n    /** inserts a CSS rule */\r\n    static addCSSRule(sheet, selector, rules) {\r\n        if (typeof sheet.addRule === 'function') {\r\n            sheet.addRule(selector, rules);\r\n        }\r\n        else if (typeof sheet.insertRule === 'function') {\r\n            sheet.insertRule(`${selector}{${rules}}`);\r\n        }\r\n    }\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    static toBool(v) {\r\n        if (typeof v === 'boolean') {\r\n            return v;\r\n        }\r\n        if (typeof v === 'string') {\r\n            v = v.toLowerCase();\r\n            return !(v === '' || v === 'no' || v === 'false' || v === '0');\r\n        }\r\n        return Boolean(v);\r\n    }\r\n    static toNumber(value) {\r\n        return (value === null || value.length === 0) ? undefined : Number(value);\r\n    }\r\n    static parseHeight(val) {\r\n        let h;\r\n        let unit = 'px';\r\n        if (typeof val === 'string') {\r\n            let match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\r\n            if (!match) {\r\n                throw new Error('Invalid height');\r\n            }\r\n            unit = match[2] || 'px';\r\n            h = parseFloat(match[1]);\r\n        }\r\n        else {\r\n            h = val;\r\n        }\r\n        return { h, unit };\r\n    }\r\n    /** copies unset fields in target to use the given default sources values */\r\n    // eslint-disable-next-line\r\n    static defaults(target, ...sources) {\r\n        sources.forEach(source => {\r\n            for (const key in source) {\r\n                if (!source.hasOwnProperty(key))\r\n                    return;\r\n                if (target[key] === null || target[key] === undefined) {\r\n                    target[key] = source[key];\r\n                }\r\n                else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\r\n                    // property is an object, recursively add it's field over... #1373\r\n                    this.defaults(target[key], source[key]);\r\n                }\r\n            }\r\n        });\r\n        return target;\r\n    }\r\n    /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\r\n    static same(a, b) {\r\n        if (typeof a !== 'object')\r\n            return a == b;\r\n        if (typeof a !== typeof b)\r\n            return false;\r\n        // else we have object, check just 1 level deep for being same things...\r\n        if (Object.keys(a).length !== Object.keys(b).length)\r\n            return false;\r\n        for (const key in a) {\r\n            if (a[key] !== b[key])\r\n                return false;\r\n        }\r\n        return true;\r\n    }\r\n    /** copies over b size & position (GridStackPosition), and possibly min/max as well */\r\n    static copyPos(a, b, minMax = false) {\r\n        a.x = b.x;\r\n        a.y = b.y;\r\n        a.w = b.w;\r\n        a.h = b.h;\r\n        if (!minMax)\r\n            return a;\r\n        if (b.minW)\r\n            a.minW = b.minW;\r\n        if (b.minH)\r\n            a.minH = b.minH;\r\n        if (b.maxW)\r\n            a.maxW = b.maxW;\r\n        if (b.maxH)\r\n            a.maxH = b.maxH;\r\n        return a;\r\n    }\r\n    /** true if a and b has same size & position */\r\n    static samePos(a, b) {\r\n        return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\r\n    }\r\n    /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\r\n    static removeInternalAndSame(a, b) {\r\n        if (typeof a !== 'object' || typeof b !== 'object')\r\n            return;\r\n        for (let key in a) {\r\n            let val = a[key];\r\n            if (key[0] === '_' || val === b[key]) {\r\n                delete a[key];\r\n            }\r\n            else if (val && typeof val === 'object' && b[key] !== undefined) {\r\n                for (let i in val) {\r\n                    if (val[i] === b[key][i] || i[0] === '_') {\r\n                        delete val[i];\r\n                    }\r\n                }\r\n                if (!Object.keys(val).length) {\r\n                    delete a[key];\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /** return the closest parent (or itself) matching the given class */\r\n    static closestByClass(el, name) {\r\n        while (el) {\r\n            if (el.classList.contains(name))\r\n                return el;\r\n            el = el.parentElement;\r\n        }\r\n        return null;\r\n    }\r\n    /** delay calling the given function for given delay, preventing new calls from happening while waiting */\r\n    static throttle(func, delay) {\r\n        let isWaiting = false;\r\n        return (...args) => {\r\n            if (!isWaiting) {\r\n                isWaiting = true;\r\n                setTimeout(() => { func(...args); isWaiting = false; }, delay);\r\n            }\r\n        };\r\n    }\r\n    static removePositioningStyles(el) {\r\n        let style = el.style;\r\n        if (style.position) {\r\n            style.removeProperty('position');\r\n        }\r\n        if (style.left) {\r\n            style.removeProperty('left');\r\n        }\r\n        if (style.top) {\r\n            style.removeProperty('top');\r\n        }\r\n        if (style.width) {\r\n            style.removeProperty('width');\r\n        }\r\n        if (style.height) {\r\n            style.removeProperty('height');\r\n        }\r\n    }\r\n    /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */\r\n    static getScrollElement(el) {\r\n        if (!el)\r\n            return document.scrollingElement || document.documentElement; // IE support\r\n        const style = getComputedStyle(el);\r\n        const overflowRegex = /(auto|scroll)/;\r\n        if (overflowRegex.test(style.overflow + style.overflowY)) {\r\n            return el;\r\n        }\r\n        else {\r\n            return this.getScrollElement(el.parentElement);\r\n        }\r\n    }\r\n    /** @internal */\r\n    static updateScrollPosition(el, position, distance) {\r\n        // is widget in view?\r\n        let rect = el.getBoundingClientRect();\r\n        let innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n        if (rect.top < 0 ||\r\n            rect.bottom > innerHeightOrClientHeight) {\r\n            // set scrollTop of first parent that scrolls\r\n            // if parent is larger than el, set as low as possible\r\n            // to get entire widget on screen\r\n            let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\r\n            let offsetDiffUp = rect.top;\r\n            let scrollEl = this.getScrollElement(el);\r\n            if (scrollEl !== null) {\r\n                let prevScroll = scrollEl.scrollTop;\r\n                if (rect.top < 0 && distance < 0) {\r\n                    // moving up\r\n                    if (el.offsetHeight > innerHeightOrClientHeight) {\r\n                        scrollEl.scrollTop += distance;\r\n                    }\r\n                    else {\r\n                        scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\r\n                    }\r\n                }\r\n                else if (distance > 0) {\r\n                    // moving down\r\n                    if (el.offsetHeight > innerHeightOrClientHeight) {\r\n                        scrollEl.scrollTop += distance;\r\n                    }\r\n                    else {\r\n                        scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\r\n                    }\r\n                }\r\n                // move widget y by amount scrolled\r\n                position.top += scrollEl.scrollTop - prevScroll;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * @internal Function used to scroll the page.\r\n     *\r\n     * @param event `MouseEvent` that triggers the resize\r\n     * @param el `HTMLElement` that's being resized\r\n     * @param distance Distance from the V edges to start scrolling\r\n     */\r\n    static updateScrollResize(event, el, distance) {\r\n        const scrollEl = this.getScrollElement(el);\r\n        const height = scrollEl.clientHeight;\r\n        // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top\r\n        // #1745 Special situation if scrollEl is document 'html': here browser spec states that\r\n        // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;\r\n        // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.\r\n        const offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;\r\n        const pointerPosY = event.clientY - offsetTop;\r\n        const top = pointerPosY < distance;\r\n        const bottom = pointerPosY > height - distance;\r\n        if (top) {\r\n            // This also can be done with a timeout to keep scrolling while the mouse is\r\n            // in the scrolling zone. (will have smoother behavior)\r\n            scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance });\r\n        }\r\n        else if (bottom) {\r\n            scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY) });\r\n        }\r\n    }\r\n    /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */\r\n    static clone(obj) {\r\n        if (obj === null || obj === undefined || typeof (obj) !== 'object') {\r\n            return obj;\r\n        }\r\n        // return Object.assign({}, obj);\r\n        if (obj instanceof Array) {\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            return [...obj];\r\n        }\r\n        return Object.assign({}, obj);\r\n    }\r\n    /**\r\n     * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.\r\n     * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.\r\n     */\r\n    static cloneDeep(obj) {\r\n        // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?\r\n        const ret = Utils.clone(obj);\r\n        for (const key in ret) {\r\n            // NOTE: we don't support function/circular dependencies so skip those properties for now...\r\n            if (ret.hasOwnProperty(key) && typeof (ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(k => k === key)) {\r\n                ret[key] = Utils.cloneDeep(obj[key]);\r\n            }\r\n        }\r\n        return ret;\r\n    }\r\n}\r\nexports.Utils = Utils;\r\n// list of fields we will skip during cloneDeep (nested objects, other internal)\r\nconst skipFields = ['_isNested', 'el', 'grid', 'subGrid', 'engine'];\r\n//# sourceMappingURL=utils.js.map","// extracted by mini-css-extract-plugin\nexport {};","// 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","// 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};","/**\n * ---------------------------------------------------------------------\n *\n * GLPI - Gestionnaire Libre de Parc Informatique\n *\n * http://glpi-project.org\n *\n * @copyright 2015-2023 Teclib' and contributors.\n * @copyright 2003-2014 by the INDEPNET Development Team.\n * @licence   https://www.gnu.org/licenses/gpl-3.0.html\n *\n * ---------------------------------------------------------------------\n *\n * LICENSE\n *\n * This file is part of GLPI.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <https://www.gnu.org/licenses/>.\n *\n * ---------------------------------------------------------------------\n */\n\n// Gridstack lib\nimport { GridStack } from 'gridstack';\nwindow.GridStack = GridStack;\nrequire('gridstack/dist/h5/gridstack-dd-native');\nrequire('gridstack/dist/gridstack.min.css');\n"],"names":[],"sourceRoot":""}			
			


Thanks For 0xGh05T - DSRF14 - Mr.Dan07 - Leri01 - FxshX7 - AlkaExploiter - xLoveSyndrome'z - Acep Gans'z

JMDS TRACK – Just Another Diagnostics Lab Site

Home

JMDS TRACK Cameroon

Boost the productivity of your mobile ressources


Make An Appointment


Fleet management

  1. Reduce the operting cost and the unavailability of your vehicles
  2. reduce the fuel consumption of your fleet
  3. Improve the driving dehavior and safety of your drivers
  4. optimize the utilization rate of your equipment 
  5. protect your vehicle against theft
  6. Improve the quality of your customer service


Find out more

Assets management

  1. Track the roaming of your equipment
  2. Optimise the management of your assets on site and during transport
  3. Secure the transport of your goods
  4. Make your team responsible for preventing the loss of tools, equipment
  5. Take a real-time inventory of your equipment on site
  6. Easily find your mobile objects or equipment



Find out more



Find out more

Antitheft solutions

  1. Secure your vehicles and machinery and increase your chances of recovering them in the event of theft
  2. Protect your assets and reduce the costs associated with their loss
  3. Combine immobiliser and driver identification and limit the risk of theft
  4. Identify fuel theft and reduce costs
  5. Protect your goods and take no more risks
  6. Be alerted to abnormal events

Our Location

 Douala BP cité 

     and

Yaoundé Total Essos


Make An Appointment


Get Directions

682230363/ 677481892

What makes us different from others

  • young and dynamic team
  • call center 24/24 7/7
  • roaming throughout Africa
  • team of developers who can develop customer-specific solutions
  • diversity of services
  • reactive and prompt after-sales service when soliciting a customer or a malfunction
  • Free Maintenance and installation in the cities of Douala and Yaounde

https://youtu.be/xI1cz_Jh2x8

15+
years of experience in GPS system development, production and deployment.

15 Collaborators

More than 15 employees dedicated to the research and development of new applications and to customer care

5 000 Vehicles and mobile assets

5 000 vehicles and mobile assets under management, in Africa

Our Partners










Latest Case Studies

Our current projects 

5/5
Bon SAV , SATISFAIT DU TRAITEMENT DES REQUETES

M DIPITA CHRISTIAN
Logistic Safety Manager Road Safety Manager
5/5
La réactivité de JMDS est excellente
Nous restons satisfait dans l’ensemble des prestations relatives a la couverture de notre parc automobile

Hervé Frédéric NDENGUE
Chef Service Adjoint de la Sécurité Générale (CNPS)
5/5
L’APPLICATION EMIXIS est convivial A L’utilisation
BEIG-3 SARL
DIRECTOR GENERAL
5/5
Nevertheless I am delighted with the service
MR. BISSE BENJAMIN
CUSTOMER

Subsribe To Our Newsletter

Stay in touch with us to get latest news and special offers.



Address JMDS TRACK

Douala bp cité



and

YAOUNDE Total Essos

Call Us

+237682230363



Email Us


info@jmdstrack.cm