@hpcc-js/dgrid-shim 2.26.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;;;uCCVA,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,iDAAoB;AACrB,CAAC,+CAAgB;AACjB,CAAC,wCAAS;AACV,CAAC,yCAAU;AACX,CAAC,uCAAQ;AACT,CAAC,4CAAa;AACd,CAAC,iDAAkB;AACnB,CAAC,mCAAE;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,uCAAuC;AACvC;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;;AAEA,qCAAqC,SAAS;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC,OAAO;AAC1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,aAAa;AACvD;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,gDAAgD;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,4DAA4D;;AAE5D;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrkBF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,4CAAa;AACd,CAAC,+CAAgB;AACjB,CAAC,wCAAS;AACV,CAAC,gDAAiB;AAClB,CAAC,yCAAU;AACX,CAAC,4CAAa;AACd,CAAC,iDAAkB;AACnB,CAAC,mCAAE;;AAEH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;AACA,qCAAqC;AACrC;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,yBAAyB;AACvD;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC,KAAK;AACL;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA,oBAAoB,mFAAmF;AACvG;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,6DAA6D;AAClF;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C,eAAe;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,YAAY;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC;AAChC,6DAA6D;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCroBF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,+CAAgB;AACjB,CAAC,iDAAoB;AACrB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,2CAAY;AACb,CAAC,4CAAa;AACd,CAAC,mCAAE;AACH;AACA;AACA;AACA;AACA;AACA,KAAK,KAAY,EAAE,EAEjB;AACF;;AAEA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC;AACrC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D,IAAI;AACJ;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA,GAAG;;AAEH;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B,yCAAyC,IAAI;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,UAAU;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,2CAA2C;;AAEjD;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA,kBAAkB;AAClB;AACA,EAAE;;AAEF;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCp2BF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,uCAAQ;AACT,CAAC,+CAAgB;AACjB,CAAC,mCAAE;AACH,0CAA0C;AAC1C,CAAC;AAAA,kGAAC;;;;;;;;;;uCCNF,iGAAO;AACP,CAAC,uCAAQ;AACT,CAAC,8CAAe;AAChB,CAAC,mDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,iDAAoB;AACrB,CAAC,wCAAS;AACV,CAAC,0CAAW;AACZ,CAAC,2CAAY;AACb,CAAC,4CAAa;AACd,CAAC,mCAAE;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA,cAAc;AACd,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;;AAEA;AACA,0BAA0B,sCAAsC;AAChE;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,OAAO;AACP,MAAM;;AAEN;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,iCAAiC,IAAI;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC95BF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,4CAAa;AACd,CAAC,+CAAgB;AACjB,CAAC,2CAAY;AACb,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,wEAA6B;AAC9B,CAAC,2CAAY;AACb,CAAC,yCAAU;AACX,CAAC,mCAAE;;AAEH;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,MAAY,GAAG,CAAa;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,OAAO,KAA4D,EAAE,EAejE;AACJ;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA,iCAAiC,IAAI;AACrC;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,uDAAuD;AACvD;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,IAAI;AACJ;AACA,kBAAkB;AAClB;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCtsBF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,8CAAe;AAChB,CAAC,4CAAa;AACd,CAAC,iDAAoB;AACrB,CAAC,yCAAU;AACX,CAAC,wCAAS;AACV,CAAC,0CAAW;AACZ,CAAC,mCAAE;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC;AACjC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,kBAAkB;AAClB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kEAAkE;AAClE;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,GAAG;;AAEH;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,0BAA0B,kBAAkB;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,iCAAiC;AACjC;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,6CAA6C;AAC7C;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCClpBF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,iDAAkB;AACnB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,gDAAiB;AAClB,CAAC,yCAAU;AACX,CAAC,iDAAoB;AACrB,CAAC,kDAAmB;AACpB,CAAC,yCAAU;AACX,CAAC,6CAAc;AACf,CAAC,gDAAiB;AAClB,CAAC,mCAAE;;AAEH;AACA;AACA;AACA,kBAAkB,UAAU;AAC5B;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA,2BAA2B,aAAa;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,8CAA8C,mCAAmC;AACjF,mDAAmD,iCAAiC;AACpF,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,sDAAsD;AACtD;;AAEA;AACA;;AAEA;;AAEA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sDAAsD,4CAA4C;AAClG;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAY,GAAG,CAAkC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,MAAY,GAAG,CAAY;AAChD;AACA;AACA,OAAO;AACP;AACA;AACA,kBAAkB,MAAY,GAAG,CAAW;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mDAAmD;;AAEnD;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC7eF,iGAAO;AACP,CAAC,gDAAiB;AAClB,CAAC,mDAAoB;AACrB,CAAC,2CAAY;AACb,CAAC,2CAAY;AACb,CAAC,6CAAc;AACf,CAAC,mCAAE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,uBAAuB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD;;AAEA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,IAAI;AAChC;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrRF,iGAAO;AACP,CAAC,+CAAgB;AACjB,CAAC,mDAAoB;AACrB,CAAC,iDAAkB;AACnB,CAAC,gDAAiB;AAClB,CAAC,iDAAoB;AACrB,CAAC,+CAAgB;AACjB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,4CAAa;AACd,CAAC,yCAAU;AACX,CAAC,0CAAW;AACZ,CAAC,0CAAW;AACZ,CAAC,6CAAc;AACf,CAAC,2DAA4B;AAC7B,CAAC,iDAAkB;AACnB,CAAC,mCAAE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,+BAA+B;AACjE;AACA,kCAAkC,2BAA2B;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAiC,+BAA+B;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,IAAI;AACJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kDAAkD;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,qBAAqB,MAAM;;AAE3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;AAEN;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC/mBF;AACA;AACA;AACA;AACA,mBAAQ,CAAC,SAAS,YAAY,OAAO,IAAI,KAAK,KAAK,OAAO,2YAA2Y,uJAAuJ;;;;;;;;;;uCCJ5lB,iGAAO;AACP,CAAC,yCAAU;AACX,CAAC,mCAAE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,gBAAgB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD;AACA;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,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1MF,iGAAO;AACP,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,mCAAE;AACH;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;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;uCC5IF,iGAAO;AACP,CAAC,gCAAS;AACV,CAAC,sCAAQ;AACT,CAAC,kDAAmB;AACpB,CAAC,iDAAoB;AACrB,CAAC,+CAAgB;AACjB,CAAC,gDAAiB;AAClB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF;;AAErF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qCAAqC,WAAW,SAAS;AACzD,sBAAsB,4BAA4B;AAClD;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;;;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCnHF,iGAAO;AACP,CAAC,iDAAkB;AACnB,CAAC,4CAAa;AACd,CAAC,mDAAoB;AACrB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;;AAEJ,sBAAsB;AACtB;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCClFF,iGAAO;AACP,CAAC,iDAAkB;AACnB,CAAC,mDAAoB;AACrB,CAAC,8CAAe;AAChB,CAAC,yCAAU;AACX,CAAC,+CAAgB;AACjB,CAAC,kDAAmB;AACpB,CAAC,+CAAgB;AACjB,CAAC,gDAAiB;AAClB,CAAC,2CAAY;AACb,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,gDAAiB;AAClB,CAAC,wCAAS;AACV,CAAC,0CAAW;AACZ,CAAC,iDAAmB;AACpB,CAAC,kDAAoB;AACrB,CAAC,mEAAoC;AACrC,CAAC,sCAAQ;AACT,CAAC,mCAAE;AACH;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,6BAA6B,iFAAiF;AAC9G,+BAA+B,iFAAiF;AAChH,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,sDAAsD;AACtD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qDAAqD;;AAErD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC;;AAEtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,2CAA2C,SAAS;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,kCAAkC;AAClC;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kDAAkD,8BAA8B;AAChF,IAAI;;AAEJ;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,qDAAqD;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,mDAAmD;AAC/D,IAAI;AACJ;;AAEA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,kBAAkB;AAC9D,IAAI;;AAEJ;AACA;AACA,mBAAmB,0CAA0C;;AAE7D;AACA;AACA;AACA;AACA;AACA,2BAA2B,2CAA2C;AACtE,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,6BAA6B;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C,6BAA6B;AAC3E;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC;;AAEhC,kCAAkC;AAClC,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA,mCAAmC;AACnC,GAAG;;AAEH;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;;AAEA;AACA,gCAAgC;AAChC;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,4CAA4C,kBAAkB;AAC9D,IAAI;;AAEJ;AACA;AACA,EAAE;;AAEF,0CAA0C;AAC1C,oCAAoC;AACpC,oCAAoC;;AAEpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCjmBF,iGAAO;AACP,CAAC,6CAAc;AACf,CAAC,wCAAS;AACV,CAAC,8CAAe;AAChB,CAAC,2CAAY;AACb,CAAC,4CAAa;AACd,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCtFF,iGAAO;AACP,CAAC,gCAAS;AACV,CAAC,iDAAkB;AACnB,CAAC,mDAAoB;AACrB,CAAC,mDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,2CAAY;AACb,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,8CAAe;AAChB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;;AAGH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,+BAA+B;AAC/B,GAAG;;AAEH;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6EAA6E,2BAA2B;AACxG;AACA;AACA,KAAK;AACL,2BAA2B;AAC3B;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA,uDAAuD,kBAAkB;AACzE;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,EAAE;AACF;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC7OF,iGAAO,EAAE,mCAAE;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCChJF,iGAAO;AACP,CAAC,wCAAS;AACV,CAAC,8CAAe;AAChB,CAAC,mDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCjEF,iGAAO;AACP,CAAC,wCAAS;AACV,CAAC,iDAAkB;AACnB,CAAC,0CAAW;AACZ,CAAC,mDAAoB;AACrB,CAAC,yCAAU;AACX,CAAC,4CAAa;AACd,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,KAAK;AACtD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;;AAEF,4BAA4B;;AAE5B;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC9BF,iGAAO;AACP,CAAC,2CAAY;AACb,CAAC,mDAAoB;AACrB,CAAC,iDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,4CAAa;AACd,CAAC,+CAAgB;AACjB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,KAAK;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,qCAAqC,+CAA+C;AACpF,uBAAuB;;AAEvB;AACA,gEAAgE;AAChE;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA,mBAAmB,IAAI,+CAA+C,IAAI;;AAE1E;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,eAAe;AACf,eAAe;AACf,kBAAkB;AAClB,iBAAiB;AACjB,KAAK;AACL,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD,eAAe;AACpE;;AAEA;AACA;AACA,8CAA8C,KAAK;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF,2BAA2B;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,gBAAgB;AAC9B;AACA;;AAEA;;AAEA,kDAAkD,KAAK,KAAK;AAC5D;AACA,0CAA0C;AAC1C,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC5MF,iGAAO;AACP,CAAC,4CAAa;AACd,CAAC,kDAAmB;AACpB,CAAC,mDAAoB;AACrB,CAAC,mDAAoB;AACrB,CAAC,yCAAU;AACX,CAAC,kDAAmB;AACpB,CAAC,gDAAiB;AAClB,CAAC,2CAAY;AACb,CAAC,2CAAY;AACb,CAAC,2CAAY;AACb,CAAC,8CAAe;AAChB,CAAC,qDAAsB;AACvB,CAAC,8CAAe;AAChB,CAAC,2CAAY,kDAAkD;AAC/D,CAAC,uCAAS;AACV,CAAC,mCAAE;AACH;;;AAGA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6CAA6C;AAC7C;AACA,GAAG,MAAM;AACT;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA,iGAAiG;AACjG,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB;AAChB;AACA,CAAC;;AAED;AACA,GAAG,KAA4B,CAAC,EAK/B;AACD;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC/VF,iGAAO;AACP,CAAC,gCAAS;AACV,CAAC,iDAAkB;AACnB,CAAC,4CAAa;AACd,CAAC,kDAAmB;AACpB,CAAC,mDAAoB;AACrB,CAAC,mDAAoB;AACrB,CAAC,yCAAU;AACX,CAAC,8CAAe;AAChB,CAAC,+CAAgB;AACjB,CAAC,iDAAoB;AACrB,CAAC,kDAAmB;AACpB,CAAC,+CAAgB;AACjB,CAAC,yCAAU;AACX,CAAC,kDAAmB;AACpB,CAAC,gDAAiB;AAClB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,8CAAe;AAChB,CAAC,2CAAY;AACb,CAAC,kDAAmB;AACpB,CAAC,8CAAe;AAChB,CAAC,gFAAiC;AAClC,CAAC,2CAAY;AACb,CAAC,mCAAE;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA,IAAI,KAA4B,CAAC,EAK/B;;AAEF;AACA,SAAS,QAAQ,+BAA+B,YAAY;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,gCAAgC;;AAEnD;AACA,0CAA0C,MAAM;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iCAAiC;AACtD;AACA,0BAA0B;AAC1B;AACA,iBAAiB;AACjB,kBAAkB;;AAElB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kDAAkD,oBAAoB;AACtE;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,iCAAiC;AACjC,KAAK;AACL;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,8DAA8D;AAC9D,4CAA4C;;AAE5C;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA,iDAAiD;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,uFAAuF,KAAK;AAC5F;AACA;AACA;AACA,+FAA+F,KAAK;AACpG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8EAA8E;AAC9E,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA,kEAAkE;AAClE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,qEAAqE;AACrE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,eAAe;AACjD;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA,kCAAkC;AAClC;AACA;AACA,kCAAkC,eAAe;AACjD;AACA;AACA;AACA,0BAA0B,+BAA+B;;AAEzD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCzsCF,iGAAO;AACP,CAAC,iDAAkB;AACnB,CAAC,kDAAmB;AACpB,CAAC,gDAAiB;AAClB,CAAC,4CAAa;AACd,CAAC,uCAAS;AACV,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA,yBAAyB;AACzB,eAAe;AACf,CAAC;AAAA,kGAAC;;;;;;;;;;;uCClCF,iGAAO;AACP,CAAC,iDAAkB;AACnB,CAAC,yCAAU;AACX,CAAC,8CAAe;AAChB,CAAC,+CAAgB;AACjB,CAAC,gDAAiB;AAClB,CAAC,2CAAY;AACb,CAAC,sCAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,0CAA0C;AAC1C,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY;AACZ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC9LF,iGAAO;AACP,CAAC,0CAAW;AACZ,CAAC,2CAAY;AACb,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,MAAM;AAClC,wBAAwB;AACxB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;;AAEF;AACA;AACA,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B;;AAE1B;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1IF,iGAAO;AACP,CAAC,4CAAa;AACd,CAAC,mDAAoB;AACrB,CAAC,yCAAU;AACX,CAAC,8CAAe;AAChB,CAAC,+CAAgB;AACjB,CAAC,iDAAoB;AACrB,CAAC,6CAAc;AACf,CAAC,gDAAiB;AAClB,CAAC,wCAAS;AACV,CAAC,8CAAe;AAChB,CAAC,2CAAY;AACb,CAAC,8CAAe;AAChB,CAAC,kDAAmB;AACpB,CAAC,4CAAa;AACd,CAAC,uCAAQ;AACT,CAAC,2CAAY;AACb,CAAC,sCAAQ;AACT,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,2DAA2D,KAAK;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C;;AAE/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA,8CAA8C;;AAE9C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ,4CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU;;AAEd;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6BAA6B;AAC7B;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,uBAAuB,sCAAsC;AAC7D;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,SAAS,eAAe,SAAS;AACjC;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;;AAEF;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCClXF,iGAAO,CAAC,+CAAgB,EAAE,2CAAY,EAAE,8CAAe,EAAE,kDAAmB,CAAC,mCAAE;;AAE/E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK,KAAmB,CAAC,EAEtB;AACH,EAAE;;AAEF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCpBF,iGAAO;AACP,CAAC,kDAAmB;AACpB,CAAC,mCAAE;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCfF,iGAAO;AACP,CAAC,iDAAkB;AACnB,CAAC,kDAAmB;AACpB,CAAC,+CAAgB;AACjB,CAAC,kDAAmB;AACpB,CAAC,kDAAmB;AACpB,CAAC,2CAAY;AACb,CAAC,sCAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B,UAAU,6BAA6B;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2DAA2D,KAAK;;AAEhE;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;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA,+CAA+C;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;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iGAAiG,gBAAgB;AACjH;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA,mHAAmH,qEAAqE,mCAAmC,2DAA2D;;AAEtR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,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,gEAAgE,iCAAiC;AACjG;AACA;AACA;AACA,IAAI;;AAEJ,qDAAqD,oBAAoB;AACzE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCtZF,iGAAO;AACP,CAAC,iDAAkB;AACnB,CAAC,kDAAmB;AACpB,CAAC,sCAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;;AAEA,wBAAwB;;AAExB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,iDAAiD;AACjD,GAAG;;AAEH;AACA;AACA;AACA,+CAA+C;AAC/C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,mBAAmB;;AAEvE;AACA;AACA;AACA;AACA,cAAc;AACd,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,0EAA0E;AAC1E,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,oCAAoC,MAAM;AAC1C;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC9JF,iGAAO,CAAC,mDAAoB,CAAC,mCAAE;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;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;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC5FF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,gDAAiB;AAClB,CAAC,iDAAkB;AACnB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,8CAAe;AAChB,CAAC,+CAAgB;AACjB,CAAC,mCAAE;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc,gBAAgB;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,8BAA8B,OAAO;AACrC;AACA;AACA;;AAEA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,OAAO;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC5PF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,8CAAe;AAChB,CAAC,+CAAgB;AACjB,CAAC,0CAAW;AACZ,CAAC,mCAAE;AACH;AACA;AACA;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,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCnCF,iGAAO,EAAE,mCAAE;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCnEF,iGAAO,CAAC,gDAAiB,EAAE,0CAAW,CAAC,mCAAE;AACzC;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrCF,iGAAO;AACP,CAAC,mDAAoB;AACrB,CAAC,iDAAkB;AACnB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,SAAS;AACT,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM;AACN;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,wBAAwB;AAC9C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCxOF,iGAAO;AACP,CAAC,gDAAiB;AAClB,CAAC,iDAAkB;AACnB,CAAC,4CAAa;AACd,CAAC,yCAAU;AACX,CAAC,0CAAW;AACZ,CAAC,mDAAoB;AACrB,CAAC,8CAAe;AAChB,CAAC,yCAAU;AACX,CAAC,6CAAc;AACf,CAAC,mCAAE;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB;AAC/C;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC,MAAM;AACN;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,0BAA0B,gCAAgC;AAC1D;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,OAAO;AAChD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP,kBAAkB,4CAA4C;AAC9D;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;uCCfA,iGAAO,CAAC,0CAAW,EAAE,8FAAuG;AAC5H,CAAC,6HAAsI;AACvI,CAAC,mCAAE;AACH,4DAA4D,mBAAmB;AAC/E,CAAC;AAAA,kGAAC;;;;;;;;;;uCCJF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAO,EAAE,mCAAE;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,GAAG,aAAa;AACnB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;ACpCF;;;;;;;;;;uCCAA,iGAAO;AACP,CAAC,sCAAO;AACR,CAAC,6CAAc;AACf,CAAC,qDAAsB;AACvB,CAAC,kDAAmB;AACpB,CAAC,0DAAgE;AACjE,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,oBAAoB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC/TF,iGAAO,CAAC,yCAAU,EAAE,qCAAM,CAAC,mCAAE;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,IAAI;AACjE;AACA;AACA;AACA,UAAU;AACV;AACA,+BAA+B,uBAAuB;AACtD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCnCF,iGAAO,CAAC,+CAAgB,EAAE,wCAAS,EAAE,8CAAe,EAAE,6CAAc,EAAE,4CAAa,EAAE,8CAAiB,EAAE,+CAAgB,EAAE,2CAAY,EAAE,4CAAa,CAAC,mCAAE;;AAExJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;;AAGH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC;AACzC,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,WAAW;AACX,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,WAAW;AACX,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,IAAI;AAC9C;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,qCAAqC,GAAG;AAC/E,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,4BAA4B;AAC5B,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,kCAAkC;AAClC;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,yEAAyE;AACzE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,0BAA0B,GAAG,cAAc,KAAK;AAChD;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4DAA4D,KAAK;AACjE;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC9hBF,iGAAO,CAAC,gDAAiB,EAAE,6CAAc,EAAE,8CAAe,EAAE,uCAAQ,CAAC,mCAAE;AACvE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,OAAO;;AAEP;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;AACA,eAAe;AACf,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA,QAAQ;;AAER,oDAAoD;AACpD,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,SAAS;AACT,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,eAAe;AACf,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,OAAO;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA,CAAC;;AAED,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCzNF,iGAAO,CAAC,yCAAU,EAAE,uCAAQ,EAAE,wCAAS,EAAE,yCAAU,CAAC,mCAAE;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,6BAA6B;AAC7B,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,QAAQ;AACR,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS,SAAS,SAAS;AAC5C,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,gCAAgC;AAChC,SAAS;AACT;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,mCAAmC;AACnC;AACA,gBAAgB;AAChB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,SAAS;AACT;AACA,2BAA2B;AAC3B,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ,8BAA8B;AAC9B,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,SAAS;AACT;AACA,4EAA4E;AAC5E,GAAG;AACH;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,kDAAkD;AAClD,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA,kBAAkB;AAClB,uBAAuB;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F;AAC7F;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCpOF,iGAAO;AACP,CAAC,yCAAU;AACX,CAAC,4CAAa;AACd,CAAC,mDAAoB;AACrB,CAAC,sDAAuB;AACxB,CAAC,uCAAQ;AACT,CAAC,uCAAQ;AACT,CAAC,wCAAS;AACV,CAAC,mCAAE;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;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,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,8BAA8B,mBAAmB,cAAc,IAAI;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;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,UAAU;AACV;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,WAAW;AACX;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,gEAAgE;AAChE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,GAAG;AACH;AACA,EAAE;;AAEF;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC9XF,iGAAO,CAAC,yCAAU,EAAE,yCAAU,EAAE,wCAAS,EAAE,uCAAQ,EAAE,gDAAiB,CAAC,mCAAE;AACzE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,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,SAAS;AACT;AACA;AACA;;AAEA,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mBAAmB;AACnB,mDAAmD,IAAI,kCAAkC;AACzF,aAAa,aAAa,UAAU;AACpC,aAAa,aAAa,UAAU;AACpC,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC7GF,iGAAO,CAAC,yCAAU,EAAE,uCAAQ,EAAE,uCAAQ,CAAC,mCAAE;AACzC;AACA;;AAEA;AACA,eAAe;;AAEf;AACA;AACA;AACA,kEAAkE;AAClE;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,UAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS,UAAU;AACnB;AACA,eAAe;AACf;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE;AACA;AACA,mDAAmD,gBAAgB;AACnE,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA,iDAAiD,gBAAgB;AACjE,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA,IAAI;AACJ,UAAU,OAAO;AACjB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA,IAAI;AACJ,UAAU,OAAO;AACjB;AACA;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAgB;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,UAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;;;AAGA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC7XF,iGAAO,CAAC,0CAAW,EAAE,uCAAQ,EAAE,gCAAS,CAAC,mCAAE;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,6DAA6D;AAC7D;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA,wCAAwC;AACxC,sDAAsD;AACtD;AACA,kDAAkD,EAAE;AACpD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI,KAAsB,CAAC,eAMzB;AACF;AACA;AACA;AACA;AACA;AACA,WAAW,MAAkB;AAC7B,kDAAkD;AAClD,GAAG,CAAiB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;;uCCtLF,iGAAO,CAAC,yCAAU,EAAE,sCAAO,EAAE,yCAAU,EAAE,0CAAW,EAAE,wCAAS,EAAE,yCAAU,EAAE,wCAAS,EAAE,uCAAQ,EAAE,wCAAS,CAAC,mCAAE;AAC9G;AACA;;AAEA,6CAA6C;AAC7C,qBAAqB;AACrB;AACA;AACA;AACA,EAAE;AACF;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,mCAAmC;AACnC,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,MAAM;AACN,eAAe;AACf,MAAM;AACN,eAAe;AACf,MAAM;AACN,6BAA6B;AAC7B;AACA;AACA;AACA,sCAAsC,0CAA0C;AAChF;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,aAAa;AACpE,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA,mDAAmD;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,KAAK,MAAM;AACjC;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,kCAAkC;AACpG;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,6EAA6E;AAC7E,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA;AACA;;AAEA;AACA;;AAEA,CAAC;AAAA,kGAAC;;;;;;;;;;;;;uCCnXF,iGAAO,CAAC,yCAAU,EAAE,uCAAQ,EAAE,uCAAQ,CAAC,mCAAE;AACzC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;AACA;;AAEA,yBAAyB;;AAEzB;AACA;AACA,6BAA6B,iBAAiB,eAAe;AAC7D;;AAEA;AACA,QAAQ,OAAO;AACf;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,4BAA4B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,4BAA4B;AAClC;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,KAAgC,CAAC,sBAOnC;AACH;;AAEA;AACA;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,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,KAA0C,CAAC,sBAY7C;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,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,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS,cAAc,MAAM;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAc,YAAY;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,GAAG,MAAM;AAC/B;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;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,SAAS;AACT,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,IAAI;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC;AACA,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC;AACA,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC;AACA,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,wCAAwC;AACxC,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,SAAS;AACT;AACA,yBAAyB;AACzB,yBAAyB;AACzB;AACA;AACA,SAAS;AACT,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,SAAS;AACT;AACA,yBAAyB;AACzB;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA,yBAAyB;AACzB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC3pCF,iGAAO,CAAC,yCAAU,EAAE,sCAAO,EAAE,uCAAQ,EAAE,gDAAiB,CAAC,mCAAE;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1DF,iGAAO,CAAC,yCAAU,EAAE,yCAAU,+BAA+B,uCAAQ,EAAE,2CAAY,EAAE,wCAAS,EAAE,0CAAW,EAAE,yCAAU,EAAE,uCAAQ,EAAE,6CAAc,CAAC,mCACjJ;AACD;AACA;AACA;AACA,iFAAiF;AACjF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,GAAG;;AAEH;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,qBAAqB;AACrB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB,gBAAgB;AACvC,yCAAyC;;AAEzC;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ,UAAU;AACjD;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ,UAAU;AACjD;;AAEA;AACA;AACA;AACA,sDAAsD;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC,QAAQ;AACR;AACA;AACA,sBAAsB,SAAS,2BAA2B;AAC1D;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA,kBAAkB,sCAAsC;AACxD,mBAAmB,qCAAqC;AACxD,uBAAuB;AACvB;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS,YAAY;AAC3C;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,gCAAgC,aAAa;AAC7C,8BAA8B;AAC9B;AACA;AACA,QAAQ;AACR;;AAEA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iCAAiC,WAAW;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE,eAAe,oDAAoD;AACnE,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,YAAY;AACvC;AACA;AACA,2BAA2B,YAAY;AACvC,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCnqBF,iGAAO,CAAC,yCAAU,EAAE,uCAAQ,EAAE,6CAAc,EAAE,4CAAa,EAAE,4CAAa,EAAE,6CAAc,EAAE,+CAAkB,EAAE,gDAAiB,CAAC,mCAAE;AACpI;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,gBAAgB;AACxC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,uDAAuD;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,+BAA+B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,+BAA+B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,gBAAgB;AACxC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACzC;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCvYF,iGAAO,CAAC,yCAAU,EAAE,wCAAS,CAAC,mCAAE;;AAEhC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qBAAqB,gBAAgB,GAAG;;AAEjD,8BAA8B;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;AACA;AACA;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,qCAAqC;AACxE,gBAAgB,qCAAqC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,wCAAwC;AAC1C;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1FF,iGAAO,CAAC,0CAAW,EAAE,uCAAQ,EAAE,yCAAU,EAAE,gCAAS,EAAE,gCAAQ,CAAC,mCAAE;AACjE;AACA;;AAEA,sEAAsE;;AAEtE;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ,YAAY;AACZ;AACA;AACA,yEAAyE;;AAEzE;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,8CAA8C;AAC9C;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD;;AAEtD;AACA;AACA,gBAAgB,KAAmB,IAAI,CAAa;AACpD;;AAEA,oCAAoC,GAAG;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sFAAsF;AACtF;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC,yEAAyE;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH,gDAAgD,IAAI;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI,KAA0B,CAAC,EA+C7B;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;;AAEzB;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCtTF,iGAAO,CAAC,yCAAU,EAAE,uCAAQ,EAAE,yCAAU,CAAC,mCAAE;AAC3C;AACA;;AAEA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,GAAG,MAAgC;AACnC,IAAI,CAA0G;;AAE9G;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,gBAAgB;AAChB;AACA;AACA;AACA;AACA,oBAAoB;AACpB,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;;AAEH,gBAAgB,KAAK,KAAK;;AAE1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM,KAAgC,CAAC,EAUnC;;AAEJ,gBAAgB;AAChB,GAAG;;AAEH;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,SAAS;AACT;AACA;AACA,+BAA+B,8BAA8B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc;AACd,wCAAwC,OAAO;AAC/C;AACA;AACA,gBAAgB;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,kCAAkC;AAClC;AACA;AACA;AACA;;AAEA;AACA,mDAAmD;AACnD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,oCAAoC;AACpC;AACA;AACA,iCAAiC;AACjC,qCAAqC;AACrC,0DAA0D;AAC1D,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,2CAA2C,uBAAuB,oBAAoB;AACtF,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,KAAK;AACzC;AACA;AACA,gBAAgB;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,MAAM;AACN,GAAG;;AAEH;AACA;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,wBAAwB;AAC5C;AACA,eAAe;AACf;AACA,oBAAoB;AACpB,oCAAoC,gBAAgB;AACpD;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,uBAAuB,uDAAuD;AAC9E;AACA,wCAAwC,gDAAgD;AACxF,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,2CAA2C,cAAc;AACzD,8BAA8B;AAC9B,+BAA+B;AAC/B,iCAAiC;AACjC;AACA,gCAAgC;AAChC,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,+BAA+B,OAAO;AACtC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,yBAAyB;AACzB,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;;;AAGH;AACA,kBAAkB,qBAAqB;AACvC,kBAAkB,yDAAyD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,KAAK,KAAK;AACvE,2CAA2C,IAAI;AAC/C,8CAA8C;AAC9C;AACA;AACA;AACA;AACA,8BAA8B,aAAa,WAAW,KAAK,KAAK;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,IAAI,EAAE;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C;AACA;AACA;AACA,WAAW,OAAO,oBAAoB,KAAK;AAC3C;AACA,YAAY,wBAAwB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,GAAG,EAAE,EAAE;AACtC,2CAA2C,KAAK,KAAK;AACrD;;AAEA;AACA,0BAA0B,uCAAuC;AACjE;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCzmBF,iGAAO,CAAC,yCAAU,EAAE,2CAAY,CAAC,mCAAE;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCZF,iGAAO,CAAC,yCAAU,EAAE,uCAAQ,EAAE,yCAAU,CAAC,mCAAE;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC5FF,iGAAO,CAAC,yCAAU,EAAE,uCAAQ,EAAE,yCAAU,CAAC,mCAAE;AAC3C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D;AAC1D,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uFAAuF;;AAEvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrIF,iGAAO;AACP,CAAC,yCAAU;AACX,CAAC,wCAAS;AACV,CAAC,gCAAS;AACV,CAAC,4CAAa;AACd;AACA,CAAC,uCAAQ;AACT,CAAC,4CAAa;AACd,CAAC,0CAAY;AACb,CAAC,yCAAU;AACX,CAAC,uCAAQ;AACT,CAAC,uCAAQ;AACT,CAAC,wCAAS;AACV,CAAC,sCAAO;AACR,CAAC,0CAAW;AACZ,CAAC,iDAAkB;AACnB,CAAC,+CAAgB;AACjB,CAAC,gDAAiB;AAClB,CAAC,mCAAE;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,QAAQ;;AAER;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,UAAU;AACjB;AACA,MAAM;AACN;AACA;AACA,kBAAkB;AAClB,GAAG;AACH;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc;AACd;;AAEA;AACA;AACA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC7sBF,iGAAO,EAAE,mCAAE;;AAEX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCnOF,iGAAO,CAAC,+CAAgB,EAAE,uCAAQ,CAAC,mCAAE;AACrC;AACA;;AAEA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCNF,iGAAO,CAAC,OAAS,EAAE,wCAAS,EAAE,6CAAc,EAAE,sCAAO,EAAE,4CAAa,EAAE,2CAAY,CAAC,mCACjF;AACF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,gCAAgC;AAChC;;AAEA,CAAC,WAAW;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sGAAsG;AACtG;;AAEA,CAAC,WAAW;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,wEAAwE;AACxE;;AAEA,CAAC,WAAW;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA,CAAC,cAAc;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,CAAC,mBAAmB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,wEAAwE;AACxE;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC3MF,iGAAO,CAAC,6CAAc,EAAE,8CAAe,EAAE,sCAAO,CAAC,mCAAE;AACnD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,WAAW;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,IAAI;;AAEJ;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,iDAAiD,SAAS;AAC1D;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA,KAAK;AACL;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;;AAE7D,wFAAwF;AACxF,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,+BAA+B;AAC/B,GAAG;;AAEH;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,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;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,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrUF,iGAAO,CAAC,OAAS,EAAE,+CAAgB,EAAE,wCAAS,EAAE,+CAAgB,EAAE,sCAAO,EAAE,2CAAY,CAAC,mCACtF;AACF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,mCAAmC,sBAAsB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC,aAAa;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,GAAG;AAC3B;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA,mCAAmC;AACnC;AACA;AACA,aAAa;AACb;;AAEA,CAAC,aAAa;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA,+BAA+B;AAC/B;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA,cAAc,cAAc;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,QAAQ;AACR;AACA;AACA;AACA;AACA,6CAA6C,uBAAuB;AACpE,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,aAAa;AACb,eAAe;AACf,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,aAAa,mBAAmB,GAAG;AACnC;AACA;AACA;;AAEA,CAAC,aAAa;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA,aAAa;AACb;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCvXF,iGAAO,CAAC,6CAAc,EAAE,sCAAO,EAAE,2CAAY,EAAE,uCAAQ,CAAC,mCAAE;AAC1D;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,mCAAmC,MAAM;AACzC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe;AACf,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD;AACtD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8EAA8E;AAC9E;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCpJF,iGAAO,CAAC,wCAAS,EAAE,+CAAgB,CAAC,sCAAO,EAAE,4CAAa,CAAC,mCACzD;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yGAAyG;AACzG;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,sGAAsG;AACtG;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM,+DAA+D;AACrE;;AAEA,mBAAmB,uEAAuE;AAC1F;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA,yCAAyC;;AAEzC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yFAAyF;AACzF;;AAEA;AACA;AACA,8BAA8B,YAAY;AAC1C;AACA;AACA;;AAEA;AACA,oDAAoD;AACpD,kCAAkC,2CAA2C;AAC7E;AACA,KAAK;AACL;;AAEA;AACA;AACA,0EAA0E,SAAS;AACnF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,iCAAiC;AACjC;AACA,yFAAyF;AACzF;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,8BAA8B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc;AACd;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC/jBF,iGAAO,CAAC,OAAS,EAAE,+CAAgB,EAAE,wCAAS,EAAE,6CAAc,EAAE,sCAAO,EAAE,4CAAa,EAAE,8CAAiB,EAAE,gDAAiB,CAAC,mCAC3H;AACF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB;AACrB,8DAA8D,kCAAkC;;AAEhG,CAAC,aAAa;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,WAAW;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA,CAAC,WAAW;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;;AAER;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,uDAAuD;AACvD;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,kDAAkD;AAClD,8DAA8D;AAC9D;AACA;AACA,IAAI;AACJ;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gBAAgB;AAChB;AACA;AACA,eAAe;AACf;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC3LF,iGAAO,CAAC,wCAAS,EAAE,sCAAO,EAAE,+CAAgB,CAAC,mCAAE;AAC/C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,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,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,gBAAgB;AAChB;AACA,2BAA2B;AAC3B;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC,IAAI;AACJ,cAAc;AACd;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,IAAI;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;;AAEtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;;AAER;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC7UF,iGAAO,CAAC,wCAAS,EAAE,+CAAgB,EAAE,+CAAgB,CAAC,mCACpD;AACF;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,IAAI,UAAU;AACd,iBAAiB;AACjB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,GAAG;;AAEH;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCpNF,iGAAO,CAAC,yCAAU,EAAE,sCAAO,CAAC,mCAAE;AAC9B;AACA,kBAAkB,4BAA4B;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB;;AAEpB;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mFAAmF;;AAEnF;AACA,uBAAuB;;AAEvB;AACA;AACA,IAAI;AACJ;AACA;AACA,4BAA4B,sDAAsD;AAClF;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,uCAAuC;AACnE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1HF,iGAAO,CAAC,yCAAU,CAAC,mCAAE;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA4C,gCAAgC;AAC5E,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCZF,iGAAO,CAAC,yCAAU,CAAC,mCAAE;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCdF,iGAAO,CAAC,yCAAU,EAAE,+CAAgB,CAAC,mCAAE;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCdF,iGAAO,CAAC,8CAAe,CAAC,mCAAE;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCxCF,qEAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCChBF,iGAAO,CAAC,yCAAU,EAAE,gCAAS,EAAE,gCAAQ,CAAC,mCAAE;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;;AAEpE,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8GAA8G;AAC9G;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,0CAA0C,cAAc;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,SAAS;;AAET;AACA;AACA;;AAEA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAY,IAAI,CAAqB;;AAE/D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE,uGAAuG;AACvG;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCjMF,iGAAO;AACP,CAAC,gCAAS;AACV,CAAC,+CAAgB;AACjB,CAAC,4CAAa;AACd,CAAC,4CAAa;AACd,CAAC,sCAAO;AACR,CAAC,2CAAY;AACb,CAAC,+CAAgB;AACjB,CAAC,mCAAE;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB,oBAAoB,aAAa,YAAY;AAChH,oGAAoG;AACpG;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,yBAAyB;AACzB,IAAI;AACJ;AACA;AACA;AACA,EAAE;;AAEF;AACA,KAAK,KAAmB,CAAC,EAEtB;AACH,EAAE;;AAEF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCtDF,iGAAO,CAAC,+CAAgB,EAAE,gCAAS,EAAE,sCAAO,EAAE,8CAAe,EAAE,+CAAgB,EAAE,6CAAc,EAAE,2CAAgC,EAAE,uCAAQ,EAAE,gCAAQ,CAAC,mCACrJ;;AAED;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qGAAqG,sBAAsB;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,YAAY;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA0F;AAC1F,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;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,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,8BAA8B,8CAA8C;AAC5E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,YAAY,MAAmD;AAC/D,KAAK,CAAkD;AACvD;AACA,IAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;;AAEvB;AACA;;AAEA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,SAAS;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,6CAA6C,mBAAmB,oCAAoC;AACpG,oCAAoC,oBAAoB;;AAExD,eAAe;AACf,8BAA8B;AAC9B,2BAA2B;AAC3B;AACA,oCAAoC;AACpC,+BAA+B;;AAE/B;AACA;AACA,4CAA4C;;AAE5C,YAAY,UAAU;AACtB;AACA;;AAEA,eAAe;AACf,0CAA0C;AAC1C,YAAY,SAAS;AACrB,qBAAqB;AACrB,YAAY;AACZ;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA,kFAAkF;AAClF;AACA;AACA,OAAO;AACP;AACA,uDAAuD;AACvD;AACA;AACA;AACA,+EAA+E,oBAAoB;AACnG;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT,qCAAqC;AACrC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,+EAA+E;AAC/E,qFAAqF,4BAA4B;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D,wCAAwC;;AAElG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC7nBF,iGAAO,CAAC,6CAAc,CAAC,mCAAE;;AAEzB;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oEAAoE;AACpE,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,uCAAuC;AACvC;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;uCC/FF,iGAAO,CAAC,sCAAO,CAAC,mCAAE;AAClB;AACA;AACA,iCAAiC;AACjC;AACA,sDAAsD,IAAI,gBAAgB,aAAa,OAAO,MAAM;;AAEpG;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,qBAAqB,gBAAgB,GAAG;AACnD;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,qCAAqC;AAC9E,kBAAkB,qCAAqC;AACvD;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA,4BAA4B,0EAA0E;AACtG;AACA;AACA;AACA,IAAI;AACJ;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,gBAAgB,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,eAAe,YAAY;AAChG;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,4CAA4C,GAAG;AAC7D;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCjKF,iGAAO,CAAC,+CAAgB,EAAE,wCAAS,CAAC,mCAAE;;AAEtC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC5EF,iGAAO,CAAC,+CAAgB,EAAE,qCAAM,EAAE,sCAAO,EAAE,sCAAO,EAAE,+CAAgB,CAAC,mCAAE;;AAEvE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,2BAA2B;AAC7D,0BAA0B,sBAAsB;AAChD,0BAA0B,sBAAsB;AAChD,0BAA0B;AAC1B;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,kCAAkC,4BAA4B;AAC9D,0BAA0B,uBAAuB;AACjD,0BAA0B,uBAAuB;AACjD,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;;AAEV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1KF,iGAAO,CAAC,iGAAsC,EAAE,+CAAgB,EAAE,wCAAS,CAAC,mCAAE;;AAE9E;AACA,iBAAiB;AACjB;AACA;AACA,qCAAqC,MAAY,IAAI,CAAe,GAAG;AACvE;AACA;AACA;AACA,GAAG;;AAEH,KAAK,KAAY,CAAC,EAsBf;AACH;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,aAAa;AAC1C;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,KAAY,CAAC,EAYf;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,6CAA6C;AAC7C;AACA,0CAA0C,GAAG;AAC7C;AACA;AACA;AACA,yBAAyB;AACzB;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,kDAAkD;AAClD;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,YAAY;AACZ,OAAO;AACP,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,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,eAAe,2BAA2B,KAAK,uDAAuD,aAAa,4BAA4B;AAChN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,IAAI,KAAY,CAAC,2DAsEf;AACF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrlBF,iGAAO;AACP,CAAC,8CAAe;AAChB,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1LF,iGAAO;AACP,CAAC,yCAAU;AACX,CAAC,uCAAQ;AACT,CAAC,8CAAe;AAChB,CAAC,+CAAgB;AACjB,CAAC,mCAAE;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCtHF,iGAAO;AACP,CAAC,8CAAe;AAChB,CAAC,0CAAW;AACZ,CAAC,2CAAY;AACb,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,8CAA8C;AAClE,oBAAoB,8CAA8C;AAClE,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCpFF,iGAAO,CAAC,+CAAgB,EAAE,sCAAO,EAAE,sCAAO,EAAE,qCAAM,EAAE,8CAAe,EAAE,6CAAc,EAAE,mDAAoB,EAAE,2DAA4B,CAAC,mCACvI;;AAED;;AAEA;AACA;AACA,4BAA4B,UAAU;AACtC,EAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;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,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,mCAAmC;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,EAAE;AACF;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,0CAA0C;AAC1C,IAAI;AACJ;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,6CAA6C;AAC7C,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA,kCAAkC;AAClC;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,yEAAyE;AACzE,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA,IAAI,GAAG;AACP,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,SAAS;AACT,SAAS;;AAET;AACA;AACA,eAAe;AACf,iBAAiB;AACjB,IAAI;AACJ,0BAA0B;AAC1B;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;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,UAAU;AACV;AACA,oCAAoC,oBAAoB;AACxD;AACA,UAAU;AACV,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCvsBF,iGAAO,CAAC,+CAAgB,EAAE,sCAAO,EAAE,gCAAS,EAAE,2CAA+B,EAAE,6CAAc,CAAC,mCAAE;AAChG;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD,QAAQ;AACR;AACA;AACA;AACA;AACA,6BAA6B,+BAA+B;AAC5D,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mDAAmD;AACpE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,KAAmE,CAAC,EAOtE;;AAEF;AACA;AACA,EAAE;AACF;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCxJF,iGAAO;AACP,CAAC,mDAAoB;AACrB;AACA;AACA,CAAC,mCAAE;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCChFF,iGAAO;AACP,CAAC,wCAAS;AACV,CAAC,gDAAiB;AAClB,CAAC,+CAAgB;AACjB,CAAC,uCAAQ;AACT,CAAC,uFAAgC;AACjC,CAAC,mCAAE;AACH;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gDAAgD,sDAAsD;AACtG;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCjGF,iGAAO;AACP,CAAC,OAAS;AACV,CAAC,uDAAwB;AACzB,CAAC,sDAAuB;AACxB,CAAC,4CAAa;AACd,CAAC,4CAAa;AACd,CAAC,+CAAgB;AACjB,CAAC,8CAAe;AAChB,CAAC,mDAAoB;AACrB,CAAC,uCAAQ;AACT,CAAC,mCAAE;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,gBAAgB;AACjB;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR,yCAAyC;AACzC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,qBAAqB;AACtB;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA,wCAAwC;AACxC,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA,CAAC,kBAAkB;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,gBAAgB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,CAAC,wBAAwB;AACzB;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,GAAG;AACH;;AAEA,CAAC,iBAAiB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA,CAAC,mBAAmB;AACpB;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrNF,iGAAO;AACP,CAAC,uCAAQ;AACT,CAAC,8DAA+B;AAChC,CAAC,sDAAuB;AACxB,CAAC,+CAAgB;AACjB,CAAC,gDAAsC;AACvC,CAAC,6GAAkD;AACnD,CAAC,mCAAE;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,sBAAsB,8CAA8C;AACpE;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC5GF,iGAAO;AACP,CAAC,uDAAwB;AACzB,CAAC,wCAAS;AACV,CAAC,2CAAY;AACb,CAAC,uCAAQ;AACT,CAAC,uCAAQ;AACT;AACA;AACA,CAAC,mCAAE;AACH;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;;AAEF;AACA,2DAA2D;AAC3D;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,EAAE;;AAEF;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,mCAAmC;AACnC;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC9YF,iGAAO,CAAC,uCAAQ,EAAE,gCAAS,CAAC,mCAC1B;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,GAAG;AACH,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC1DF,iGAAO,CAAC,uCAAQ,EAAE,gDAAiB,CAAC,mCAAE;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,kCAAkC,OAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sBAAsB;AACtC;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA,8BAA8B;AAC9B;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,EAAE,qBAAqB;;AAEvB;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC9RF,iGAAO,CAAC,sCAAO,CAAC,mCAAE;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCC3FF,iGAAO;AACP,CAAC,+CAAgB;AACjB,CAAC,6CAAc;AACf,CAAC,mCAAE;;AAEH;AACA;AACA;AACA;AACA,YAAY;AACZ,WAAW;AACX,WAAW;AACX,aAAa;AACb,aAAa;AACb,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,eAAe;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA,IAAI,OAAO,sBAAsB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB;;AAEvB;AACA,OAAO;AACP;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,IAAI;AAClD,QAAQ,WAAW;AACnB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,EAAE,+BAA+B,EAAE;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAK,+BAA+B,SAAS;AAC7D,SAAS,0BAA0B;AACnC;AACA;AACA;AACA;AACA;AACA,UAAU,GAAG,kBAAkB,EAAE;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,UAAU;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD;;AAEnD,8BAA8B,SAAS,iBAAiB,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG,GAAG;AACN;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCjRF,iGAAO,CAAC,+CAAgB,EAAE,gCAAS,EAAE,sCAAO,EAAE,0CAA8B,CAAC,mCAAE;AAC/E;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,wBAAwB,4BAA4B;AACrE;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;;AAEH,eAAe;;AAEf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,gEAAgE,eAAe;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;;AAE3F;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;AAAA,kGAAC;;;;;;;;;;;;uCCxNF,iGAAO,CAAC,0CAAW,CAAC,mCAAE;;AAEtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,qCAAqC,uBAAuB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCrCF,iGAAO,CAAC,+CAAgB,EAAE,yCAAU,EAAE,sCAAO,EAAE,4CAAa,EAAE,6CAAc,EAAE,qCAAM,EAAE,sCAAO,EAAE,wCAAS,EAAE,2CAAY,EAAE,+CAAgB,CAAC,mCACzI;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,qDAAqD;AAC3E;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,4CAA4C;AACxD;;AAEA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,4CAA4C;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,eAAe,4CAA4C;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;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAI,KAAY,CAAC,EAuGf;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,2CAA2C;AAC3C,8CAA8C;AAC9C,6CAA6C;AAC7C;AACA;AACA,uCAAuC;AACvC,sCAAsC;AACtC,yCAAyC;AACzC,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCheF,iGAAO,CAAC,+CAAgB,EAAE,6CAAc,EAAE,2CAAY,EAAE,wCAAS,EAAE,+CAAgB,CAAC,mCACnF;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCpFF,iGAAO;AACP,CAAC,2CAAY;AACb,CAAC,kDAAmB;AACpB,CAAC,mCAAE;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;uCCtDF,iGAAO,CAAC,6CAAc,EAAE,wCAAS,EAAE,+CAAgB,EAAE,sCAAO,EAAE,+CAAgB,EAAE,4CAAa,EAAE,8CAAiB,CAAC,mCAChH;;AAED;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA,YAAY;AACZ,IAAI;AACJ;AACA,YAAY;AACZ,IAAI;AACJ;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAM,KAAY,CAAC,iBAKf;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA,+CAA+C;AAC/C,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,uBAAuB,UAAU;AACjC;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA,iDAAiD;AACjD;AACA;AACA;AACA,MAAM;AACN;AACA,uBAAuB,iBAAiB,iBAAiB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,kGAAC;;;;;;;;;;;;AChPW;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,qBAAqB,GAAG,mBAAmB,GAAG,gBAAgB;AAC9D,gBAAgB;AAChB,mBAAmB;AACnB,qBAAqB;AACrB;;;;;;;;;;;ACNa;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB,GAAG,kBAAkB;AACvC,kBAAkB,mBAAO,CAAC,6BAAmB;AAC7C,sBAAsB,mBAAO,CAAC,uCAA6B;AAC3D,cAAc,mBAAO,CAAC,wBAAe;AACrC,cAAc,mBAAO,CAAC,8BAAoB;AAC1C,YAAY,mBAAO,CAAC,4BAAkB;AACtC,eAAe,mBAAO,CAAC,0BAAgB;AACvC,kBAAkB;AAClB;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,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,aAAa;AACb,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,sKAAsK,GAAG;AACzK;AACA;AACA,CAAC;AACD;;;;;;;;;;;AC/Ia;AACb,8CAA6C,EAAE,aAAa,EAAC;AAC7D,kBAAkB,GAAG,YAAY,GAAG,oBAAoB,GAAG,cAAc,GAAG,oBAAoB,GAAG,gBAAgB;AACnH,cAAc,mBAAO,CAAC,iBAAO;AAC7B,qBAAqB,mBAAO,CAAC,yBAAe;AAC5C;AACA;AACA,cAAc,mBAAO,CAAC,8BAAoB;AAC1C,gBAAgB,mBAAO,CAAC,yBAAe;AACvC,oBAAoB,mBAAO,CAAC,4BAAoB;AAChD,gBAAgB;AAChB,oBAAoB;AACpB;AACA,cAAc,mBAAO,CAAC,8BAAoB;AAC1C,oBAAoB,mBAAO,CAAC,oCAA0B;AACtD,cAAc;AACd,oBAAoB;AACpB;AACA,YAAY,mBAAO,CAAC,sBAAY;AAChC;AACA,mBAAmB,mBAAO,CAAC,8BAAoB;AAC/C,eAAe,mBAAO,CAAC,0BAAgB;AACvC,gBAAgB,mBAAO,CAAC,2BAAiB;AACzC,oBAAoB,mBAAO,CAAC,0CAAgC;AAC5D,sBAAsB,mBAAO,CAAC,2CAAkC;AAChE,oBAAoB,mBAAO,CAAC,2CAAiC;AAC7D;AACA,mBAAmB,mBAAO,CAAC,wBAAc;AACzC,YAAY;AACZ,qCAAqC;AACrC,kBAAkB;AAClB,2CAA2C;AAC3C;;;;;;;;;;AChCA,uEAAuE,+BAA+B;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA,+BAA+B;AAC/B;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;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,eAAe;;AAEf;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,iCAAiC,4BAA4B;AAC7D,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,4EAA4E;AAC5E;;AAEA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,OAAO,CAE4F;AACnG,KAAK,KAAC,EAAE,EAKN;;AAEF,OAAO,CAEyF;AAChG,KAAK,KAAC,EAAE,mCAWN;;AAEF,OAAO,CAA8G;AACrH,KAAK,KAAC,EAAE,EA4BN;;AAEF,2DAA2D;AAC3D;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAC,EAAE,EAON;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,KAAC,EAAE,mEAoGN;AACF;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAC;AAChB;AACA,eAAe;AACf;AACA,EAAE,CAA0C;;AAE5C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B,iFAAiF;AACjF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA,kCAAkC;AAClC;;AAEA;AACA,4DAA4D;AAC5D,OAAO;;AAEP;AACA,+BAA+B;AAC/B,OAAO;;AAEP;AACA,sDAAsD;AACtD;;AAEA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA,mCAAmC,oEAAoE;AACvG;AACA;AACA;AACA,oEAAoE;AACpE,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA,KAAK,KAAC,EAAE,6KA6PN;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA,KAAK,KAAG,GAAG,wKA+KT;;AAEF;AACA,mCAAmC,8BAA8B;AACjE;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA,OAAO,KAAC,EAAE,WAGN;AACJ,YAAY;AACZ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ,gEAAgE;AAChE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI,SAAS,KAAC,EAAE,EAEZ;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,KAAK,KAAG,GAAG,sEAmDT;;AAEF;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAG,GAAG,6PA+MT;;AAEF;AACA,cAAc;AACd;AACA;;;;AAIA,KAAK,KAAC,EAAE,EAQN;;AAEF,KAAK,KAAK,EAAE,0HAySV;;AAEF;AACA;AACA;AACA,KAAK,KAAC,EAAE,EAgBN;;AAEF,MAAM,KAAC,GAAG,EASR;;AAEF,KAAK,KAAsB,CAAC,wDAsE1B;;AAEF,KAAK,KAAC,EAAE,EAQN;AACF;AACA;;AAEA,KAAK,KAAC,EAAE,cAwCN;AACF;AACA;AACA,KAAK,KAAG,GAAG,YAyFT,CAAC;AACH;AACA;AACA,wEAAwE;AACxE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE;;;AAGF,KAAK,KAAC,EAAE,EAyBN;;AAEF,4CAA4C;AAC5C;AACA;AACA,MAAM,KAAC,EAAE,EAEN;AACH;AACA,EAAE;AACF;AACA;AACA,MAAM,KAAC,EAAE,EAEN;AACH;;AAEA,KAAK,KAAoC,CAAC,4BAMxC;;AAEF,KAAK,KAAS,EAAE,+BAKd;AACF,IAAI,KAAG,EAAE,EAGP;AACF,CAAC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACz9DA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,gBAAgB,sCAAsC,kBAAkB;AACjF,wBAAwB;AACxB;AACA;;AAEO;AACP;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEO;AACP;AACA,+CAA+C,OAAO;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA,2DAA2D,cAAc;AACzE;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA,2CAA2C,QAAQ;AACnD;AACA;;AAEO;AACP,kCAAkC;AAClC;;AAEO;AACP,uBAAuB,uFAAuF;AAC9G;AACA;AACA,yGAAyG;AACzG;AACA,sCAAsC,QAAQ;AAC9C;AACA,gEAAgE;AAChE;AACA,8CAA8C,yFAAyF;AACvI,8DAA8D,2CAA2C;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA,kBAAkB,yBAAyB;AAC3C;AACA;AACA;AACA;;AAEO;AACP;AACA;;AAEO;AACP;AACA,4CAA4C,yEAAyE;AACrH;;AAEO;AACP;AACA;;AAEO;AACP,0BAA0B,+DAA+D,iBAAiB;AAC1G;AACA,kCAAkC,MAAM,+BAA+B,YAAY;AACnF,iCAAiC,MAAM,mCAAmC,YAAY;AACtF,8BAA8B;AAC9B;AACA,GAAG;AACH;;AAEO;AACP,YAAY,6BAA6B,0BAA0B,cAAc,qBAAqB;AACtG,2IAA2I,cAAc;AACzJ,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,iCAAiC,SAAS;AAC1C,iCAAiC,WAAW,UAAU;AACtD,wCAAwC,cAAc;AACtD;AACA,4GAA4G,OAAO;AACnH,+EAA+E,iBAAiB;AAChG,uDAAuD,gBAAgB,QAAQ;AAC/E,6CAA6C,gBAAgB,gBAAgB;AAC7E;AACA,gCAAgC;AAChC;AACA;AACA,QAAQ,YAAY,aAAa,SAAS,UAAU;AACpD,kCAAkC,SAAS;AAC3C;AACA;;AAEO;AACP;AACA;AACA;AACA,eAAe,oCAAoC;AACnD;AACA;AACA,CAAC;AACD;AACA;AACA,CAAC;;AAEM;AACP;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACO;AACP,2BAA2B,sBAAsB;AACjD;AACA;AACA;;AAEA;AACO;AACP,gDAAgD,QAAQ;AACxD,uCAAuC,QAAQ;AAC/C,uDAAuD,QAAQ;AAC/D;AACA;AACA;;AAEO;AACP,2EAA2E,OAAO;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;;AAEO;AACP;AACA;AACA,wMAAwM,cAAc;AACtN,4BAA4B,sBAAsB;AAClD,wBAAwB,YAAY,sBAAsB,qCAAqC,2CAA2C,MAAM;AAChJ,0BAA0B,MAAM,iBAAiB,YAAY;AAC7D,qBAAqB;AACrB,4BAA4B;AAC5B,2BAA2B;AAC3B,0BAA0B;AAC1B;;AAEO;AACP;AACA,eAAe,6CAA6C,UAAU,sDAAsD,cAAc;AAC1I,wBAAwB,6BAA6B,oBAAoB,uCAAuC,kBAAkB;AAClI;;AAEO;AACP;AACA;AACA,yGAAyG,uFAAuF,cAAc;AAC9M,qBAAqB,8BAA8B,gDAAgD,wDAAwD;AAC3J,2CAA2C,sCAAsC,UAAU,mBAAmB,IAAI;AAClH;;AAEO;AACP,+BAA+B,uCAAuC,YAAY,KAAK,OAAO;AAC9F;AACA;;AAEA;AACA,wCAAwC,4BAA4B;AACpE,CAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA,qDAAqD,cAAc;AACnE;AACA;AACA;;AAEO;AACP,2CAA2C;AAC3C;;AAEO;AACP;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,MAAM,oBAAoB,YAAY;AAC5E,qBAAqB,8CAA8C;AACnE;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,SAAS,gBAAgB;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA,iEAAe;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,CAAC,EAAC;;;;;;;UChZF;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WC5BA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA,cAAc;WACd,4BAA4B;WAC5B;WACA;WACA;;WAEA;WACA;WACA;;WAEA;WACA;WACA;;WAEA;WACA;WACA;WACA;;WAEA,0CAA0C;WAC1C;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mCAAmC,eAAe;WAClD;WACA;WACA,sCAAsC,eAAe;WACrD;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA,sCAAsC;WACtC;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA,+CAA+C;WAC/C;WACA;WACA;;WAEA;WACA,8CAA8C,YAAY;WAC1D;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA,gDAAgD,sBAAsB;WACtE,IAAI;WACJ;WACA;WACA;WACA;WACA;WACA,MAAM;WACN;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA,wDAAwD;WACxD,oDAAoD;WACpD,iBAAiB;WACjB;WACA;WACA;WACA;WACA;WACA,sBAAsB,8BAA8B;WACpD,0BAA0B,+BAA+B;WACzD;WACA;WACA,IAAI;WACJ;WACA;;WAEA,8DAA8D;WAC9D,iBAAiB;WACjB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA,OAAO;WACP,mBAAmB,mBAAmB;WACtC;WACA,KAAK;WACL;WACA;WACA,+CAA+C;WAC/C,gEAAgE;WAChE,oDAAoD;WACpD,QAAQ,iCAAiC,oBAAoB;WAC7D,QAAQ;WACR;WACA;WACA;WACA,MAAM;WACN;WACA;WACA;WACA;WACA;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;;WAEF;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,cAAc,0BAA0B;WACxC,EAAE;WACF;WACA,YAAY,kBAAkB;WAC9B,YAAY;WACZ,EAAE;WACF;WACA;WACA,8CAA8C,wDAAwD,wBAAwB;WAC9H;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI,EAAE;WACN,uBAAuB,aAAa,+LAA+L,YAAY,oFAAoF,qKAAqK,SAAS,+DAA+D,YAAY,iEAAiE,YAAY,iEAAiE,mBAAmB,+EAA+E,YAAY,iEAAiE,aAAa,wEAAwE,EAAE,gEAAgE,aAAa,EAAE;WAC/hC;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,qEAAqE,sCAAsC;WAC3G;WACA;WACA;WACA;WACA;WACA,CAAC,KAAK;;;;;UEzWN;UACA;UACA;UACA","sources":["webpack://@hpcc-js/dgrid-shim/webpack/universalModuleDefinition","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/Grid.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/Keyboard.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/List.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/OnDemandGrid.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/OnDemandList.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/Selection.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/_StoreMixin.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/extensions/ColumnResizer.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/extensions/CompoundColumns.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/extensions/Pagination.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/extensions/nls/pagination.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/util/misc.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/util/touch.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/BackgroundIframe.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/Destroyable.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/Tooltip.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/Viewport.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_AttachMixin.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_BidiMixin.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_FocusMixin.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_OnDijitClickMixin.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_TemplatedMixin.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_Widget.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_WidgetBase.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/_base/manager.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/a11y.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/a11yclick.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/focus.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/hccss.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/main.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/place.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/registry.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-dstore/Filter.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-dstore/Memory.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-dstore/Promised.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-dstore/QueryMethod.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-dstore/QueryResults.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-dstore/SimpleQuery.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-dstore/Store.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-webpack-plugin/lib/NoModule.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dgrid/extensions/nls/pagination.js?40cb","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo-webpack-plugin/loaders/dojo/runner.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dijit/templates/Tooltip.html","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/Deferred.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/Evented.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/NodeList-dom.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/Stateful.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/Color.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/Deferred.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/NodeList.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/array.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/config.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/connect.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/declare.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/event.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/fx.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/html.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/json.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/kernel.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/lang.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/query.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/sniff.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/window.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/_base/xhr.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/aspect.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/cache.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom-attr.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom-class.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom-construct.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom-form.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom-geometry.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom-prop.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom-style.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/dom.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/domReady.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/errors/CancelError.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/errors/RequestError.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/errors/RequestTimeoutError.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/errors/create.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/global.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/has.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/hccss.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/i18n.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/io-query.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/json.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/keys.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/mouse.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/on.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/promise/Promise.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/promise/instrumentation.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/promise/tracer.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/query.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/ready.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/request.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/request/handlers.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/request/util.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/request/watch.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/request/xhr.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/selector/_loader.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/selector/lite.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/sniff.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/string.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/text.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/topic.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/touch.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/uacss.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/when.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/dojo/window.js","webpack://@hpcc-js/dgrid-shim/./lib-cjs/__package__.js","webpack://@hpcc-js/dgrid-shim/./lib-cjs/gridHelper.js","webpack://@hpcc-js/dgrid-shim/./lib-cjs/index.js","webpack://@hpcc-js/dgrid-shim/../../../../../../../tmp/tmp-3424WjDfS5sTY29e/dojo/dojo.js","webpack://@hpcc-js/dgrid-shim/../../node_modules/tslib/tslib.es6.mjs","webpack://@hpcc-js/dgrid-shim/webpack/bootstrap","webpack://@hpcc-js/dgrid-shim/webpack/runtime/define property getters","webpack://@hpcc-js/dgrid-shim/webpack/runtime/hasOwnProperty shorthand","webpack://@hpcc-js/dgrid-shim/webpack/runtime/make namespace object","webpack://@hpcc-js/dgrid-shim/webpack/runtime/dojo-webpack-plugin","webpack://@hpcc-js/dgrid-shim/webpack/before-startup","webpack://@hpcc-js/dgrid-shim/webpack/startup","webpack://@hpcc-js/dgrid-shim/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"@hpcc-js/dgrid-shim\"] = factory();\n\telse\n\t\troot[\"@hpcc-js/dgrid-shim\"] = factory();\n})(self, () => {\nreturn ","define([\n\t'dojo/_base/declare',\n\t'dojo/_base/lang',\n\t'dojo/dom-construct',\n\t'dojo/dom-class',\n\t'dojo/on',\n\t'dojo/has',\n\t'./List',\n\t'./util/misc',\n\t'dojo/_base/sniff'\n], function (declare, lang, domConstruct, domClass, listen, has, List, miscUtil) {\n\tfunction appendIfNode(parent, subNode) {\n\t\tif (subNode && subNode.nodeType) {\n\t\t\tparent.appendChild(subNode);\n\t\t}\n\t}\n\n\tfunction replaceInvalidChars(str) {\n\t\t// Replaces invalid characters for a CSS identifier with hyphen,\n\t\t// as dgrid does for field names / column IDs when adding classes.\n\t\treturn miscUtil.escapeCssIdentifier(str, '-');\n\t}\n\n\tvar Grid = declare(List, {\n\t\tcolumns: null,\n\n\t\t// hasNeutralSort: Boolean\n\t\t//\t\tDetermines behavior of toggling sort on the same column.\n\t\t//\t\tIf false, sort toggles between ascending and descending and cannot be\n\t\t//\t\treset to neutral without sorting another column.\n\t\t//\t\tIf true, sort toggles between ascending, descending, and neutral.\n\t\thasNeutralSort: false,\n\n\t\t// cellNavigation: Boolean\n\t\t//\t\tThis indicates that focus is at the cell level. This may be set to false to cause\n\t\t//\t\tfocus to be at the row level, which is useful if you want only want row-level\n\t\t//\t\tnavigation.\n\t\tcellNavigation: true,\n\n\t\ttabableHeader: true,\n\t\tshowHeader: true,\n\t\tcolumn: function (target) {\n\t\t\t// summary:\n\t\t\t//\t\tGet the column object by node, or event, or a columnId\n\t\t\tif (typeof target !== 'object') {\n\t\t\t\treturn this.columns[target];\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn this.cell(target).column;\n\t\t\t}\n\t\t},\n\t\tlistType: 'grid',\n\t\tcell: function (target, columnId) {\n\t\t\t// summary:\n\t\t\t//\t\tGet the cell object by node, or event, id, plus a columnId\n\n\t\t\tif (target.column && target.element) {\n\t\t\t\treturn target;\n\t\t\t}\n\n\t\t\tif (target.target && target.target.nodeType) {\n\t\t\t\t// event\n\t\t\t\ttarget = target.target;\n\t\t\t}\n\t\t\tvar element;\n\t\t\tif (target.nodeType) {\n\t\t\t\tdo {\n\t\t\t\t\tif (this._rowIdToObject[target.id]) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvar colId = target.columnId;\n\t\t\t\t\tif (colId) {\n\t\t\t\t\t\tcolumnId = colId;\n\t\t\t\t\t\telement = target;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t} while (target && target !== this.domNode);\n\t\t\t}\n\t\t\tif (!element && typeof columnId !== 'undefined') {\n\t\t\t\tvar row = this.row(target),\n\t\t\t\t\trowElement = row && row.element;\n\t\t\t\tif (rowElement) {\n\t\t\t\t\tvar elements = rowElement.getElementsByTagName('td');\n\t\t\t\t\tfor (var i = 0; i < elements.length; i++) {\n\t\t\t\t\t\tif (elements[i].columnId === columnId) {\n\t\t\t\t\t\t\telement = elements[i];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (target != null) {\n\t\t\t\treturn {\n\t\t\t\t\trow: row || this.row(target),\n\t\t\t\t\tcolumn: columnId && this.column(columnId),\n\t\t\t\t\telement: element\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tcreateRowCells: function (tag, createCell, subRows, item, options) {\n\t\t\t// summary:\n\t\t\t//\t\tGenerates the grid for each row (used by renderHeader and and renderRow)\n\t\t\tvar row = domConstruct.create('table', {\n\t\t\t\t\tclassName: 'dgrid-row-table',\n\t\t\t\t\trole: 'presentation'\n\t\t\t\t}),\n\t\t\t\t// IE < 9 needs an explicit tbody; other browsers do not\n\t\t\t\ttbody = (has('ie') < 9) ? domConstruct.create('tbody', null, row) : row,\n\t\t\t\ttr,\n\t\t\t\tsi, sl, i, l, // iterators\n\t\t\t\tsubRow, column, id, extraClasses, className,\n\t\t\t\tcell, colSpan, rowSpan; // used inside loops\n\n\t\t\t// Allow specification of custom/specific subRows, falling back to\n\t\t\t// those defined on the instance.\n\t\t\tsubRows = subRows || this.subRows;\n\n\t\t\tfor (si = 0, sl = subRows.length; si < sl; si++) {\n\t\t\t\tsubRow = subRows[si];\n\t\t\t\t// for single-subrow cases in modern browsers, TR can be skipped\n\t\t\t\t// http://jsperf.com/table-without-trs\n\t\t\t\ttr = domConstruct.create('tr', null, tbody);\n\t\t\t\tif (subRow.className) {\n\t\t\t\t\ttr.className = subRow.className;\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0, l = subRow.length; i < l; i++) {\n\t\t\t\t\t// iterate through the columns\n\t\t\t\t\tcolumn = subRow[i];\n\t\t\t\t\tid = column.id;\n\n\t\t\t\t\textraClasses = column.field ?\n\t\t\t\t\t\t' field-' + replaceInvalidChars(column.field) :\n\t\t\t\t\t\t'';\n\t\t\t\t\tclassName = typeof column.className === 'function' ?\n\t\t\t\t\t\tcolumn.className(item) : column.className;\n\t\t\t\t\tif (className) {\n\t\t\t\t\t\textraClasses += ' ' + className;\n\t\t\t\t\t}\n\n\t\t\t\t\tcell = domConstruct.create(tag, {\n\t\t\t\t\t\tclassName: 'dgrid-cell' +\n\t\t\t\t\t\t\t(id ? ' dgrid-column-' + replaceInvalidChars(id) : '') + extraClasses,\n\t\t\t\t\t\trole: tag === 'th' ? 'columnheader' : 'gridcell'\n\t\t\t\t\t});\n\t\t\t\t\tcell.columnId = id;\n\t\t\t\t\tcolSpan = column.colSpan;\n\t\t\t\t\tif (colSpan) {\n\t\t\t\t\t\tcell.colSpan = colSpan;\n\t\t\t\t\t}\n\t\t\t\t\trowSpan = column.rowSpan;\n\t\t\t\t\tif (rowSpan) {\n\t\t\t\t\t\tcell.rowSpan = rowSpan;\n\t\t\t\t\t}\n\t\t\t\t\tcreateCell(cell, column, item, options);\n\t\t\t\t\t// add the td to the tr at the end for better performance\n\t\t\t\t\ttr.appendChild(cell);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn row;\n\t\t},\n\n\t\t_createBodyRowCell: function (cellElement, column, item, options) {\n\t\t\tvar cellData = item;\n\n\t\t\t// Support get function or field property (similar to DataGrid)\n\t\t\tif (column.get) {\n\t\t\t\tcellData = column.get(item);\n\t\t\t}\n\t\t\telse if ('field' in column && column.field !== '_item') {\n\t\t\t\tcellData = item[column.field];\n\t\t\t}\n\n\t\t\tif (column.renderCell) {\n\t\t\t\t// A column can provide a renderCell method to do its own DOM manipulation,\n\t\t\t\t// event handling, etc.\n\t\t\t\tappendIfNode(cellElement, column.renderCell(item, cellData, cellElement, options));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._defaultRenderCell.call(column, item, cellData, cellElement, options);\n\t\t\t}\n\t\t},\n\n\t\t_createHeaderRowCell: function (cellElement, column) {\n\t\t\tvar contentNode = column.headerNode = cellElement;\n\t\t\tvar field = column.field;\n\t\t\tif (field) {\n\t\t\t\tcellElement.field = field;\n\t\t\t}\n\t\t\t// allow for custom header content manipulation\n\t\t\tif (column.renderHeaderCell) {\n\t\t\t\tappendIfNode(contentNode, column.renderHeaderCell(contentNode));\n\t\t\t}\n\t\t\telse if ('label' in column || column.field) {\n\t\t\t\tcontentNode.appendChild(document.createTextNode(\n\t\t\t\t\t'label' in column ? column.label : column.field));\n\t\t\t}\n\t\t\tif (column.sortable !== false && field && field !== '_item') {\n\t\t\t\tcellElement.sortable = true;\n\t\t\t\tcellElement.className += ' dgrid-sortable';\n\t\t\t}\n\t\t},\n\n\t\tleft: function (cell, steps) {\n\t\t\tif (!cell.element) {\n\t\t\t\tcell = this.cell(cell);\n\t\t\t}\n\t\t\treturn this.cell(this._move(cell, -(steps || 1), 'dgrid-cell'));\n\t\t},\n\t\tright: function (cell, steps) {\n\t\t\tif (!cell.element) {\n\t\t\t\tcell = this.cell(cell);\n\t\t\t}\n\t\t\treturn this.cell(this._move(cell, steps || 1, 'dgrid-cell'));\n\t\t},\n\n\t\t_defaultRenderCell: function (object, value, td) {\n\t\t\t// summary:\n\t\t\t//\t\tDefault renderCell implementation.\n\t\t\t//\t\tNOTE: Called in context of column definition object.\n\t\t\t// object: Object\n\t\t\t//\t\tThe data item for the row currently being rendered\n\t\t\t// value: Mixed\n\t\t\t//\t\tThe value of the field applicable to the current cell\n\t\t\t// td: DOMNode\n\t\t\t//\t\tThe cell element representing the current item/field\n\t\t\t// options: Object?\n\t\t\t//\t\tAny additional options passed through from renderRow\n\n\t\t\tif (this.formatter) {\n\t\t\t\t// Support formatter, with or without formatterScope\n\t\t\t\tvar formatter = this.formatter,\n\t\t\t\t\tformatterScope = this.grid.formatterScope;\n\t\t\t\tvar formattedValue = typeof formatter === 'string' && formatterScope ?\n\t\t\t\t\tformatterScope[formatter](value, object) : this.formatter(value, object);\n\t\t\t\tif (formattedValue != null && formattedValue.hasOwnProperty('html')) {\n\t\t\t\t\ttd.innerHTML = formattedValue.html;\n\t\t\t\t} else if (formattedValue != null) {\n\t\t\t\t\ttd.appendChild(document.createTextNode(formattedValue));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (value != null) {\n\t\t\t\ttd.appendChild(document.createTextNode(value));\n\t\t\t}\n\t\t},\n\n\t\trenderRow: function (item, options) {\n\t\t\tvar row = this.createRowCells('td', lang.hitch(this, '_createBodyRowCell'),\n\t\t\t\toptions && options.subRows, item, options);\n\n\t\t\t// row gets a wrapper div for a couple reasons:\n\t\t\t// 1. So that one can set a fixed height on rows (heights can't be set on <table>'s AFAICT)\n\t\t\t// 2. So that outline style can be set on a row when it is focused,\n\t\t\t// and Safari's outline style is broken on <table>\n\t\t\tvar div = domConstruct.create('div', { role: 'row' });\n\t\t\tdiv.appendChild(row);\n\t\t\treturn div;\n\t\t},\n\n\t\trenderHeader: function () {\n\t\t\t// summary:\n\t\t\t//\t\tSetup the headers for the grid\n\t\t\tvar grid = this,\n\t\t\t\theaderNode = this.headerNode;\n\n\t\t\theaderNode.setAttribute('role', 'row');\n\n\t\t\t// clear out existing header in case we're resetting\n\t\t\tdomConstruct.empty(headerNode);\n\n\t\t\tvar row = this.createRowCells('th', lang.hitch(this, '_createHeaderRowCell'),\n\t\t\t\tthis.subRows && this.subRows.headerRows);\n\t\t\tthis._rowIdToObject[row.id = this.id + '-header'] = this.columns;\n\t\t\theaderNode.appendChild(row);\n\n\t\t\t// If the columns are sortable, re-sort on clicks.\n\t\t\t// Use a separate listener property to be managed by renderHeader in case\n\t\t\t// of subsequent calls.\n\t\t\tif (this._sortListener) {\n\t\t\t\tthis._sortListener.remove();\n\t\t\t}\n\t\t\tthis._sortListener = listen(row, 'click,keydown', function (event) {\n\t\t\t\t// respond to click, space keypress, or enter keypress\n\t\t\t\tif (event.type === 'click' || event.keyCode === 32 ||\n\t\t\t\t\t\t(!has('opera') && event.keyCode === 13)) {\n\t\t\t\t\tvar target = event.target;\n\t\t\t\t\tvar field;\n\t\t\t\t\tvar sort;\n\t\t\t\t\tvar newSort;\n\t\t\t\t\tvar eventObj;\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\tif (target.sortable) {\n\t\t\t\t\t\t\tfield = target.field || target.columnId;\n\t\t\t\t\t\t\tsort = grid.sort[0];\n\t\t\t\t\t\t\tif (!grid.hasNeutralSort || !sort || sort.property !== field || !sort.descending) {\n\t\t\t\t\t\t\t\t// If the user toggled the same column as the active sort,\n\t\t\t\t\t\t\t\t// reverse sort direction\n\t\t\t\t\t\t\t\tnewSort = [{\n\t\t\t\t\t\t\t\t\tproperty: field,\n\t\t\t\t\t\t\t\t\tdescending: sort && sort.property === field &&\n\t\t\t\t\t\t\t\t\t\t!sort.descending\n\t\t\t\t\t\t\t\t}];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// If the grid allows neutral sort and user toggled an already-descending column,\n\t\t\t\t\t\t\t\t// clear sort entirely\n\t\t\t\t\t\t\t\tnewSort = [];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Emit an event with the new sort\n\t\t\t\t\t\t\teventObj = {\n\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t\t\t\tgrid: grid,\n\t\t\t\t\t\t\t\tparentType: event.type,\n\t\t\t\t\t\t\t\tsort: newSort\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tif (listen.emit(event.target, 'dgrid-sort', eventObj)) {\n\t\t\t\t\t\t\t\t// Stash node subject to DOM manipulations,\n\t\t\t\t\t\t\t\t// to be referenced then removed by sort()\n\t\t\t\t\t\t\t\tgrid._sortNode = target;\n\t\t\t\t\t\t\t\tgrid.set('sort', newSort);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} while ((target = target.parentNode) && target !== headerNode);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tresize: function () {\n\t\t\t// extension of List.resize to allow accounting for\n\t\t\t// column sizes larger than actual grid area\n\t\t\tvar headerTableNode = this.headerNode.firstChild,\n\t\t\t\tcontentNode = this.contentNode,\n\t\t\t\twidth;\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Force contentNode width to match up with header width.\n\t\t\tcontentNode.style.width = ''; // reset first\n\t\t\tif (contentNode && headerTableNode) {\n\t\t\t\tif ((width = headerTableNode.offsetWidth) > contentNode.offsetWidth) {\n\t\t\t\t\t// update size of content node if necessary (to match size of rows)\n\t\t\t\t\t// (if headerTableNode can't be found, there isn't much we can do)\n\t\t\t\t\tcontentNode.style.width = width + 'px';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdestroy: function () {\n\t\t\t// Run _destroyColumns first to perform any column plugin tear-down logic.\n\t\t\tthis._destroyColumns();\n\t\t\tif (this._sortListener) {\n\t\t\t\tthis._sortListener.remove();\n\t\t\t}\n\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t_setSort: function () {\n\t\t\t// summary:\n\t\t\t//\t\tExtension of List.js sort to update sort arrow in UI\n\n\t\t\t// Normalize sort first via inherited logic, then update the sort arrow\n\t\t\tthis.inherited(arguments);\n\t\t\tthis.updateSortArrow(this.sort);\n\t\t},\n\n\t\t_findSortArrowParent: function (field) {\n\t\t\t// summary:\n\t\t\t//\t\tMethod responsible for finding cell that sort arrow should be\n\t\t\t//\t\tadded under. Called by updateSortArrow; separated for extensibility.\n\n\t\t\tvar columns = this.columns;\n\t\t\tfor (var i in columns) {\n\t\t\t\tvar column = columns[i];\n\t\t\t\tif (column.field === field) {\n\t\t\t\t\treturn column.headerNode;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateSortArrow: function (sort, updateSort) {\n\t\t\t// summary:\n\t\t\t//\t\tMethod responsible for updating the placement of the arrow in the\n\t\t\t//\t\tappropriate header cell. Typically this should not be called (call\n\t\t\t//\t\tset(\"sort\", ...) when actually updating sort programmatically), but\n\t\t\t//\t\tthis method may be used by code which is customizing sort (e.g.\n\t\t\t//\t\tby reacting to the dgrid-sort event, canceling it, then\n\t\t\t//\t\tperforming logic and calling this manually).\n\t\t\t// sort: Array\n\t\t\t//\t\tStandard sort parameter - array of object(s) containing property name\n\t\t\t//\t\tand optional descending flag\n\t\t\t// updateSort: Boolean?\n\t\t\t//\t\tIf true, will update this.sort based on the passed sort array\n\t\t\t//\t\t(i.e. to keep it in sync when custom logic is otherwise preventing\n\t\t\t//\t\tit from being updated); defaults to false\n\n\t\t\t// Clean up UI from any previous sort\n\t\t\tif (this._lastSortedArrow) {\n\t\t\t\t// Remove the sort classes from the parent node\n\t\t\t\tif (this._lastSortedArrow.parentNode) {\n\t\t\t\t\tdomClass.remove(this._lastSortedArrow.parentNode, 'dgrid-sort-up dgrid-sort-down');\n\t\t\t\t}\n\t\t\t\t// Destroy the lastSortedArrow node\n\t\t\t\tdomConstruct.destroy(this._lastSortedArrow);\n\t\t\t\tdelete this._lastSortedArrow;\n\t\t\t}\n\n\t\t\tif (updateSort) {\n\t\t\t\tthis.sort = sort;\n\t\t\t}\n\t\t\tif (!sort[0]) {\n\t\t\t\treturn; // Nothing to do if no sort is specified\n\t\t\t}\n\n\t\t\tvar prop = sort[0].property,\n\t\t\t\tdesc = sort[0].descending,\n\t\t\t\t// if invoked from header click, target is stashed in _sortNode\n\t\t\t\ttarget = this._sortNode || this._findSortArrowParent(prop),\n\t\t\t\tarrowNode;\n\n\t\t\tdelete this._sortNode;\n\n\t\t\t// Skip this logic if field being sorted isn't actually displayed\n\t\t\tif (target) {\n\t\t\t\ttarget = target.contents || target;\n\t\t\t\t// Place sort arrow under clicked node, and add up/down sort class\n\t\t\t\tarrowNode = this._lastSortedArrow = domConstruct.create('div', {\n\t\t\t\t\tclassName: 'dgrid-sort-arrow ui-icon',\n\t\t\t\t\tinnerHTML: '&nbsp;',\n\t\t\t\t\trole: 'presentation'\n\t\t\t\t}, target, 'first');\n\t\t\t\tdomClass.add(target, 'dgrid-sort-' + (desc ? 'down' : 'up'));\n\t\t\t\t// Call resize in case relocation of sort arrow caused any height changes\n\t\t\t\tthis.resize();\n\t\t\t}\n\t\t},\n\n\t\tstyleColumn: function (colId, css) {\n\t\t\t// summary:\n\t\t\t//\t\tDynamically creates a stylesheet rule to alter a column's style.\n\n\t\t\treturn this.addCssRule('#' + miscUtil.escapeCssIdentifier(this.domNode.id) +\n\t\t\t\t' .dgrid-column-' + replaceInvalidChars(colId), css);\n\t\t},\n\n\t\t/*=====\n\t\t_configColumn: function (column, rowColumns, prefix) {\n\t\t\t// summary:\n\t\t\t//\t\tMethod called when normalizing base configuration of a single\n\t\t\t//\t\tcolumn. Can be used as an extension point for behavior requiring\n\t\t\t//\t\taccess to columns when a new configuration is applied.\n\t\t},=====*/\n\n\t\t_configColumns: function (prefix, rowColumns) {\n\t\t\t// configure the current column\n\t\t\tvar subRow = [],\n\t\t\t\tisArray = rowColumns instanceof Array;\n\n\t\t\tfunction configColumn(column, columnId) {\n\t\t\t\tif (typeof column === 'string') {\n\t\t\t\t\trowColumns[columnId] = column = { label: column };\n\t\t\t\t}\n\t\t\t\tif (!isArray && !column.field) {\n\t\t\t\t\tcolumn.field = columnId;\n\t\t\t\t}\n\t\t\t\tcolumnId = column.id = column.id || (isNaN(columnId) ? columnId : (prefix + columnId));\n\t\t\t\t// allow further base configuration in subclasses\n\t\t\t\tif (this._configColumn) {\n\t\t\t\t\tthis._configColumn(column, rowColumns, prefix);\n\t\t\t\t\t// Allow the subclasses to modify the column id.\n\t\t\t\t\tcolumnId = column.id;\n\t\t\t\t}\n\t\t\t\tif (isArray) {\n\t\t\t\t\tthis.columns[columnId] = column;\n\t\t\t\t}\n\n\t\t\t\t// add grid reference to each column object for potential use by plugins\n\t\t\t\tif (!column.grid) {\n\t\t\t\t\tcolumn.grid = this;\n\t\t\t\t} else {\n\t\t\t\t\tif (column.grid !== this) {\n\t\t\t\t\t\tconsole.warn('Sharing column definition objects with multiple grids is not supported.',\n\t\t\t\t\t\t\tcolumn.grid, this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsubRow.push(column); // make sure it can be iterated on\n\t\t\t}\n\n\t\t\tmiscUtil.each(rowColumns, configColumn, this);\n\t\t\treturn isArray ? rowColumns : subRow;\n\t\t},\n\n\t\t_destroyColumns: function () {\n\t\t\t// summary:\n\t\t\t//\t\tExtension point for column-related cleanup. This is called\n\t\t\t//\t\timmediately before configuring a new column structure,\n\t\t\t//\t\tand when the grid is destroyed.\n\n\t\t\t// First remove rows (since they'll be refreshed after we're done),\n\t\t\t// so that anything temporarily extending removeRow can run.\n\t\t\t// (cleanup will end up running again, but with nothing to iterate.)\n\t\t\tthis.cleanup();\n\t\t},\n\n\t\tconfigStructure: function () {\n\t\t\t// configure the columns and subRows\n\t\t\tvar subRows = this.subRows,\n\t\t\t\tcolumns = this._columns = this.columns;\n\n\t\t\t// Reset this.columns unless it was already passed in as an object\n\t\t\tthis.columns = !columns || columns instanceof Array ? {} : columns;\n\n\t\t\tif (subRows) {\n\t\t\t\t// Process subrows, which will in turn populate the this.columns object\n\t\t\t\tfor (var i = 0; i < subRows.length; i++) {\n\t\t\t\t\tsubRows[i] = this._configColumns(i + '-', subRows[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.subRows = [this._configColumns('', columns)];\n\t\t\t}\n\t\t},\n\n\t\t_getColumns: function () {\n\t\t\t// _columns preserves what was passed to set(\"columns\"), but if subRows\n\t\t\t// was set instead, columns contains the \"object-ified\" version, which\n\t\t\t// was always accessible in the past, so maintain that accessibility going\n\t\t\t// forward.\n\t\t\treturn this._columns || this.columns;\n\t\t},\n\t\t_setColumns: function (columns) {\n\t\t\tthis._destroyColumns();\n\t\t\t// reset instance variables\n\t\t\tthis.subRows = null;\n\t\t\tthis.columns = columns;\n\t\t\t// re-run logic\n\t\t\tthis._updateColumns();\n\t\t},\n\n\t\t_setSubRows: function (subrows) {\n\t\t\tthis._destroyColumns();\n\t\t\tthis.subRows = subrows;\n\t\t\tthis._updateColumns();\n\t\t},\n\n\t\t_updateColumns: function () {\n\t\t\t// summary:\n\t\t\t//\t\tCalled when columns, subRows, or columnSets are reset\n\n\t\t\tthis.configStructure();\n\t\t\tthis.renderHeader();\n\n\t\t\tthis.refresh();\n\t\t\t// re-render last collection if present\n\t\t\tthis._lastCollection && this.renderArray(this._lastCollection);\n\n\t\t\t// After re-rendering the header, re-apply the sort arrow if needed.\n\t\t\tif (this._started) {\n\t\t\t\tif (this.sort.length) {\n\t\t\t\t\tthis._lastSortedArrow = null;\n\t\t\t\t\tthis.updateSortArrow(this.sort);\n\t\t\t\t} else {\n\t\t\t\t\t// Only call resize directly if we didn't call updateSortArrow,\n\t\t\t\t\t// since that calls resize itself when it updates.\n\t\t\t\t\tthis.resize();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tGrid.appendIfNode = appendIfNode;\n\n\treturn Grid;\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/aspect',\n\t'dojo/dom-class',\n\t'dojo/on',\n\t'dojo/_base/lang',\n\t'dojo/has',\n\t'./util/misc',\n\t'dojo/_base/sniff'\n], function (declare, aspect, domClass, on, lang, has, miscUtil) {\n\n\tvar delegatingInputTypes = {\n\t\t\tcheckbox: 1,\n\t\t\tradio: 1,\n\t\t\tbutton: 1\n\t\t},\n\t\thasGridCellClass = /\\bdgrid-cell\\b/,\n\t\thasGridRowClass = /\\bdgrid-row\\b/;\n\n\tvar Keyboard = declare(null, {\n\t\t// summary:\n\t\t//\t\tAdds keyboard navigation capability to a list or grid.\n\n\t\t// pageSkip: Number\n\t\t//\t\tNumber of rows to jump by when page up or page down is pressed.\n\t\tpageSkip: 10,\n\n\t\ttabIndex: 0,\n\n\t\t// keyMap: Object\n\t\t//\t\tHash which maps key codes to functions to be executed (in the context\n\t\t//\t\tof the instance) for key events within the grid's body.\n\t\tkeyMap: null,\n\n\t\t// headerKeyMap: Object\n\t\t//\t\tHash which maps key codes to functions to be executed (in the context\n\t\t//\t\tof the instance) for key events within the grid's header row.\n\t\theaderKeyMap: null,\n\n\t\t// mouseDownEventType: dojo/on compatible event type\n\t\t//\t\tEvent type to use for Keyboard's mouse down listener that sets focus.\n\t\tmouseDownEventType: 'mousedown',\n\n\t\tpostMixInProperties: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif (!this.keyMap) {\n\t\t\t\tthis.keyMap = lang.mixin({}, Keyboard.defaultKeyMap);\n\t\t\t}\n\t\t\tif (!this.headerKeyMap) {\n\t\t\t\tthis.headerKeyMap = lang.mixin({}, Keyboard.defaultHeaderKeyMap);\n\t\t\t}\n\t\t},\n\n\t\tpostCreate: function () {\n\t\t\tthis.inherited(arguments);\n\t\t\tvar grid = this;\n\n\t\t\tfunction handledEvent(event) {\n\t\t\t\t// Text boxes and other inputs that can use direction keys should be ignored\n\t\t\t\t// and not affect cell/row navigation\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn target.type && (!delegatingInputTypes[target.type] || event.keyCode === 32);\n\t\t\t}\n\n\t\t\tfunction enableNavigation(areaNode) {\n\t\t\t\tvar cellNavigation = grid.cellNavigation,\n\t\t\t\t\tisFocusableClass = cellNavigation ? hasGridCellClass : hasGridRowClass,\n\t\t\t\t\tisHeader = areaNode === grid.headerNode,\n\t\t\t\t\tinitialNode = areaNode;\n\n\t\t\t\tfunction initHeader() {\n\t\t\t\t\tif (grid._focusedHeaderNode) {\n\t\t\t\t\t\t// Remove the tab index for the node that previously had it.\n\t\t\t\t\t\tgrid._focusedHeaderNode.tabIndex = -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (grid.showHeader) {\n\t\t\t\t\t\tif (cellNavigation) {\n\t\t\t\t\t\t\t// Get the focused element. Ensure that the focused element\n\t\t\t\t\t\t\t// is actually a grid cell, not a column-set-cell or some\n\t\t\t\t\t\t\t// other cell that should not be focused\n\t\t\t\t\t\t\tvar elements = grid.headerNode.getElementsByTagName('th');\n\t\t\t\t\t\t\tfor (var i = 0, element; (element = elements[i]); ++i) {\n\t\t\t\t\t\t\t\tif (isFocusableClass.test(element.className)) {\n\t\t\t\t\t\t\t\t\tgrid._focusedHeaderNode = initialNode = element;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tgrid._focusedHeaderNode = initialNode = grid.headerNode;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Set the tab index only if the header is visible.\n\t\t\t\t\t\tif (initialNode) {\n\t\t\t\t\t\t\tinitialNode.tabIndex = grid.tabIndex;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction afterContentAdded() {\n\t\t\t\t\t// Ensures the first element of a grid is always keyboard selectable after data has been\n\t\t\t\t\t// retrieved if there is not already a valid focused element.\n\n\t\t\t\t\tvar focusedNode = grid._focusedNode || initialNode;\n\n\t\t\t\t\t// do not update the focused element if we already have a valid one\n\t\t\t\t\tif (isFocusableClass.test(focusedNode.className) && areaNode.contains(focusedNode)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// ensure that the focused element is actually a grid cell, not a\n\t\t\t\t\t// dgrid-preload or dgrid-content element, which should not be focusable,\n\t\t\t\t\t// even when data is loaded asynchronously\n\t\t\t\t\tvar elements = areaNode.getElementsByTagName('*');\n\t\t\t\t\tfor (var i = 0, element; (element = elements[i]); ++i) {\n\t\t\t\t\t\tif (isFocusableClass.test(element.className)) {\n\t\t\t\t\t\t\tfocusedNode = grid._focusedNode = element;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tinitialNode.tabIndex = -1;\n\t\t\t\t\tfocusedNode.tabIndex = grid.tabIndex; // This is initialNode if nothing focusable was found\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (isHeader) {\n\t\t\t\t\t// Initialize header now (since it's already been rendered),\n\t\t\t\t\t// and aspect after future renderHeader calls to reset focus.\n\t\t\t\t\tinitHeader();\n\t\t\t\t\tgrid._listeners.push(aspect.after(grid, 'renderHeader', initHeader, true));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tgrid._listeners.push(\n\t\t\t\t\t\taspect.after(grid, 'renderArray', afterContentAdded, true),\n\t\t\t\t\t\taspect.after(grid, '_onNotification', function (rows, event) {\n\t\t\t\t\t\t\tif (event.totalLength === 0) {\n\t\t\t\t\t\t\t\tareaNode.tabIndex = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (event.totalLength === 1 && event.type === 'add') {\n\t\t\t\t\t\t\t\tafterContentAdded();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, true)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tgrid._listeners.push(on(areaNode, grid.mouseDownEventType, function (event) {\n\t\t\t\t\tif (!handledEvent(event)) {\n\t\t\t\t\t\tgrid._focusOnNode(event.target, isHeader, event);\n\t\t\t\t\t}\n\t\t\t\t}));\n\n\t\t\t\tgrid._listeners.push(on(areaNode, 'keydown', function (event) {\n\t\t\t\t\t// For now, don't squash browser-specific functionalities by letting\n\t\t\t\t\t// ALT and META function as they would natively\n\t\t\t\t\tif (event.metaKey || event.altKey) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar handler = grid[isHeader ? 'headerKeyMap' : 'keyMap'][event.keyCode];\n\n\t\t\t\t\t// Text boxes and other inputs that can use direction keys should be ignored\n\t\t\t\t\t// and not affect cell/row navigation\n\t\t\t\t\tif (handler && !handledEvent(event)) {\n\t\t\t\t\t\thandler.call(grid, event);\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}\n\n\t\t\tif (this.tabableHeader) {\n\t\t\t\tenableNavigation(this.headerNode);\n\t\t\t\ton(this.headerNode, 'dgrid-cellfocusin', function () {\n\t\t\t\t\tgrid.scrollTo({ x: this.scrollLeft });\n\t\t\t\t});\n\t\t\t}\n\t\t\tenableNavigation(this.contentNode);\n\n\t\t\tthis._debouncedEnsureScroll = miscUtil.debounce(this._ensureScroll, this);\n\t\t},\n\n\t\t_pruneRow: function () {\n\t\t\t// If rows are being pruned for scrolling, then don't try to restore focus.\n\t\t\tvar savedFocusedNode = this._focusedNode;\n\t\t\tthis._focusedNode = null;\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._focusedNode = savedFocusedNode;\n\t\t},\n\n\t\tremoveRow: function (rowElement) {\n\t\t\tif (!this._focusedNode) {\n\t\t\t\t// Nothing special to do if we have no record of anything focused\n\t\t\t\treturn this.inherited(arguments);\n\t\t\t}\n\n\t\t\tvar self = this,\n\t\t\t\tisActive = document.activeElement === this._focusedNode,\n\t\t\t\tfocusedTarget = this[this.cellNavigation ? 'cell' : 'row'](this._focusedNode),\n\t\t\t\tfocusedRow = focusedTarget.row || focusedTarget,\n\t\t\t\tsibling;\n\t\t\trowElement = rowElement.element || rowElement;\n\n\t\t\t// If removed row previously had focus, temporarily store information\n\t\t\t// to be handled in an immediately-following insertRow call, or next turn\n\t\t\tif (rowElement === focusedRow.element) {\n\t\t\t\tsibling = this.down(focusedRow, 1, true);\n\n\t\t\t\t// Check whether down call returned the same row, or failed to return\n\t\t\t\t// any (e.g. during a partial unrendering)\n\t\t\t\tif (!sibling || sibling.element === rowElement) {\n\t\t\t\t\tsibling = this.up(focusedRow, 1, true);\n\t\t\t\t}\n\n\t\t\t\tthis._removedFocus = {\n\t\t\t\t\tactive: isActive,\n\t\t\t\t\trowId: focusedRow.id,\n\t\t\t\t\tcolumnId: focusedTarget.column && focusedTarget.column.id,\n\t\t\t\t\tsiblingId: !sibling || sibling.element === rowElement ? undefined : sibling.id\n\t\t\t\t};\n\n\t\t\t\t// Call _restoreFocus on next turn, to restore focus to sibling\n\t\t\t\t// if no replacement row was immediately inserted.\n\t\t\t\t// Pass original row's id in case it was re-inserted in a renderArray\n\t\t\t\t// call (and thus was found, but couldn't be focused immediately)\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tif (self._removedFocus) {\n\t\t\t\t\t\tself._restoreFocus(focusedRow.id);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\n\t\t\t\t// Clear _focusedNode until _restoreFocus is called, to avoid\n\t\t\t\t// needlessly re-running this logic\n\t\t\t\tthis._focusedNode = null;\n\t\t\t}\n\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\tinsertRow: function () {\n\t\t\tvar rowElement = this.inherited(arguments);\n\t\t\tif (this._removedFocus && !this._removedFocus.wait) {\n\t\t\t\tthis._restoreFocus(rowElement);\n\t\t\t}\n\t\t\treturn rowElement;\n\t\t},\n\n\t\t_restoreFocus: function (row) {\n\t\t\t// summary:\n\t\t\t//\t\tRestores focus to the newly inserted row if it matches the\n\t\t\t//\t\tpreviously removed row, or to the nearest sibling otherwise.\n\t\t\tvar focusInfo = this._removedFocus,\n\t\t\t\tnewTarget,\n\t\t\t\tcell;\n\n\t\t\trow = row && this.row(row);\n\t\t\tnewTarget = row && row.element && row.id === focusInfo.rowId ? row :\n\t\t\t\ttypeof focusInfo.siblingId !== 'undefined' && this.row(focusInfo.siblingId);\n\n\t\t\tif (newTarget && newTarget.element) {\n\t\t\t\tif (!newTarget.element.parentNode.parentNode) {\n\t\t\t\t\t// This was called from renderArray, so the row hasn't\n\t\t\t\t\t// actually been placed in the DOM yet; handle it on the next\n\t\t\t\t\t// turn (called from removeRow).\n\t\t\t\t\tfocusInfo.wait = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Should focus be on a cell?\n\t\t\t\tif (typeof focusInfo.columnId !== 'undefined') {\n\t\t\t\t\tcell = this.cell(newTarget, focusInfo.columnId);\n\t\t\t\t\tif (cell && cell.element) {\n\t\t\t\t\t\tnewTarget = cell;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (focusInfo.active && newTarget.element.offsetHeight !== 0) {\n\t\t\t\t\t// Row/cell was previously focused and is visible, so focus the new one immediately\n\t\t\t\t\tthis._focusOnNode(newTarget, false, null);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Row/cell was not focused or is not visible, but we still need to\n\t\t\t\t\t// update _focusedNode and the element's tabIndex/class\n\t\t\t\t\tdomClass.add(newTarget.element, 'dgrid-focus');\n\t\t\t\t\tnewTarget.element.tabIndex = this.tabIndex;\n\t\t\t\t\tthis._focusedNode = newTarget.element;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this._removedFocus;\n\t\t},\n\n\t\taddKeyHandler: function (key, callback, isHeader) {\n\t\t\t// summary:\n\t\t\t//\t\tAdds a handler to the keyMap on the instance.\n\t\t\t//\t\tSupports binding additional handlers to already-mapped keys.\n\t\t\t// key: Number\n\t\t\t//\t\tKey code representing the key to be handled.\n\t\t\t// callback: Function\n\t\t\t//\t\tCallback to be executed (in instance context) when the key is pressed.\n\t\t\t// isHeader: Boolean\n\t\t\t//\t\tWhether the handler is to be added for the grid body (false, default)\n\t\t\t//\t\tor the header (true).\n\n\t\t\t// Aspects may be about 10% slower than using an array-based appraoch,\n\t\t\t// but there is significantly less code involved (here and above).\n\t\t\tvar handle = aspect.after( // Handle\n\t\t\t\tthis[isHeader ? 'headerKeyMap' : 'keyMap'], key, callback, true);\n\t\t\tthis._listeners.push(handle);\n\t\t\treturn handle;\n\t\t},\n\n\t\t_ensureRowScroll: function (rowElement) {\n\t\t\t// summary:\n\t\t\t//\t\tEnsures that the entire row is visible within the viewport.\n\t\t\t//\t\tCalled for cell navigation in complex structures.\n\n\t\t\tvar scrollY = this.getScrollPosition().y;\n\t\t\tif (scrollY > rowElement.offsetTop) {\n\t\t\t\t// Row starts above the viewport\n\t\t\t\tthis.scrollTo({ y: rowElement.offsetTop });\n\t\t\t}\n\t\t\telse if (scrollY + this.contentNode.offsetHeight < rowElement.offsetTop + rowElement.offsetHeight) {\n\t\t\t\t// Row ends below the viewport\n\t\t\t\tthis.scrollTo({ y: rowElement.offsetTop - this.contentNode.offsetHeight + rowElement.offsetHeight });\n\t\t\t}\n\t\t},\n\n\t\t_ensureColumnScroll: function (cellElement) {\n\t\t\t// summary:\n\t\t\t//\t\tEnsures that the entire cell is visible in the viewport.\n\t\t\t//\t\tCalled in cases where the grid can scroll horizontally.\n\n\t\t\tvar scrollX = this.getScrollPosition().x;\n\t\t\tvar cellLeft = cellElement.offsetLeft;\n\t\t\tif (scrollX > cellLeft) {\n\t\t\t\tthis.scrollTo({ x: cellLeft });\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar bodyWidth = this.bodyNode.clientWidth;\n\t\t\t\tvar cellWidth = cellElement.offsetWidth;\n\t\t\t\tvar cellRight = cellLeft + cellWidth;\n\t\t\t\tif (scrollX + bodyWidth < cellRight) {\n\t\t\t\t\t// Adjust so that the right side of the cell and grid body align,\n\t\t\t\t\t// unless the cell is actually wider than the body - then align the left sides\n\t\t\t\t\tthis.scrollTo({ x: bodyWidth > cellWidth ? cellRight - bodyWidth : cellLeft });\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_ensureScroll: function (rowOrCell, isHeader) {\n\t\t\t// summary:\n\t\t\t//\t\tCorrects scroll based on the position of the newly-focused row/cell\n\t\t\t//\t\tas necessary based on grid configuration and dimensions.\n\t\t\tvar isRow = !rowOrCell.column && !rowOrCell.row && rowOrCell.data && rowOrCell.element;\n\n\t\t\tif (isRow) {\n\t\t\t\tthis._ensureRowScroll(rowOrCell.element);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this.cellNavigation && (this.columnSets || this.subRows.length > 1) && !isHeader) {\n\t\t\t\t\tthis._ensureRowScroll(rowOrCell.row.element);\n\t\t\t\t}\n\t\t\t\tif (this.bodyNode.clientWidth < this.contentNode.offsetWidth) {\n\t\t\t\t\tthis._ensureColumnScroll(rowOrCell.element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_focusOnNode: function (element, isHeader, event) {\n\t\t\tvar focusedNodeProperty = '_focused' + (isHeader ? 'Header' : '') + 'Node',\n\t\t\t\tfocusedNode = this[focusedNodeProperty],\n\t\t\t\tcellOrRowType = this.cellNavigation ? 'cell' : 'row',\n\t\t\t\tcell = this[cellOrRowType](element),\n\t\t\t\tinputs,\n\t\t\t\tinput,\n\t\t\t\tnumInputs,\n\t\t\t\tinputFocused,\n\t\t\t\ti;\n\n\t\t\telement = cell && cell.element;\n\t\t\tif (!element) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.cellNavigation) {\n\t\t\t\tinputs = element.getElementsByTagName('input');\n\t\t\t\tfor (i = 0, numInputs = inputs.length; i < numInputs; i++) {\n\t\t\t\t\tinput = inputs[i];\n\t\t\t\t\tif ((input.tabIndex !== -1 || '_dgridLastValue' in input) && !input.disabled) {\n\t\t\t\t\t\tinput.focus();\n\t\t\t\t\t\tinputFocused = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set up event information for dgrid-cellfocusout/in events.\n\t\t\t// Note that these events are not fired for _restoreFocus.\n\t\t\tif (event !== null) {\n\t\t\t\tevent = lang.mixin({ grid: this }, event);\n\t\t\t\tif (event.type) {\n\t\t\t\t\tevent.parentType = event.type;\n\t\t\t\t}\n\t\t\t\tif (!event.bubbles) {\n\t\t\t\t\t// IE doesn't always have a bubbles property already true.\n\t\t\t\t\t// Opera throws if you try to set it to true if it is already true.\n\t\t\t\t\tevent.bubbles = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (focusedNode) {\n\t\t\t\t// Clean up previously-focused element\n\t\t\t\t// Remove the class name and the tabIndex attribute\n\t\t\t\tdomClass.remove(focusedNode, 'dgrid-focus');\n\t\t\t\tfocusedNode.removeAttribute('tabindex');\n\n\t\t\t\t// Expose object representing focused cell or row losing focus, via\n\t\t\t\t// event.cell or event.row; which is set depends on cellNavigation.\n\t\t\t\tif (event) {\n\t\t\t\t\tevent[cellOrRowType] = this[cellOrRowType](focusedNode);\n\t\t\t\t\ton.emit(focusedNode, 'dgrid-cellfocusout', event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfocusedNode = this[focusedNodeProperty] = element;\n\n\t\t\tif (event) {\n\t\t\t\t// Expose object representing focused cell or row gaining focus, via\n\t\t\t\t// event.cell or event.row; which is set depends on cellNavigation.\n\t\t\t\t// Note that yes, the same event object is being reused; on.emit\n\t\t\t\t// performs a shallow copy of properties into a new event object.\n\t\t\t\tevent[cellOrRowType] = cell;\n\t\t\t}\n\n\t\t\tvar isFocusableClass = this.cellNavigation ? hasGridCellClass : hasGridRowClass;\n\t\t\tif (!inputFocused && isFocusableClass.test(element.className)) {\n\t\t\t\telement.tabIndex = this.tabIndex;\n\t\t\t\telement.focus();\n\t\t\t}\n\t\t\tdomClass.add(element, 'dgrid-focus');\n\n\t\t\tif (event) {\n\t\t\t\ton.emit(focusedNode, 'dgrid-cellfocusin', event);\n\t\t\t}\n\n\t\t\tthis._debouncedEnsureScroll(cell, isHeader);\n\t\t},\n\n\t\tfocusHeader: function (element) {\n\t\t\tthis._focusOnNode(element || this._focusedHeaderNode, true);\n\t\t},\n\n\t\tfocus: function (element) {\n\t\t\tvar node = element || this._focusedNode;\n\t\t\tif (node) {\n\t\t\t\tthis._focusOnNode(node, false);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this._removedFocus) {\n\t\t\t\t\tthis._removedFocus.active = true;\n\t\t\t\t}\n\t\t\t\tthis.contentNode.focus();\n\t\t\t}\n\t\t}\n\t});\n\n\t// Common functions used in default keyMap (called in instance context)\n\n\tvar moveFocusVertical = Keyboard.moveFocusVertical = function (event, steps) {\n\t\t// if there is no _focusNode (for example, when the grid doesn't have data) don't try to find the next focus row/cell\n\t\tif (!this._focusedNode) {\n\t\t\treturn;\n\t\t}\n\n\t\t// don't attempt navigation if a cell or row is not currently focused\n\t\t// this can happen if empty space within the grid has been clicked\n\t\tif (event.target === this.contentNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar cellNavigation = this.cellNavigation;\n\t\tvar target = this[cellNavigation ? 'cell' : 'row'](event);\n\t\tvar columnId = cellNavigation && target.column.id;\n\t\tvar next = this.down(this._focusedNode, steps, true);\n\n\t\t// Navigate within same column if cell navigation is enabled\n\t\tif (cellNavigation) {\n\t\t\tnext = this.cell(next, columnId);\n\t\t}\n\t\tthis._focusOnNode(next, false, event);\n\n\t\tevent.preventDefault();\n\t};\n\n\tvar moveFocusUp = Keyboard.moveFocusUp = function (event) {\n\t\tmoveFocusVertical.call(this, event, -1);\n\t};\n\n\tvar moveFocusDown = Keyboard.moveFocusDown = function (event) {\n\t\tmoveFocusVertical.call(this, event, 1);\n\t};\n\n\tvar moveFocusPageUp = Keyboard.moveFocusPageUp = function (event) {\n\t\tmoveFocusVertical.call(this, event, -this.pageSkip);\n\t};\n\n\tvar moveFocusPageDown = Keyboard.moveFocusPageDown = function (event) {\n\t\tmoveFocusVertical.call(this, event, this.pageSkip);\n\t};\n\n\tvar moveFocusHorizontal = Keyboard.moveFocusHorizontal = function (event, steps) {\n\t\tif (!this.cellNavigation) {\n\t\t\treturn;\n\t\t}\n\n\t\t// don't attempt navigation if a cell or row is not currently focused\n\t\t// this can happen if empty space within the grid has been clicked\n\t\tif (event.target === this.contentNode) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar isHeader = !this.row(event); // header reports row as undefined\n\t\tvar currentNode = this['_focused' + (isHeader ? 'Header' : '') + 'Node'];\n\n\t\tthis._focusOnNode(this.right(currentNode, steps), isHeader, event);\n\t\tevent.preventDefault();\n\t};\n\n\tvar moveFocusLeft = Keyboard.moveFocusLeft = function (event) {\n\t\tmoveFocusHorizontal.call(this, event, -1);\n\t};\n\n\tvar moveFocusRight = Keyboard.moveFocusRight = function (event) {\n\t\tmoveFocusHorizontal.call(this, event, 1);\n\t};\n\n\tvar moveHeaderFocusEnd = Keyboard.moveHeaderFocusEnd = function (event, scrollToBeginning) {\n\t\t// Header case is always simple, since all rows/cells are present\n\t\tvar nodes;\n\t\tif (this.cellNavigation) {\n\t\t\tnodes = this.headerNode.getElementsByTagName('th');\n\t\t\tthis._focusOnNode(nodes[scrollToBeginning ? 0 : nodes.length - 1], true, event);\n\t\t}\n\t\t// In row-navigation mode, there's nothing to do - only one row in header\n\n\t\t// Prevent browser from scrolling entire page\n\t\tevent.preventDefault();\n\t};\n\n\tvar moveHeaderFocusHome = Keyboard.moveHeaderFocusHome = function (event) {\n\t\tmoveHeaderFocusEnd.call(this, event, true);\n\t};\n\n\tvar moveFocusEnd = Keyboard.moveFocusEnd = function (event, scrollToTop) {\n\t\t// summary:\n\t\t//\t\tHandles requests to scroll to the beginning or end of the grid.\n\n\t\tvar cellNavigation = this.cellNavigation,\n\t\t\tcontentNode = this.contentNode,\n\t\t\tcontentPos = scrollToTop ? 0 : contentNode.scrollHeight,\n\t\t\tscrollPos = contentNode.scrollTop + contentPos,\n\t\t\tendChild = contentNode[scrollToTop ? 'firstChild' : 'lastChild'],\n\t\t\thasPreload = endChild.className.indexOf('dgrid-preload') > -1,\n\t\t\tendTarget = hasPreload ? endChild[(scrollToTop ? 'next' : 'previous') + 'Sibling'] : endChild,\n\t\t\thandle;\n\n\t\t// Scroll explicitly rather than relying on native browser scrolling\n\t\t// (which might use smooth scrolling, which could incur extra renders for OnDemandList)\n\t\tevent.preventDefault();\n\t\tthis.scrollTo({\n\t\t\ty: scrollPos\n\t\t});\n\n\t\tif (hasPreload) {\n\t\t\t// Find the nearest dgrid-row to the relevant end of the grid\n\t\t\twhile (endTarget && endTarget.className.indexOf('dgrid-row') < 0) {\n\t\t\t\tendTarget = endTarget[(scrollToTop ? 'next' : 'previous') + 'Sibling'];\n\t\t\t}\n\t\t\t// If none is found, there are no rows, and nothing to navigate\n\t\t\tif (!endTarget) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Grid content may be lazy-loaded, so check if content needs to be\n\t\t// loaded first\n\t\tif (!hasPreload || endChild.offsetHeight < 1) {\n\t\t\t// End row is loaded; focus the first/last row/cell now\n\t\t\tif (cellNavigation) {\n\t\t\t\t// Preserve column that was currently focused\n\t\t\t\tendTarget = this.cell(endTarget, this.cell(event).column.id);\n\t\t\t}\n\t\t\tthis._focusOnNode(endTarget, false, event);\n\t\t}\n\t\telse {\n\t\t\t// In IE < 9, the event member references will become invalid by the time\n\t\t\t// _focusOnNode is called, so make a (shallow) copy up-front\n\t\t\tif (!has('dom-addeventlistener')) {\n\t\t\t\tevent = lang.mixin({}, event);\n\t\t\t}\n\n\t\t\t// If the topmost/bottommost row rendered doesn't reach the top/bottom of\n\t\t\t// the contentNode, we are using OnDemandList and need to wait for more\n\t\t\t// data to render, then focus the first/last row in the new content.\n\t\t\thandle = aspect.after(this, 'renderArray', function (rows) {\n\t\t\t\tvar target = rows[scrollToTop ? 0 : rows.length - 1];\n\t\t\t\tif (cellNavigation) {\n\t\t\t\t\t// Preserve column that was currently focused\n\t\t\t\t\ttarget = this.cell(target, this.cell(event).column.id);\n\t\t\t\t}\n\t\t\t\tthis._focusOnNode(target, false, event);\n\t\t\t\thandle.remove();\n\t\t\t\treturn rows;\n\t\t\t});\n\t\t\tthis._listeners.push(handle);\n\t\t}\n\t};\n\n\tvar moveFocusHome = Keyboard.moveFocusHome = function (event) {\n\t\tmoveFocusEnd.call(this, event, true);\n\t};\n\n\tfunction preventDefault(event) {\n\t\tevent.preventDefault();\n\t}\n\n\tKeyboard.defaultKeyMap = {\n\t\t32: preventDefault, // space\n\t\t33: moveFocusPageUp, // page up\n\t\t34: moveFocusPageDown, // page down\n\t\t35: moveFocusEnd, // end\n\t\t36: moveFocusHome, // home\n\t\t37: moveFocusLeft, // left\n\t\t38: moveFocusUp, // up\n\t\t39: moveFocusRight, // right\n\t\t40: moveFocusDown // down\n\t};\n\n\t// Header needs fewer default bindings (no vertical), so bind it separately\n\tKeyboard.defaultHeaderKeyMap = {\n\t\t32: preventDefault, // space\n\t\t35: moveHeaderFocusEnd, // end\n\t\t36: moveHeaderFocusHome, // home\n\t\t37: moveFocusLeft, // left\n\t\t39: moveFocusRight // right\n\t};\n\n\treturn Keyboard;\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/_base/lang',\n\t'dojo/dom-class',\n\t'dojo/dom-construct',\n\t'dojo/on',\n\t'dojo/query',\n\t'dojo/sniff',\n\t'./util/misc'\n], function (declare, lang, domClass, domConstruct, listen, query, has, miscUtil) {\n\t// Add user agent/feature CSS classes needed for structural CSS\n\tvar featureClasses = [];\n\tif (has('mozilla')) {\n\t\tfeatureClasses.push('has-mozilla');\n\t}\n\tif (has('touch')) {\n\t\tfeatureClasses.push('has-touch');\n\t}\n\tdomClass.add(document.documentElement, featureClasses);\n\n\t// Add a feature test for pointer (only Dojo 1.10 has pointer-events and MSPointer tests)\n\thas.add('pointer', function (global) {\n\t\treturn 'PointerEvent' in global ? 'pointer' :\n\t\t\t'MSPointerEvent' in global ? 'MSPointer' : false;\n\t});\n\n\tvar oddClass = 'dgrid-row-odd',\n\t\tevenClass = 'dgrid-row-even',\n\t\tscrollbarWidth, scrollbarHeight;\n\n\tfunction byId(id, context) {\n\t\t// document.getElementById only works for elements in the document\n\t\t// dojo/query with the context parameter works for descendants of 'context' even when it is not in the document\n\t\treturn query('#' + miscUtil.escapeCssIdentifier(id), context)[0];\n\t}\n\n\tfunction cleanupTestElement(element) {\n\t\telement.className = '';\n\t\tif (element.parentNode) {\n\t\t\tdocument.body.removeChild(element);\n\t\t}\n\t}\n\n\tfunction getScrollbarSize(element, dimension) {\n\t\t// Used by has tests for scrollbar width/height\n\t\telement.className = 'dgrid-scrollbar-measure';\n\t\tdocument.body.appendChild(element);\n\t\tvar size = element['offset' + dimension] - element['client' + dimension];\n\t\tcleanupTestElement(element);\n\t\treturn size;\n\t}\n\thas.add('dom-scrollbar-width', function (global, doc, element) {\n\t\treturn getScrollbarSize(element, 'Width');\n\t});\n\thas.add('dom-scrollbar-height', function (global, doc, element) {\n\t\treturn getScrollbarSize(element, 'Height');\n\t});\n\n\thas.add('dom-rtl-scrollbar-left', function (global, doc, element) {\n\t\tvar div = document.createElement('div'),\n\t\t\tisLeft;\n\n\t\telement.className = 'dgrid-scrollbar-measure';\n\t\telement.setAttribute('dir', 'rtl');\n\t\telement.appendChild(div);\n\t\tdocument.body.appendChild(element);\n\n\t\t// position: absolute makes modern IE and Edge always report child's offsetLeft as 0,\n\t\t// but other browsers factor in the position of the scrollbar if it is to the left.\n\t\t// All versions of IE and Edge are known to move the scrollbar to the left side for rtl.\n\t\tisLeft = !!has('ie') || !!has('trident') || /\\bEdge\\//.test(navigator.userAgent) ||\n\t\t\tdiv.offsetLeft >= has('dom-scrollbar-width');\n\t\tcleanupTestElement(element);\n\t\tdomConstruct.destroy(div);\n\t\telement.removeAttribute('dir');\n\t\treturn isLeft;\n\t});\n\n\t// var and function for autogenerating ID when one isn't provided\n\tvar autoId = 0;\n\tfunction generateId() {\n\t\treturn List.autoIdPrefix + autoId++;\n\t}\n\n\t// common functions for class and className setters/getters\n\t// (these are run in instance context)\n\tfunction setClass(cls) {\n\t\tdomClass.replace(this.domNode, cls, this._class || '');\n\n\t\t// Store for later retrieval/removal.\n\t\tthis._class = cls;\n\t}\n\tfunction getClass() {\n\t\treturn this._class;\n\t}\n\n\t// window resize event handler, run in context of List instance\n\tvar winResizeHandler = function () {\n\t\tif (this._started) {\n\t\t\tthis.resize();\n\t\t}\n\t};\n\n\tvar List = declare(null, {\n\t\ttabableHeader: false,\n\n\t\t// showHeader: Boolean\n\t\t//\t\tWhether to render header (sub)rows.\n\t\tshowHeader: false,\n\n\t\t// showFooter: Boolean\n\t\t//\t\tWhether to render footer area. Extensions which display content\n\t\t//\t\tin the footer area should set this to true.\n\t\tshowFooter: false,\n\n\t\t// maintainOddEven: Boolean\n\t\t//\t\tWhether to maintain the odd/even classes when new rows are inserted.\n\t\t//\t\tThis can be disabled to improve insertion performance if odd/even styling is not employed.\n\t\tmaintainOddEven: true,\n\n\t\t// cleanAddedRules: Boolean\n\t\t//\t\tWhether to track rules added via the addCssRule method to be removed\n\t\t//\t\twhen the list is destroyed. Note this is effective at the time of\n\t\t//\t\tthe call to addCssRule, not at the time of destruction.\n\t\tcleanAddedRules: true,\n\n\t\t// addUiClasses: Boolean\n\t\t//\t\tWhether to add jQuery UI classes to various elements in dgrid's DOM.\n\t\taddUiClasses: true,\n\n\t\t// highlightDuration: Integer\n\t\t//\t\tThe amount of time (in milliseconds) that a row should remain\n\t\t//\t\thighlighted after it has been updated.\n\t\thighlightDuration: 250,\n\n\t\t// resizeThrottleDelay: Integer\n\t\t//\t\tThe delay (in milliseconds) passed to the resizeThrottleMethod.\n\t\t//\t\tA lower value will provide more responsive grid resizing. If there are a large number of grids on\n\t\t//\t\tthe page, a higher value can improve performance (or specify 'debounce' for 'resizeThrottleMethod').\n\t\tresizeThrottleDelay: miscUtil.defaultDelay,\n\n\t\t// resizeThrottleMethod: String or Function\n\t\t//\t\tString: the name of a method from dgrid/util/misc ('debounce', 'throttle', 'throttleDelayed') to throttle or debounce the window resize handler.\n\t\t//\t\tFunction: a function to throttle or debounce the window resize handler. The function will receive\n\t\t//\t\ttwo parameters:\n\t\t//\t\t\tcallback (Function): the function to be throttled\n\t\t//\t\t\tdelay (Integer): the value of the resizeThrottleDelay property\n\t\t//\t\tThe function must return a function that executes the callback function.\n\t\tresizeThrottleMethod: 'throttleDelayed',\n\n\t\tpostscript: function (params, srcNodeRef) {\n\t\t\t// perform setup and invoke create in postScript to allow descendants to\n\t\t\t// perform logic before create/postCreate happen (a la dijit/_WidgetBase)\n\t\t\tvar grid = this;\n\n\t\t\t(this._Row = function (id, object, element) {\n\t\t\t\tthis.id = id;\n\t\t\t\tthis.data = object;\n\t\t\t\tthis.element = element;\n\t\t\t}).prototype.remove = function () {\n\t\t\t\tgrid.removeRow(this.element);\n\t\t\t};\n\n\t\t\tif (srcNodeRef) {\n\t\t\t\t// normalize srcNodeRef and store on instance during create process.\n\t\t\t\t// Doing this in postscript is a bit earlier than dijit would do it,\n\t\t\t\t// but allows subclasses to access it pre-normalized during create.\n\t\t\t\tthis.srcNodeRef = srcNodeRef =\n\t\t\t\t\tsrcNodeRef.nodeType ? srcNodeRef : byId(srcNodeRef);\n\t\t\t}\n\t\t\tthis.create(params, srcNodeRef);\n\t\t},\n\t\tlistType: 'list',\n\n\t\tcreate: function (params, srcNodeRef) {\n\t\t\tvar domNode = this.domNode = srcNodeRef || document.createElement('div'),\n\t\t\t\tcls;\n\n\t\t\tif (params) {\n\t\t\t\tthis.params = params;\n\t\t\t\tdeclare.safeMixin(this, params);\n\n\t\t\t\t// Check for initial class or className in params or on domNode\n\t\t\t\tcls = params['class'] || params.className || domNode.className;\n\t\t\t}\n\n\t\t\t// ensure arrays and hashes are initialized\n\t\t\tthis.sort = this.sort || [];\n\t\t\tthis._listeners = [];\n\t\t\tthis._rowIdToObject = {};\n\n\t\t\tthis.postMixInProperties && this.postMixInProperties();\n\n\t\t\t// Apply id to widget and domNode,\n\t\t\t// from incoming node, widget params, or autogenerated.\n\t\t\tthis.id = domNode.id = domNode.id || this.id || generateId();\n\n\t\t\t// Perform initial rendering, and apply classes if any were specified.\n\t\t\tthis.buildRendering();\n\t\t\tif (cls) {\n\t\t\t\tsetClass.call(this, cls);\n\t\t\t}\n\n\t\t\tthis.postCreate();\n\n\t\t\t// remove srcNodeRef instance property post-create\n\t\t\tdelete this.srcNodeRef;\n\t\t\t// to preserve \"it just works\" behavior, call startup if we're visible\n\t\t\tif (this.domNode.offsetHeight) {\n\t\t\t\tthis.startup();\n\t\t\t}\n\t\t},\n\t\tbuildRendering: function () {\n\t\t\tvar domNode = this.domNode,\n\t\t\t\taddUiClasses = this.addUiClasses,\n\t\t\t\tself = this,\n\t\t\t\theaderNode,\n\t\t\t\tbodyNode,\n\t\t\t\tfooterNode,\n\t\t\t\tisRTL,\n\t\t\t\tthrottledResizeHandler;\n\n\t\t\t// Detect RTL on html/body nodes; taken from dojo/dom-geometry\n\t\t\tisRTL = this.isRTL = (document.body.dir || document.documentElement.dir ||\n\t\t\t\tdocument.body.style.direction).toLowerCase() === 'rtl';\n\n\t\t\t// Clear out className (any pre-applied classes will be re-applied via the\n\t\t\t// class / className setter), then apply standard classes/attributes\n\t\t\tdomNode.className = '';\n\n\t\t\tdomNode.setAttribute('role', 'grid');\n\t\t\tdomClass.add(domNode, 'dgrid dgrid-' + this.listType +\n\t\t\t\t(addUiClasses ? ' ui-widget' : ''));\n\n\t\t\t// Place header node (initially hidden if showHeader is false).\n\t\t\theaderNode = this.headerNode = domConstruct.create('div', {\n\t\t\t\tclassName: 'dgrid-header dgrid-header-row' + (addUiClasses ? ' ui-widget-header' : '') +\n\t\t\t\t\t(this.showHeader ? '' : ' dgrid-header-hidden')\n\t\t\t}, domNode);\n\n\t\t\tbodyNode = this.bodyNode = domConstruct.create('div', {\n\t\t\t\tclassName: 'dgrid-scroller'\n\t\t\t}, domNode);\n\n\t\t\t// Firefox 4+ adds overflow: auto elements to the tab index by default;\n\t\t\t// force them to not be tabbable, but restrict this to Firefox,\n\t\t\t// since it breaks accessibility support in other browsers\n\t\t\tif (has('ff')) {\n\t\t\t\tbodyNode.tabIndex = -1;\n\t\t\t}\n\n\t\t\tthis.headerScrollNode = domConstruct.create('div', {\n\t\t\t\tclassName: 'dgrid-header dgrid-header-scroll dgrid-scrollbar-width' +\n\t\t\t\t\t(addUiClasses ? ' ui-widget-header' : '')\n\t\t\t}, domNode);\n\n\t\t\t// Place footer node (initially hidden if showFooter is false).\n\t\t\tfooterNode = this.footerNode = domConstruct.create('div', {\n\t\t\t\tclassName: 'dgrid-footer' + (this.showFooter ? '' : ' dgrid-footer-hidden')\n\t\t\t}, domNode);\n\n\t\t\tif (isRTL) {\n\t\t\t\tdomNode.className += ' dgrid-rtl' +\n\t\t\t\t\t(has('dom-rtl-scrollbar-left') ? ' dgrid-rtl-swap' : '');\n\t\t\t}\n\n\t\t\tlisten(bodyNode, 'scroll', function (event) {\n\t\t\t\tif (self.showHeader) {\n\t\t\t\t\t// keep the header aligned with the body\n\t\t\t\t\theaderNode.scrollLeft = event.scrollLeft || bodyNode.scrollLeft;\n\t\t\t\t}\n\t\t\t\t// re-fire, since browsers are not consistent about propagation here\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tlisten.emit(domNode, 'scroll', {scrollTarget: bodyNode});\n\t\t\t});\n\t\t\tthis.configStructure();\n\t\t\tthis.renderHeader();\n\n\t\t\tthis.contentNode = this.touchNode = domConstruct.create('div', {\n\t\t\t\tclassName: 'dgrid-content' + (addUiClasses ? ' ui-widget-content' : '')\n\t\t\t}, this.bodyNode);\n\n\t\t\tif (typeof this.resizeThrottleMethod === 'string' && miscUtil[this.resizeThrottleMethod]) {\n\t\t\t\tthrottledResizeHandler = miscUtil[this.resizeThrottleMethod](winResizeHandler, this, this.resizeThrottleDelay);\n\t\t\t} else if (typeof this.resizeThrottleMethod === 'function') {\n\t\t\t\tthrottledResizeHandler = this.resizeThrottleMethod(lang.hitch(this, winResizeHandler), this.resizeThrottleDelay);\n\t\t\t} else {\n\t\t\t\tconsole.warn('Invalid value specified for resizeThrottleMethod: ' + this.resizeThrottleMethod);\n\t\t\t\tthrottledResizeHandler = miscUtil.throttleDelayed(winResizeHandler, this, this.resizeThrottleDelay);\n\t\t\t}\n\n\t\t\t// add window resize handler, with reference for later removal if needed\n\t\t\tthis._resizeHandle = listen(window, 'resize', throttledResizeHandler);\n\t\t\tthis._listeners.push(this._resizeHandle);\n\t\t},\n\n\t\tpostCreate: function () {\n\t\t},\n\n\t\tstartup: function () {\n\t\t\t// summary:\n\t\t\t//\t\tCalled automatically after postCreate if the component is already\n\t\t\t//\t\tvisible; otherwise, should be called manually once placed.\n\n\t\t\tif (this._started) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._started = true;\n\t\t\tthis.resize();\n\t\t\t// apply sort (and refresh) now that we're ready to render\n\t\t\tthis.set('sort', this.sort);\n\t\t},\n\n\t\tconfigStructure: function () {\n\t\t\t// does nothing in List, this is more of a hook for the Grid\n\t\t},\n\t\tresize: function () {\n\t\t\tvar bodyNode = this.bodyNode,\n\t\t\t\theaderNode = this.headerNode,\n\t\t\t\tfooterNode = this.footerNode,\n\t\t\t\theaderHeight = headerNode.offsetHeight,\n\t\t\t\tfooterHeight = this.showFooter ? footerNode.offsetHeight : 0;\n\n\t\t\tthis.headerScrollNode.style.height = bodyNode.style.marginTop = headerHeight + 'px';\n\t\t\tbodyNode.style.marginBottom = footerHeight + 'px';\n\n\t\t\tif (!scrollbarWidth) {\n\t\t\t\t// Measure the browser's scrollbar width using a DIV we'll delete right away\n\t\t\t\tscrollbarWidth = has('dom-scrollbar-width');\n\t\t\t\tscrollbarHeight = has('dom-scrollbar-height');\n\n\t\t\t\t// Avoid issues with certain widgets inside in IE7, and\n\t\t\t\t// ColumnSet scroll issues with all supported IE versions\n\t\t\t\tif (has('ie')) {\n\t\t\t\t\tscrollbarWidth++;\n\t\t\t\t\tscrollbarHeight++;\n\t\t\t\t}\n\n\t\t\t\t// add rules that can be used where scrollbar width/height is needed\n\t\t\t\tmiscUtil.addCssRule('.dgrid-scrollbar-width', 'width: ' + scrollbarWidth + 'px');\n\t\t\t\tmiscUtil.addCssRule('.dgrid-scrollbar-height', 'height: ' + scrollbarHeight + 'px');\n\n\t\t\t\tif (scrollbarWidth !== 17) {\n\t\t\t\t\t// for modern browsers, we can perform a one-time operation which adds\n\t\t\t\t\t// a rule to account for scrollbar width in all grid headers.\n\t\t\t\t\tmiscUtil.addCssRule('.dgrid-header-row', 'right: ' + scrollbarWidth + 'px');\n\t\t\t\t\t// add another for RTL grids\n\t\t\t\t\tmiscUtil.addCssRule('.dgrid-rtl-swap .dgrid-header-row', 'left: ' + scrollbarWidth + 'px');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\taddCssRule: function (selector, css) {\n\t\t\t// summary:\n\t\t\t//\t\tVersion of util/misc.addCssRule which tracks added rules and removes\n\t\t\t//\t\tthem when the List is destroyed.\n\n\t\t\tvar rule = miscUtil.addCssRule(selector, css);\n\t\t\tif (this.cleanAddedRules) {\n\t\t\t\t// Although this isn't a listener, it shares the same remove contract\n\t\t\t\tthis._listeners.push(rule);\n\t\t\t}\n\t\t\treturn rule;\n\t\t},\n\n\t\ton: function (eventType, listener) {\n\t\t\t// delegate events to the domNode\n\t\t\tvar signal = listen(this.domNode, eventType, listener);\n\t\t\tif (!has('dom-addeventlistener')) {\n\t\t\t\tthis._listeners.push(signal);\n\t\t\t}\n\t\t\treturn signal;\n\t\t},\n\n\t\tcleanup: function () {\n\t\t\t// summary:\n\t\t\t//\t\tClears out all rows currently in the list.\n\n\t\t\tvar i;\n\t\t\tfor (i in this._rowIdToObject) {\n\t\t\t\tif (this._rowIdToObject[i] !== this.columns) {\n\t\t\t\t\tvar rowElement = byId(i, this.domNode);\n\t\t\t\t\tif (rowElement) {\n\t\t\t\t\t\tthis.removeRow(rowElement, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdestroy: function () {\n\t\t\t// summary:\n\t\t\t//\t\tDestroys this grid\n\n\t\t\t// Remove any event listeners and other such removables\n\t\t\tif (this._listeners) { // Guard against accidental subsequent calls to destroy\n\t\t\t\tfor (var i = this._listeners.length; i--;) {\n\t\t\t\t\tthis._listeners[i].remove();\n\t\t\t\t}\n\t\t\t\tthis._listeners = null;\n\t\t\t}\n\n\t\t\tthis._started = false;\n\t\t\tthis.cleanup();\n\t\t\t// destroy DOM\n\t\t\tdomConstruct.destroy(this.domNode);\n\t\t},\n\t\trefresh: function () {\n\t\t\t// summary:\n\t\t\t//\t\trefreshes the contents of the grid\n\t\t\tthis.cleanup();\n\t\t\tthis._rowIdToObject = {};\n\t\t\tthis._autoRowId = 0;\n\n\t\t\t// make sure all the content has been removed so it can be recreated\n\t\t\tthis.contentNode.innerHTML = '';\n\t\t\t// Ensure scroll position always resets\n\t\t\tthis.scrollTo({ x: 0, y: 0 });\n\t\t},\n\n\t\thighlightRow: function (rowElement, delay) {\n\t\t\t// summary:\n\t\t\t//\t\tHighlights a row. Used when updating rows due to store\n\t\t\t//\t\tnotifications, but potentially also useful in other cases.\n\t\t\t// rowElement: Object\n\t\t\t//\t\tRow element (or object returned from the row method) to\n\t\t\t//\t\thighlight.\n\t\t\t// delay: Number\n\t\t\t//\t\tNumber of milliseconds between adding and removing the\n\t\t\t//\t\tui-state-highlight class.\n\n\t\t\tvar classes = 'dgrid-highlight' + (this.addUiClasses ? ' ui-state-highlight' : '');\n\n\t\t\trowElement = rowElement.element || rowElement;\n\t\t\tdomClass.add(rowElement, classes);\n\t\t\tsetTimeout(function () {\n\t\t\t\tdomClass.remove(rowElement, classes);\n\t\t\t}, delay || this.highlightDuration);\n\t\t},\n\n\t\tadjustRowIndices: function (firstRow) {\n\t\t\t// Traverse through rows to update indexes on shift, i.e. for the odd/even classes.\n\t\t\tvar next = firstRow;\n\t\t\tvar rowIndex = next.rowIndex;\n\t\t\tif (rowIndex > -1) { // make sure we have a real number in case this is called on a non-row\n\t\t\t\tdo {\n\t\t\t\t\t// Skip non-numeric, non-rows\n\t\t\t\t\tif (next.rowIndex > -1) {\n\t\t\t\t\t\tthis.setRowIndex(next, rowIndex++, next.rowIndex);\n\t\t\t\t\t}\n\t\t\t\t} while ((next = next.nextSibling) && next.rowIndex !== rowIndex);\n\t\t\t}\n\t\t},\n\t\trenderArray: function (results, beforeNode, options) {\n\t\t\t// summary:\n\t\t\t//\t\tRenders an array of objects as rows, before the given node.\n\n\t\t\toptions = options || {};\n\t\t\tvar self = this,\n\t\t\t\tstart = options.start || 0,\n\t\t\t\trowsFragment = document.createDocumentFragment(),\n\t\t\t\trows = [],\n\t\t\t\tcontainer,\n\t\t\t\ti = 0,\n\t\t\t\tlen = results.length;\n\n\t\t\tif (!beforeNode) {\n\t\t\t\tthis._lastCollection = results;\n\t\t\t}\n\n\t\t\t// Insert a row for each item into the document fragment\n\t\t\twhile (i < len) {\n\t\t\t\trows[i] = this.insertRow(results[i], rowsFragment, null, start++, options);\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\t// Insert the document fragment into the appropriate position\n\t\t\tcontainer = beforeNode ? beforeNode.parentNode : self.contentNode;\n\t\t\tif (container && container.parentNode &&\n\t\t\t\t\t(container !== self.contentNode || len)) {\n\t\t\t\tcontainer.insertBefore(rowsFragment, beforeNode || null);\n\t\t\t\tif (len) {\n\t\t\t\t\tself.adjustRowIndices(rows[len - 1]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn rows;\n\t\t},\n\n\t\trenderHeader: function () {\n\t\t\t// no-op in a plain list\n\t\t},\n\t\tsetRowIndex: function(row, rowIndex, oldRowIndex) {\n\t\t\t// Update row for changes to the visual row index.\n\t\t\trow.rowIndex = rowIndex;\n\t\t\tif (this.maintainOddEven) {\n\t\t\t\tvar newClass = (rowIndex % 2 === 1 ? oddClass : evenClass)\n\t\t\t\tif (oldRowIndex !== undefined) {\n\t\t\t\t\tvar oldClass = (oldRowIndex % 2 === 1 ? oddClass : evenClass);\n\t\t\t\t\tif (oldClass !== newClass)\n\t\t\t\t\t\tdomClass.replace(row, oldClass, newClass);\n\t\t\t\t} else {\n\t\t\t\t\tdomClass.add(row, newClass);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_autoRowId: 0,\n\t\tinsertRow: function (object, parent, beforeNode, i, options) {\n\t\t\t// summary:\n\t\t\t//\t\tCreates a single row in the grid.\n\n\t\t\t// Include parentId within row identifier if one was specified in options.\n\t\t\t// (This is used by tree to allow the same object to appear under\n\t\t\t// multiple parents.)\n\t\t\tvar id = this.id + '-row-' + ((this.collection && this.collection.getIdentity) ?\n\t\t\t\t\tthis.collection.getIdentity(object) : this._autoRowId++),\n\t\t\t\trow = byId(id, this.domNode),\n\t\t\t\tpreviousRow = row && row.previousSibling;\n\n\t\t\tif (row) {\n\t\t\t\t// If it existed elsewhere in the DOM, we will remove it, so we can recreate it\n\t\t\t\tif (row === beforeNode) {\n\t\t\t\t\tbeforeNode = (beforeNode.connected || beforeNode).nextSibling;\n\t\t\t\t}\n\t\t\t\tthis.removeRow(row, false, options);\n\t\t\t}\n\t\t\trow = this.renderRow(object, options);\n\t\t\trow.className = (row.className || '') + ' dgrid-row ' +\n\t\t\t\t(this.addUiClasses ? ' ui-state-default' : '');\n\t\t\t// Get the row id for easy retrieval\n\t\t\tthis._rowIdToObject[row.id = id] = object;\n\t\t\tparent.insertBefore(row, beforeNode || null);\n\t\t\tthis.setRowIndex(row, i);\n\n\t\t\tif (previousRow && previousRow.rowIndex !== (row.rowIndex - 1)) {\n\t\t\t\t// In this case, we are pulling the row from another location in the grid,\n\t\t\t\t// and we need to readjust the rowIndices from the point it was removed\n\t\t\t\tthis.adjustRowIndices(previousRow);\n\t\t\t}\n\t\t\treturn row;\n\t\t},\n\t\trenderRow: function (value) {\n\t\t\t// summary:\n\t\t\t//\t\tResponsible for returning the DOM for a single row in the grid.\n\t\t\t// value: Mixed\n\t\t\t//\t\tValue to render\n\t\t\t// options: Object?\n\t\t\t//\t\tOptional object with additional options\n\n\t\t\tvar div = document.createElement('div');\n\t\t\tdiv.appendChild(document.createTextNode(value));\n\t\t\treturn div;\n\t\t},\n\t\tremoveRow: function (rowElement, preserveDom) {\n\t\t\t// summary:\n\t\t\t//\t\tSimply deletes the node in a plain List.\n\t\t\t//\t\tColumn plugins may aspect this to implement their own cleanup routines.\n\t\t\t// rowElement: Object|DOMNode\n\t\t\t//\t\tObject or element representing the row to be removed.\n\t\t\t// preserveDom: Boolean?\n\t\t\t//\t\tIf true, the row element will not be removed from the DOM; this can\n\t\t\t//\t\tbe used by extensions/plugins in cases where the DOM will be\n\t\t\t//\t\tmassively cleaned up at a later point in time.\n\t\t\t// options: Object?\n\t\t\t//\t\tMay be specified with a `rows` property for the purpose of\n\t\t\t//\t\tcleaning up collection tracking (used by `_StoreMixin`).\n\n\t\t\trowElement = rowElement.element || rowElement;\n\t\t\tdelete this._rowIdToObject[rowElement.id];\n\t\t\tif (!preserveDom) {\n\t\t\t\tdomConstruct.destroy(rowElement);\n\t\t\t}\n\t\t},\n\n\t\trow: function (target) {\n\t\t\t// summary:\n\t\t\t//\t\tGet the row object by id, object, node, or event\n\t\t\tvar id;\n\n\t\t\tif (target instanceof this._Row) {\n\t\t\t\treturn target; // No-op; already a row\n\t\t\t}\n\n\t\t\tif (target.target && target.target.nodeType) {\n\t\t\t\t// Event\n\t\t\t\ttarget = target.target;\n\t\t\t}\n\t\t\tif (target.nodeType) {\n\t\t\t\t// Row element, or child of a row element\n\t\t\t\tvar object;\n\t\t\t\tdo {\n\t\t\t\t\tvar rowId = target.id;\n\t\t\t\t\tif ((object = this._rowIdToObject[rowId])) {\n\t\t\t\t\t\treturn new this._Row(rowId.substring(this.id.length + 5), object, target);\n\t\t\t\t\t}\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}while (target && target !== this.domNode);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof target === 'object') {\n\t\t\t\t// Assume target represents a collection item\n\t\t\t\tid = this.collection.getIdentity(target);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Assume target is a row ID\n\t\t\t\tid = target;\n\t\t\t\ttarget = this._rowIdToObject[this.id + '-row-' + id];\n\t\t\t}\n\t\t\treturn new this._Row(id, target, byId(this.id + '-row-' + id, this.domNode));\n\t\t},\n\t\tcell: function (target) {\n\t\t\t// this doesn't do much in a plain list\n\t\t\treturn {\n\t\t\t\trow: this.row(target)\n\t\t\t};\n\t\t},\n\n\t\t_move: function (item, steps, targetClass, visible) {\n\t\t\tvar nextSibling, current, element;\n\t\t\t// Start at the element indicated by the provided row or cell object.\n\t\t\telement = current = item.element;\n\t\t\tsteps = steps || 1;\n\n\t\t\tdo {\n\t\t\t\t// Outer loop: move in the appropriate direction.\n\t\t\t\tif ((nextSibling = current[steps < 0 ? 'previousSibling' : 'nextSibling'])) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\t// Inner loop: advance, and dig into children if applicable.\n\t\t\t\t\t\tcurrent = nextSibling;\n\t\t\t\t\t\tif (current && (current.className + ' ').indexOf(targetClass + ' ') > -1) {\n\t\t\t\t\t\t\t// Element with the appropriate class name; count step, stop digging.\n\t\t\t\t\t\t\telement = current;\n\t\t\t\t\t\t\tsteps += steps < 0 ? 1 : -1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If the next sibling isn't a match, drill down to search, unless\n\t\t\t\t\t\t// visible is true and children are hidden.\n\t\t\t\t\t} while ((nextSibling = (!visible || !current.hidden) &&\n\t\t\t\t\t\tcurrent[steps < 0 ? 'lastChild' : 'firstChild']));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcurrent = current.parentNode;\n\t\t\t\t\tif (!current || current === this.bodyNode || current === this.headerNode) {\n\t\t\t\t\t\t// Break out if we step out of the navigation area entirely.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}while (steps);\n\t\t\t// Return the final element we arrived at, which might still be the\n\t\t\t// starting element if we couldn't navigate further in that direction.\n\t\t\treturn element;\n\t\t},\n\n\t\tup: function (row, steps, visible) {\n\t\t\t// summary:\n\t\t\t//\t\tReturns the row that is the given number of steps (1 by default)\n\t\t\t//\t\tabove the row represented by the given object.\n\t\t\t// row:\n\t\t\t//\t\tThe row to navigate upward from.\n\t\t\t// steps:\n\t\t\t//\t\tNumber of steps to navigate up from the given row; default is 1.\n\t\t\t// visible:\n\t\t\t//\t\tIf true, rows that are currently hidden (i.e. children of\n\t\t\t//\t\tcollapsed tree rows) will not be counted in the traversal.\n\t\t\t// returns:\n\t\t\t//\t\tA row object representing the appropriate row. If the top of the\n\t\t\t//\t\tlist is reached before the given number of steps, the first row will\n\t\t\t//\t\tbe returned.\n\t\t\tif (!row.element) {\n\t\t\t\trow = this.row(row);\n\t\t\t}\n\t\t\treturn this.row(this._move(row, -(steps || 1), 'dgrid-row', visible));\n\t\t},\n\t\tdown: function (row, steps, visible) {\n\t\t\t// summary:\n\t\t\t//\t\tReturns the row that is the given number of steps (1 by default)\n\t\t\t//\t\tbelow the row represented by the given object.\n\t\t\t// row:\n\t\t\t//\t\tThe row to navigate downward from.\n\t\t\t// steps:\n\t\t\t//\t\tNumber of steps to navigate down from the given row; default is 1.\n\t\t\t// visible:\n\t\t\t//\t\tIf true, rows that are currently hidden (i.e. children of\n\t\t\t//\t\tcollapsed tree rows) will not be counted in the traversal.\n\t\t\t// returns:\n\t\t\t//\t\tA row object representing the appropriate row. If the bottom of the\n\t\t\t//\t\tlist is reached before the given number of steps, the last row will\n\t\t\t//\t\tbe returned.\n\t\t\tif (!row.element) {\n\t\t\t\trow = this.row(row);\n\t\t\t}\n\t\t\treturn this.row(this._move(row, steps || 1, 'dgrid-row', visible));\n\t\t},\n\n\t\tscrollTo: function (options) {\n\t\t\tif (typeof options.x !== 'undefined') {\n\t\t\t\tthis.bodyNode.scrollLeft = options.x;\n\t\t\t}\n\t\t\tif (typeof options.y !== 'undefined') {\n\t\t\t\tthis.bodyNode.scrollTop = options.y;\n\t\t\t}\n\t\t},\n\n\t\tgetScrollPosition: function () {\n\t\t\treturn {\n\t\t\t\tx: this.bodyNode.scrollLeft,\n\t\t\t\ty: this.bodyNode.scrollTop\n\t\t\t};\n\t\t},\n\n\t\tget: function (/*String*/ name /*, ... */) {\n\t\t\t// summary:\n\t\t\t//\t\tGet a property on a List instance.\n\t\t\t//\tname:\n\t\t\t//\t\tThe property to get.\n\t\t\t//\treturns:\n\t\t\t//\t\tThe property value on this List instance.\n\t\t\t// description:\n\t\t\t//\t\tGet a named property on a List object. The property may\n\t\t\t//\t\tpotentially be retrieved via a getter method in subclasses. In the base class\n\t\t\t//\t\tthis just retrieves the object's property.\n\n\t\t\tvar fn = '_get' + name.charAt(0).toUpperCase() + name.slice(1);\n\n\t\t\tif (typeof this[fn] === 'function') {\n\t\t\t\treturn this[fn].apply(this, [].slice.call(arguments, 1));\n\t\t\t}\n\n\t\t\t// Alert users that try to use Dijit-style getter/setters so they don’t get confused\n\t\t\t// if they try to use them and it does not work\n\t\t\tif (!has('dojo-built') && typeof this[fn + 'Attr'] === 'function') {\n\t\t\t\tconsole.warn('dgrid: Use ' + fn + ' instead of ' + fn + 'Attr for getting ' + name);\n\t\t\t}\n\n\t\t\treturn this[name];\n\t\t},\n\n\t\tset: function (/*String*/ name, /*Object*/ value /*, ... */) {\n\t\t\t//\tsummary:\n\t\t\t//\t\tSet a property on a List instance\n\t\t\t//\tname:\n\t\t\t//\t\tThe property to set.\n\t\t\t//\tvalue:\n\t\t\t//\t\tThe value to set in the property.\n\t\t\t//\treturns:\n\t\t\t//\t\tThe function returns this List instance.\n\t\t\t//\tdescription:\n\t\t\t//\t\tSets named properties on a List object.\n\t\t\t//\t\tA programmatic setter may be defined in subclasses.\n\t\t\t//\n\t\t\t//\t\tset() may also be called with a hash of name/value pairs, ex:\n\t\t\t//\t|\tmyObj.set({\n\t\t\t//\t|\t\tfoo: \"Howdy\",\n\t\t\t//\t|\t\tbar: 3\n\t\t\t//\t|\t})\n\t\t\t//\t\tThis is equivalent to calling set(foo, \"Howdy\") and set(bar, 3)\n\n\t\t\tif (typeof name === 'object') {\n\t\t\t\tfor (var k in name) {\n\t\t\t\t\tthis.set(k, name[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar fn = '_set' + name.charAt(0).toUpperCase() + name.slice(1);\n\n\t\t\t\tif (typeof this[fn] === 'function') {\n\t\t\t\t\tthis[fn].apply(this, [].slice.call(arguments, 1));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Alert users that try to use Dijit-style getter/setters so they don’t get confused\n\t\t\t\t\t// if they try to use them and it does not work\n\t\t\t\t\tif (!has('dojo-built') && typeof this[fn + 'Attr'] === 'function') {\n\t\t\t\t\t\tconsole.warn('dgrid: Use ' + fn + ' instead of ' + fn + 'Attr for setting ' + name);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis[name] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\n\t\t// Accept both class and className programmatically to set domNode class.\n\t\t_getClass: getClass,\n\t\t_setClass: setClass,\n\t\t_getClassName: getClass,\n\t\t_setClassName: setClass,\n\n\t\t_setSort: function (property, descending) {\n\t\t\t// summary:\n\t\t\t//\t\tSort the content\n\t\t\t// property: String|Array\n\t\t\t//\t\tString specifying field to sort by, or actual array of objects\n\t\t\t//\t\twith property and descending properties\n\t\t\t// descending: boolean\n\t\t\t//\t\tIn the case where property is a string, this argument\n\t\t\t//\t\tspecifies whether to sort ascending (false) or descending (true)\n\n\t\t\tthis.sort = typeof property !== 'string' ? property :\n\t\t\t\t[{property: property, descending: descending}];\n\n\t\t\tthis._applySort();\n\t\t},\n\n\t\t_applySort: function () {\n\t\t\t// summary:\n\t\t\t//\t\tApplies the current sort\n\t\t\t// description:\n\t\t\t//\t\tThis is an extension point to allow specializations to apply the sort differently\n\n\t\t\tthis.refresh();\n\n\t\t\tif (this._lastCollection) {\n\t\t\t\tvar sort = this.sort;\n\t\t\t\tif (sort && sort.length > 0) {\n\t\t\t\t\tvar property = sort[0].property,\n\t\t\t\t\t\tdescending = !!sort[0].descending;\n\t\t\t\t\tthis._lastCollection.sort(function (a, b) {\n\t\t\t\t\t\tvar aVal = a[property], bVal = b[property];\n\t\t\t\t\t\t// fall back undefined values to \"\" for more consistent behavior\n\t\t\t\t\t\tif (aVal === undefined) {\n\t\t\t\t\t\t\taVal = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (bVal === undefined) {\n\t\t\t\t\t\t\tbVal = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn aVal === bVal ? 0 : (aVal > bVal !== descending ? 1 : -1);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.renderArray(this._lastCollection);\n\t\t\t}\n\t\t},\n\n\t\t_setShowHeader: function (show) {\n\t\t\t// this is in List rather than just in Grid, primarily for two reasons:\n\t\t\t// (1) just in case someone *does* want to show a header in a List\n\t\t\t// (2) helps address IE < 8 header display issue in List\n\n\t\t\tvar headerNode = this.headerNode;\n\n\t\t\tthis.showHeader = show;\n\n\t\t\t// add/remove class which has styles for \"hiding\" header\n\t\t\tdomClass.toggle(headerNode, 'dgrid-header-hidden', !show);\n\n\t\t\tthis.renderHeader();\n\t\t\tthis.resize(); // resize to account for (dis)appearance of header\n\n\t\t\tif (show) {\n\t\t\t\t// Update scroll position of header to make sure it's in sync.\n\t\t\t\theaderNode.scrollLeft = this.getScrollPosition().x;\n\t\t\t}\n\t\t},\n\n\t\t_setShowFooter: function (show) {\n\t\t\tthis.showFooter = show;\n\n\t\t\t// add/remove class which has styles for hiding footer\n\t\t\tdomClass.toggle(this.footerNode, 'dgrid-footer-hidden', !show);\n\n\t\t\tthis.resize(); // to account for (dis)appearance of footer\n\t\t}\n\t});\n\n\tList.autoIdPrefix = 'dgrid_';\n\n\treturn List;\n});\n","define([\n\t'dojo/_base/declare',\n\t'./Grid',\n\t'./OnDemandList'\n], function (declare, Grid, OnDemandList) {\n\treturn declare([ Grid, OnDemandList ], {});\n});","define([\n\t'./List',\n\t'./_StoreMixin',\n\t'dojo/_base/declare',\n\t'dojo/_base/lang',\n\t'dojo/dom-construct',\n\t'dojo/on',\n\t'dojo/when',\n\t'dojo/query',\n\t'./util/misc'\n], function (List, _StoreMixin, declare, lang, domConstruct, on, when, query, miscUtil) {\n\n\tvar preloadId = 0;\n\n\tfunction nextPreloadId() {\n\t\treturn preloadId++;\n\t}\n\n\tfunction isRowNode(node) {\n\t\treturn node && (node.className.indexOf('dgrid-row') >= 0 ||\n\t\t\tnode.className.indexOf('dgrid-loading') >= 0);\n\t}\n\n\tfunction isPreloadNode(node) {\n\t\treturn node && node.className.indexOf('dgrid-preload') >= 0;\n\t}\n\n\treturn declare([List, _StoreMixin], {\n\t\t// summary:\n\t\t//\t\tExtends List to include virtual scrolling functionality, querying a\n\t\t//\t\tdojo/store instance for the appropriate range when the user scrolls.\n\n\t\t// minRowsPerPage: Integer\n\t\t//\t\tThe minimum number of rows to request at one time.\n\t\tminRowsPerPage: 25,\n\n\t\t// maxRowsPerPage: Integer\n\t\t//\t\tThe maximum number of rows to request at one time.\n\t\tmaxRowsPerPage: 250,\n\n\t\t// maxEmptySpace: Integer\n\t\t//\t\tDefines the maximum size (in pixels) of unrendered space below the\n\t\t//\t\tcurrently-rendered rows. Setting this to less than Infinity can be useful if you\n\t\t//\t\twish to limit the initial vertical scrolling of the grid so that the scrolling is\n\t\t// \t\tnot excessively sensitive. With very large grids of data this may make scrolling\n\t\t//\t\teasier to use, albiet it can limit the ability to instantly scroll to the end.\n\t\tmaxEmptySpace: Infinity,\n\n\t\t// bufferRows: Integer\n\t\t//\t The number of rows to keep ready on each side of the viewport area so that the user can\n\t\t//\t perform local scrolling without seeing the grid being built. Increasing this number can\n\t\t//\t improve perceived performance when the data is being retrieved over a slow network.\n\t\tbufferRows: 10,\n\n\t\t// farOffRemoval: Integer\n\t\t//\t\tDefines the minimum distance (in pixels) from the visible viewport area\n\t\t//\t\trows must be in order to be removed. Setting to Infinity causes rows\n\t\t//\t\tto never be removed.\n\t\tfarOffRemoval: 2000,\n\n\t\t// queryRowsOverlap: Integer\n\t\t//\t\tIndicates the number of rows to overlap queries. This helps keep\n\t\t//\t\tcontinuous data when underlying data changes (and thus pages don't\n\t\t//\t\texactly align)\n\t\tqueryRowsOverlap: 0,\n\n\t\t// pagingMethod: String\n\t\t//\t\tMethod (from dgrid/util/misc) to use to either throttle or debounce\n\t\t//\t\trequests. Default is \"debounce\" which will cause the grid to wait until\n\t\t//\t\tthe user pauses scrolling before firing any requests; can be set to\n\t\t//\t\t\"throttleDelayed\" instead to progressively request as the user scrolls,\n\t\t//\t\twhich generally incurs more overhead but might appear more responsive.\n\t\tpagingMethod: 'debounce',\n\n\t\t// pagingDelay: Integer\n\t\t//\t\tIndicates the delay (in milliseconds) imposed upon pagingMethod, to wait\n\t\t//\t\tbefore paging in more data on scroll events. This can be increased to\n\t\t//\t\treduce client-side overhead or the number of requests sent to a server.\n\t\tpagingDelay: miscUtil.defaultDelay,\n\n\t\t// keepScrollPosition: Boolean\n\t\t//\t\tWhen refreshing the list, controls whether the scroll position is\n\t\t//\t\tpreserved, or reset to the top. This can also be overridden for\n\t\t//\t\tspecific calls to refresh.\n\t\tkeepScrollPosition: false,\n\n\t\t// rowHeight: Number\n\t\t//\t\tAverage row height, computed in renderQuery during the rendering of\n\t\t//\t\tthe first range of data.\n\t\trowHeight: 0,\n\n\t\t// _deleteQueue: Array\n\t\t// \t\tList of DOM nodes queued for deletion.\n\t\t_deleteQueue: [],\n\n\t\tpostCreate: function () {\n\t\t\tthis.inherited(arguments);\n\t\t\tvar self = this;\n\t\t\t// check visibility on scroll events\n\t\t\ton(this.bodyNode, 'scroll',\n\t\t\t\tmiscUtil[this.pagingMethod](function (event) {\n\t\t\t\t\tself._processScroll(event);\n\t\t\t\t}, null, this.pagingDelay)\n\t\t\t);\n\t\t},\n\n\t\trenderQuery: function (query, options) {\n\t\t\t// summary:\n\t\t\t//\t\tCreates a preload node for rendering a query into, and executes the query\n\t\t\t//\t\tfor the first page of data. Subsequent data will be downloaded as it comes\n\t\t\t//\t\tinto view.\n\t\t\t// query: Function\n\t\t\t//\t\tFunction to be called when requesting new data.\n\t\t\t// options: Object?\n\t\t\t//\t\tOptional object containing the following:\n\t\t\t//\t\t* container: Container to build preload nodes within; defaults to this.contentNode\n\n\t\t\tvar self = this,\n\t\t\t\tcontainer = (options && options.container) || this.contentNode,\n\t\t\t\tpreload,\n\t\t\t\ttopPreloadNode, preloadNode,\n\t\t\t\tqueryLevel,\n\t\t\t\tpreloadLevel = 0,\n\t\t\t\tstart = (options && options.start) || 0;\n\n\t\t\tif ('level' in query) {\n\t\t\t\tpreloadLevel = queryLevel = query.level;\n\t\t\t}\n\n\t\t\tpreload = {\n\t\t\t\tquery: query,\n\t\t\t\tcount: 0,\n\t\t\t\tlevel: preloadLevel,\n\t\t\t\ttop: false\n\t\t\t};\n\n\t\t\t// Initial query; set up top and bottom preload nodes\n\t\t\tvar topPreload = {\n\t\t\t\tnode: domConstruct.create('div', {\n\t\t\t\t\tclassName: 'dgrid-preload',\n\t\t\t\t\tstyle: { height: '0' }\n\t\t\t\t}, container),\n\t\t\t\tcount: 0,\n\t\t\t\tquery: query,\n\t\t\t\tnext: preload,\n\t\t\t\tlevel: preloadLevel,\n\t\t\t\ttop: true\n\t\t\t};\n\t\t\ttopPreloadNode = topPreload.node;\n\t\t\ttopPreloadNode.rowIndex = 0;\n\t\t\tpreload.previous = topPreload;\n\n\t\t\tpreloadNode = preload.node = domConstruct.create('div', {\n\t\t\t\tclassName: 'dgrid-preload',\n\t\t\t\tstyle: { height: '0' }\n\t\t\t}, container);\n\n\t\t\t// Add preload ids.\n\t\t\ttopPreload.id = nextPreloadId();\n\t\t\ttopPreloadNode.setAttribute('data-preloadid', topPreload.id);\n\t\t\tpreload.id = nextPreloadId();\n\t\t\tpreloadNode.setAttribute('data-preloadid', preload.id);\n\n\t\t\t// this preload node is used to represent the area of the grid that hasn't been\n\t\t\t// downloaded yet\n\t\t\tpreloadNode.rowIndex = this.minRowsPerPage;\n\n\t\t\tself._insertPreload(topPreload);\n\n\t\t\tvar loadingNode = domConstruct.create('div', {\n\t\t\t\t\tclassName: 'dgrid-loading'\n\t\t\t\t}, preloadNode, 'before'),\n\t\t\t\tinnerNode = domConstruct.create('div', {\n\t\t\t\t\tclassName: 'dgrid-below'\n\t\t\t\t}, loadingNode);\n\t\t\tinnerNode.innerHTML = this.loadingMessage;\n\n\t\t\t// Establish query options, mixing in our own\n\t\t\toptions = lang.mixin({ start: 0, count: this.minRowsPerPage }, options);\n\t\t\tif (queryLevel != null) {\n\t\t\t\toptions.queryLevel = queryLevel;\n\t\t\t}\n\n\t\t\t// Protect the query within a _trackError call, but return the resulting collection\n\t\t\treturn this._trackError(function () {\n\t\t\t\tvar results = query(options);\n\n\t\t\t\t// Render the result set\n\t\t\t\treturn self.renderQueryResults(results, preloadNode, options).then(function (trs) {\n\t\t\t\t\treturn results.totalLength.then(function (total) {\n\t\t\t\t\t\tvar trCount = trs.length;\n\t\t\t\t\t\tvar parentNode = preloadNode.parentNode;\n\n\t\t\t\t\t\tif (self._rows && !('queryLevel' in options)) {\n\t\t\t\t\t\t\tself._rows.min = 0;\n\t\t\t\t\t\t\tself._rows.max = trCount === total ? Infinity : trCount - 1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdomConstruct.destroy(loadingNode);\n\t\t\t\t\t\tif (!('queryLevel' in options)) {\n\t\t\t\t\t\t\tself._total = total;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// now we need to adjust the height and total count based on the first result set\n\t\t\t\t\t\tif (total === 0 && parentNode) {\n\t\t\t\t\t\t\tif (self.noDataNode) {\n\t\t\t\t\t\t\t\tdomConstruct.destroy(self.noDataNode);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tself._insertNoDataNode(parentNode);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttopPreload.count = start;\n\t\t\t\t\t\tpreload.count = total - trCount - start;\n\t\t\t\t\t\tpreloadNode.rowIndex = start + trCount;\n\n\t\t\t\t\t\tif (total) {\n\t\t\t\t\t\t\tself._updatePreloadRowHeights(topPreload);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpreloadNode.style.display = 'none';\n\t\t\t\t\t\t\ttopPreloadNode.style.display = 'none';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (self._previousScrollPosition && parentNode && parentNode.offsetHeight) {\n\t\t\t\t\t\t\t// Restore position after a refresh operation w/ keepScrollPosition but only\n\t\t\t\t\t\t\t// if the rows have been inserted into the DOM.\n\t\t\t\t\t\t\tself.scrollTo(self._previousScrollPosition);\n\t\t\t\t\t\t\tdelete self._previousScrollPosition;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Redo scroll processing in case the query didn't fill the screen,\n\t\t\t\t\t\t// or in case scroll position was restored\n\t\t\t\t\t\treturn when(self._processScroll()).then(function () {\n\t\t\t\t\t\t\treturn trs;\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}).otherwise(function (err) {\n\t\t\t\t\t// remove the loadingNode and re-throw\n\t\t\t\t\tdomConstruct.destroy(loadingNode);\n\t\t\t\t\tthrow err;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\t_insertPreload: function (newTopPreload) {\n\t\t\tvar preload = this.preload;\n\t\t\tif (!preload) {\n\t\t\t\t// first one\n\t\t\t\tthis.preload = newTopPreload;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twhile (preload.node.compareDocumentPosition(newTopPreload.node) & Node.DOCUMENT_POSITION_PRECEDING) {\n\t\t\t\tpreload = preload.previous;\n\t\t\t\tif (preload == null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (preload.node.compareDocumentPosition(newTopPreload.node) & Node.DOCUMENT_POSITION_FOLLOWING) {\n\t\t\t\tif (!preload.next) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpreload = preload.next;\n\t\t\t}\n\t\t\t// insert, newPreload before preload\n\t\t\tpreload.previous.next = newTopPreload;\n\t\t\tnewTopPreload.previous = preload.previous;\n\t\t\tvar newBottomPreload = newTopPreload.next;\n\t\t\tnewBottomPreload.next = preload;\n\t\t\tpreload.previous = newBottomPreload;\n\t\t},\n\n\t\trefresh: function (options) {\n\t\t\t// summary:\n\t\t\t//\t\tRefreshes the contents of the grid.\n\t\t\t// options: Object?\n\t\t\t//\t\tOptional object, supporting the following parameters:\n\t\t\t//\t\t* keepScrollPosition: like the keepScrollPosition instance property;\n\t\t\t//\t\t\tspecifying it in the options here will override the instance\n\t\t\t//\t\t\tproperty's value for this specific refresh call only.\n\n\t\t\tvar self = this,\n\t\t\t\tkeep = (options && options.keepScrollPosition),\n\t\t\t\tfetchResults;\n\n\t\t\t// Fall back to instance property if option is not defined\n\t\t\tif (typeof keep === 'undefined') {\n\t\t\t\tkeep = this.keepScrollPosition;\n\t\t\t}\n\n\t\t\t// Store scroll position to be restored after new total is received\n\t\t\tif (keep) {\n\t\t\t\tthis._previousScrollPosition = this.getScrollPosition();\n\t\t\t}\n\n\t\t\tthis.inherited(arguments);\n\t\t\tif (this._renderedCollection) {\n\t\t\t\t// render the query\n\t\t\t\t// renderQuery calls _trackError internally\n\t\t\t\treturn this.renderQuery(function (queryOptions) {\n\t\t\t\t\tvar queryResults = self._renderedCollection.fetchRange({\n\t\t\t\t\t\tstart: queryOptions.start,\n\t\t\t\t\t\tend: queryOptions.start + queryOptions.count\n\t\t\t\t\t});\n\n\t\t\t\t\tqueryResults.then(function (results) {\n\t\t\t\t\t\tfetchResults = results;\n\t\t\t\t\t});\n\n\t\t\t\t\t// It is important to return the original QueryResults object, which is a special promise\n\t\t\t\t\t// with 'totalLength' and 'forEach' properties on it. Returning a chained promise would\n\t\t\t\t\t// lose these properties.\n\t\t\t\t\treturn queryResults;\n\t\t\t\t}).then(function () {\n\t\t\t\t\tself._emitRefreshComplete();\n\n\t\t\t\t\treturn fetchResults;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tresize: function () {\n\t\t\tthis.inherited(arguments);\n\t\t\tthis._processScroll();\n\t\t},\n\n\t\tcleanup: function () {\n\t\t\tthis.inherited(arguments);\n\t\t\tthis.preload = null;\n\t\t},\n\n\t\trenderQueryResults: function (results) {\n\t\t\tvar rows = this.inherited(arguments);\n\t\t\tvar collection = this._getRenderedCollection(this.preload);\n\n\t\t\tif (collection && collection.releaseRange) {\n\t\t\t\trows.then(function (resolvedRows) {\n\t\t\t\t\tif (resolvedRows[0] && !resolvedRows[0].parentNode.tagName) {\n\t\t\t\t\t\t// Release this range, since it was never actually rendered;\n\t\t\t\t\t\t// need to wait until totalLength promise resolves, since\n\t\t\t\t\t\t// Trackable only adds the range then to begin with\n\t\t\t\t\t\tresults.totalLength.then(function () {\n\t\t\t\t\t\t\tcollection.releaseRange(resolvedRows[0].rowIndex,\n\t\t\t\t\t\t\t\tresolvedRows[resolvedRows.length - 1].rowIndex + 1);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn rows;\n\t\t},\n\n\t\t_getFirstRowSibling: function (container) {\n\t\t\t// summary:\n\t\t\t//\t\tReturns the DOM node that a new row should be inserted before\n\t\t\t//\t\twhen there are no other rows in the current result set.\n\t\t\t//\t\tIn the case of OnDemandList, this will always be the last child\n\t\t\t//\t\tof the container (which will be a trailing preload node).\n\t\t\treturn container.lastChild;\n\t\t},\n\n\t\t_calcRowHeight: function (rowElement) {\n\t\t\t// summary:\n\t\t\t//\t\tCalculate the height of a row. This is a method so it can be overriden for\n\t\t\t//\t\tplugins that add connected elements to a row, like the tree\n\n\t\t\tvar sibling = rowElement.nextSibling;\n\n\t\t\t// If a next row exists, compare the top of this row with the\n\t\t\t// next one (in case \"rows\" are actually rendering side-by-side).\n\t\t\t// If no next row exists, this is either the last or only row,\n\t\t\t// in which case we count its own height.\n\t\t\tif (sibling && !/\\bdgrid-preload\\b/.test(sibling.className)) {\n\t\t\t\treturn sibling.offsetTop - rowElement.offsetTop;\n\t\t\t}\n\n\t\t\treturn rowElement.offsetHeight;\n\t\t},\n\n\t\t_calcAverageRowHeight: function (rowElements) {\n\t\t\t// summary:\n\t\t\t//\t\tSets this.rowHeight based on the average from heights of the provided row elements.\n\n\t\t\tvar count = rowElements.length;\n\t\t\tvar height = 0;\n\t\t\tfor (var i = 0; i < count; i++) {\n\t\t\t\theight += this._calcRowHeight(rowElements[i]);\n\t\t\t}\n\t\t\t// only update rowHeight if elements were passed and are in flow\n\t\t\tif (count && height) {\n\t\t\t\treturn height / count;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\n\t\t_updatePreloadRowHeights: function () {\n\t\t\tvar preload = this.preload;\n\t\t\tvar rowHeight = 0;\n\t\t\tif (!preload) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twhile (preload.previous) {\n\t\t\t\tpreload = preload.previous;\n\t\t\t}\n\t\t\twhile (preload) {\n\t\t\t\tif (!preload.rowHeight) {\n\t\t\t\t\tpreload.rowHeight = \n\t\t\t\t\t\tthis._calcAverageRowHeight(preload.node.parentNode.querySelectorAll('.dgrid-row'));\n\t\t\t\t\tthis._adjustPreloadHeight(preload);\n\t\t\t\t}\n\t\t\t\trowHeight = preload ? preload.rowHeight : rowHeight;\n\t\t\t\tpreload = preload.next;\n\t\t\t}\n\t\t\tthis.rowHeight = rowHeight;\n\t\t},\n\n\t\tlastScrollTop: 0,\n\t\t_processScroll: function (evt) {\n\t\t\t// summary:x\n\t\t\t//\t\tChecks to make sure that everything in the viewable area has been\n\t\t\t//\t\tdownloaded, and triggering a request for the necessary data when needed.\n\t\t\tvar preload = this.preload,\n\t\t\t\trowHeight;\n\n\t\t\tthis._updatePreloadRowHeights();\n\t\t\trowHeight = preload && preload.rowHeight;\n\t\t\tif (!rowHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar grid = this,\n\t\t\t\tscrollNode = grid.bodyNode,\n\t\t\t\t// grab current visible top from event if provided, otherwise from node\n\t\t\t\tvisibleTop = (evt && evt.scrollTop) || this.getScrollPosition().y,\n\t\t\t\tvisibleBottom = scrollNode.offsetHeight + visibleTop,\n\t\t\t\tpriorPreload, preloadNode,\n\t\t\t\tlastScrollTop = grid.lastScrollTop,\n\t\t\t\trequestBuffer = grid.bufferRows * rowHeight,\n\t\t\t\tsearchBuffer = requestBuffer - rowHeight, // Avoid rounding causing multiple queries\n\t\t\t\t// References related to emitting dgrid-refresh-complete if applicable\n\t\t\t\tlastRows,\n\t\t\t\tpreloadSearchNext = true;\n\n\t\t\t// XXX: I do not know why this happens.\n\t\t\t// munging the actual location of the viewport relative to the preload node by a few pixels in either\n\t\t\t// direction is necessary because at least WebKit on Windows seems to have an error that causes it to\n\t\t\t// not quite get the entire element being focused in the viewport during keyboard navigation,\n\t\t\t// which means it becomes impossible to load more data using keyboard navigation because there is\n\t\t\t// no more data to scroll to to trigger the fetch.\n\t\t\t// 1 is arbitrary and just gets it to work correctly with our current test cases; don’t wanna go\n\t\t\t// crazy and set it to a big number without understanding more about what is going on.\n\t\t\t// wondering if it has to do with border-box or something, but changing the border widths does not\n\t\t\t// seem to make it break more or less, so I do not know…\n\t\t\tvar mungeAmount = 1;\n\n\t\t\tgrid.lastScrollTop = visibleTop;\n\n\t\t\tfunction calculateDistanceOffset(preload, removeBelow) {\n\t\t\t\tif (removeBelow) {\n\t\t\t\t\treturn preload.node.offsetTop - visibleBottom;\n\t\t\t\t} else {\n\t\t\t\t\treturn visibleTop - (preload.node.offsetTop + preload.node.offsetHeight);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction traverseToEndPreload(preload, removeBelow) {\n\t\t\t\tvar direction = removeBelow ? 'next' : 'previous';\n\t\t\t\tvar nextPreload;\n\t\t\t\twhile ((nextPreload = preload[direction])) {\n\t\t\t\t\tpreload = nextPreload;\n\t\t\t\t}\n\t\t\t\treturn preload;\n\t\t\t}\n\n\t\t\tfunction removeDistantNodes(preload, removeBelow) {\n\t\t\t\t// we check to see the the nodes are \"far off\"\n\n\t\t\t\tvar startingPreload = preload;\n\t\t\t\tpreload = traverseToEndPreload(preload, removeBelow);\n\n\t\t\t\tvar distanceOff = calculateDistanceOffset(preload, removeBelow);\n\t\t\t\tvar farOffRemoval = grid.farOffRemoval;\n\t\t\t\tvar preloadNode = preload.node;\n\t\t\t\tvar domTraversal = removeBelow ? 'previousSibling' : 'nextSibling';\n\t\t\t\tvar count = 0;\n\t\t\t\tvar reclaimedHeight = 0;\n\t\t\t\tvar firstRowIndex;\n\t\t\t\tvar lastRowIndex;\n\n\t\t\t\tfunction findNextPreload() {\n\t\t\t\t\tvar topPreloadWanted = !removeBelow;\n\t\t\t\t\tvar newPreload = preload;\n\t\t\t\t\twhile ((newPreload = newPreload[removeBelow ? 'previous' : 'next'])) {\n\t\t\t\t\t\tif (topPreloadWanted === newPreload.top) {\n\t\t\t\t\t\t\treturn newPreload;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction isEmpty(aPreload) {\n\t\t\t\t\treturn isPreloadNode(aPreload.top ? aPreload.node.nextSibling : aPreload.node.previousSibling);\n\t\t\t\t}\n\n\t\t\t\tfunction traversePreload() {\n\t\t\t\t\tvar newPreload = findNextPreload();\n\t\t\t\t\tvar node;\n\n\t\t\t\t\tif (newPreload && startingPreload !== newPreload && !isEmpty(newPreload)) {\n\t\t\t\t\t\tadjustPreloadStats();\n\n\t\t\t\t\t\tpreload = newPreload;\n\t\t\t\t\t\tpreloadNode = preload.node;\n\t\t\t\t\t\tdistanceOff = calculateDistanceOffset(preload, removeBelow);\n\t\t\t\t\t\tnode = traverseNode(preloadNode);\n\t\t\t\t\t\tresetRowIndexes(node);\n\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction traverseNode(referenceNode) {\n\t\t\t\t\t// Preload node referenced was first moved to the appropriate end of the list and\n\t\t\t\t\t// now we are moving toward the viewable area.\n\t\t\t\t\tvar refIsPreload = isPreloadNode(referenceNode);\n\t\t\t\t\tvar node = referenceNode[domTraversal];\n\t\t\t\t\tvar childNode;\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tif (!isRowNode(node)) {\n\t\t\t\t\t\t\tif (refIsPreload && isPreloadNode(node)) {\n\t\t\t\t\t\t\t\tnode = null;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchildNode = traversePreload();\n\t\t\t\t\t\t\t\tif (childNode) {\n\t\t\t\t\t\t\t\t\tnode = childNode;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnode = traverseNode(node);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn node;\n\t\t\t\t}\n\n\t\t\t\tfunction adjustPreloadStats() {\n\t\t\t\t\t// adjust the preloadNode based on the reclaimed space\n\t\t\t\t\tpreload.count += count;\n\t\t\t\t\tif (removeBelow) {\n\t\t\t\t\t\tpreloadNode.rowIndex -= count;\n\t\t\t\t\t}\n\t\t\t\t\tgrid._adjustPreloadHeight(preload);\n\t\t\t\t\tcount = 0;\n\n\t\t\t\t\tgrid._releaseRange(preload, removeBelow, firstRowIndex, lastRowIndex);\n\t\t\t\t}\n\n\t\t\t\tfunction resetRowIndexes(row) {\n\t\t\t\t\tfirstRowIndex = row && row.rowIndex;\n\t\t\t\t\tlastRowIndex = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (distanceOff > 2 * farOffRemoval) {\n\t\t\t\t\t// there is a preloadNode that is far off;\n\t\t\t\t\t// remove rows until we get to in the current viewport\n\t\t\t\t\tvar row;\n\t\t\t\t\tvar nextRow = traverseNode(preloadNode);\n\t\t\t\t\tresetRowIndexes(nextRow);\n\n\t\t\t\t\twhile ((row = nextRow) && startingPreload !== preload) {\n\t\t\t\t\t\tvar currentRowHeight = grid._calcRowHeight(row);\n\t\t\t\t\t\tif (reclaimedHeight + currentRowHeight + farOffRemoval > distanceOff || !isRowNode(row)) {\n\t\t\t\t\t\t\t// we have reclaimed enough rows or we have gone beyond grid rows\n\t\t\t\t\t\t\tnextRow = traversePreload();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treclaimedHeight += currentRowHeight;\n\t\t\t\t\t\tcount += row.count || 1;\n\t\t\t\t\t\tgrid._pruneRow(row, removeBelow);\n\n\t\t\t\t\t\tif ('rowIndex' in row) {\n\t\t\t\t\t\t\tlastRowIndex = row.rowIndex;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextRow = traverseNode(row);\n\t\t\t\t\t}\n\n\t\t\t\t\tadjustPreloadStats();\n\t\t\t\t\tgrid._deleteNodeQueue();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction traversePreload(preload, moveNext) {\n\t\t\t\t// Skip past preloads that are not currently connected\n\t\t\t\tdo {\n\t\t\t\t\tpreload = moveNext ? preload.next : preload.previous;\n\t\t\t\t} while (preload && !preload.node.offsetWidth);\n\t\t\t\treturn preload;\n\t\t\t}\n\n\t\t\twhile (preload && !preload.node.offsetWidth) {\n\t\t\t\t// skip past preloads that are not currently connected\n\t\t\t\tpreload = preload.previous;\n\t\t\t}\n\t\t\t// there can be multiple preloadNodes (if they split, or multiple queries are created),\n\t\t\t//\tso we can traverse them until we find whatever is in the current viewport, making\n\t\t\t//\tsure we don't backtrack\n\t\t\twhile (preload && preload !== priorPreload) {\n\t\t\t\tpriorPreload = grid.preload;\n\t\t\t\tgrid.preload = preload;\n\t\t\t\tpreloadNode = preload.node;\n\t\t\t\tvar preloadTop = preloadNode.offsetTop;\n\n\t\t\t\tif (visibleBottom + mungeAmount + searchBuffer < preloadTop) {\n\t\t\t\t\t// the preload is below the line of sight\n\t\t\t\t\tpreload = traversePreload(preload, (preloadSearchNext = false));\n\t\t\t\t}\n\t\t\t\telse if (visibleTop - mungeAmount - searchBuffer > preloadTop + preloadNode.offsetHeight) {\n\t\t\t\t\t// the preload is above the line of sight\n\t\t\t\t\tpreload = traversePreload(preload, (preloadSearchNext = true));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// the preload node is visible, or close to visible, better show it\n\t\t\t\t\tvar offset = ((preloadNode.top ? visibleTop - requestBuffer :\n\t\t\t\t\t\t\tvisibleBottom) - preloadTop) / preload.rowHeight;\n\t\t\t\t\tvar count = (visibleBottom - visibleTop + 2 * requestBuffer) / preload.rowHeight;\n\t\t\t\t\t// utilize momentum for predictions\n\t\t\t\t\tvar momentum = Math.max(\n\t\t\t\t\t\tMath.min((visibleTop - lastScrollTop) * preload.rowHeight, grid.maxRowsPerPage / 2),\n\t\t\t\t\t\tgrid.maxRowsPerPage / -2);\n\t\t\t\t\tcount += Math.min(Math.abs(momentum), 10);\n\t\t\t\t\tif (preloadNode.top) {\n\t\t\t\t\t\t// at the top, adjust from bottom to top\n\t\t\t\t\t\toffset -= count;\n\t\t\t\t\t}\n\t\t\t\t\toffset = Math.max(offset, 0);\n\t\t\t\t\tif (offset < 10 && offset > 0 && count + offset < grid.maxRowsPerPage) {\n\t\t\t\t\t\t// connect to the top of the preloadNode if possible to avoid excessive adjustments\n\t\t\t\t\t\tcount += Math.max(0, offset);\n\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t}\n\t\t\t\t\tcount = Math.min(Math.max(count, grid.minRowsPerPage),\n\t\t\t\t\t\tgrid.maxRowsPerPage, preload.count);\n\n\t\t\t\t\tif (count === 0) {\n\t\t\t\t\t\tpreload = traversePreload(preload, preloadSearchNext);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tcount = Math.ceil(count);\n\t\t\t\t\toffset = Math.min(Math.floor(offset), preload.count - count);\n\n\t\t\t\t\tvar options = {};\n\t\t\t\t\tpreload.count -= count;\n\t\t\t\t\tvar beforeNode = preloadNode,\n\t\t\t\t\t\tkeepScrollTo,\n\t\t\t\t\t\tqueryRowsOverlap = grid.queryRowsOverlap,\n\t\t\t\t\t\tbottomPreload = !preload.top && preload;\n\t\t\t\t\tif (bottomPreload) {\n\t\t\t\t\t\t// add new rows below\n\t\t\t\t\t\tvar previous = preload.previous;\n\t\t\t\t\t\tif (previous) {\n\t\t\t\t\t\t\tremoveDistantNodes(preload);\n\t\t\t\t\t\t\tif (offset > 0 && isPreloadNode(preloadNode.previousSibling)) {\n\t\t\t\t\t\t\t\t// all of the nodes above were removed\n\t\t\t\t\t\t\t\toffset = Math.min(preload.count, offset);\n\t\t\t\t\t\t\t\tpreload.previous.count += offset;\n\t\t\t\t\t\t\t\tgrid._adjustPreloadHeight(preload.previous, true);\n\t\t\t\t\t\t\t\tpreloadNode.rowIndex += offset;\n\t\t\t\t\t\t\t\tqueryRowsOverlap = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tcount += offset;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpreload.count -= offset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\toptions.start = preloadNode.rowIndex - queryRowsOverlap;\n\t\t\t\t\t\toptions.count = Math.min(count + queryRowsOverlap, grid.maxRowsPerPage);\n\t\t\t\t\t\tpreloadNode.rowIndex = options.start + options.count;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// add new rows above\n\t\t\t\t\t\tif (preload.next) {\n\t\t\t\t\t\t\t// remove out of sight nodes first\n\t\t\t\t\t\t\tbeforeNode = preloadNode.nextSibling;\n\t\t\t\t\t\t\tremoveDistantNodes(preload, true);\n\t\t\t\t\t\t\tif (isPreloadNode(preloadNode.nextSibling)) {\n\t\t\t\t\t\t\t\t// all of the nodes were removed, can position wherever we want\n\t\t\t\t\t\t\t\tpreload.next.count += preload.count - offset;\n\t\t\t\t\t\t\t\tpreload.next.node.rowIndex = offset + count;\n\t\t\t\t\t\t\t\tgrid._adjustPreloadHeight(preload.next);\n\t\t\t\t\t\t\t\tpreload.count = offset;\n\t\t\t\t\t\t\t\tqueryRowsOverlap = 0;\n\t\t\t\t\t\t\t\tbeforeNode = preload.next.node;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tkeepScrollTo = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\toptions.start = preload.count;\n\t\t\t\t\t\toptions.count = Math.min(count + queryRowsOverlap, grid.maxRowsPerPage);\n\t\t\t\t\t\toptions.scrollingUp = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (keepScrollTo && beforeNode && beforeNode.offsetWidth) {\n\t\t\t\t\t\t// Before adjusting the size of the preload node for the new rows yet to be loaded, remember\n\t\t\t\t\t\t// the current position of beforeNode so the scroll position can be adjusted after\n\t\t\t\t\t\t// the new rows are added.\n\t\t\t\t\t\tkeepScrollTo = beforeNode.offsetTop;\n\t\t\t\t\t}\n\t\t\t\t\tgrid._adjustPreloadHeight(preload);\n\n\t\t\t\t\t// use the query associated with the preload node to get the next \"page\"\n\t\t\t\t\tif ('level' in preload.query) {\n\t\t\t\t\t\toptions.queryLevel = preload.query.level;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Avoid spurious queries (ideally this should be unnecessary...)\n\t\t\t\t\tif (!('queryLevel' in options) && (options.start > grid._total || options.count < 0)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a loading node as a placeholder while the data is loaded\n\t\t\t\t\tvar loadingNode = domConstruct.create('div', {\n\t\t\t\t\t\tclassName: 'dgrid-loading',\n\t\t\t\t\t\tstyle: { height: count * preload.rowHeight + 'px' }\n\t\t\t\t\t}, beforeNode, 'before');\n\t\t\t\t\tdomConstruct.create('div', {\n\t\t\t\t\t\tclassName: 'dgrid-' + (bottomPreload ? 'below' : 'above'),\n\t\t\t\t\t\tinnerHTML: grid.loadingMessage\n\t\t\t\t\t}, loadingNode);\n\t\t\t\t\tloadingNode.count = count;\n\n\t\t\t\t\t// Query now to fill in these rows.\n\t\t\t\t\tgrid._trackError(function () {\n\t\t\t\t\t\t// Use function to isolate the variables in case we make multiple requests\n\t\t\t\t\t\t// (which can happen if we need to render on both sides of an island of already-rendered rows)\n\t\t\t\t\t\t(function (loadingNode, below, keepScrollTo) {\n\t\t\t\t\t\t\t/* jshint maxlen: 122 */\n\t\t\t\t\t\t\tvar rangeResults = preload.query(options);\n\t\t\t\t\t\t\tlastRows = grid.renderQueryResults(rangeResults, loadingNode, options).then(function (rows) {\n\t\t\t\t\t\t\t\tvar gridRows = grid._rows;\n\t\t\t\t\t\t\t\tif (gridRows && !('queryLevel' in options) && rows.length) {\n\t\t\t\t\t\t\t\t\t// Update relevant observed range for top-level items\n\t\t\t\t\t\t\t\t\tif (below) {\n\t\t\t\t\t\t\t\t\t\tif (gridRows.max <= gridRows.min) {\n\t\t\t\t\t\t\t\t\t\t\t// All rows were removed; update start of rendered range as well\n\t\t\t\t\t\t\t\t\t\t\tgridRows.min = rows[0].rowIndex;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgridRows.max = rows[rows.length - 1].rowIndex;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tif (gridRows.max <= gridRows.min) {\n\t\t\t\t\t\t\t\t\t\t\t// All rows were removed; update end of rendered range as well\n\t\t\t\t\t\t\t\t\t\t\tgridRows.max = rows[rows.length - 1].rowIndex;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgridRows.min = rows[0].rowIndex;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// can remove the loading node now\n\t\t\t\t\t\t\t\tbeforeNode = loadingNode.nextSibling;\n\t\t\t\t\t\t\t\tdomConstruct.destroy(loadingNode);\n\t\t\t\t\t\t\t\t// beforeNode may have been removed if the query results loading node was removed\n\t\t\t\t\t\t\t\t// as a distant node before rendering\n\t\t\t\t\t\t\t\tif (keepScrollTo && beforeNode && beforeNode.offsetWidth) {\n\t\t\t\t\t\t\t\t\t// if the preload area above the nodes is approximated based on average\n\t\t\t\t\t\t\t\t\t// row height, we may need to adjust the scroll once they are filled in\n\t\t\t\t\t\t\t\t\t// so we don't \"jump\" in the scrolling position\n\t\t\t\t\t\t\t\t\tgrid.scrollTo({\n\t\t\t\t\t\t\t\t\t\ty: grid.bodyNode.scrollTop + beforeNode.offsetTop - keepScrollTo\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trangeResults.totalLength.then(function (total) {\n\t\t\t\t\t\t\t\t\tif (!('queryLevel' in options)) {\n\t\t\t\t\t\t\t\t\t\tgrid._total = total;\n\t\t\t\t\t\t\t\t\t\tif (grid._rows && grid._rows.max >= grid._total - 1) {\n\t\t\t\t\t\t\t\t\t\t\tgrid._rows.max = Infinity;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (below) {\n\t\t\t\t\t\t\t\t\t\t// if it is below, we will use the total from the collection to update\n\t\t\t\t\t\t\t\t\t\t// the count of the last preload in case the total changes as\n\t\t\t\t\t\t\t\t\t\t// later pages are retrieved\n\n\t\t\t\t\t\t\t\t\t\t// recalculate the count\n\t\t\t\t\t\t\t\t\t\tbelow.count = total - below.node.rowIndex;\n\t\t\t\t\t\t\t\t\t\t// readjust the height\n\t\t\t\t\t\t\t\t\t\tgrid._adjustPreloadHeight(below);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t// make sure we have covered the visible area\n\t\t\t\t\t\t\t\tgrid._processScroll();\n\t\t\t\t\t\t\t\treturn rows;\n\t\t\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\t\t\tdomConstruct.destroy(loadingNode);\n\t\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})(loadingNode, bottomPreload, keepScrollTo);\n\t\t\t\t\t});\n\n\t\t\t\t\tpreload = preload.previous;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// return the promise from the last render\n\t\t\treturn lastRows;\n\t\t},\n\n\t\t_adjustPreloadHeight: function (preload, noMax) {\n\t\t\tpreload.node.style.height = this._calculatePreloadHeight(preload, noMax) + 'px';\n\t\t},\n\n\t\t_calculatePreloadHeight: function (preload, noMax) {\n\t\t\treturn Math.min(preload.count * preload.rowHeight,\n\t\t\t\tnoMax ? Infinity : this.maxEmptySpace);\n\t\t},\n\n\t\t_pruneRow: function (rowElement, removeBelow, options) {\n\t\t\t// Calling _pruneRow indicates the row is not being deleted permanantly but could be restored\n\t\t\t// as the grid scrolls.\n\n\t\t\t// Just do cleanup here, as we will do a more efficient node destruction will be done later.\n\t\t\tthis.removeRow(rowElement, true, options);\n\t\t\tthis._queueNodeForDeletion(rowElement);\n\t\t},\n\n\t\t_queueNodeForDeletion: function (node) {\n\t\t\tthis._deleteQueue.push(node);\n\t\t},\n\n\t\t_deleteNodeQueue: function () {\n\t\t\tvar trashBin = document.createElement('div');\n\t\t\tvar toDelete = this._deleteQueue;\n\t\t\tfor (var i = toDelete.length; i--;) {\n\t\t\t\ttrashBin.appendChild(toDelete[i]);\n\t\t\t}\n\t\t\tthis._deleteQueue = [];\n\t\t\tsetTimeout(function () {\n\t\t\t\t// we can defer the destruction until later\n\t\t\t\tdomConstruct.destroy(trashBin);\n\t\t\t}, 1);\n\t\t},\n\n\t\t_removePreloads: function (preloadNodes) {\n\t\t\t// summary:\n\t\t\t// \t\tRemove the preload objects from the linked list that correspond to the\n\t\t\t// \t\tsupplied DOM nodes.\n\t\t\tif (!preloadNodes || !preloadNodes.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar grid = this;\n\t\t\tvar headPreload = this._getHeadPreload();\n\t\t\tpreloadNodes.forEach(function (preloadNode) {\n\t\t\t\tvar preload = grid._findPreload(preloadNode, headPreload);\n\t\t\t\tif (preload) {\n\t\t\t\t\t// Remove the found preload object from the linked list.\n\t\t\t\t\tif (preload.previous) {\n\t\t\t\t\t\tpreload.previous.next = preload.next;\n\t\t\t\t\t}\n\t\t\t\t\tif (preload.next) {\n\t\t\t\t\t\tpreload.next.previous = preload.previous;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t_getHeadPreload: function () {\n\t\t\tvar headPreload = this.preload;\n\t\t\tif (headPreload) {\n\t\t\t\twhile (headPreload.previous) {\n\t\t\t\t\theadPreload = headPreload.previous;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn headPreload;\n\t\t},\n\n\t\t_findPreload: function (preloadNode, startingPreload) {\n\t\t\tif (!startingPreload) {\n\t\t\t\tstartingPreload = this._getHeadPreload();\n\t\t\t}\n\t\t\tvar preload = startingPreload;\n\t\t\twhile (preload) {\n\t\t\t\tif (preload.node === preloadNode) {\n\t\t\t\t\treturn preload;\n\t\t\t\t}\n\t\t\t\tpreload = preload.next;\n\t\t\t}\n\t\t},\n\n\t\t_getRenderedCollection: function (/* preload */) {\n\t\t\t// This allows extensions to overload the collection retrieval mechanism.\n\t\t\treturn this._renderedCollection;\n\t\t},\n\n\t\t_releaseRange: function (preload, removeBelow, firstRowIndex, lastRowIndex) {\n\t\t\tif (!preload) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar level = preload.level;\n\t\t\tvar renderedCollection = this._getRenderedCollection(preload);\n\t\t\tif (lastRowIndex != null) {\n\t\t\t\tif (renderedCollection.releaseRange &&\n\t\t\t\t\ttypeof firstRowIndex === 'number' && typeof lastRowIndex === 'number') {\n\t\t\t\t\t// Note that currently child rows in Tree structures are never unrendered;\n\t\t\t\t\t// this logic will need to be revisited when that is addressed.\n\n\t\t\t\t\t// releaseRange is end-exclusive, and won't remove anything if start >= end.\n\t\t\t\t\tif (removeBelow) {\n\t\t\t\t\t\trenderedCollection.releaseRange(lastRowIndex, firstRowIndex + 1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\trenderedCollection.releaseRange(firstRowIndex, lastRowIndex + 1);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._rows && !level) {\n\t\t\t\t\t\tthis._rows[removeBelow ? 'max' : 'min'] = lastRowIndex;\n\t\t\t\t\t\tif (this._rows.max >= this._total - 1) {\n\t\t\t\t\t\t\tthis._rows.max = Infinity;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/aspect',\n\t'dojo/dom-class',\n\t'dojo/mouse',\n\t'dojo/on',\n\t'dojo/sniff',\n\t'dojo/has!touch?./util/touch',\n\t'dojo/query', // for on.selector\n\t'dojo/dom' // for has('css-user-select') in 1.8.2+\n], function (declare, aspect, domClass, mouse, on, has, touchUtil) {\n\n\thas.add('dom-comparedocumentposition', function (global, doc, element) {\n\t\treturn !!element.compareDocumentPosition;\n\t});\n\n\t// Add a feature test for the onselectstart event, which offers a more\n\t// graceful fallback solution than node.unselectable.\n\thas.add('dom-selectstart', typeof document.onselectstart !== 'undefined');\n\n\tvar ctrlEquiv = has('mac') ? 'metaKey' : 'ctrlKey',\n\t\thasUserSelect = has('css-user-select'),\n\t\thasPointer = has('pointer'),\n\t\thasMSPointer = hasPointer && hasPointer.slice(0, 2) === 'MS',\n\t\tdownType = hasPointer ? hasPointer + (hasMSPointer ? 'Down' : 'down') : 'mousedown',\n\t\tupType = hasPointer ? hasPointer + (hasMSPointer ? 'Up' : 'up') : 'mouseup';\n\n\tif (hasUserSelect === 'WebkitUserSelect' && typeof document.documentElement.style.msUserSelect !== 'undefined') {\n\t\t// Edge defines both webkit and ms prefixes, rendering feature detects as brittle as UA sniffs...\n\t\thasUserSelect = false;\n\t}\n\n\tfunction makeUnselectable(node, unselectable) {\n\t\t// Utility function used in fallback path for recursively setting unselectable\n\t\tvar value = node.unselectable = unselectable ? 'on' : '',\n\t\t\telements = node.getElementsByTagName('*'),\n\t\t\ti = elements.length;\n\n\t\twhile (--i) {\n\t\t\tif (elements[i].tagName === 'INPUT' || elements[i].tagName === 'TEXTAREA') {\n\t\t\t\tcontinue; // Don't prevent text selection in text input fields.\n\t\t\t}\n\t\t\telements[i].unselectable = value;\n\t\t}\n\t}\n\n\tfunction setSelectable(grid, selectable) {\n\t\t// Alternative version of dojo/dom.setSelectable based on feature detection.\n\n\t\t// For FF < 21, use -moz-none, which will respect -moz-user-select: text on\n\t\t// child elements (e.g. form inputs). In FF 21, none behaves the same.\n\t\t// See https://developer.mozilla.org/en-US/docs/CSS/user-select\n\t\tvar node = grid.bodyNode,\n\t\t\tvalue = selectable ? 'text' : has('ff') < 21 ? '-moz-none' : 'none';\n\n\t\t// In IE10+, -ms-user-select: none will block selection from starting within the\n\t\t// element, but will not block an existing selection from entering the element.\n\t\t// When using a modifier key, IE will select text inside of the element as well\n\t\t// as outside of the element, because it thinks the selection started outside.\n\t\t// Therefore, fall back to other means of blocking selection for IE10+.\n\t\t// Newer versions of Dojo do not even report msUserSelect (see https://github.com/dojo/dojo/commit/7ae2a43).\n\t\tif (hasUserSelect && hasUserSelect !== 'msUserSelect') {\n\t\t\tnode.style[hasUserSelect] = value;\n\t\t}\n\t\telse if (has('dom-selectstart')) {\n\t\t\t// For browsers that don't support user-select but support selectstart (IE<10),\n\t\t\t// we can hook up an event handler as necessary. Since selectstart bubbles,\n\t\t\t// it will handle any child elements as well.\n\t\t\t// Note, however, that both this and the unselectable fallback below are\n\t\t\t// incapable of preventing text selection from outside the targeted node.\n\t\t\tif (!selectable && !grid._selectstartHandle) {\n\t\t\t\tgrid._selectstartHandle = on(node, 'selectstart', function (evt) {\n\t\t\t\t\tvar tag = evt.target && evt.target.tagName;\n\n\t\t\t\t\t// Prevent selection except where a text input field is involved.\n\t\t\t\t\tif (tag !== 'INPUT' && tag !== 'TEXTAREA') {\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (selectable && grid._selectstartHandle) {\n\t\t\t\tgrid._selectstartHandle.remove();\n\t\t\t\tdelete grid._selectstartHandle;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// For browsers that don't support either user-select or selectstart (Opera),\n\t\t\t// we need to resort to setting the unselectable attribute on all nodes\n\t\t\t// involved. Since this doesn't automatically apply to child nodes, we also\n\t\t\t// need to re-apply it whenever rows are rendered.\n\t\t\tmakeUnselectable(node, !selectable);\n\t\t\tif (!selectable && !grid._unselectableHandle) {\n\t\t\t\tgrid._unselectableHandle = aspect.after(grid, 'renderRow', function (row) {\n\t\t\t\t\tmakeUnselectable(row, true);\n\t\t\t\t\treturn row;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (selectable && grid._unselectableHandle) {\n\t\t\t\tgrid._unselectableHandle.remove();\n\t\t\t\tdelete grid._unselectableHandle;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn declare(null, {\n\t\t// summary:\n\t\t//\t\tAdd selection capabilities to a grid. The grid will have a selection property and\n\t\t//\t\tfire \"dgrid-select\" and \"dgrid-deselect\" events.\n\n\t\t// selectionDelegate: String\n\t\t//\t\tSelector to delegate to as target of selection events.\n\t\tselectionDelegate: '.dgrid-row',\n\n\t\t// selectionEvents: String|Function\n\t\t//\t\tEvent (or comma-delimited events, or extension event) to listen on\n\t\t//\t\tto trigger select logic.\n\t\tselectionEvents: downType + ',' + upType + ',dgrid-cellfocusin',\n\n\t\t// selectionTouchEvents: String|Function\n\t\t//\t\tEvent (or comma-delimited events, or extension event) to listen on\n\t\t//\t\tin addition to selectionEvents for touch devices.\n\t\tselectionTouchEvents: has('touch') ? touchUtil.tap : null,\n\n\t\t// deselectOnRefresh: Boolean\n\t\t//\t\tIf true, the selection object will be cleared when refresh is called.\n\t\tdeselectOnRefresh: true,\n\n\t\t// allowSelectAll: Boolean\n\t\t//\t\tIf true, allow ctrl/cmd+A to select all rows.\n\t\t//\t\tAlso consulted by the selector plugin for showing select-all checkbox.\n\t\tallowSelectAll: false,\n\n\t\t// selection:\n\t\t//\t\tAn object where the property names correspond to\n\t\t//\t\tobject ids and values are true or false depending on whether an item is selected\n\t\tselection: {},\n\n\t\t// selectionMode: String\n\t\t//\t\tThe selection mode to use, can be \"none\", \"multiple\", \"single\", or \"extended\".\n\t\tselectionMode: 'extended',\n\n\t\t// allowTextSelection: Boolean\n\t\t//\t\tWhether to still allow text within cells to be selected. The default\n\t\t//\t\tbehavior is to allow text selection only when selectionMode is none;\n\t\t//\t\tsetting this property to either true or false will explicitly set the\n\t\t//\t\tbehavior regardless of selectionMode.\n\t\tallowTextSelection: undefined,\n\n\t\t// _selectionTargetType: String\n\t\t//\t\tIndicates the property added to emitted events for selected targets;\n\t\t//\t\toverridden in CellSelection\n\t\t_selectionTargetType: 'rows',\n\n\t\tcreate: function () {\n\t\t\tthis.selection = {};\n\t\t\treturn this.inherited(arguments);\n\t\t},\n\t\tpostCreate: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\tthis._initSelectionEvents();\n\n\t\t\t// Force selectionMode setter to run\n\t\t\tvar selectionMode = this.selectionMode;\n\t\t\tthis.selectionMode = '';\n\t\t\tthis._setSelectionMode(selectionMode);\n\t\t},\n\n\t\tdestroy: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Remove any extra handles added by Selection.\n\t\t\tif (this._selectstartHandle) {\n\t\t\t\tthis._selectstartHandle.remove();\n\t\t\t}\n\t\t\tif (this._unselectableHandle) {\n\t\t\t\tthis._unselectableHandle.remove();\n\t\t\t}\n\t\t\tif (this._removeDeselectSignals) {\n\t\t\t\tthis._removeDeselectSignals();\n\t\t\t}\n\t\t},\n\n\t\t_setSelectionMode: function (mode) {\n\t\t\t// summary:\n\t\t\t//\t\tUpdates selectionMode, resetting necessary variables.\n\n\t\t\tif (mode === this.selectionMode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Start selection fresh when switching mode.\n\t\t\tthis.clearSelection();\n\n\t\t\tthis.selectionMode = mode;\n\n\t\t\t// Compute name of selection handler for this mode once\n\t\t\t// (in the form of _fooSelectionHandler)\n\t\t\tthis._selectionHandlerName = '_' + mode + 'SelectionHandler';\n\n\t\t\t// Also re-run allowTextSelection setter in case it is in automatic mode.\n\t\t\tthis._setAllowTextSelection(this.allowTextSelection);\n\t\t},\n\n\t\t_setAllowTextSelection: function (allow) {\n\t\t\tif (typeof allow !== 'undefined') {\n\t\t\t\tsetSelectable(this, allow);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsetSelectable(this, this.selectionMode === 'none');\n\t\t\t}\n\t\t\tthis.allowTextSelection = allow;\n\t\t},\n\n\t\t_handleSelect: function (event, target) {\n\t\t\tif (mouse.isRight(event)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Don't run if selection mode doesn't have a handler (incl. \"none\"), target can't be selected,\n\t\t\t// or if coming from a dgrid-cellfocusin from a mousedown\n\t\t\tif (!this[this._selectionHandlerName] || !this.allowSelect(this.row(target)) ||\n\t\t\t\t\t(event.type === 'dgrid-cellfocusin' && event.parentType === 'mousedown') ||\n\t\t\t\t\t(event.type === upType && target !== this._waitForMouseUp)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._waitForMouseUp = null;\n\t\t\tthis._selectionTriggerEvent = event;\n\n\t\t\t// Don't call select handler for ctrl+navigation\n\t\t\tif (!event.keyCode || !event.ctrlKey || event.keyCode === 32) {\n\t\t\t\t// If clicking a selected item, wait for mouseup so that drag n' drop\n\t\t\t\t// is possible without losing our selection\n\t\t\t\tif (!event.shiftKey && event.type === downType && this.isSelected(target)) {\n\t\t\t\t\tthis._waitForMouseUp = target;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis[this._selectionHandlerName](event, target);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._selectionTriggerEvent = null;\n\t\t},\n\n\t\t_singleSelectionHandler: function (event, target) {\n\t\t\t// summary:\n\t\t\t//\t\tSelection handler for \"single\" mode, where only one target may be\n\t\t\t//\t\tselected at a time.\n\n\t\t\tvar ctrlKey = event.keyCode ? event.ctrlKey : event[ctrlEquiv];\n\t\t\tif (this._lastSelected === target) {\n\t\t\t\t// Allow ctrl to toggle selection, even within single select mode.\n\t\t\t\tthis.select(target, null, !ctrlKey || !this.isSelected(target));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.clearSelection();\n\t\t\t\tthis.select(target);\n\t\t\t\tthis._lastSelected = target;\n\t\t\t}\n\t\t},\n\n\t\t_multipleSelectionHandler: function (event, target) {\n\t\t\t// summary:\n\t\t\t//\t\tSelection handler for \"multiple\" mode, where shift can be held to\n\t\t\t//\t\tselect ranges, ctrl/cmd can be held to toggle, and clicks/keystrokes\n\t\t\t//\t\twithout modifier keys will add to the current selection.\n\n\t\t\tvar lastRow = this._lastSelected,\n\t\t\t\tctrlKey = event.keyCode ? event.ctrlKey : event[ctrlEquiv],\n\t\t\t\tvalue;\n\n\t\t\tif (!event.shiftKey) {\n\t\t\t\t// Toggle if ctrl is held; otherwise select\n\t\t\t\tvalue = ctrlKey ? null : true;\n\t\t\t\tlastRow = null;\n\t\t\t}\n\t\t\tthis.select(target, lastRow, value);\n\n\t\t\tif (!lastRow) {\n\t\t\t\t// Update reference for potential subsequent shift+select\n\t\t\t\t// (current row was already selected above)\n\t\t\t\tthis._lastSelected = target;\n\t\t\t}\n\t\t},\n\n\t\t_extendedSelectionHandler: function (event, target) {\n\t\t\t// summary:\n\t\t\t//\t\tSelection handler for \"extended\" mode, which is like multiple mode\n\t\t\t//\t\texcept that clicks/keystrokes without modifier keys will clear\n\t\t\t//\t\tthe previous selection.\n\n\t\t\t// If the target is already selected, and is the sole selection, ignore a user action\n\t\t\t// that would simply select the target (causing unnecessary deselect/select).\n\t\t\tif (!event[ctrlEquiv] && this.isSelected(target) && this.getSelectedCount() === 1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Clear selection first for right-clicks outside selection and non-ctrl-clicks;\n\t\t\t// otherwise, extended mode logic is identical to multiple mode\n\t\t\tif (event.button === 2 ? !this.isSelected(target) :\n\t\t\t\t\t!(event.keyCode ? event.ctrlKey : event[ctrlEquiv])) {\n\t\t\t\tthis.clearSelection(null, true);\n\t\t\t}\n\t\t\tthis._multipleSelectionHandler(event, target);\n\t\t},\n\n\t\t_toggleSelectionHandler: function (event, target) {\n\t\t\t// summary:\n\t\t\t//\t\tSelection handler for \"toggle\" mode which simply toggles the selection\n\t\t\t//\t\tof the given target. Primarily useful for touch input.\n\n\t\t\tthis.select(target, null, null);\n\t\t},\n\n\t\t_initSelectionEvents: function () {\n\t\t\t// summary:\n\t\t\t//\t\tPerforms first-time hookup of event handlers containing logic\n\t\t\t//\t\trequired for selection to operate.\n\n\t\t\tvar grid = this,\n\t\t\t\tcontentNode = this.contentNode,\n\t\t\t\tselector = this.selectionDelegate;\n\n\t\t\tthis._selectionEventQueues = {\n\t\t\t\tdeselect: [],\n\t\t\t\tselect: []\n\t\t\t};\n\n\t\t\tif (has('touch') && !has('pointer') && this.selectionTouchEvents) {\n\t\t\t\t// Listen for taps, and also for mouse/keyboard, making sure not\n\t\t\t\t// to trigger both for the same interaction\n\t\t\t\ton(contentNode, touchUtil.selector(selector, this.selectionTouchEvents), function (evt) {\n\t\t\t\t\tgrid._handleSelect(evt, this);\n\t\t\t\t\tgrid._ignoreMouseSelect = this;\n\t\t\t\t});\n\t\t\t\ton(contentNode, on.selector(selector, this.selectionEvents), function (event) {\n\t\t\t\t\tif (grid._ignoreMouseSelect !== this) {\n\t\t\t\t\t\tgrid._handleSelect(event, this);\n\t\t\t\t\t}\n\t\t\t\t\telse if (event.type === upType) {\n\t\t\t\t\t\tgrid._ignoreMouseSelect = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Listen for mouse/keyboard actions that should cause selections\n\t\t\t\ton(contentNode, on.selector(selector, this.selectionEvents), function (event) {\n\t\t\t\t\tgrid._handleSelect(event, this);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Also hook up spacebar (for ctrl+space)\n\t\t\tif (this.addKeyHandler) {\n\t\t\t\tthis.addKeyHandler(32, function (event) {\n\t\t\t\t\tgrid._handleSelect(event, event.target);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If allowSelectAll is true, bind ctrl/cmd+A to (de)select all rows,\n\t\t\t// unless the event was received from an editor component.\n\t\t\t// (Handler further checks against _allowSelectAll, which may be updated\n\t\t\t// if selectionMode is changed post-init.)\n\t\t\tif (this.allowSelectAll) {\n\t\t\t\tthis.on('keydown', function (event) {\n\t\t\t\t\tif (event[ctrlEquiv] && event.keyCode === 65 &&\n\t\t\t\t\t\t\t!/\\bdgrid-input\\b/.test(event.target.className)) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tgrid[grid.allSelected ? 'clearSelection' : 'selectAll']();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Update aspects if there is a collection change\n\t\t\tif (this._setCollection) {\n\t\t\t\tthis._listeners.push(\n\t\t\t\t\taspect.before(this, '_setCollection', function (collection) {\n\t\t\t\t\t\tgrid._updateDeselectionAspect(collection);\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._updateDeselectionAspect();\n\t\t},\n\n\t\t_updateDeselectionAspect: function (collection) {\n\t\t\t// summary:\n\t\t\t//\t\tHooks up logic to handle deselection of removed items.\n\t\t\t//\t\tAspects to a trackable collection's notify method if applicable,\n\t\t\t//\t\tor to the list/grid's removeRow method otherwise.\n\n\t\t\tvar self = this,\n\t\t\t\tsignals;\n\n\t\t\tfunction ifSelected(rowArg, methodName) {\n\t\t\t\t// Calls a method if the row corresponding to the object is selected.\n\t\t\t\tvar row = self.row(rowArg),\n\t\t\t\t\tselection = row && self.selection[row.id];\n\t\t\t\t// Is the row currently in the selection list.\n\t\t\t\tif (selection) {\n\t\t\t\t\tself[methodName](row);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove anything previously configured\n\t\t\tif (this._removeDeselectSignals) {\n\t\t\t\tthis._removeDeselectSignals();\n\t\t\t}\n\n\t\t\tif (collection && collection.track && this._observeCollection) {\n\t\t\t\tsignals = [\n\t\t\t\t\taspect.before(this, '_observeCollection', function (collection) {\n\t\t\t\t\t\tsignals.push(\n\t\t\t\t\t\t\tcollection.on('delete', function (event) {\n\t\t\t\t\t\t\t\tif (typeof event.index === 'undefined') {\n\t\t\t\t\t\t\t\t\t// Call deselect on the row if the object is being removed. This allows the\n\t\t\t\t\t\t\t\t\t// deselect event to reference the row element while it still exists in the DOM.\n\t\t\t\t\t\t\t\t\tifSelected(event.id, 'deselect');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\taspect.after(this, '_observeCollection', function (collection) {\n\t\t\t\t\t\tsignals.push(\n\t\t\t\t\t\t\tcollection.on('update', function (event) {\n\t\t\t\t\t\t\t\tif (typeof event.index !== 'undefined') {\n\t\t\t\t\t\t\t\t\t// When List updates an item, the row element is removed and a new one inserted.\n\t\t\t\t\t\t\t\t\t// If at this point the object is still in grid.selection,\n\t\t\t\t\t\t\t\t\t// then call select on the row so the element's CSS is updated.\n\t\t\t\t\t\t\t\t\tifSelected(collection.getIdentity(event.target), 'select');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}, true)\n\t\t\t\t];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsignals = [\n\t\t\t\t\taspect.before(this, 'removeRow', function (rowElement, preserveDom) {\n\t\t\t\t\t\tvar row;\n\t\t\t\t\t\tif (!preserveDom) {\n\t\t\t\t\t\t\trow = this.row(rowElement);\n\t\t\t\t\t\t\t// if it is a real row removal for a selected item, deselect it\n\t\t\t\t\t\t\tif (row && (row.id in this.selection)) {\n\t\t\t\t\t\t\t\tthis.deselect(row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tthis._removeDeselectSignals = function () {\n\t\t\t\tfor (var i = signals.length; i--;) {\n\t\t\t\t\tsignals[i].remove();\n\t\t\t\t}\n\t\t\t\tsignals = [];\n\t\t\t};\n\t\t},\n\n\t\tallowSelect: function () {\n\t\t\t// summary:\n\t\t\t//\t\tA method that can be overriden to determine whether or not a row (or\n\t\t\t//\t\tcell) can be selected. By default, all rows (or cells) are selectable.\n\t\t\t// target: Object\n\t\t\t//\t\tRow object (for Selection) or Cell object (for CellSelection) for the\n\t\t\t//\t\trow/cell in question\n\t\t\treturn true;\n\t\t},\n\n\t\t_fireSelectionEvent: function (type) {\n\t\t\t// summary:\n\t\t\t//\t\tFires an event for the accumulated rows once a selection\n\t\t\t//\t\toperation is finished (whether singular or for a range)\n\n\t\t\tvar queue = this._selectionEventQueues[type],\n\t\t\t\ttriggerEvent = this._selectionTriggerEvent,\n\t\t\t\teventObject;\n\n\t\t\teventObject = {\n\t\t\t\tbubbles: true,\n\t\t\t\tgrid: this\n\t\t\t};\n\t\t\tif (triggerEvent) {\n\t\t\t\teventObject.parentType = triggerEvent.type;\n\t\t\t}\n\t\t\teventObject[this._selectionTargetType] = queue;\n\n\t\t\t// Clear the queue so that the next round of (de)selections starts anew\n\t\t\tthis._selectionEventQueues[type] = [];\n\n\t\t\ton.emit(this.contentNode, 'dgrid-' + type, eventObject);\n\t\t},\n\n\t\t_fireSelectionEvents: function () {\n\t\t\tvar queues = this._selectionEventQueues,\n\t\t\t\ttype;\n\n\t\t\tfor (type in queues) {\n\t\t\t\tif (queues[type].length) {\n\t\t\t\t\tthis._fireSelectionEvent(type);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_select: function (row, toRow, value) {\n\t\t\t// summary:\n\t\t\t//\t\tContains logic for determining whether to select targets, but\n\t\t\t//\t\tdoes not emit events. Called from select, deselect, selectAll,\n\t\t\t//\t\tand clearSelection.\n\n\t\t\tvar selection,\n\t\t\t\tpreviousValue,\n\t\t\t\telement,\n\t\t\t\ttoElement,\n\t\t\t\tdirection;\n\n\t\t\tif (typeof value === 'undefined') {\n\t\t\t\t// default to true\n\t\t\t\tvalue = true;\n\t\t\t}\n\t\t\tif (!row.element) {\n\t\t\t\trow = this.row(row);\n\t\t\t}\n\n\t\t\t// Check whether we're allowed to select the given row before proceeding.\n\t\t\t// If a deselect operation is being performed, this check is skipped,\n\t\t\t// to avoid errors when changing column definitions, and since disabled\n\t\t\t// rows shouldn't ever be selected anyway.\n\t\t\tif (value === false || this.allowSelect(row)) {\n\t\t\t\tselection = this.selection;\n\t\t\t\tpreviousValue = !!selection[row.id];\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// indicates a toggle\n\t\t\t\t\tvalue = !previousValue;\n\t\t\t\t}\n\t\t\t\telement = row.element;\n\t\t\t\tif (!value && !this.allSelected) {\n\t\t\t\t\tdelete this.selection[row.id];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tselection[row.id] = value;\n\t\t\t\t}\n\t\t\t\tif (element) {\n\t\t\t\t\t// add or remove classes as appropriate\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tdomClass.add(element, 'dgrid-selected' +\n\t\t\t\t\t\t\t(this.addUiClasses ? ' ui-state-active' : ''));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tdomClass.remove(element, 'dgrid-selected ui-state-active');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (value !== previousValue && element) {\n\t\t\t\t\t// add to the queue of row events\n\t\t\t\t\tthis._selectionEventQueues[(value ? '' : 'de') + 'select'].push(row);\n\t\t\t\t}\n\n\t\t\t\tif (toRow) {\n\t\t\t\t\tif (!toRow.element) {\n\t\t\t\t\t\ttoRow = this.row(toRow);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!toRow) {\n\t\t\t\t\t\tthis._lastSelected = element;\n\t\t\t\t\t\tconsole.warn('The selection range has been reset because the ' +\n\t\t\t\t\t\t\t'beginning of the selection is no longer in the DOM. ' +\n\t\t\t\t\t\t\t'If you are using OnDemandList, you may wish to increase ' +\n\t\t\t\t\t\t\t'farOffRemoval to avoid this, but note that keeping more nodes ' +\n\t\t\t\t\t\t\t'in the DOM may impact performance.');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\ttoElement = toRow.element;\n\t\t\t\t\tif (toElement) {\n\t\t\t\t\t\tdirection = this._determineSelectionDirection(element, toElement);\n\t\t\t\t\t\tif (!direction) {\n\t\t\t\t\t\t\t// The original element was actually replaced\n\t\t\t\t\t\t\ttoElement = document.getElementById(toElement.id);\n\t\t\t\t\t\t\tdirection = this._determineSelectionDirection(element, toElement);\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile (row.element !== toElement && (row = this[direction](row))) {\n\t\t\t\t\t\t\tthis._select(row, null, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Implement _determineSelectionDirection differently based on whether the\n\t\t// browser supports element.compareDocumentPosition; use sourceIndex for IE<9\n\t\t_determineSelectionDirection: has('dom-comparedocumentposition') ? function (from, to) {\n\t\t\tvar result = to.compareDocumentPosition(from);\n\t\t\tif (result & 1) {\n\t\t\t\treturn false; // Out of document\n\t\t\t}\n\t\t\treturn result === 2 ? 'down' : 'up';\n\t\t} : function (from, to) {\n\t\t\tif (to.sourceIndex < 1) {\n\t\t\t\treturn false; // Out of document\n\t\t\t}\n\t\t\treturn to.sourceIndex > from.sourceIndex ? 'down' : 'up';\n\t\t},\n\n\t\tselect: function (row, toRow, value) {\n\t\t\t// summary:\n\t\t\t//\t\tSelects or deselects the given row or range of rows.\n\t\t\t// row: Mixed\n\t\t\t//\t\tRow object (or something that can resolve to one) to (de)select\n\t\t\t// toRow: Mixed\n\t\t\t//\t\tIf specified, the inclusive range between row and toRow will\n\t\t\t//\t\tbe (de)selected\n\t\t\t// value: Boolean|Null\n\t\t\t//\t\tWhether to select (true/default), deselect (false), or toggle\n\t\t\t//\t\t(null) the row\n\n\t\t\tthis._select(row, toRow, value);\n\t\t\tthis._fireSelectionEvents();\n\t\t},\n\t\tdeselect: function (row, toRow) {\n\t\t\t// summary:\n\t\t\t//\t\tDeselects the given row or range of rows.\n\t\t\t// row: Mixed\n\t\t\t//\t\tRow object (or something that can resolve to one) to deselect\n\t\t\t// toRow: Mixed\n\t\t\t//\t\tIf specified, the inclusive range between row and toRow will\n\t\t\t//\t\tbe deselected\n\n\t\t\tthis.select(row, toRow, false);\n\t\t},\n\n\t\tclearSelection: function (exceptId, dontResetLastSelected) {\n\t\t\t// summary:\n\t\t\t//\t\tDeselects any currently-selected items.\n\t\t\t// exceptId: Mixed?\n\t\t\t//\t\tIf specified, the given id will not be deselected.\n\n\t\t\tthis.allSelected = false;\n\t\t\tfor (var id in this.selection) {\n\t\t\t\tif (exceptId !== id) {\n\t\t\t\t\tthis._select(id, null, false);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!dontResetLastSelected) {\n\t\t\t\tthis._lastSelected = null;\n\t\t\t}\n\t\t\tthis._fireSelectionEvents();\n\t\t},\n\t\tselectAll: function () {\n\t\t\tthis.allSelected = true;\n\t\t\tthis.selection = {}; // we do this to clear out pages from previous sorts\n\t\t\tfor (var i in this._rowIdToObject) {\n\t\t\t\tvar row = this.row(this._rowIdToObject[i]);\n\t\t\t\tthis._select(row.id, null, true);\n\t\t\t}\n\t\t\tthis._fireSelectionEvents();\n\t\t},\n\n\t\tgetSelectedCount: function () {\n\t\t\tvar count = 0;\n\n\t\t\tfor (var id in this.selection) {\n\t\t\t\tif (id) {\n\t\t\t\t\tcount += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn count;\n\t\t},\n\n\t\tisSelected: function (object) {\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if the indicated row is selected.\n\n\t\t\tif (typeof object === 'undefined' || object === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!object.element) {\n\t\t\t\tobject = this.row(object);\n\t\t\t}\n\n\t\t\t// First check whether the given row is indicated in the selection hash;\n\t\t\t// failing that, check if allSelected is true (testing against the\n\t\t\t// allowSelect method if possible)\n\t\t\treturn (object.id in this.selection) ? !!this.selection[object.id] :\n\t\t\t\tthis.allSelected && (!object.data || this.allowSelect(object));\n\t\t},\n\n\t\trefresh: function () {\n\t\t\tif (this.deselectOnRefresh) {\n\t\t\t\tthis.clearSelection();\n\t\t\t}\n\t\t\tthis._lastSelected = null;\n\t\t\treturn this.inherited(arguments);\n\t\t},\n\n\t\trenderArray: function () {\n\t\t\tvar rows = this.inherited(arguments),\n\t\t\t\tselection = this.selection,\n\t\t\t\ti,\n\t\t\t\trow,\n\t\t\t\tselected;\n\n\t\t\tfor (i = 0; i < rows.length; i++) {\n\t\t\t\trow = this.row(rows[i]);\n\t\t\t\tselected = row.id in selection ? selection[row.id] : this.allSelected;\n\t\t\t\tif (selected) {\n\t\t\t\t\tthis.select(row, null, selected);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._fireSelectionEvents();\n\t\t\treturn rows;\n\t\t}\n\t});\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/_base/lang',\n\t'dojo/Deferred',\n\t'dojo/aspect',\n\t'dojo/dom-construct',\n\t'dojo/has',\n\t'dojo/on',\n\t'dojo/when'\n], function (declare, lang, Deferred, aspect, domConstruct, has, on, when) {\n\t// This module isolates the base logic required by store-aware list/grid\n\t// components, e.g. OnDemandList/Grid and the Pagination extension.\n\n\tfunction emitError(err) {\n\t\t// called by _trackError in context of list/grid, if an error is encountered\n\t\tif (typeof err !== 'object') {\n\t\t\t// Ensure we actually have an error object, so we can attach a reference.\n\t\t\terr = new Error(err);\n\t\t}\n\t\telse if (err.dojoType === 'cancel') {\n\t\t\t// Don't fire dgrid-error events for errors due to canceled requests\n\t\t\t// (unfortunately, the Deferred instrumentation will still log them)\n\t\t\treturn;\n\t\t}\n\n\t\tvar event = on.emit(this.domNode, 'dgrid-error', {\n\t\t\tgrid: this,\n\t\t\terror: err,\n\t\t\tcancelable: true,\n\t\t\tbubbles: true\n\t\t});\n\t\tif (event) {\n\t\t\tconsole.error(err);\n\t\t}\n\t}\n\n\treturn declare(null, {\n\t\t// collection: Object\n\t\t//\t\tThe base object collection (implementing the dstore/api/Store API) before being sorted\n\t\t//\t\tor otherwise processed by the grid. Use it for general purpose store operations such as\n\t\t//\t\t`getIdentity` and `get`, `add`, `put`, and `remove`.\n\t\tcollection: null,\n\n\t\t// _renderedCollection: Object\n\t\t//\t\tThe object collection from which data is to be fetched. This is the sorted collection.\n\t\t//\t\tUse it when retrieving data to be rendered by the grid.\n\t\t_renderedCollection: null,\n\n\t\t// _rows: Array\n\t\t//\t\tSparse array of row nodes, used to maintain the grid in response to events from a tracked collection.\n\t\t//\t\tEach node's index corresponds to the index of its data object in the collection.\n\t\t_rows: null,\n\n\t\t// _observerHandle: Object\n\t\t//\t\tThe observer handle for the current collection, if trackable.\n\t\t_observerHandle: null,\n\n\t\t// _structureHandle: Object\n\t\t//\t\tThe observer handle for the configStructure aspect event.\n\t\t_structureHandle: null,\n\n\t\t// shouldTrackCollection: Boolean\n\t\t//\t\tWhether this instance should track any trackable collection it is passed.\n\t\tshouldTrackCollection: true,\n\n\t\t// getBeforePut: boolean\n\t\t//\t\tIf true, a get request will be performed to the store before each put\n\t\t//\t\tas a baseline when saving; otherwise, existing row data will be used.\n\t\tgetBeforePut: true,\n\n\t\t// noDataMessage: String\n\t\t//\t\tMessage to be displayed when no results exist for a collection, whether at\n\t\t//\t\tthe time of the initial query or upon subsequent observed changes.\n\t\t//\t\tDefined by _StoreMixin, but to be implemented by subclasses.\n\t\tnoDataMessage: '',\n\n\t\t// loadingMessage: String\n\t\t//\t\tMessage displayed when data is loading.\n\t\t//\t\tDefined by _StoreMixin, but to be implemented by subclasses.\n\t\tloadingMessage: '',\n\n\t\t_total: 0,\n\n\t\tconstructor: function () {\n\t\t\t// Create empty objects on each instance, not the prototype\n\t\t\tthis.dirty = {};\n\t\t\tthis._updating = {}; // Tracks rows that are mid-update\n\t\t\tthis._columnsWithSet = {};\n\n\t\t\t// Reset _columnsWithSet whenever column configuration is reset\n\t\t\tthis._structureHandle = aspect.before(this, 'configStructure', lang.hitch(this, function () {\n\t\t\t\tthis._columnsWithSet = {};\n\t\t\t}));\n\t\t},\n\n\t\tdestroy: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif (this._structureHandle) {\n\t\t\t\tthis._structureHandle.remove();\n\t\t\t}\n\t\t\tif (this._renderedCollection) {\n\t\t\t\tthis._cleanupCollection();\n\t\t\t}\n\t\t\tif (this._refreshTimeout) {\n\t\t\t\tclearTimeout(this._refreshTimeout);\n\t\t\t}\n\t\t},\n\n\t\t_configColumn: function (column) {\n\t\t\t// summary:\n\t\t\t//\t\tImplements extension point provided by Grid to store references to\n\t\t\t//\t\tany columns with `set` methods, for use during `save`.\n\t\t\tif (column.set) {\n\t\t\t\tthis._columnsWithSet[column.field] = column;\n\t\t\t}\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t_setCollection: function (collection) {\n\t\t\t// summary:\n\t\t\t//\t\tAssigns a new collection to the list/grid, sets up tracking\n\t\t\t//\t\tif applicable, and tells the list/grid to refresh.\n\n\t\t\tif (this._renderedCollection) {\n\t\t\t\tthis.cleanup();\n\t\t\t\tthis._cleanupCollection({\n\t\t\t\t\t// Only clear the dirty hash if the collection being used is actually from a different store\n\t\t\t\t\t// (i.e. not just a re-sorted / re-filtered version of the same store)\n\t\t\t\t\tshouldRevert: !collection || collection.storage !== this._renderedCollection.storage\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.collection = collection;\n\n\t\t\t// Avoid unnecessary rendering and processing before the grid has started up\n\t\t\tif (this._started) {\n\t\t\t\t// Once startup is called, List.startup sets the sort property which calls _StoreMixin._applySort\n\t\t\t\t// which sets the collection property again. So _StoreMixin._applySort will be executed again\n\t\t\t\t// after startup is called.\n\t\t\t\tif (collection) {\n\t\t\t\t\tvar renderedCollection = collection;\n\t\t\t\t\tif (this.sort && this.sort.length > 0) {\n\t\t\t\t\t\trenderedCollection = collection.sort(this.sort);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (renderedCollection.track && this.shouldTrackCollection) {\n\t\t\t\t\t\trenderedCollection = renderedCollection.track();\n\t\t\t\t\t\tthis._rows = [];\n\n\t\t\t\t\t\tthis._observerHandle = this._observeCollection(\n\t\t\t\t\t\t\trenderedCollection,\n\t\t\t\t\t\t\tthis.contentNode,\n\t\t\t\t\t\t\t{ rows: this._rows }\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._renderedCollection = renderedCollection;\n\t\t\t\t}\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t},\n\n\t\t_setStore: function () {\n\t\t\tif (!this.collection) {\n\t\t\t\tconsole.debug('set(\\'store\\') call detected, but you probably meant set(\\'collection\\')');\n\t\t\t}\n\t\t},\n\n\t\t_getTotal: function () {\n\t\t\t// summary:\n\t\t\t//\t\tRetrieves the currently-tracked total (as updated by\n\t\t\t//\t\tsubclasses after store queries, or by _StoreMixin in response to\n\t\t\t//\t\tupdated totalLength in events)\n\n\t\t\treturn this._total;\n\t\t},\n\n\t\t_cleanupCollection: function (options) {\n\t\t\t// summary:\n\t\t\t//\t\tHandles cleanup duty for the previous collection;\n\t\t\t//\t\tcalled during _setCollection and destroy.\n\t\t\t// options: Object?\n\t\t\t//\t\t* shouldRevert: Whether to clear the dirty hash\n\n\t\t\toptions = options || {};\n\n\t\t\t// Remove observer and existing rows so any sub-row observers will be cleaned up\n\t\t\tif (this._observerHandle) {\n\t\t\t\tthis._observerHandle.remove();\n\t\t\t\tthis._observerHandle = this._rows = null;\n\t\t\t}\n\n\t\t\t// Discard dirty map, as it applied to a previous collection\n\t\t\tif (options.shouldRevert !== false) {\n\t\t\t\tthis.dirty = {};\n\t\t\t}\n\n\t\t\tthis._renderedCollection = this.collection = null;\n\t\t},\n\n\t\t_applySort: function () {\n\t\t\tif (this.collection) {\n\t\t\t\tthis.set('collection', this.collection);\n\t\t\t}\n\t\t\telse if (this.store) {\n\t\t\t\tconsole.debug('_StoreMixin found store property but not collection; ' +\n\t\t\t\t\t'this is often the sign of a mistake during migration from 0.3 to 0.4');\n\t\t\t}\n\t\t},\n\n\t\t_emitRefreshComplete: function () {\n\t\t\t// summary:\n\t\t\t//\t\tHandles emitting the dgrid-refresh-complete event on a separate turn,\n\t\t\t//\t\tto enable event to be used consistently regardless of whether the backing store is async.\n\n\t\t\tvar self = this;\n\n\t\t\tthis._refreshTimeout = setTimeout(function () {\n\t\t\t\ton.emit(self.domNode, 'dgrid-refresh-complete', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcancelable: false,\n\t\t\t\t\tgrid: self\n\t\t\t\t});\n\t\t\t\tself._refreshTimeout = null;\n\t\t\t}, 0);\n\t\t},\n\n\t\t_insertNoDataNode: function (parentNode) {\n\t\t\t// summary:\n\t\t\t//\t\tCreates a node displaying noDataMessage.\n\n\t\t\t// Remove the current no data node if it exists.\n\t\t\tthis._removeNoDataNode();\n\n\t\t\tparentNode = parentNode || this.contentNode;\n\t\t\tvar noDataNode = this.noDataNode = domConstruct.create('div', {\n\t\t\t\tclassName: 'dgrid-no-data',\n\t\t\t\tinnerHTML: this.noDataMessage\n\t\t\t});\n\n\t\t\t// 2nd param is *required*, even if it is null\n\t\t\tparentNode.insertBefore(noDataNode, this._getFirstRowSibling ? this._getFirstRowSibling(parentNode) : null);\n\t\t\treturn noDataNode;\n\t\t},\n\n\t\t_removeNoDataNode: function () {\n\t\t\t// summary:\n\t\t\t//\t\tRemoves the noDataNode from the grid if it exists.\n\t\t\t//\t\tReturns true if a noDataNode existed previously.\n\t\t\t//\t\tReturns false if no noDataNode existed previously.\n\t\t\tif (this.noDataNode) {\n\t\t\t\tdomConstruct.destroy(this.noDataNode);\n\t\t\t\tdelete this.noDataNode;\n\t\t\t\treturn true; // Indicate that a noDataNode was removed.\n\t\t\t}\n\t\t\treturn false; // Indicate there was no noDataNode.\n\t\t},\n\n\t\trow: function () {\n\t\t\t// Extend List#row with more appropriate lookup-by-id logic\n\t\t\tvar row = this.inherited(arguments);\n\t\t\tif (row && row.data && typeof row.id !== 'undefined') {\n\t\t\t\trow.id = this.collection.getIdentity(row.data);\n\t\t\t}\n\t\t\treturn row;\n\t\t},\n\n\t\trefresh: function () {\n\t\t\tvar result = this.inherited(arguments);\n\n\t\t\tif (!this.collection) {\n\t\t\t\tthis._insertNoDataNode();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\trefreshCell: function (cell) {\n\t\t\tif (!this.collection || !this._createBodyRowCell) {\n\t\t\t\tthrow new Error('refreshCell requires a Grid with a collection.');\n\t\t\t}\n\n\t\t\tthis.inherited(arguments);\n\t\t\treturn this.collection.get(cell.row.id).then(lang.hitch(this, '_refreshCellFromItem', cell));\n\t\t},\n\n\t\t_refreshCellFromItem: function (cell, item, options) {\n\t\t\tvar cellElement = cell.element;\n\n\t\t\tdomConstruct.empty(cellElement);\n\n\t\t\tvar dirtyItem = this.dirty && this.dirty[cell.row.id];\n\t\t\tif (dirtyItem) {\n\t\t\t\titem = lang.delegate(item, dirtyItem);\n\t\t\t}\n\n\t\t\tthis._createBodyRowCell(cellElement, cell.column, item, options);\n\t\t},\n\n\t\trenderArray: function () {\n\t\t\tvar rows = this.inherited(arguments);\n\n\t\t\tif (!this.collection) {\n\t\t\t\tif (rows.length && this.noDataNode) {\n\t\t\t\t\tdomConstruct.destroy(this.noDataNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn rows;\n\t\t},\n\n\t\tinsertRow: function (object, parent, beforeNode, i, options) {\n\t\t\tvar store = this.collection,\n\t\t\t\tdirty = this.dirty,\n\t\t\t\tid = store && store.getIdentity(object),\n\t\t\t\tdirtyObj,\n\t\t\t\trow;\n\n\t\t\tif (id in dirty && !(id in this._updating)) {\n\t\t\t\tdirtyObj = dirty[id];\n\t\t\t}\n\t\t\tif (dirtyObj) {\n\t\t\t\t// restore dirty object as delegate on top of original object,\n\t\t\t\t// to provide protection for subsequent changes as well\n\t\t\t\tobject = lang.delegate(object, dirtyObj);\n\t\t\t}\n\n\t\t\trow = this.inherited(arguments);\n\n\t\t\tif (options && options.rows) {\n\t\t\t\toptions.rows[i] = row;\n\t\t\t}\n\n\t\t\t// Remove no data message when a new row appears.\n\t\t\t// Run after inherited logic to prevent confusion due to noDataNode\n\t\t\t// no longer being present as a sibling.\n\t\t\tif (this.noDataNode) {\n\t\t\t\tdomConstruct.destroy(this.noDataNode);\n\t\t\t\tthis.noDataNode = null;\n\t\t\t}\n\n\t\t\treturn row;\n\t\t},\n\n\t\tupdateDirty: function (id, field, value) {\n\t\t\t// summary:\n\t\t\t//\t\tUpdates dirty data of a field for the item with the specified ID.\n\t\t\tvar dirty = this.dirty,\n\t\t\t\tdirtyObj = dirty[id];\n\n\t\t\tif (!dirtyObj) {\n\t\t\t\tdirtyObj = dirty[id] = {};\n\t\t\t}\n\t\t\tdirtyObj[field] = value;\n\t\t},\n\n\t\tsave: function () {\n\t\t\t// Keep track of the store and puts\n\t\t\tvar self = this,\n\t\t\t\tstore = this.collection,\n\t\t\t\tdirty = this.dirty,\n\t\t\t\tdfd = new Deferred(),\n\t\t\t\tresults = {},\n\t\t\t\tgetFunc = function (id) {\n\t\t\t\t\t// returns a function to pass as a step in the promise chain,\n\t\t\t\t\t// with the id variable closured\n\t\t\t\t\tvar data;\n\t\t\t\t\treturn (self.getBeforePut || !(data = self.row(id).data)) ?\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\treturn store.get(id);\n\t\t\t\t\t\t} :\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t// function called within loop to generate a function for putting an item\n\t\t\tfunction putter(id, dirtyObj) {\n\t\t\t\t// Return a function handler\n\t\t\t\treturn function (object) {\n\t\t\t\t\tvar colsWithSet = self._columnsWithSet,\n\t\t\t\t\t\tupdating = self._updating,\n\t\t\t\t\t\tkey, data;\n\n\t\t\t\t\tif (typeof object.set === 'function') {\n\t\t\t\t\t\tobject.set(dirtyObj);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Copy dirty props to the original, applying setters if applicable\n\t\t\t\t\t\tfor (key in dirtyObj) {\n\t\t\t\t\t\t\tobject[key] = dirtyObj[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply any set methods in column definitions.\n\t\t\t\t\t// Note that while in the most common cases column.set is intended\n\t\t\t\t\t// to return transformed data for the key in question, it is also\n\t\t\t\t\t// possible to directly modify the object to be saved.\n\t\t\t\t\tfor (key in colsWithSet) {\n\t\t\t\t\t\tdata = colsWithSet[key].set(object);\n\t\t\t\t\t\tif (data !== undefined) {\n\t\t\t\t\t\t\tobject[key] = data;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tupdating[id] = true;\n\t\t\t\t\t// Put it in the store, returning the result/promise\n\t\t\t\t\treturn store.put(object).then(function (result) {\n\t\t\t\t\t\t// Clear the item now that it's been confirmed updated\n\t\t\t\t\t\tdelete dirty[id];\n\t\t\t\t\t\tdelete updating[id];\n\t\t\t\t\t\tresults[id] = result;\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar promise = dfd.then(function () {\n\t\t\t\t// Ensure empty object is returned even if nothing was dirty, for consistency\n\t\t\t\treturn results;\n\t\t\t});\n\n\t\t\t// For every dirty item, grab the ID\n\t\t\tfor (var id in dirty) {\n\t\t\t\t// Create put function to handle the saving of the the item\n\t\t\t\tvar put = putter(id, dirty[id]);\n\n\t\t\t\t// Add this item onto the promise chain,\n\t\t\t\t// getting the item from the store first if desired.\n\t\t\t\tpromise = promise.then(getFunc(id)).then(put);\n\t\t\t}\n\n\t\t\t// Kick off and return the promise representing all applicable get/put ops.\n\t\t\t// If the success callback is fired, all operations succeeded; otherwise,\n\t\t\t// save will stop at the first error it encounters.\n\t\t\tdfd.resolve();\n\t\t\treturn promise;\n\t\t},\n\n\t\trevert: function () {\n\t\t\t// summary:\n\t\t\t//\t\tReverts any changes since the previous save.\n\t\t\tthis.dirty = {};\n\t\t\tthis.refresh();\n\t\t},\n\n\t\t_trackError: function (func) {\n\t\t\t// summary:\n\t\t\t//\t\tUtility function to handle emitting of error events.\n\t\t\t// func: Function|String\n\t\t\t//\t\tA function which performs some store operation, or a String identifying\n\t\t\t//\t\ta function to be invoked (sans arguments) hitched against the instance.\n\t\t\t//\t\tIf sync, it can return a value, but may throw an error on failure.\n\t\t\t//\t\tIf async, it should return a promise, which would fire the error\n\t\t\t//\t\tcallback on failure.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tif (typeof func === 'string') {\n\t\t\t\tfunc = lang.hitch(this, func);\n\t\t\t}\n\n\t\t\tvar self = this,\n\t\t\t\tpromise;\n\n\t\t\ttry {\n\t\t\t\tpromise = when(func());\n\t\t\t} catch (err) {\n\t\t\t\t// report sync error\n\t\t\t\tvar dfd = new Deferred();\n\t\t\t\tdfd.reject(err);\n\t\t\t\tpromise = dfd.promise;\n\t\t\t}\n\n\t\t\tpromise.otherwise(function (err) {\n\t\t\t\temitError.call(self, err);\n\t\t\t});\n\t\t\treturn promise;\n\t\t},\n\n\t\tremoveRow: function (rowElement, preserveDom, options) {\n\t\t\tvar row = {element: rowElement};\n\t\t\t// Check to see if we are now empty...\n\t\t\tif (!preserveDom && (this.up(row).element === rowElement) && (this.down(row).element === rowElement)) {\n\t\t\t\t// ...we are empty, so show the no data message.\n\t\t\t\tthis._insertNoDataNode();\n\t\t\t}\n\n\t\t\tvar rows = (options && options.rows) || this._rows;\n\t\t\tif (rows) {\n\t\t\t\tdelete rows[rowElement.rowIndex];\n\t\t\t}\n\n\t\t\treturn this.inherited(arguments);\n\t\t},\n\n\t\trenderQueryResults: function (results, beforeNode, options) {\n\t\t\t// summary:\n\t\t\t//\t\tRenders objects from QueryResults as rows, before the given node.\n\n\t\t\toptions = lang.mixin({ rows: this._rows }, options);\n\t\t\tvar self = this;\n\n\t\t\tif (!has('dojo-built')) {\n\t\t\t\t// Check for null/undefined totalResults to help diagnose faulty services/stores\n\t\t\t\tresults.totalLength.then(function (total) {\n\t\t\t\t\tif (total == null) {\n\t\t\t\t\t\tconsole.warn('Store reported null or undefined totalLength. ' +\n\t\t\t\t\t\t\t'Make sure your store (and service, if applicable) are reporting total correctly!');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn results.then(function (resolvedResults) {\n\t\t\t\tvar resolvedRows = self.renderArray(resolvedResults, beforeNode, options);\n\t\t\t\tdelete self._lastCollection; // used only for non-store List/Grid\n\t\t\t\treturn resolvedRows;\n\t\t\t});\n\t\t},\n\n\t\t_observeCollection: function (collection, container, options) {\n\t\t\tvar self = this,\n\t\t\t\trows = options.rows,\n\t\t\t\trow;\n\n\t\t\tvar handles = [\n\t\t\t\tcollection.on('delete, update', function (event) {\n\t\t\t\t\tvar from = event.previousIndex;\n\t\t\t\t\tvar to = event.index;\n\n\t\t\t\t\tif (from !== undefined && rows[from]) {\n\t\t\t\t\t\tif ('max' in rows && (to === undefined || to < rows.min || to > rows.max)) {\n\t\t\t\t\t\t\trows.max--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// max should never be less than zero; if it is the logic in the 'add, update' handler\n\t\t\t\t\t\t// below will prevent insertion of rows (https://github.com/SitePen/dgrid/issues/1305)\n\t\t\t\t\t\tif (rows.max < 0) {\n\t\t\t\t\t\t\trows.max = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trow = rows[from];\n\n\t\t\t\t\t\t// check to make the sure the node is still there before we try to remove it\n\t\t\t\t\t\t// (in case it was moved to a different place in the DOM)\n\t\t\t\t\t\tif (row.parentNode === container) {\n\t\t\t\t\t\t\tself.removeRow(row, false, options);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// remove the old slot\n\t\t\t\t\t\trows.splice(from, 1);\n\n\t\t\t\t\t\tif (event.type === 'delete' ||\n\t\t\t\t\t\t\t\t(event.type === 'update' && (from < to || to === undefined))) {\n\t\t\t\t\t\t\t// adjust the rowIndex so adjustRowIndices has the right starting point\n\t\t\t\t\t\t\trows[from] && rows[from].rowIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (event.type === 'delete') {\n\t\t\t\t\t\t// Reset row in case this is later followed by an add;\n\t\t\t\t\t\t// only update events should retain the row variable below\n\t\t\t\t\t\trow = null;\n\t\t\t\t\t}\n\t\t\t\t}),\n\n\t\t\t\tcollection.on('add, update', function (event) {\n\t\t\t\t\tvar from = event.previousIndex;\n\t\t\t\t\tvar to = event.index;\n\t\t\t\t\tvar nextNode;\n\n\t\t\t\t\tfunction advanceNext() {\n\t\t\t\t\t\tnextNode = (nextNode.connected || nextNode).nextSibling;\n\t\t\t\t\t}\n\n\t\t\t\t\t// When possible, restrict observations to the actually rendered range\n\t\t\t\t\tif (to !== undefined && (!('max' in rows) || (to >= rows.min && to <= rows.max))) {\n\t\t\t\t\t\tif ('max' in rows && (from === undefined || from < rows.min || from > rows.max)) {\n\t\t\t\t\t\t\trows.max++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add to new slot (either before an existing row, or at the end)\n\t\t\t\t\t\t// First determine the DOM node that this should be placed before.\n\t\t\t\t\t\tif (rows.length) {\n\t\t\t\t\t\t\tnextNode = rows[to];\n\t\t\t\t\t\t\tif (!nextNode) {\n\t\t\t\t\t\t\t\tnextNode = rows[to - 1];\n\t\t\t\t\t\t\t\tif (nextNode) {\n\t\t\t\t\t\t\t\t\t// Make sure to skip connected nodes, so we don't accidentally\n\t\t\t\t\t\t\t\t\t// insert a row in between a parent and its children.\n\t\t\t\t\t\t\t\t\tadvanceNext();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// There are no rows. Allow for subclasses to insert new rows somewhere other than\n\t\t\t\t\t\t\t// at the end of the parent node.\n\t\t\t\t\t\t\tnextNode = self._getFirstRowSibling && self._getFirstRowSibling(container);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Make sure we don't trip over a stale reference to a\n\t\t\t\t\t\t// node that was removed, or try to place a node before\n\t\t\t\t\t\t// itself (due to overlapped queries)\n\t\t\t\t\t\tif (row && nextNode && row.id === nextNode.id) {\n\t\t\t\t\t\t\tadvanceNext();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (nextNode && !nextNode.parentNode) {\n\t\t\t\t\t\t\tnextNode = document.getElementById(nextNode.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\trows.splice(to, 0, undefined);\n\t\t\t\t\t\trow = self.insertRow(event.target, container, nextNode, to, options);\n\t\t\t\t\t\tself.highlightRow(row);\n\t\t\t\t\t}\n\t\t\t\t\t// Reset row so it doesn't get reused on the next event\n\t\t\t\t\trow = null;\n\t\t\t\t}),\n\n\t\t\t\tcollection.on('add, delete, update', function (event) {\n\t\t\t\t\tvar from = (typeof event.previousIndex !== 'undefined') ? event.previousIndex : Infinity,\n\t\t\t\t\t\tto = (typeof event.index !== 'undefined') ? event.index : Infinity,\n\t\t\t\t\t\tadjustAtIndex = Math.min(from, to);\n\t\t\t\t\tfrom !== to && rows[adjustAtIndex] && self.adjustRowIndices(rows[adjustAtIndex]);\n\n\t\t\t\t\t// the removal of rows could cause us to need to page in more items\n\t\t\t\t\tif (from !== Infinity && self._processScroll && (rows[from] || rows[from - 1])) {\n\t\t\t\t\t\tself._processScroll();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fire _onNotification, even for out-of-viewport notifications,\n\t\t\t\t\t// since some things may still need to update (e.g. Pagination's status/navigation)\n\t\t\t\t\tself._onNotification(rows, event, collection);\n\n\t\t\t\t\t// Update _total after _onNotification so that it can potentially\n\t\t\t\t\t// decide whether to perform actions based on whether the total changed\n\t\t\t\t\tif (collection === self._renderedCollection && 'totalLength' in event) {\n\t\t\t\t\t\tself._total = event.totalLength;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t];\n\n\t\t\treturn {\n\t\t\t\tremove: function () {\n\t\t\t\t\twhile (handles.length > 0) {\n\t\t\t\t\t\thandles.pop().remove();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t_onNotification: function () {\n\t\t\t// summary:\n\t\t\t//\t\tProtected method called whenever a store notification is observed.\n\t\t\t//\t\tIntended to be extended as necessary by mixins/extensions.\n\t\t\t// rows: Array\n\t\t\t//\t\tA sparse array of row nodes corresponding to data objects in the collection.\n\t\t\t// event: Object\n\t\t\t//\t\tThe notification event\n\t\t\t// collection: Object\n\t\t\t//\t\tThe collection that the notification is relevant to.\n\t\t\t//\t\tUseful for distinguishing child-level from top-level notifications.\n\t\t}\n\t});\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/_base/array',\n\t'dojo/on',\n\t'dojo/query',\n\t'dojo/_base/lang',\n\t'dojo/dom',\n\t'dojo/dom-construct',\n\t'dojo/dom-geometry',\n\t'dojo/has',\n\t'../util/misc',\n\t'dojo/_base/html'\n], function (declare, arrayUtil, listen, query, lang, dom, domConstruct, geom, has, miscUtil) {\n\n\tfunction addRowSpan(table, span, startRow, column, id) {\n\t\t// loop through the rows of the table and add this column's id to\n\t\t// the rows' column\n\t\tfor (var i = 1; i < span; i++) {\n\t\t\ttable[startRow + i][column] = id;\n\t\t}\n\t}\n\tfunction subRowAssoc(subRows) {\n\t\t// Take a sub-row structure and output an object with key=>value pairs\n\t\t// The keys will be the column id's; the values will be the first-row column\n\t\t// that column's resizer should be associated with.\n\n\t\tvar i = subRows.length,\n\t\t\tl = i,\n\t\t\tnumCols = arrayUtil.filter(subRows[0], function (column) {\n\t\t\t\treturn !column.hidden;\n\t\t\t}).length,\n\t\t\ttable = new Array(i);\n\n\t\t// create table-like structure in an array so it can be populated\n\t\t// with row-spans and col-spans\n\t\twhile (i--) {\n\t\t\ttable[i] = new Array(numCols);\n\t\t}\n\n\t\tvar associations = {};\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tvar row = table[i],\n\t\t\t\tsubRow = subRows[i];\n\n\t\t\t// j: counter for table columns\n\t\t\t// js: counter for subrow structure columns\n\t\t\tfor (var j = 0, js = 0; j < numCols; j++) {\n\t\t\t\tvar cell = subRow[js], k;\n\n\t\t\t\t// if something already exists in the table (row-span), skip this\n\t\t\t\t// spot and go to the next\n\t\t\t\tif (typeof row[j] !== 'undefined') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\trow[j] = cell.id;\n\n\t\t\t\tif (cell.rowSpan && cell.rowSpan > 1) {\n\t\t\t\t\taddRowSpan(table, cell.rowSpan, i, j, cell.id);\n\t\t\t\t}\n\n\t\t\t\t// colSpans are only applicable in the second or greater rows\n\t\t\t\t// and only if the colSpan is greater than 1\n\t\t\t\tif (i > 0 && cell.colSpan && cell.colSpan > 1) {\n\t\t\t\t\tfor (k = 1; k < cell.colSpan; k++) {\n\t\t\t\t\t\t// increment j and assign the id since this is a span\n\t\t\t\t\t\trow[++j] = cell.id;\n\t\t\t\t\t\tif (cell.rowSpan && cell.rowSpan > 1) {\n\t\t\t\t\t\t\taddRowSpan(table, cell.rowSpan, i, j, cell.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tassociations[cell.id] = subRows[0][j].id;\n\t\t\t\tjs++;\n\t\t\t}\n\t\t}\n\n\t\treturn associations;\n\t}\n\n\tfunction resizeColumnWidth(grid, colId, width, parentType, doResize) {\n\t\t// don't react to widths <= 0, e.g. for hidden columns\n\t\tif (width <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar column = grid.columns[colId],\n\t\t\tevent,\n\t\t\trule;\n\n\t\tif (!column) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent = {\n\t\t\tgrid: grid,\n\t\t\tcolumnId: colId,\n\t\t\twidth: width,\n\t\t\tbubbles: true,\n\t\t\tcancelable: true\n\t\t};\n\n\t\tif (parentType) {\n\t\t\tevent.parentType = parentType;\n\t\t}\n\n\t\tif (!grid._resizedColumns || listen.emit(grid.headerNode, 'dgrid-columnresize', event)) {\n\t\t\t// Update width on column object, then convert value for CSS\n\t\t\tif (width === 'auto') {\n\t\t\t\tdelete column.width;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcolumn.width = width;\n\t\t\t\twidth += 'px';\n\t\t\t}\n\n\t\t\trule = grid._columnSizes[colId];\n\n\t\t\tif (rule) {\n\t\t\t\t// Modify existing, rather than deleting + adding\n\t\t\t\trule.set('width', width);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Use miscUtil function directly, since we clean these up ourselves anyway\n\t\t\t\trule = miscUtil.addCssRule('#' + miscUtil.escapeCssIdentifier(grid.domNode.id) +\n\t\t\t\t\t' .dgrid-column-' + miscUtil.escapeCssIdentifier(colId, '-'),\n\t\t\t\t\t'width: ' + width + ';');\n\t\t\t}\n\n\t\t\t// keep a reference for future removal\n\t\t\tgrid._columnSizes[colId] = rule;\n\n\t\t\tif (doResize !== false) {\n\t\t\t\tgrid.resize();\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Functions for shared resizer node\n\n\tvar resizerNode, // DOM node for resize indicator, reused between instances\n\t\tresizerGuardNode, // DOM node to guard against clicks registering on header cells (and inducing sort)\n\t\tresizableCount = 0; // Number of ColumnResizer-enabled grid instances\n\tvar resizer = {\n\t\t// This object contains functions for manipulating the shared resizerNode\n\t\tcreate: function () {\n\t\t\tresizerNode = domConstruct.create('div', { className: 'dgrid-column-resizer' });\n\t\t\tresizerGuardNode = domConstruct.create('div', { className: 'dgrid-resize-guard' });\n\t\t},\n\t\tdestroy: function () {\n\t\t\tdomConstruct.destroy(resizerNode);\n\t\t\tdomConstruct.destroy(resizerGuardNode);\n\t\t\tresizerNode = resizerGuardNode = null;\n\t\t},\n\t\tshow: function (grid) {\n\t\t\tvar pos = geom.position(grid.domNode, true);\n\t\t\tresizerNode.style.top = pos.y + 'px';\n\t\t\tresizerNode.style.height = pos.h + 'px';\n\t\t\tdocument.body.appendChild(resizerNode);\n\t\t\tgrid.domNode.appendChild(resizerGuardNode);\n\t\t},\n\t\tmove: function (x) {\n\t\t\tresizerNode.style.left = x + 'px';\n\t\t},\n\t\thide: function () {\n\t\t\tresizerNode.parentNode.removeChild(resizerNode);\n\t\t\tresizerGuardNode.parentNode.removeChild(resizerGuardNode);\n\t\t}\n\t};\n\n\treturn declare(null, {\n\t\tresizeNode: null,\n\n\t\t// minWidth: Number\n\t\t//\t\tMinimum column width, in px.\n\t\tminWidth: 40,\n\n\t\t// adjustLastColumn: Boolean\n\t\t//\t\tIf true, adjusts the last column's width to \"auto\" at times where the\n\t\t//\t\tbrowser would otherwise stretch all columns to span the grid.\n\t\tadjustLastColumn: true,\n\n\t\t_resizedColumns: false, // flag indicating if resizer has converted column widths to px\n\n\t\tbuildRendering: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Create resizerNode when first grid w/ ColumnResizer is created\n\t\t\tif (!resizableCount) {\n\t\t\t\tresizer.create();\n\t\t\t}\n\t\t\tresizableCount++;\n\t\t},\n\n\t\tdestroy: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Remove any applied column size styles since we're tracking them directly\n\t\t\tfor (var name in this._columnSizes) {\n\t\t\t\tthis._columnSizes[name].remove();\n\t\t\t}\n\n\t\t\t// If this is the last grid on the page with ColumnResizer, destroy the\n\t\t\t// shared resizerNode\n\t\t\tif (!--resizableCount) {\n\t\t\t\tresizer.destroy();\n\t\t\t}\n\t\t},\n\n\t\tresizeColumnWidth: function (colId, width) {\n\t\t\t// Summary:\n\t\t\t// calls grid's styleColumn function to add a style for the column\n\t\t\t// colId: String\n\t\t\t// column id\n\t\t\t// width: Integer\n\t\t\t// new width of the column\n\t\t\treturn resizeColumnWidth(this, colId, width);\n\t\t},\n\n\t\tconfigStructure: function () {\n\t\t\tvar oldSizes = this._oldColumnSizes = lang.mixin({}, this._columnSizes), // shallow clone\n\t\t\t\tk;\n\n\t\t\tthis._resizedColumns = false;\n\t\t\tthis._columnSizes = {};\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Remove old column styles that are no longer relevant; this is specifically\n\t\t\t// done *after* calling inherited so that _columnSizes will contain keys\n\t\t\t// for all columns in the new structure that were assigned widths.\n\t\t\tfor (k in oldSizes) {\n\t\t\t\tif (!(k in this._columnSizes)) {\n\t\t\t\t\toldSizes[k].remove();\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelete this._oldColumnSizes;\n\t\t},\n\n\t\t_configColumn: function (column) {\n\t\t\tthis.inherited(arguments);\n\n\t\t\tvar colId = column.id,\n\t\t\t\trule;\n\n\t\t\tif ('width' in column) {\n\t\t\t\t// Update or add a style rule for the specified width\n\t\t\t\tif ((rule = this._oldColumnSizes[colId])) {\n\t\t\t\t\trule.set('width', column.width + 'px');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trule = miscUtil.addCssRule('#' + miscUtil.escapeCssIdentifier(this.domNode.id) +\n\t\t\t\t\t\t' .dgrid-column-' + miscUtil.escapeCssIdentifier(colId, '-'),\n\t\t\t\t\t\t'width: ' + column.width + 'px;');\n\t\t\t\t}\n\t\t\t\tthis._columnSizes[colId] = rule;\n\t\t\t}\n\t\t},\n\n\t\trenderHeader: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\tvar grid = this;\n\n\t\t\tvar assoc;\n\t\t\tif (this.columnSets && this.columnSets.length) {\n\t\t\t\tvar csi = this.columnSets.length;\n\t\t\t\twhile (csi--) {\n\t\t\t\t\tassoc = lang.mixin(assoc || {}, subRowAssoc(this.columnSets[csi]));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (this.subRows && this.subRows.length > 1) {\n\t\t\t\tassoc = subRowAssoc(this.subRows);\n\t\t\t}\n\n\t\t\tvar colNodes = query('.dgrid-cell', grid.headerNode),\n\t\t\t\ti = colNodes.length;\n\t\t\twhile (i--) {\n\t\t\t\tvar colNode = colNodes[i],\n\t\t\t\t\tid = colNode.columnId,\n\t\t\t\t\tcol = grid.columns[id],\n\t\t\t\t\tchildNodes = colNode.childNodes,\n\t\t\t\t\tresizeHandle;\n\n\t\t\t\tif (!col || col.resizable === false) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar headerTextNode = domConstruct.create('div', { className: 'dgrid-resize-header-container' });\n\t\t\t\tcolNode.contents = headerTextNode;\n\n\t\t\t\t// move all the children to the header text node\n\t\t\t\twhile (childNodes.length > 0) {\n\t\t\t\t\theaderTextNode.appendChild(childNodes[0]);\n\t\t\t\t}\n\n\t\t\t\tresizeHandle = domConstruct.create('div', {\n\t\t\t\t\tclassName: 'dgrid-resize-handle resizeNode-' + miscUtil.escapeCssIdentifier(id, '-')\n\t\t\t\t}, headerTextNode);\n\t\t\t\tcolNode.appendChild(headerTextNode);\n\t\t\t\tresizeHandle.columnId = assoc && assoc[id] || id;\n\t\t\t}\n\n\t\t\tif (!grid.mouseMoveListen) {\n\t\t\t\t// establish listeners for initiating, dragging, and finishing resize\n\t\t\t\tlisten(grid.headerNode,\n\t\t\t\t\t'.dgrid-resize-handle:mousedown' +\n\t\t\t\t\t\t(has('touch') ? ',.dgrid-resize-handle:touchstart' : ''),\n\t\t\t\t\tfunction (e) {\n\t\t\t\t\t\tgrid._resizeMouseDown(e, this);\n\t\t\t\t\t\tgrid.mouseMoveListen.resume();\n\t\t\t\t\t\tgrid.mouseUpListen.resume();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tgrid._listeners.push(grid.mouseMoveListen =\n\t\t\t\t\tlisten.pausable(document,\n\t\t\t\t\t\t'mousemove' + (has('touch') ? ',touchmove' : ''),\n\t\t\t\t\t\tmiscUtil.throttleDelayed(function (e) {\n\t\t\t\t\t\t\tgrid._updateResizerPosition(e);\n\t\t\t\t\t\t})\n\t\t\t\t));\n\t\t\t\tgrid._listeners.push(grid.mouseUpListen = listen.pausable(document,\n\t\t\t\t\t'mouseup' + (has('touch') ? ',touchend' : ''),\n\t\t\t\t\tfunction (e) {\n\t\t\t\t\t\tgrid._resizeMouseUp(e);\n\t\t\t\t\t\tgrid.mouseMoveListen.pause();\n\t\t\t\t\t\tgrid.mouseUpListen.pause();\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t\t// initially pause the move/up listeners until a drag happens\n\t\t\t\tgrid.mouseMoveListen.pause();\n\t\t\t\tgrid.mouseUpListen.pause();\n\t\t\t}\n\t\t}, // end renderHeader\n\n\t\t_resizeMouseDown: function (e, target) {\n\t\t\t// Summary:\n\t\t\t// called when mouse button is pressed on the header\n\t\t\t// e: Object\n\t\t\t// mousedown event object\n\n\t\t\t// preventDefault actually seems to be enough to prevent browser selection\n\t\t\t// in all but IE < 9. setSelectable works for those.\n\t\t\te.preventDefault();\n\t\t\tdom.setSelectable(this.domNode, false);\n\n\t\t\tthis._startX = this._getResizeMouseLocation(e); //position of the target\n\n\t\t\tthis._targetCell = query('.dgrid-column-' + miscUtil.escapeCssIdentifier(target.columnId, '-'),\n\t\t\t\tthis.headerNode)[0];\n\n\t\t\t// Show resizerNode after initializing its x position\n\t\t\tthis._updateResizerPosition(e);\n\t\t\tresizer.show(this);\n\t\t},\n\t\t_resizeMouseUp: function (e) {\n\t\t\t// Summary:\n\t\t\t// called when mouse button is released\n\t\t\t// e: Object\n\t\t\t// mouseup event object\n\n\t\t\tvar columnSizes = this._columnSizes,\n\t\t\t\tcolNodes, colWidths, gridWidth;\n\n\t\t\tif (this.adjustLastColumn) {\n\t\t\t\t// For some reason, total column width needs to be 1 less than this\n\t\t\t\tgridWidth = this.headerNode.clientWidth - 1;\n\t\t\t}\n\n\t\t\t//This is used to set all the column widths to a static size\n\t\t\tif (!this._resizedColumns) {\n\t\t\t\tcolNodes = query('.dgrid-cell', this.headerNode);\n\n\t\t\t\tif (this.columnSets && this.columnSets.length) {\n\t\t\t\t\tcolNodes = colNodes.filter(function (node) {\n\t\t\t\t\t\tvar idx = node.columnId.split('-');\n\t\t\t\t\t\treturn idx[0] === '0' && !(node.columnId in columnSizes);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (this.subRows && this.subRows.length > 1) {\n\t\t\t\t\tcolNodes = colNodes.filter(function (node) {\n\t\t\t\t\t\treturn node.columnId.charAt(0) === '0' && !(node.columnId in columnSizes);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get a set of sizes before we start mutating, to avoid\n\t\t\t\t// weird disproportionate measures if the grid has set\n\t\t\t\t// column widths, but no full grid width set\n\t\t\t\tcolWidths = colNodes.map(function (colNode) {\n\t\t\t\t\treturn colNode.offsetWidth;\n\t\t\t\t});\n\n\t\t\t\t// Set a baseline size for each column based on\n\t\t\t\t// its original measure\n\t\t\t\tcolNodes.forEach(function (colNode, i) {\n\t\t\t\t\tresizeColumnWidth(this, colNode.columnId, colWidths[i], null, false);\n\t\t\t\t}, this);\n\n\t\t\t\tthis._resizedColumns = true;\n\t\t\t}\n\t\t\tdom.setSelectable(this.domNode, true);\n\n\t\t\tvar cell = this._targetCell,\n\t\t\t\tdelta = this._getResizeMouseLocation(e) - this._startX, //final change in position of resizer\n\t\t\t\tnewWidth = cell.offsetWidth + delta, //the new width after resize\n\t\t\t\tobj = this._getResizedColumnWidths(),//get current total column widths before resize\n\t\t\t\ttotalWidth = obj.totalWidth,\n\t\t\t\tlastCol = obj.lastColId,\n\t\t\t\tlastColWidth = query('.dgrid-column-' + miscUtil.escapeCssIdentifier(lastCol, '-'),\n\t\t\t\t\tthis.headerNode)[0].offsetWidth;\n\n\t\t\tif (newWidth < this.minWidth) {\n\t\t\t\t//enforce minimum widths\n\t\t\t\tnewWidth = this.minWidth;\n\t\t\t}\n\n\t\t\tif (resizeColumnWidth(this, cell.columnId, newWidth, e.type)) {\n\t\t\t\tif (cell.columnId !== lastCol && this.adjustLastColumn) {\n\t\t\t\t\tif (totalWidth + delta < gridWidth) {\n\t\t\t\t\t\t//need to set last column's width to auto\n\t\t\t\t\t\tresizeColumnWidth(this, lastCol, 'auto', e.type);\n\t\t\t\t\t}\n\t\t\t\t\telse if (lastColWidth - delta <= this.minWidth) {\n\t\t\t\t\t\t//change last col width back to px, unless it is the last column itself being resized...\n\t\t\t\t\t\tresizeColumnWidth(this, lastCol, this.minWidth, e.type);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tresizer.hide();\n\n\t\t\t// Clean up after the resize operation\n\t\t\tdelete this._startX;\n\t\t\tdelete this._targetCell;\n\t\t},\n\n\t\t_updateResizerPosition: function (e) {\n\t\t\t// Summary:\n\t\t\t// updates position of resizer bar as mouse moves\n\t\t\t// e: Object\n\t\t\t// mousemove event object\n\n\t\t\tif (!this._targetCell) {\n\t\t\t\treturn; // Release event was already processed\n\t\t\t}\n\n\t\t\tvar mousePos = this._getResizeMouseLocation(e),\n\t\t\t\tdelta = mousePos - this._startX, //change from where user clicked to where they drag\n\t\t\t\twidth = this._targetCell.offsetWidth,\n\t\t\t\tleft = mousePos;\n\t\t\tif (width + delta < this.minWidth) {\n\t\t\t\tleft = this._startX - (width - this.minWidth);\n\t\t\t}\n\t\t\tresizer.move(left);\n\t\t},\n\n\t\t_getResizeMouseLocation: function (e) {\n\t\t\t//Summary:\n\t\t\t// returns position of mouse relative to the left edge\n\t\t\t// e: event object\n\t\t\t// mouse move event object\n\t\t\tvar posX = 0;\n\t\t\tif (e.pageX) {\n\t\t\t\tposX = e.pageX;\n\t\t\t}\n\t\t\telse if (e.clientX) {\n\t\t\t\tposX = e.clientX + document.body.scrollLeft +\n\t\t\t\t\tdocument.documentElement.scrollLeft;\n\t\t\t}\n\t\t\treturn posX;\n\t\t},\n\t\t_getResizedColumnWidths: function () {\n\t\t\t//Summary:\n\t\t\t// returns object containing new column width and column id\n\t\t\tvar totalWidth = 0,\n\t\t\t\tcolNodes = query(\n\t\t\t\t\t(this.columnSets ? '.dgrid-column-set-cell ' : '') + 'tr:first-child .dgrid-cell',\n\t\t\t\t\tthis.headerNode);\n\n\t\t\tvar i = colNodes.length;\n\t\t\tif (!i) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tvar lastColId = colNodes[i - 1].columnId;\n\n\t\t\twhile (i--) {\n\t\t\t\ttotalWidth += colNodes[i].offsetWidth;\n\t\t\t}\n\t\t\treturn {totalWidth: totalWidth, lastColId: lastColId};\n\t\t}\n\t});\n});\n","define([\n\t'dojo/_base/lang',\n\t'dojo/_base/declare',\n\t'dojo/sniff',\n\t'dojo/query',\n\t'../util/misc'\n], function (lang, declare, has, query, miscUtil) {\n\treturn declare(null, {\n\t\t// summary:\n\t\t//\t\tExtension allowing for specification of columns with additional\n\t\t//\t\theader rows spanning multiple columns for strictly display purposes.\n\t\t//\t\tOnly works on `columns` arrays, not `columns` objects or `subRows`\n\t\t//\t\t(nor ColumnSets).\n\t\t// description:\n\t\t//\t\tCompoundColumns allows nested header cell configurations, wherein the\n\t\t//\t\thigher-level headers may span multiple columns and are for\n\t\t//\t\tdisplay purposes only.\n\t\t//\t\tThese nested header cells are configured using a special recursive\n\t\t//\t\t`children` property in the column definition, where only the deepest\n\t\t//\t\tchildren are ultimately rendered in the grid as actual columns.\n\t\t//\t\tIn addition, the deepest child columns may be rendered without\n\t\t//\t\tindividual headers by specifying `showChildHeaders: false` on the parent.\n\n\t\tconfigStructure: function () {\n\t\t\t// create a set of sub rows for the header row so we can do compound columns\n\t\t\t// the first row is a special spacer row\n\t\t\tvar columns = (this.subRows && this.subRows[0]) || this.columns,\n\t\t\t\theaderRows = [[]],\n\t\t\t\ttopHeaderRow = headerRows[0],\n\t\t\t\tcontentColumns = [];\n\t\t\t// This first row is spacer row that will be made invisible (zero height)\n\t\t\t// with CSS, but it must be rendered as the first row since that is what\n\t\t\t// the table layout is driven by.\n\t\t\theaderRows[0].className = 'dgrid-spacer-row';\n\n\t\t\tfunction processColumns(columns, level, hasLabel, parent) {\n\t\t\t\tvar numColumns = 0,\n\t\t\t\t\tnoop = function () {},\n\t\t\t\t\tchildren,\n\t\t\t\t\thasChildLabels;\n\n\t\t\t\tfunction processColumn(column, i) {\n\t\t\t\t\t// Handle the column config when it is an object rather\n\t\t\t\t\t// than an array.\n\t\t\t\t\tif (typeof column === 'string') {\n\t\t\t\t\t\tcolumn = {label: column};\n\t\t\t\t\t}\n\t\t\t\t\tif (!(columns instanceof Array) && !column.field) {\n\t\t\t\t\t\tcolumn.field = i;\n\t\t\t\t\t}\n\t\t\t\t\tchildren = column.children;\n\t\t\t\t\thasChildLabels = children && (column.showChildHeaders !== false);\n\t\t\t\t\t// Set a reference to the parent column so later the children's ids can\n\t\t\t\t\t// be updated to indicate the parent-child relationship.\n\t\t\t\t\tcolumn.parentColumn = parent;\n\t\t\t\t\tif (children) {\n\t\t\t\t\t\t// it has children\n\t\t\t\t\t\t// make sure the column has an id\n\t\t\t\t\t\tif (column.id == null) {\n\t\t\t\t\t\t\tcolumn.id = ((parent && parent.id) || level - 1) + '-' + topHeaderRow.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (parent && parent.id) {\n\t\t\t\t\t\t\t// Make sure nested compound columns have ids that are prefixed with\n\t\t\t\t\t\t\t// their parent's ids.\n\t\t\t\t\t\t\tcolumn.id = parent.id + '-' + column.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// it has no children, it is a normal header, add it to the content columns\n\t\t\t\t\t\tcontentColumns.push(column);\n\t\t\t\t\t\t// add each one to the first spacer header row for proper layout of the header cells\n\t\t\t\t\t\ttopHeaderRow.push(lang.delegate(column, {renderHeaderCell: noop}));\n\t\t\t\t\t\tnumColumns++;\n\t\t\t\t\t}\n\t\t\t\t\tif (!hasChildLabels) {\n\t\t\t\t\t\t// create a header version of the column where we can define a specific rowSpan\n\t\t\t\t\t\t// we define the rowSpan as a negative, the number of levels less than the\n\t\t\t\t\t\t// total number of rows, which we don't know yet\n\t\t\t\t\t\tcolumn = lang.delegate(column, {rowSpan: -level});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (children) {\n\t\t\t\t\t\t// Recursively process the children; this is specifically\n\t\t\t\t\t\t// performed *after* any potential lang.delegate calls\n\t\t\t\t\t\t// so the parent reference will receive additional info\n\t\t\t\t\t\tnumColumns += (column.colSpan =\n\t\t\t\t\t\t\tprocessColumns(children, level + 1, hasChildLabels, column));\n\t\t\t\t\t}\n\n\t\t\t\t\t// add the column to the header rows at the appropriate level\n\t\t\t\t\tif (hasLabel) {\n\t\t\t\t\t\t(headerRows[level] || (headerRows[level] = [])).push(column);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmiscUtil.each(columns, processColumn, this);\n\t\t\t\treturn numColumns;\n\t\t\t}\n\n\t\t\tprocessColumns(columns, 1, true);\n\n\t\t\tvar numHeaderRows = headerRows.length,\n\t\t\t\ti, j, headerRow, headerColumn;\n\t\t\t// Now go back through and increase the rowSpans of the headers to be\n\t\t\t// total rows minus the number of levels they are at.\n\t\t\tfor (i = 0; i < numHeaderRows; i++) {\n\t\t\t\theaderRow = headerRows[i];\n\t\t\t\tfor (j = 0; j < headerRow.length; j++) {\n\t\t\t\t\theaderColumn = headerRow[j];\n\t\t\t\t\tif (headerColumn.rowSpan < 1) {\n\t\t\t\t\t\theaderColumn.rowSpan += numHeaderRows;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// we need to set this to be used for subRows, so we make it a single row\n\t\t\tcontentColumns = [contentColumns];\n\t\t\t// set our header rows so that the grid will use the alternate header row\n\t\t\t// configuration for rendering the headers\n\t\t\tcontentColumns.headerRows = headerRows;\n\t\t\tthis.subRows = contentColumns;\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\trenderHeader: function () {\n\t\t\tvar i,\n\t\t\t\tcolumns = this.subRows[0],\n\t\t\t\theaderColumns = this.subRows.headerRows[0];\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// The object delegation performed in configStructure unfortunately\n\t\t\t// \"protects\" the original column definition objects (referenced by\n\t\t\t// columns and subRows) from obtaining headerNode information, so\n\t\t\t// copy them back in.\n\t\t\tfor (i = columns.length; i--;) {\n\t\t\t\tcolumns[i].headerNode = headerColumns[i].headerNode;\n\t\t\t}\n\t\t},\n\n\t\t_findSortArrowParent: function () {\n\t\t\tvar parent = this.inherited(arguments),\n\t\t\t\tspacerRow = query('.dgrid-spacer-row', this.headerNode)[0],\n\t\t\t\tcolumnId,\n\t\t\t\tnodes;\n\n\t\t\tif (parent && spacerRow.contains(parent)) {\n\t\t\t\tcolumnId = parent.columnId;\n\t\t\t\tnodes = query('.dgrid-column-' + columnId, this.headerNode);\n\t\t\t\treturn nodes[nodes.length - 1];\n\t\t\t}\n\t\t},\n\n\t\t_configColumn: function (column, rowColumns, prefix) {\n\t\t\t// Updates the id on a column definition that is a child to include\n\t\t\t// the parent's id.\n\t\t\tvar parent = column.parentColumn;\n\t\t\tvar columnId = column.id;\n\t\t\tif (parent) {\n\t\t\t\t// Adjust the id to incorporate the parent's id.\n\t\t\t\t// Remove the prefix if it was used to create the id\n\t\t\t\tvar id = columnId.indexOf(prefix) === 0 ? columnId.substring(prefix.length) : columnId;\n\t\t\t\tprefix = parent.id + '-';\n\t\t\t\tcolumnId = column.id = prefix + id;\n\t\t\t}\n\t\t\tthis.inherited(arguments, [column, rowColumns, prefix]);\n\t\t},\n\n\t\tcell: function (target, columnId) {\n\t\t\t// summary:\n\t\t\t//\t\tGet the cell object by node, event, or id, plus a columnId.\n\t\t\t//\t\tThis extension prefixes children's column ids with the parents' column ids,\n\t\t\t//\t\tso cell takes that into account when looking for a column id.\n\n\t\t\tif (typeof columnId !== 'object') {\n\t\t\t\t// Find the columnId that corresponds with the provided id.\n\t\t\t\t// The provided id may be a suffix of the actual id.\n\t\t\t\tvar column = this.column(columnId);\n\t\t\t\tif (column) {\n\t\t\t\t\tcolumnId = column.id;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this.inherited(arguments, [target, columnId]);\n\t\t},\n\n\t\tcolumn: function (target) {\n\t\t\t// summary:\n\t\t\t//\t\tGet the column object by node, event, or column id. Take into account parent column id\n\t\t\t//\t\tprefixes that may be added by this extension.\n\t\t\tvar results = this.inherited(arguments);\n\t\t\tif (results == null && typeof target !== 'object') {\n\t\t\t\t// Find a column id that ends with the provided column id. This will locate a child column\n\t\t\t\t// by an id that was provided in the original column configuration. For example, if a compound column\n\t\t\t\t// was given the id \"compound\" and a child column was given the id \"child\", this will find the column\n\t\t\t\t// using only \"child\". If \"compound-child\" was being searched for, the inherited call\n\t\t\t\t// above would have found the cell.\n\t\t\t\tvar suffix = '-' + target,\n\t\t\t\t\tsuffixLength = suffix.length;\n\t\t\t\tfor (var completeId in this.columns) {\n\t\t\t\t\tif (completeId.indexOf(suffix, completeId.length - suffixLength) !== -1) {\n\t\t\t\t\t\treturn this.columns[completeId];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\n\t\t_updateCompoundHiddenStates: function (id, hidden) {\n\t\t\t// summary:\n\t\t\t//\t\tCalled from _hideColumn and _showColumn (for ColumnHider)\n\t\t\t//\t\tto adjust parent header cells\n\n\t\t\tvar column = this.columns[id],\n\t\t\t\tcolSpan;\n\n\t\t\tif (column && column.hidden === hidden) {\n\t\t\t\t// Avoid redundant processing (since it would cause colSpan skew)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// column will be undefined when this is called for parents\n\t\t\twhile (column && column.parentColumn) {\n\t\t\t\t// Update colSpans / hidden state of parents\n\t\t\t\tcolumn = column.parentColumn;\n\t\t\t\tcolSpan = column.colSpan = column.colSpan + (hidden ? -1 : 1);\n\n\t\t\t\tif (colSpan) {\n\t\t\t\t\tcolumn.headerNode.colSpan = colSpan;\n\t\t\t\t}\n\t\t\t\tif (colSpan === 1 && !hidden) {\n\t\t\t\t\tthis._showColumn(column.id);\n\t\t\t\t}\n\t\t\t\telse if (!colSpan && hidden) {\n\t\t\t\t\tthis._hideColumn(column.id);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_hideColumn: function (id) {\n\t\t\tvar self = this;\n\n\t\t\tthis._updateCompoundHiddenStates(id, true);\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif (has('ff')) {\n\t\t\t\t// Firefox causes display quirks in certain situations;\n\t\t\t\t// avoid them by forcing reflow of the header\n\t\t\t\tthis.headerNode.style.display = 'none';\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tself.headerNode.style.display = '';\n\t\t\t\t\tself.resize();\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t},\n\n\t\t_showColumn: function (id) {\n\t\t\tthis._updateCompoundHiddenStates(id, false);\n\t\t\tthis.inherited(arguments);\n\t\t},\n\n\t\t_getResizedColumnWidths: function () {\n\t\t\t// Overrides ColumnResizer method to report the total width and\n\t\t\t// last column correctly for CompoundColumns structures\n\n\t\t\tvar total = 0,\n\t\t\t\tcolumns = this.columns,\n\t\t\t\tid;\n\n\t\t\tfor (id in columns) {\n\t\t\t\ttotal += columns[id].headerNode.offsetWidth;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttotalWidth: total,\n\t\t\t\tlastColId: this.subRows[0][this.subRows[0].length - 1].id\n\t\t\t};\n\t\t}\n\t});\n});\n","define([\n\t'../_StoreMixin',\n\t'dojo/_base/declare',\n\t'dojo/_base/array',\n\t'dojo/_base/lang',\n\t'dojo/dom-construct',\n\t'dojo/dom-class',\n\t'dojo/on',\n\t'dojo/query',\n\t'dojo/string',\n\t'dojo/has',\n\t'dojo/keys',\n\t'dojo/when',\n\t'../util/misc',\n\t'dojo/i18n!./nls/pagination',\n\t'dojo/_base/sniff'\n], function (_StoreMixin, declare, arrayUtil, lang, domConstruct, domClass, on, query, string, has, keys,\n\twhen, miscUtil, i18n) {\n\tfunction cleanupContent(grid) {\n\t\t// Remove any currently-rendered rows, or noDataMessage\n\t\tif (!grid._removeNoDataNode()) {\n\t\t\tgrid.cleanup();\n\t\t}\n\t\tgrid.contentNode.innerHTML = '';\n\t}\n\tfunction cleanupLoading(grid) {\n\t\tif (grid.loadingNode) {\n\t\t\tgrid._loadingCount--;\n\t\t\tif (!grid._loadingCount) {\n\t\t\t\tdomConstruct.destroy(grid.loadingNode);\n\t\t\t\tdelete grid.loadingNode;\n\t\t\t}\n\t\t}\n\t\telse if (grid._oldPageNodes) {\n\t\t\t// If cleaning up after a load w/ showLoadingMessage: false,\n\t\t\t// be careful to only clean up rows from the old page, not the new one\n\t\t\tfor (var id in grid._oldPageNodes) {\n\t\t\t\tgrid.removeRow(grid._oldPageNodes[id]);\n\t\t\t}\n\t\t\tdelete grid._oldPageNodes;\n\t\t}\n\t\tdelete grid._isLoading;\n\t}\n\n\treturn declare(_StoreMixin, {\n\t\t// summary:\n\t\t//\t\tAn extension for adding discrete pagination to a List or Grid.\n\n\t\t// rowsPerPage: Number\n\t\t//\t\tNumber of rows (items) to show on a given page.\n\t\trowsPerPage: 10,\n\n\t\t// pagingTextBox: Boolean\n\t\t//\t\tIndicates whether or not to show a textbox for paging.\n\t\tpagingTextBox: false,\n\t\t// previousNextArrows: Boolean\n\t\t//\t\tIndicates whether or not to show the previous and next arrow links.\n\t\tpreviousNextArrows: true,\n\t\t// firstLastArrows: Boolean\n\t\t//\t\tIndicates whether or not to show the first and last arrow links.\n\t\tfirstLastArrows: false,\n\n\t\t// pagingLinks: Number\n\t\t//\t\tThe number of page links to show on each side of the current page\n\t\t//\t\tSet to 0 (or false) to disable page links.\n\t\tpagingLinks: 2,\n\t\t// pageSizeOptions: Array[Number]\n\t\t//\t\tThis provides options for different page sizes in a drop-down.\n\t\t//\t\tIf it is empty (default), no page size drop-down will be displayed.\n\t\tpageSizeOptions: null,\n\n\t\t// showLoadingMessage: Boolean\n\t\t//\t\tIf true, clears previous data and displays loading node when requesting\n\t\t//\t\tanother page; if false, leaves previous data in place until new data\n\t\t//\t\tarrives, then replaces it immediately.\n\t\tshowLoadingMessage: true,\n\n\t\t// i18nPagination: Object\n\t\t//\t\tThis object contains all of the internationalized strings as\n\t\t//\t\tkey/value pairs.\n\t\ti18nPagination: i18n,\n\n\t\tshowFooter: true,\n\t\t_currentPage: 1,\n\t\t_loadingCount: 0,\n\n\t\tbuildRendering: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// add pagination to footer\n\t\t\tvar grid = this,\n\t\t\t\tpaginationNode = this.paginationNode =\n\t\t\t\t\tdomConstruct.create('div', { className: 'dgrid-pagination' }, this.footerNode),\n\t\t\t\tstatusNode = this.paginationStatusNode =\n\t\t\t\t\tdomConstruct.create('div', { className: 'dgrid-status' }, paginationNode),\n\t\t\t\ti18n = this.i18nPagination,\n\t\t\t\tnavigationNode,\n\t\t\t\tnode;\n\n\t\t\tif (typeof this._processScroll === 'function') {\n\t\t\t\t// Warn the user of an invalid class + mixin combination when they mix OnDemandList and this extension.\n\t\t\t\tthis.bodyNode.innerHTML = i18n.notCompatibleWithOnDemand;\n\t\t\t\tconsole.warn(i18n.notCompatibleWithOnDemand);\n\t\t\t}\n\n\t\t\tstatusNode.tabIndex = 0;\n\n\t\t\t// Initialize UI based on pageSizeOptions and rowsPerPage\n\t\t\tthis._updatePaginationSizeSelect();\n\t\t\tthis._updateRowsPerPageOption();\n\n\t\t\t// initialize some content into paginationStatusNode, to ensure\n\t\t\t// accurate results on initial resize call\n\t\t\tthis._updatePaginationStatus(this._total);\n\n\t\t\tnavigationNode = this.paginationNavigationNode =\n\t\t\t\tdomConstruct.create('div', { className: 'dgrid-navigation' }, paginationNode);\n\n\t\t\tif (this.firstLastArrows) {\n\t\t\t\t// create a first-page link\n\t\t\t\tnode = this.paginationFirstNode = domConstruct.create('span', {\n\t\t\t\t\t'aria-label': i18n.gotoFirst,\n\t\t\t\t\tclassName: 'dgrid-first dgrid-page-link',\n\t\t\t\t\tinnerHTML: '«',\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t}, navigationNode);\n\t\t\t}\n\t\t\tif (this.previousNextArrows) {\n\t\t\t\t// create a previous link\n\t\t\t\tnode = this.paginationPreviousNode = domConstruct.create('span', {\n\t\t\t\t\t'aria-label': i18n.gotoPrev,\n\t\t\t\t\tclassName: 'dgrid-previous dgrid-page-link',\n\t\t\t\t\tinnerHTML: '‹',\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t}, navigationNode);\n\t\t\t}\n\n\t\t\tthis.paginationLinksNode = domConstruct.create('span', {\n\t\t\t\tclassName: 'dgrid-pagination-links'\n\t\t\t}, navigationNode);\n\n\t\t\tif (this.previousNextArrows) {\n\t\t\t\t// create a next link\n\t\t\t\tnode = this.paginationNextNode = domConstruct.create('span', {\n\t\t\t\t\t'aria-label': i18n.gotoNext,\n\t\t\t\t\tclassName: 'dgrid-next dgrid-page-link',\n\t\t\t\t\tinnerHTML: '›',\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t}, navigationNode);\n\t\t\t}\n\t\t\tif (this.firstLastArrows) {\n\t\t\t\t// create a last-page link\n\t\t\t\tnode = this.paginationLastNode = domConstruct.create('span', {\n\t\t\t\t\t'aria-label': i18n.gotoLast,\n\t\t\t\t\tclassName: 'dgrid-last dgrid-page-link',\n\t\t\t\t\tinnerHTML: '»',\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t}, navigationNode);\n\t\t\t}\n\n\t\t\t/* jshint maxlen: 121 */\n\t\t\tthis._listeners.push(on(navigationNode, '.dgrid-page-link:click,.dgrid-page-link:keydown', function (event) {\n\t\t\t\t// For keyboard events, only respond to enter\n\t\t\t\tif (event.type === 'keydown' && event.keyCode !== 13) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar cls = this.className,\n\t\t\t\t\tcurr, max;\n\n\t\t\t\tif (grid._isLoading || cls.indexOf('dgrid-page-disabled') > -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcurr = grid._currentPage;\n\t\t\t\tmax = Math.ceil(grid._total / grid.rowsPerPage);\n\n\t\t\t\t// determine navigation target based on clicked link's class\n\t\t\t\tif (this === grid.paginationPreviousNode) {\n\t\t\t\t\tgrid.gotoPage(curr - 1);\n\t\t\t\t}\n\t\t\t\telse if (this === grid.paginationNextNode) {\n\t\t\t\t\tgrid.gotoPage(curr + 1);\n\t\t\t\t}\n\t\t\t\telse if (this === grid.paginationFirstNode) {\n\t\t\t\t\tgrid.gotoPage(1);\n\t\t\t\t}\n\t\t\t\telse if (this === grid.paginationLastNode) {\n\t\t\t\t\tgrid.gotoPage(max);\n\t\t\t\t}\n\t\t\t\telse if (cls === 'dgrid-page-link') {\n\t\t\t\t\tgrid.gotoPage(+this.innerHTML); // the innerHTML has the page number\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\n\t\tdestroy: function () {\n\t\t\tthis.inherited(arguments);\n\t\t\tif (this._pagingTextBoxChangeHandle) {\n\t\t\t\tthis._pagingTextBoxChangeHandle.remove();\n\t\t\t}\n\t\t\tif (this._pagingTextBoxKeyPressHandle) {\n\t\t\t\tthis._pagingTextBoxKeyPressHandle.remove();\n\t\t\t}\n\t\t},\n\n\t\t_updatePaginationSizeSelect: function () {\n\t\t\t// summary:\n\t\t\t//\t\tCreates or repopulates the pagination size selector based on\n\t\t\t//\t\tthe values in pageSizeOptions. Called from buildRendering\n\t\t\t//\t\tand _setPageSizeOptions.\n\n\t\t\tvar pageSizeOptions = this.pageSizeOptions,\n\t\t\t\tpaginationSizeSelect = this.paginationSizeSelect,\n\t\t\t\thandle;\n\n\t\t\tif (pageSizeOptions && pageSizeOptions.length) {\n\t\t\t\tif (!paginationSizeSelect) {\n\t\t\t\t\t// First time setting page options; create the select\n\t\t\t\t\tpaginationSizeSelect = this.paginationSizeSelect = domConstruct.create('select', {\n\t\t\t\t\t\t'aria-label': this.i18nPagination.rowsPerPage,\n\t\t\t\t\t\tclassName: 'dgrid-page-size'\n\t\t\t\t\t}, this.paginationNode);\n\n\t\t\t\t\thandle = this._paginationSizeChangeHandle =\n\t\t\t\t\t\ton(paginationSizeSelect, 'change', lang.hitch(this, function () {\n\t\t\t\t\t\t\tthis.set('rowsPerPage', +this.paginationSizeSelect.value);\n\t\t\t\t\t\t}));\n\t\t\t\t\tthis._listeners.push(handle);\n\t\t\t\t}\n\n\t\t\t\t// Repopulate options\n\t\t\t\tpaginationSizeSelect.options.length = 0;\n\t\t\t\tfor (var i = 0; i < pageSizeOptions.length; i++) {\n\t\t\t\t\tdomConstruct.create('option', {\n\t\t\t\t\t\tinnerHTML: pageSizeOptions[i],\n\t\t\t\t\t\tselected: this.rowsPerPage === pageSizeOptions[i],\n\t\t\t\t\t\tvalue: pageSizeOptions[i]\n\t\t\t\t\t}, paginationSizeSelect);\n\t\t\t\t}\n\t\t\t\t// Ensure current rowsPerPage value is in options\n\t\t\t\tthis._updateRowsPerPageOption();\n\t\t\t}\n\t\t\telse if (!(pageSizeOptions && pageSizeOptions.length) && paginationSizeSelect) {\n\t\t\t\t// pageSizeOptions was removed; remove/unhook the drop-down\n\t\t\t\tdomConstruct.destroy(paginationSizeSelect);\n\t\t\t\tthis.paginationSizeSelect = null;\n\t\t\t\tthis._paginationSizeChangeHandle.remove();\n\t\t\t}\n\t\t},\n\n\t\t_setPageSizeOptions: function (pageSizeOptions) {\n\t\t\tthis.pageSizeOptions = pageSizeOptions && pageSizeOptions.sort(function (a, b) {\n\t\t\t\treturn a - b;\n\t\t\t});\n\t\t\tthis._updatePaginationSizeSelect();\n\t\t},\n\n\t\t_updateRowsPerPageOption: function () {\n\t\t\t// summary:\n\t\t\t//\t\tEnsures that an option for rowsPerPage's value exists in the\n\t\t\t//\t\tpaginationSizeSelect drop-down (if one is rendered).\n\t\t\t//\t\tCalled from buildRendering and _setRowsPerPage.\n\n\t\t\tvar rowsPerPage = this.rowsPerPage,\n\t\t\t\tpageSizeOptions = this.pageSizeOptions,\n\t\t\t\tpaginationSizeSelect = this.paginationSizeSelect;\n\n\t\t\tif (paginationSizeSelect) {\n\t\t\t\tif (arrayUtil.indexOf(pageSizeOptions, rowsPerPage) < 0) {\n\t\t\t\t\tthis._setPageSizeOptions(pageSizeOptions.concat([rowsPerPage]));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpaginationSizeSelect.value = '' + rowsPerPage;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_setRowsPerPage: function (rowsPerPage) {\n\t\t\tthis.rowsPerPage = rowsPerPage;\n\t\t\tthis._updateRowsPerPageOption();\n\t\t\tthis.gotoPage(1);\n\t\t},\n\n\t\t_updateNavigation: function (total) {\n\t\t\t// summary:\n\t\t\t//\t\tUpdate status and navigation controls based on total count from query\n\n\t\t\tvar grid = this,\n\t\t\t\ti18n = this.i18nPagination,\n\t\t\t\tlinksNode = this.paginationLinksNode,\n\t\t\t\tcurrentPage = this._currentPage,\n\t\t\t\tpagingLinks = this.pagingLinks,\n\t\t\t\tpaginationNavigationNode = this.paginationNavigationNode,\n\t\t\t\tend = Math.ceil(total / this.rowsPerPage),\n\t\t\t\tpagingTextBoxKeyPressHandle = this._pagingTextBoxKeyPressHandle,\n\t\t\t\tpagingTextBoxChangeHandle = this._pagingTextBoxChangeHandle,\n\t\t\t\tfocused = document.activeElement,\n\t\t\t\tfocusedPage,\n\t\t\t\tlastFocusablePageLink,\n\t\t\t\tfocusableNodes;\n\n\t\t\tfunction _gotoPage(page) {\n\t\t\t\tpage = +page;\n\t\t\t\tif (!isNaN(page) && page > 0 && page <= end) {\n\t\t\t\t\tgrid.gotoPage(page);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction pageLink(page, addSpace) {\n\t\t\t\tvar link;\n\t\t\t\tvar disabled;\n\t\t\t\tvar requirePageChange = true;\n\n\t\t\t\tif (grid.pagingTextBox && page === currentPage && end > 1) {\n\t\t\t\t\t// use a paging text box if enabled instead of just a number\n\t\t\t\t\tlink = domConstruct.create('input', {\n\t\t\t\t\t\t'aria-label': i18n.jumpPage,\n\t\t\t\t\t\tclassName: 'dgrid-page-input',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tvalue: currentPage\n\t\t\t\t\t}, linksNode);\n\t\t\t\t\tgrid._pagingTextBoxChangeHandle = on(link, 'change', function () {\n\t\t\t\t\t\tif (requirePageChange) {\n\t\t\t\t\t\t\t_gotoPage(+this.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequirePageChange = true;\n\t\t\t\t\t});\n\t\t\t\t\tgrid._pagingTextBoxKeyPressHandle = on(link, 'keypress', function (evt) {\n\t\t\t\t\t\tif (evt.keyCode === keys.ENTER) {\n\t\t\t\t\t\t\trequirePageChange = false;\n\t\t\t\t\t\t\t_gotoPage(+this.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (focused && focused.tagName === 'INPUT') {\n\t\t\t\t\t\tlink.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// normal link\n\t\t\t\t\tdisabled = page === currentPage;\n\t\t\t\t\tlink = domConstruct.create('span', {\n\t\t\t\t\t\t'aria-label': i18n.gotoPage,\n\t\t\t\t\t\tclassName: 'dgrid-page-link' + (disabled ? ' dgrid-page-disabled' : ''),\n\t\t\t\t\t\tinnerHTML: page + (addSpace ? ' ' : ''),\n\t\t\t\t\t\ttabIndex: disabled ? -1 : 0\n\t\t\t\t\t}, linksNode);\n\n\t\t\t\t\t// Try to restore focus if applicable;\n\t\t\t\t\t// if we need to but can't, try on the previous or next page,\n\t\t\t\t\t// depending on whether we're at the end\n\t\t\t\t\tif (focusedPage === page) {\n\t\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\t\tlink.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (page < end) {\n\t\t\t\t\t\t\tfocusedPage++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlastFocusablePageLink.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\tlastFocusablePageLink = link;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction setDisabled(link, disabled) {\n\t\t\t\tdomClass.toggle(link, 'dgrid-page-disabled', disabled);\n\t\t\t\tlink.tabIndex = disabled ? -1 : 0;\n\t\t\t}\n\n\t\t\tfunction addSkipNode() {\n\t\t\t\t// Adds visual indication of skipped page numbers in navigation area\n\t\t\t\tdomConstruct.create('span', {\n\t\t\t\t\tclassName: 'dgrid-page-skip',\n\t\t\t\t\tinnerHTML: '...'\n\t\t\t\t}, linksNode);\n\t\t\t}\n\n\t\t\tif (!focused || !this.paginationNavigationNode.contains(focused)) {\n\t\t\t\tfocused = null;\n\t\t\t}\n\t\t\telse if (focused.className === 'dgrid-page-link') {\n\t\t\t\tfocusedPage = +focused.innerHTML;\n\t\t\t}\n\n\t\t\tif (pagingTextBoxKeyPressHandle) {\n\t\t\t\tpagingTextBoxKeyPressHandle.remove();\n\t\t\t}\n\t\t\tif (pagingTextBoxChangeHandle) {\n\t\t\t\tpagingTextBoxChangeHandle.remove();\n\t\t\t}\n\n\t\t\tlinksNode.innerHTML = '';\n\t\t\tquery('.dgrid-first, .dgrid-previous', paginationNavigationNode).forEach(function (link) {\n\t\t\t\tsetDisabled(link, currentPage === 1);\n\t\t\t});\n\t\t\tquery('.dgrid-last, .dgrid-next', paginationNavigationNode).forEach(function (link) {\n\t\t\t\tsetDisabled(link, currentPage >= end);\n\t\t\t});\n\n\t\t\tif (pagingLinks && end > 0) {\n\t\t\t\t// always include the first page (back to the beginning)\n\t\t\t\tpageLink(1, true);\n\t\t\t\tvar start = currentPage - pagingLinks;\n\t\t\t\tif (start > 2) {\n\t\t\t\t\taddSkipNode();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstart = 2;\n\t\t\t\t}\n\t\t\t\t// now iterate through all the page links we should show\n\t\t\t\tfor (var i = start; i < Math.min(currentPage + pagingLinks + 1, end); i++) {\n\t\t\t\t\tpageLink(i, true);\n\t\t\t\t}\n\t\t\t\tif (currentPage + pagingLinks + 1 < end) {\n\t\t\t\t\taddSkipNode();\n\t\t\t\t}\n\t\t\t\t// last link\n\t\t\t\tif (end > 1) {\n\t\t\t\t\tpageLink(end);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (grid.pagingTextBox) {\n\t\t\t\t// The pageLink function is also used to create the paging textbox.\n\t\t\t\tpageLink(currentPage);\n\t\t\t}\n\n\t\t\tif (focused && focused.tabIndex === -1) {\n\t\t\t\t// One of the first/last or prev/next links was focused but\n\t\t\t\t// is now disabled, so find something focusable\n\t\t\t\tfocusableNodes = query('[tabindex=\"0\"]', this.paginationNavigationNode);\n\t\t\t\tif (focused === this.paginationPreviousNode || focused === this.paginationFirstNode) {\n\t\t\t\t\tfocused = focusableNodes[0];\n\t\t\t\t}\n\t\t\t\telse if (focusableNodes.length) {\n\t\t\t\t\tfocused = focusableNodes[focusableNodes.length - 1];\n\t\t\t\t}\n\t\t\t\tif (focused) {\n\t\t\t\t\tfocused.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_updatePaginationStatus: function (total) {\n\t\t\tvar count = this.rowsPerPage;\n\t\t\tvar start = Math.min(total, (this._currentPage - 1) * count + 1);\n\t\t\tthis.paginationStatusNode.innerHTML = string.substitute(this.i18nPagination.status, {\n\t\t\t\tstart: start,\n\t\t\t\tend: Math.min(total, start + count - 1),\n\t\t\t\ttotal: total\n\t\t\t});\n\t\t},\n\n\t\trefresh: function (options) {\n\t\t\t// summary:\n\t\t\t//\t\tRe-renders the first page of data, or the current page if\n\t\t\t//\t\toptions.keepCurrentPage is true.\n\n\t\t\tvar self = this;\n\t\t\tvar page = options && options.keepCurrentPage ?\n\t\t\t\tMath.min(this._currentPage, Math.ceil(this._total / this.rowsPerPage)) : 1;\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Reset to first page and return promise from gotoPage\n\t\t\treturn this.gotoPage(page).then(function (results) {\n\t\t\t\tself._emitRefreshComplete();\n\t\t\t\treturn results;\n\t\t\t});\n\t\t},\n\n\t\t_onNotification: function (rows, event, collection) {\n\t\t\tvar rowsPerPage = this.rowsPerPage;\n\t\t\tvar pageEnd = this._currentPage * rowsPerPage;\n\t\t\tvar needsRefresh = (event.type === 'add' && event.index < pageEnd) ||\n\t\t\t\t(event.type === 'delete' && event.previousIndex < pageEnd) ||\n\t\t\t\t(event.type === 'update' &&\n\t\t\t\t\tMath.floor(event.index / rowsPerPage) !== Math.floor(event.previousIndex / rowsPerPage));\n\n\t\t\tif (needsRefresh) {\n\t\t\t\t// Refresh the current page to maintain correct number of rows on page\n\t\t\t\tthis.gotoPage(Math.min(this._currentPage, Math.ceil(event.totalLength / this.rowsPerPage)) || 1);\n\t\t\t}\n\t\t\t// If we're not updating the whole page, check if we at least need to update status/navigation\n\t\t\telse if (collection === this._renderedCollection && event.totalLength !== this._total) {\n\t\t\t\tthis._updatePaginationStatus(event.totalLength);\n\t\t\t\tthis._updateNavigation(event.totalLength);\n\t\t\t}\n\t\t},\n\n\t\trenderQueryResults: function (results, beforeNode) {\n\t\t\tvar grid = this,\n\t\t\t\trows = this.inherited(arguments);\n\n\t\t\tif (!beforeNode) {\n\t\t\t\tif (this._topLevelRequest) {\n\t\t\t\t\t// Cancel previous async request that didn't finish\n\t\t\t\t\tthis._topLevelRequest.cancel();\n\t\t\t\t\tdelete this._topLevelRequest;\n\t\t\t\t}\n\n\t\t\t\tif (typeof rows.cancel === 'function') {\n\t\t\t\t\t// Store reference to new async request in progress\n\t\t\t\t\tthis._topLevelRequest = rows;\n\t\t\t\t}\n\n\t\t\t\trows.then(function () {\n\t\t\t\t\tif (grid._topLevelRequest) {\n\t\t\t\t\t\t// Remove reference to request now that it's finished\n\t\t\t\t\t\tdelete grid._topLevelRequest;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn rows;\n\t\t},\n\n\t\tinsertRow: function () {\n\t\t\tvar oldNodes = this._oldPageNodes,\n\t\t\t\trow = this.inherited(arguments);\n\n\t\t\tif (oldNodes && row === oldNodes[row.id]) {\n\t\t\t\t// If the previous row was reused, avoid removing it in cleanup\n\t\t\t\tdelete oldNodes[row.id];\n\t\t\t}\n\n\t\t\treturn row;\n\t\t},\n\n\t\tgotoPage: function (page) {\n\t\t\t// summary:\n\t\t\t//\t\tLoads the given page. Note that page numbers start at 1.\n\t\t\tvar grid = this,\n\t\t\t\tstart = (this._currentPage - 1) * this.rowsPerPage;\n\n\t\t\tif (!this._renderedCollection) {\n\t\t\t\tconsole.warn('Pagination requires a collection to operate.');\n\t\t\t\treturn when([]);\n\t\t\t}\n\n\t\t\tif (this._renderedCollection.releaseRange) {\n\t\t\t\tthis._renderedCollection.releaseRange(start, start + this.rowsPerPage);\n\t\t\t}\n\n\t\t\treturn this._trackError(function () {\n\t\t\t\tvar count = grid.rowsPerPage,\n\t\t\t\t\tstart = (page - 1) * count,\n\t\t\t\t\toptions = {\n\t\t\t\t\t\tstart: start,\n\t\t\t\t\t\tcount: count\n\t\t\t\t\t},\n\t\t\t\t\tresults,\n\t\t\t\t\tcontentNode = grid.contentNode,\n\t\t\t\t\tloadingNode,\n\t\t\t\t\toldNodes,\n\t\t\t\t\tchildren,\n\t\t\t\t\ti,\n\t\t\t\t\tlen;\n\n\t\t\t\tif (grid.showLoadingMessage) {\n\t\t\t\t\tgrid._loadingCount++;\n\t\t\t\t\tcleanupContent(grid);\n\t\t\t\t\tloadingNode = grid.loadingNode = domConstruct.create('div', {\n\t\t\t\t\t\tclassName: 'dgrid-loading',\n\t\t\t\t\t\tinnerHTML: grid.loadingMessage\n\t\t\t\t\t}, contentNode);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Reference nodes to be cleared later, rather than now;\n\t\t\t\t\t// iterate manually since IE < 9 doesn't like slicing HTMLCollections\n\t\t\t\t\tgrid._oldPageNodes = oldNodes = {};\n\t\t\t\t\tchildren = contentNode.children;\n\t\t\t\t\tfor (i = 0, len = children.length; i < len; i++) {\n\t\t\t\t\t\toldNodes[children[i].id] = children[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// set flag to deactivate pagination event handlers until loaded\n\t\t\t\tgrid._isLoading = true;\n\n\t\t\t\tresults = grid._renderedCollection.fetchRange({\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: start + count\n\t\t\t\t});\n\n\t\t\t\treturn grid.renderQueryResults(results, null, options).then(function (rows) {\n\t\t\t\t\tcleanupLoading(grid);\n\t\t\t\t\t// Reset scroll Y-position now that new page is loaded.\n\t\t\t\t\tgrid.scrollTo({ y: 0 });\n\n\t\t\t\t\tif (grid._rows) {\n\t\t\t\t\t\tgrid._rows.min = start;\n\t\t\t\t\t\tgrid._rows.max = start + count - 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tresults.totalLength.then(function (total) {\n\t\t\t\t\t\tif (!total) {\n\t\t\t\t\t\t\tgrid._insertNoDataNode();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update status text based on now-current page and total.\n\t\t\t\t\t\tgrid._total = total;\n\t\t\t\t\t\tgrid._currentPage = page;\n\t\t\t\t\t\tgrid._rowsOnPage = rows.length;\n\t\t\t\t\t\tgrid._updatePaginationStatus(total);\n\n\t\t\t\t\t\t// It's especially important that _updateNavigation is called only\n\t\t\t\t\t\t// after renderQueryResults is resolved as well (to prevent jumping).\n\t\t\t\t\t\tgrid._updateNavigation(total);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn results;\n\t\t\t\t}, function (error) {\n\t\t\t\t\tcleanupLoading(grid);\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n});\n","/*\n * This module was modified by dojo-webpack-plugin to disable some locales\n * that were excluded by the plugin's 'locales' option\n */\ndefine(({'root':({'status':'${start} - ${end} of ${total} results','gotoFirst':'Go to first page','gotoNext':'Go to next page','gotoPrev':'Go to previous page','gotoLast':'Go to last page','gotoPage':'Go to page','jumpPage':'Jump to page','rowsPerPage':'Number of rows per page','notCompatibleWithOnDemand':'The Pagination extension is not compatible with dgrid/OnDemandList and dgrid/OnDemandGrid. Please use dgrid/List or dgrid/Grid as a base class.'}),'ar':false,'de':false,'es':false,'fr':false,'ja':false,'pt':false,'ro':false,'ru':false,'sk':false,'sl':false,'th':false,'zh-cn':false,'zh-hk':false}))","define([\r\n\t'dojo/has'\r\n], function (has) {\r\n\t// summary:\r\n\t//\t\tThis module defines miscellaneous utility methods for purposes of\r\n\t//\t\tadding styles, and throttling/debouncing function calls.\r\n\r\n\t// establish an extra stylesheet which addCssRule calls will use,\r\n\t// plus an array to track actual indices in stylesheet for removal\r\n\tvar extraRules = [],\r\n\t\textraSheet,\r\n\t\tremoveMethod,\r\n\t\trulesProperty,\r\n\t\tinvalidCssChars = /([^A-Za-z0-9_\\u00A0-\\uFFFF-])/g,\r\n\t\tdelayCallback = setTimeout,\r\n\t\tcancelDelay = clearTimeout;\r\n\r\n\thas.add('requestidlecallback', function (global) {\r\n\t\treturn typeof global.requestIdleCallback === 'function';\r\n\t});\r\n\r\n\t// The presence of the 'requestIdleCallback' method indicates a browser that might\r\n\t// performance optimize code by delaying execution of the callback passed to\r\n\t// 'setTimeout', so use 'requestIdleCallback' to improve the likelihood of the\r\n\t// callback being executed in a timely manner.\r\n\t// This is not a perfect solution, but has worked well in testing.\r\n\t// requestIdleCallback is designed to be called successively, performing progressive chunks\r\n\t// of computation each time until the task is complete.\r\n\t// setTimeout executes its callback when delay has transpired, *or later*\r\n\t// requestIdleCallback executes its callback when delay has transpired, *or sooner*\r\n\t// Fixes https://github.com/SitePen/dgrid/issues/1351\r\n\t// if (has('requestidlecallback')) {\r\n\t// \tdelayCallback = function (callback, delay) {\r\n\t// \t\treturn requestIdleCallback(callback, { timeout: delay });\r\n\t// \t};\r\n\t// \tcancelDelay = cancelIdleCallback;\r\n\t// }\r\n\r\n\tfunction removeRule(index) {\r\n\t\t// Function called by the remove method on objects returned by addCssRule.\r\n\t\tvar realIndex = extraRules[index],\r\n\t\t\ti, l;\r\n\t\tif (realIndex === undefined) {\r\n\t\t\treturn; // already removed\r\n\t\t}\r\n\r\n\t\t// remove rule indicated in internal array at index\r\n\t\textraSheet[removeMethod](realIndex);\r\n\r\n\t\t// Clear internal array item representing rule that was just deleted.\r\n\t\t// NOTE: we do NOT splice, since the point of this array is specifically\r\n\t\t// to negotiate the splicing that occurs in the stylesheet itself!\r\n\t\textraRules[index] = undefined;\r\n\r\n\t\t// Then update array items as necessary to downshift remaining rule indices.\r\n\t\t// Can start at index + 1, since array is sparse but strictly increasing.\r\n\t\tfor (i = index + 1, l = extraRules.length; i < l; i++) {\r\n\t\t\tif (extraRules[i] > realIndex) {\r\n\t\t\t\textraRules[i]--;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar util = {\r\n\t\t// Throttle/debounce functions\r\n\r\n\t\tdefaultDelay: 15,\r\n\t\tthrottle: function (cb, context, delay) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tReturns a function which calls the given callback at most once per\r\n\t\t\t//\t\tdelay milliseconds. (Inspired by plugd)\r\n\t\t\tvar ran = false;\r\n\t\t\tdelay = delay || util.defaultDelay;\r\n\t\t\treturn function () {\r\n\t\t\t\tif (ran) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tran = true;\r\n\t\t\t\tcb.apply(context, arguments);\r\n\t\t\t\tdelayCallback(function () {\r\n\t\t\t\t\tran = false;\r\n\t\t\t\t}, delay);\r\n\t\t\t};\r\n\t\t},\r\n\t\tthrottleDelayed: function (cb, context, delay) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tLike throttle, except that the callback runs after the delay,\r\n\t\t\t//\t\trather than before it.\r\n\t\t\tvar ran = false;\r\n\t\t\tdelay = delay || util.defaultDelay;\r\n\t\t\treturn function () {\r\n\t\t\t\tif (ran) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tran = true;\r\n\t\t\t\tvar a = arguments;\r\n\t\t\t\tdelayCallback(function () {\r\n\t\t\t\t\tran = false;\r\n\t\t\t\t\tcb.apply(context, a);\r\n\t\t\t\t}, delay);\r\n\t\t\t};\r\n\t\t},\r\n\t\tdebounce: function (cb, context, delay) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tReturns a function which calls the given callback only after a\r\n\t\t\t//\t\tcertain time has passed without successive calls. (Inspired by plugd)\r\n\t\t\tvar timer;\r\n\t\t\tdelay = delay || util.defaultDelay;\r\n\t\t\treturn function () {\r\n\t\t\t\tif (timer) {\r\n\t\t\t\t\tcancelDelay(timer);\r\n\t\t\t\t\ttimer = null;\r\n\t\t\t\t}\r\n\t\t\t\tvar a = arguments;\r\n\t\t\t\ttimer = delayCallback(function () {\r\n\t\t\t\t\ttimer = null;\r\n\t\t\t\t\tcb.apply(context, a);\r\n\t\t\t\t}, delay);\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t// Iterative functions\r\n\r\n\t\teach: function (arrayOrObject, callback, context) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tGiven an array or object, iterates through its keys.\r\n\t\t\t//\t\tDoes not use hasOwnProperty (since even Dojo does not\r\n\t\t\t//\t\tconsistently use it), but will iterate using a for or for-in\r\n\t\t\t//\t\tloop as appropriate.\r\n\r\n\t\t\tvar i, len;\r\n\r\n\t\t\tif (!arrayOrObject) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (typeof arrayOrObject.length === 'number') {\r\n\t\t\t\tfor (i = 0, len = arrayOrObject.length; i < len; i++) {\r\n\t\t\t\t\tcallback.call(context, arrayOrObject[i], i, arrayOrObject);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tfor (i in arrayOrObject) {\r\n\t\t\t\t\tcallback.call(context, arrayOrObject[i], i, arrayOrObject);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// CSS-related functions\r\n\r\n\t\taddCssRule: function (selector, css) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tDynamically adds a style rule to the document. Returns an object\r\n\t\t\t//\t\twith a remove method which can be called to later remove the rule.\r\n\r\n\t\t\tif (!extraSheet) {\r\n\t\t\t\t// First time, create an extra stylesheet for adding rules\r\n\t\t\t\textraSheet = document.createElement('style');\r\n\t\t\t\tdocument.getElementsByTagName('head')[0].appendChild(extraSheet);\r\n\t\t\t\t// Keep reference to actual StyleSheet object (`styleSheet` for IE < 9)\r\n\t\t\t\textraSheet = extraSheet.sheet || extraSheet.styleSheet;\r\n\t\t\t\t// Store name of method used to remove rules (`removeRule` for IE < 9)\r\n\t\t\t\tremoveMethod = extraSheet.deleteRule ? 'deleteRule' : 'removeRule';\r\n\t\t\t\t// Store name of property used to access rules (`rules` for IE < 9)\r\n\t\t\t\trulesProperty = extraSheet.cssRules ? 'cssRules' : 'rules';\r\n\t\t\t}\r\n\r\n\t\t\tvar index = extraRules.length;\r\n\t\t\textraRules[index] = (extraSheet.cssRules || extraSheet.rules).length;\r\n\t\t\textraSheet.addRule ?\r\n\t\t\t\textraSheet.addRule(selector, css) :\r\n\t\t\t\textraSheet.insertRule(selector + '{' + css + '}', extraRules[index]);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tget: function (prop) {\r\n\t\t\t\t\treturn extraSheet[rulesProperty][extraRules[index]].style[prop];\r\n\t\t\t\t},\r\n\t\t\t\tset: function (prop, value) {\r\n\t\t\t\t\tif (typeof extraRules[index] !== 'undefined') {\r\n\t\t\t\t\t\textraSheet[rulesProperty][extraRules[index]].style[prop] = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tremove: function () {\r\n\t\t\t\t\tremoveRule(index);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\tescapeCssIdentifier: function (id, replace) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tEscapes normally-invalid characters in a CSS identifier (such as . or :);\r\n\t\t\t//\t\tsee http://www.w3.org/TR/CSS2/syndata.html#value-def-identifier\r\n\t\t\t// id: String\r\n\t\t\t//\t\tCSS identifier (e.g. tag name, class, or id) to be escaped\r\n\t\t\t// replace: String?\r\n\t\t\t//\t\tIf specified, indicates that invalid characters should be\r\n\t\t\t//\t\treplaced by the given string rather than being escaped\r\n\r\n\t\t\treturn typeof id === 'string' ? id.replace(invalidCssChars, replace || '\\\\$1') : id;\r\n\t\t}\r\n\t};\r\n\treturn util;\r\n});\r\n","define([\r\n\t'dojo/on',\r\n\t'dojo/query'\r\n], function (on, query) {\r\n\t// This module exposes useful functions for working with touch devices.\r\n\r\n\tvar util = {\r\n\t\t// Overridable defaults related to extension events defined below.\r\n\t\ttapRadius: 10,\r\n\t\tdbltapTime: 250,\r\n\r\n\t\tselector: function (selector, eventType, children) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tReimplementation of on.selector, taking an iOS quirk into account\r\n\t\t\treturn function (target, listener) {\r\n\t\t\t\tvar bubble = eventType.bubble;\r\n\t\t\t\tif (bubble) {\r\n\t\t\t\t\t// the event type doesn't naturally bubble, but has a bubbling form, use that\r\n\t\t\t\t\teventType = bubble;\r\n\t\t\t\t}\r\n\t\t\t\telse if (children !== false) {\r\n\t\t\t\t\t// for normal bubbling events we default to allowing children of the selector\r\n\t\t\t\t\tchildren = true;\r\n\t\t\t\t}\r\n\t\t\t\treturn on(target, eventType, function (event) {\r\n\t\t\t\t\tvar eventTarget = event.target;\r\n\r\n\t\t\t\t\t// iOS tends to report the text node an event was fired on, rather than\r\n\t\t\t\t\t// the top-level element; this may end up causing errors in selector engines\r\n\t\t\t\t\tif (eventTarget.nodeType === 3) {\r\n\t\t\t\t\t\teventTarget = eventTarget.parentNode;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// there is a selector, so make sure it matches\r\n\t\t\t\t\twhile (!query.matches(eventTarget, selector, target)) {\r\n\t\t\t\t\t\tif (eventTarget === target || !children || !(eventTarget = eventTarget.parentNode)) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn listener.call(eventTarget, event);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\tcountCurrentTouches: function (evt, node) {\r\n\t\t\t// summary:\r\n\t\t\t//\t\tGiven a touch event and a DOM node, counts how many current touches\r\n\t\t\t//\t\tpresently lie within that node. Useful in cases where an accurate\r\n\t\t\t//\t\tcount is needed but tracking changedTouches won't suffice because\r\n\t\t\t//\t\tother handlers stop events from bubbling high enough.\r\n\r\n\t\t\tif (!('touches' in evt)) {\r\n\t\t\t\t// Not a touch event (perhaps called from a mouse event on a\r\n\t\t\t\t// platform supporting touch events)\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\r\n\t\t\tvar i, numTouches, touch;\r\n\t\t\tfor (i = 0, numTouches = 0; (touch = evt.touches[i]); ++i) {\r\n\t\t\t\tif (node.contains(touch.target)) {\r\n\t\t\t\t\t++numTouches;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn numTouches;\r\n\t\t}\r\n\t};\r\n\r\n\tfunction handleTapStart(target, listener, evt, prevent) {\r\n\t\t// Common function for handling tap detection.\r\n\t\t// The passed listener will only be fired when and if a touchend is fired\r\n\t\t// which confirms the overall gesture resembled a tap.\r\n\r\n\t\tif (evt.targetTouches.length > 1) {\r\n\t\t\treturn; // ignore multitouch\r\n\t\t}\r\n\r\n\t\tvar start = evt.changedTouches[0],\r\n\t\t\tstartX = start.screenX,\r\n\t\t\tstartY = start.screenY;\r\n\r\n\t\tprevent && evt.preventDefault();\r\n\r\n\t\tvar endListener = on(target, 'touchend', function (evt) {\r\n\t\t\tvar end = evt.changedTouches[0];\r\n\t\t\tif (!evt.targetTouches.length) {\r\n\t\t\t\t// only call listener if this really seems like a tap\r\n\t\t\t\tif (Math.abs(end.screenX - startX) < util.tapRadius &&\r\n\t\t\t\t\t\tMath.abs(end.screenY - startY) < util.tapRadius) {\r\n\t\t\t\t\tprevent && evt.preventDefault();\r\n\t\t\t\t\tlistener.call(this, evt);\r\n\t\t\t\t}\r\n\t\t\t\tendListener.remove();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction tap(target, listener) {\r\n\t\t// Function usable by dojo/on as a synthetic tap event.\r\n\t\treturn on(target, 'touchstart', function (evt) {\r\n\t\t\thandleTapStart(target, listener, evt);\r\n\t\t});\r\n\t}\r\n\r\n\tfunction dbltap(target, listener) {\r\n\t\t// Function usable by dojo/on as a synthetic double-tap event.\r\n\t\tvar first, timeout;\r\n\r\n\t\treturn on(target, 'touchstart', function (evt) {\r\n\t\t\tif (!first) {\r\n\t\t\t\t// first potential tap: detect as usual, but with specific logic\r\n\t\t\t\thandleTapStart(target, function (evt) {\r\n\t\t\t\t\tfirst = evt.changedTouches[0];\r\n\t\t\t\t\ttimeout = setTimeout(function () {\r\n\t\t\t\t\t\tfirst = timeout = null;\r\n\t\t\t\t\t}, util.dbltapTime);\r\n\t\t\t\t}, evt);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\thandleTapStart(target, function (evt) {\r\n\t\t\t\t\t// bail out if first was cleared between 2nd touchstart and touchend\r\n\t\t\t\t\tif (!first) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar second = evt.changedTouches[0];\r\n\t\t\t\t\t// only call listener if both taps occurred near the same place\r\n\t\t\t\t\tif (Math.abs(second.screenX - first.screenX) < util.tapRadius &&\r\n\t\t\t\t\t\t\tMath.abs(second.screenY - first.screenY) < util.tapRadius) {\r\n\t\t\t\t\t\ttimeout && clearTimeout(timeout);\r\n\t\t\t\t\t\tfirst = timeout = null;\r\n\t\t\t\t\t\tlistener.call(this, evt);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, evt, true);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tutil.tap = tap;\r\n\tutil.dbltap = dbltap;\r\n\r\n\treturn util;\r\n});","define([\n\t\"require\",\t\t\t// require.toUrl\n\t\"./main\",\t// to export dijit.BackgroundIframe\n\t\"dojo/_base/config\",\n\t\"dojo/dom-construct\", // domConstruct.create\n\t\"dojo/dom-style\", // domStyle.set\n\t\"dojo/_base/lang\", // lang.extend lang.hitch\n\t\"dojo/on\",\n\t\"dojo/sniff\" // has(\"ie\"), has(\"trident\"), has(\"quirks\")\n], function(require, dijit, config, domConstruct, domStyle, lang, on, has){\n\n\t// module:\n\t//\t\tdijit/BackgroundIFrame\n\n\t// Flag for whether to create background iframe behind popups like Menus and Dialog.\n\t// A background iframe is useful to prevent problems with popups appearing behind applets/pdf files,\n\t// and is also useful on older versions of IE (IE6 and IE7) to prevent the \"bleed through select\" problem.\n\t// By default, it's enabled for IE6-11, excluding Windows Phone 8.\n\t// TODO: For 2.0, make this false by default. Also, possibly move definition to has.js so that this module can be\n\t// conditionally required via dojo/has!bgIfame?dijit/BackgroundIframe\n\thas.add(\"config-bgIframe\",\n \t(has(\"ie\") || has(\"trident\")) && !/IEMobile\\/10\\.0/.test(navigator.userAgent)); // No iframe on WP8, to match 1.9 behavior\n\n\tvar _frames = new function(){\n\t\t// summary:\n\t\t//\t\tcache of iframes\n\n\t\tvar queue = [];\n\n\t\tthis.pop = function(){\n\t\t\tvar iframe;\n\t\t\tif(queue.length){\n\t\t\t\tiframe = queue.pop();\n\t\t\t\tiframe.style.display=\"\";\n\t\t\t}else{\n\t\t\t\t// transparency needed for DialogUnderlay and for tooltips on IE (to see screen near connector)\n\t\t\t\tif(has(\"ie\") < 9){\n\t\t\t\t\tvar burl = config[\"dojoBlankHtmlUrl\"] || require.toUrl(\"dojo/resources/blank.html\") || \"javascript:\\\"\\\"\";\n\t\t\t\t\tvar html=\"<iframe src='\" + burl + \"' role='presentation'\"\n\t\t\t\t\t\t+ \" style='position: absolute; left: 0px; top: 0px;\"\n\t\t\t\t\t\t+ \"z-index: -1; filter:Alpha(Opacity=\\\"0\\\");'>\";\n\t\t\t\t\tiframe = document.createElement(html);\n\t\t\t\t}else{\n\t\t\t\t\tiframe = domConstruct.create(\"iframe\");\n\t\t\t\t\tiframe.src = 'javascript:\"\"';\n\t\t\t\t\tiframe.className = \"dijitBackgroundIframe\";\n\t\t\t\t\tiframe.setAttribute(\"role\", \"presentation\");\n\t\t\t\t\tdomStyle.set(iframe, \"opacity\", 0.1);\n\t\t\t\t}\n\t\t\t\tiframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work.\n\t\t\t}\n\t\t\treturn iframe;\n\t\t};\n\n\t\tthis.push = function(iframe){\n\t\t\tiframe.style.display=\"none\";\n\t\t\tqueue.push(iframe);\n\t\t}\n\t}();\n\n\n\tdijit.BackgroundIframe = function(/*DomNode*/ node){\n\t\t// summary:\n\t\t//\t\tFor IE/FF z-index shenanigans. id attribute is required.\n\t\t//\n\t\t// description:\n\t\t//\t\tnew dijit.BackgroundIframe(node).\n\t\t//\n\t\t//\t\tMakes a background iframe as a child of node, that fills\n\t\t//\t\tarea (and position) of node\n\n\t\tif(!node.id){ throw new Error(\"no id\"); }\n\t\tif(has(\"config-bgIframe\")){\n\t\t\tvar iframe = (this.iframe = _frames.pop());\n\t\t\tnode.appendChild(iframe);\n\t\t\tif(has(\"ie\")<7 || has(\"quirks\")){\n\t\t\t\tthis.resize(node);\n\t\t\t\tthis._conn = on(node, 'resize', lang.hitch(this, \"resize\", node));\n\t\t\t}else{\n\t\t\t\tdomStyle.set(iframe, {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '100%'\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\n\tlang.extend(dijit.BackgroundIframe, {\n\t\tresize: function(node){\n\t\t\t// summary:\n\t\t\t//\t\tResize the iframe so it's the same size as node.\n\t\t\t//\t\tNeeded on IE6 and IE/quirks because height:100% doesn't work right.\n\t\t\tif(this.iframe){\n\t\t\t\tdomStyle.set(this.iframe, {\n\t\t\t\t\twidth: node.offsetWidth + 'px',\n\t\t\t\t\theight: node.offsetHeight + 'px'\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdestroy: function(){\n\t\t\t// summary:\n\t\t\t//\t\tdestroy the iframe\n\t\t\tif(this._conn){\n\t\t\t\tthis._conn.remove();\n\t\t\t\tthis._conn = null;\n\t\t\t}\n\t\t\tif(this.iframe){\n\t\t\t\tthis.iframe.parentNode.removeChild(this.iframe);\n\t\t\t\t_frames.push(this.iframe);\n\t\t\t\tdelete this.iframe;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn dijit.BackgroundIframe;\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/aspect\",\n\t\"dojo/_base/declare\"\n], function(array, aspect, declare){\n\n\t// module:\n\t//\t\tdijit/Destroyable\n\n\treturn declare(\"dijit.Destroyable\", null, {\n\t\t// summary:\n\t\t//\t\tMixin to track handles and release them when instance is destroyed.\n\t\t// description:\n\t\t//\t\tCall this.own(...) on list of handles (returned from dojo/aspect, dojo/on,\n\t\t//\t\tdojo/Stateful::watch, or any class (including widgets) with a destroyRecursive() or destroy() method.\n\t\t//\t\tThen call destroy() later to destroy this instance and release the resources.\n\n\t\tdestroy: function(/*Boolean*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy this class, releasing any resources registered via own().\n\t\t\tthis._destroyed = true;\n\t\t},\n\n\t\town: function(){\n\t\t\t// summary:\n\t\t\t//\t\tTrack specified handles and remove/destroy them when this instance is destroyed, unless they were\n\t\t\t//\t\talready removed/destroyed manually.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\t// returns:\n\t\t\t//\t\tThe array of specified handles, so you can do for example:\n\t\t\t//\t|\t\tvar handle = this.own(on(...))[0];\n\n\t\t\tvar cleanupMethods = [\n\t\t\t\t\"destroyRecursive\",\n\t\t\t\t\"destroy\",\n\t\t\t\t\"remove\"\n\t\t\t];\n\n\t\t\tarray.forEach(arguments, function(handle){\n\t\t\t\t// When this.destroy() is called, destroy handle. Since I'm using aspect.before(),\n\t\t\t\t// the handle will be destroyed before a subclass's destroy() method starts running, before it calls\n\t\t\t\t// this.inherited() or even if it doesn't call this.inherited() at all. If that's an issue, make an\n\t\t\t\t// onDestroy() method and connect to that instead.\n\t\t\t\tvar destroyMethodName;\n\t\t\t\tvar odh = aspect.before(this, \"destroy\", function (preserveDom){\n\t\t\t\t\thandle[destroyMethodName](preserveDom);\n\t\t\t\t});\n\n\t\t\t\t// Callback for when handle is manually destroyed.\n\t\t\t\tvar hdhs = [];\n\t\t\t\tfunction onManualDestroy(){\n\t\t\t\t\todh.remove();\n\t\t\t\t\tarray.forEach(hdhs, function(hdh){\n\t\t\t\t\t\thdh.remove();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Setup listeners for manual destroy of handle.\n\t\t\t\t// Also computes destroyMethodName, used in listener above.\n\t\t\t\tif(handle.then){\n\t\t\t\t\t// Special path for Promises. Detect when Promise is resolved, rejected, or\n\t\t\t\t\t// canceled (nb: cancelling a Promise causes it to be rejected).\n\t\t\t\t\tdestroyMethodName = \"cancel\";\n\t\t\t\t\thandle.then(onManualDestroy, onManualDestroy);\n\t\t\t\t}else{\n\t\t\t\t\t// Path for other handles. Just use AOP to detect when handle is manually destroyed.\n\t\t\t\t\tarray.forEach(cleanupMethods, function(cleanupMethod){\n\t\t\t\t\t\tif(typeof handle[cleanupMethod] === \"function\"){\n\t\t\t\t\t\t\tif(!destroyMethodName){\n\t\t\t\t\t\t\t\t// Use first matching method name in above listener (prefer destroyRecursive() to destroy())\n\t\t\t\t\t\t\t\tdestroyMethodName = cleanupMethod;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thdhs.push(aspect.after(handle, cleanupMethod, onManualDestroy, true));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, this);\n\n\t\t\treturn arguments;\t\t// handle\n\t\t}\n\t});\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.indexOf array.map\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/fx\", // fx.fadeIn fx.fadeOut\n\t\"dojo/dom\", // dom.byId\n\t\"dojo/dom-class\", // domClass.add\n\t\"dojo/dom-geometry\", // domGeometry.position\n\t\"dojo/dom-style\", // domStyle.set, domStyle.get\n\t\"dojo/_base/lang\", // lang.hitch lang.isArrayLike\n\t\"dojo/mouse\",\n\t\"dojo/on\",\n\t\"dojo/sniff\", // has(\"ie\"), has(\"trident\")\n\t\"./_base/manager\",\t// manager.defaultDuration\n\t\"./place\",\n\t\"./_Widget\",\n\t\"./_TemplatedMixin\",\n\t\"./BackgroundIframe\",\n\t\"dojo/text!./templates/Tooltip.html\",\n\t\"./main\"\t\t// sets dijit.showTooltip etc. for back-compat\n], function(array, declare, fx, dom, domClass, domGeometry, domStyle, lang, mouse, on, has,\n\t\t\tmanager, place, _Widget, _TemplatedMixin, BackgroundIframe, template, dijit){\n\n\t// module:\n\t//\t\tdijit/Tooltip\n\n\n\t// TODO: Tooltip should really share more positioning code with TooltipDialog, like:\n\t//\t\t- the orient() method\n\t//\t\t- the connector positioning code in show()\n\t//\t\t- the dijitTooltip[Dialog] class\n\t//\n\t// The problem is that Tooltip's implementation supplies it's own <iframe> and interacts directly\n\t// with dijit/place, rather than going through dijit/popup like TooltipDialog and other popups (ex: Menu).\n\n\tvar MasterTooltip = declare(\"dijit._MasterTooltip\", [_Widget, _TemplatedMixin], {\n\t\t// summary:\n\t\t//\t\tInternal widget that holds the actual tooltip markup,\n\t\t//\t\twhich occurs once per page.\n\t\t//\t\tCalled by Tooltip widgets which are just containers to hold\n\t\t//\t\tthe markup\n\t\t// tags:\n\t\t//\t\tprotected\n\n\t\t// duration: Integer\n\t\t//\t\tMilliseconds to fade in/fade out\n\t\tduration: manager.defaultDuration,\n\n\t\ttemplateString: template,\n\n\t\tpostCreate: function(){\n\t\t\tthis.ownerDocumentBody.appendChild(this.domNode);\n\n\t\t\tthis.bgIframe = new BackgroundIframe(this.domNode);\n\n\t\t\t// Setup fade-in and fade-out functions.\n\t\t\tthis.fadeIn = fx.fadeIn({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, \"_onShow\") });\n\t\t\tthis.fadeOut = fx.fadeOut({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, \"_onHide\") });\n\t\t},\n\n\t\tshow: function(innerHTML, aroundNode, position, rtl, textDir, onMouseEnter, onMouseLeave){\n\t\t\t// summary:\n\t\t\t//\t\tDisplay tooltip w/specified contents to right of specified node\n\t\t\t//\t\t(To left if there's no space on the right, or if rtl == true)\n\t\t\t// innerHTML: String\n\t\t\t//\t\tContents of the tooltip\n\t\t\t// aroundNode: DomNode|dijit/place.__Rectangle\n\t\t\t//\t\tSpecifies that tooltip should be next to this node / area\n\t\t\t// position: String[]?\n\t\t\t//\t\tList of positions to try to position tooltip (ex: [\"right\", \"above\"])\n\t\t\t// rtl: Boolean?\n\t\t\t//\t\tCorresponds to `WidgetBase.dir` attribute, where false means \"ltr\" and true\n\t\t\t//\t\tmeans \"rtl\"; specifies GUI direction, not text direction.\n\t\t\t// textDir: String?\n\t\t\t//\t\tCorresponds to `WidgetBase.textdir` attribute; specifies direction of text.\n\t\t\t// onMouseEnter: Function?\n\t\t\t//\t\tCallback function for mouse enter on tooltip\n\t\t\t// onMouseLeave: Function?\n\t\t\t//\t\tCallback function for mouse leave on tooltip\n\n\t\t\tif(this.aroundNode && this.aroundNode === aroundNode && this.containerNode.innerHTML == innerHTML){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.fadeOut.status() == \"playing\"){\n\t\t\t\t// previous tooltip is being hidden; wait until the hide completes then show new one\n\t\t\t\tthis._onDeck=arguments;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.containerNode.innerHTML=innerHTML;\n\n\t\t\tif(textDir){\n\t\t\t\tthis.set(\"textDir\", textDir);\n\t\t\t}\n\n\t\t\tthis.containerNode.align = rtl? \"right\" : \"left\"; //fix the text alignment\n\n\t\t\tvar pos = place.around(this.domNode, aroundNode,\n\t\t\t\tposition && position.length ? position : Tooltip.defaultPosition, !rtl, lang.hitch(this, \"orient\"));\n\n\t\t\t// Position the tooltip connector for middle alignment.\n\t\t\t// This could not have been done in orient() since the tooltip wasn't positioned at that time.\n\t\t\tvar aroundNodeCoords = pos.aroundNodePos;\n\t\t\tif(pos.corner.charAt(0) == 'M' && pos.aroundCorner.charAt(0) == 'M'){\n\t\t\t\tthis.connectorNode.style.top = aroundNodeCoords.y + ((aroundNodeCoords.h - this.connectorNode.offsetHeight) >> 1) - pos.y + \"px\";\n\t\t\t\tthis.connectorNode.style.left = \"\";\n\t\t\t}else if(pos.corner.charAt(1) == 'M' && pos.aroundCorner.charAt(1) == 'M'){\n\t\t\t\tthis.connectorNode.style.left = aroundNodeCoords.x + ((aroundNodeCoords.w - this.connectorNode.offsetWidth) >> 1) - pos.x + \"px\";\n\t\t\t}else{\n\t\t\t\t// Not *-centered, but just above/below/after/before\n\t\t\t\tthis.connectorNode.style.left = \"\";\n\t\t\t\tthis.connectorNode.style.top = \"\";\n\t\t\t}\n\n\t\t\t// show it\n\t\t\tdomStyle.set(this.domNode, \"opacity\", 0);\n\t\t\tthis.fadeIn.play();\n\t\t\tthis.isShowingNow = true;\n\t\t\tthis.aroundNode = aroundNode;\n\n\t\t\tthis.onMouseEnter = onMouseEnter || noop;\n\t\t\tthis.onMouseLeave = onMouseLeave || noop;\n\t\t},\n\n\t\torient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ tooltipCorner, /*Object*/ spaceAvailable, /*Object*/ aroundNodeCoords){\n\t\t\t// summary:\n\t\t\t//\t\tPrivate function to set CSS for tooltip node based on which position it's in.\n\t\t\t//\t\tThis is called by the dijit popup code. It will also reduce the tooltip's\n\t\t\t//\t\twidth to whatever width is available\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tthis.connectorNode.style.top = \"\"; //reset to default\n\n\t\t\tvar heightAvailable = spaceAvailable.h,\n\t\t\t\twidthAvailable = spaceAvailable.w;\n\n\t\t\tnode.className = \"dijitTooltip \" +\n\t\t\t\t{\n\t\t\t\t\t\"MR-ML\": \"dijitTooltipRight\",\n\t\t\t\t\t\"ML-MR\": \"dijitTooltipLeft\",\n\t\t\t\t\t\"TM-BM\": \"dijitTooltipAbove\",\n\t\t\t\t\t\"BM-TM\": \"dijitTooltipBelow\",\n\t\t\t\t\t\"BL-TL\": \"dijitTooltipBelow dijitTooltipABLeft\",\n\t\t\t\t\t\"TL-BL\": \"dijitTooltipAbove dijitTooltipABLeft\",\n\t\t\t\t\t\"BR-TR\": \"dijitTooltipBelow dijitTooltipABRight\",\n\t\t\t\t\t\"TR-BR\": \"dijitTooltipAbove dijitTooltipABRight\",\n\t\t\t\t\t\"BR-BL\": \"dijitTooltipRight\",\n\t\t\t\t\t\"BL-BR\": \"dijitTooltipLeft\"\n\t\t\t\t}[aroundCorner + \"-\" + tooltipCorner];\n\n\t\t\t// reset width; it may have been set by orient() on a previous tooltip show()\n\t\t\tthis.domNode.style.width = \"auto\";\n\n\t\t\t// Reduce tooltip's width to the amount of width available, so that it doesn't overflow screen.\n\t\t\t// Note that sometimes widthAvailable is negative, but we guard against setting style.width to a\n\t\t\t// negative number since that causes an exception on IE.\n\t\t\tvar size = domGeometry.position(this.domNode);\n\t\t\tif(has(\"ie\") || has(\"trident\")){\n\t\t\t\t// workaround strange IE bug where setting width to offsetWidth causes words to wrap\n\t\t\t\tsize.w += 2;\n\t\t\t}\n\n\t\t\tvar width = Math.min((Math.max(widthAvailable,1)), size.w);\n\n\t\t\tdomGeometry.setMarginBox(this.domNode, {w: width});\n\n\t\t\t// Reposition the tooltip connector.\n\t\t\tif(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){\n\t\t\t\tvar bb = domGeometry.position(node);\n\t\t\t\tvar tooltipConnectorHeight = this.connectorNode.offsetHeight;\n\t\t\t\tif(bb.h > heightAvailable){\n\t\t\t\t\t// The tooltip starts at the top of the page and will extend past the aroundNode\n\t\t\t\t\tvar aroundNodePlacement = heightAvailable - ((aroundNodeCoords.h + tooltipConnectorHeight) >> 1);\n\t\t\t\t\tthis.connectorNode.style.top = aroundNodePlacement + \"px\";\n\t\t\t\t\tthis.connectorNode.style.bottom = \"\";\n\t\t\t\t}else{\n\t\t\t\t\t// Align center of connector with center of aroundNode, except don't let bottom\n\t\t\t\t\t// of connector extend below bottom of tooltip content, or top of connector\n\t\t\t\t\t// extend past top of tooltip content\n\t\t\t\t\tthis.connectorNode.style.bottom = Math.min(\n\t\t\t\t\t\tMath.max(aroundNodeCoords.h/2 - tooltipConnectorHeight/2, 0),\n\t\t\t\t\t\tbb.h - tooltipConnectorHeight) + \"px\";\n\t\t\t\t\tthis.connectorNode.style.top = \"\";\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t// reset the tooltip back to the defaults\n\t\t\t\tthis.connectorNode.style.top = \"\";\n\t\t\t\tthis.connectorNode.style.bottom = \"\";\n\t\t\t}\n\n\t\t\treturn Math.max(0, size.w - widthAvailable);\n\t\t},\n\n\t\t_onShow: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled at end of fade-in operation\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tif(has(\"ie\")){\n\t\t\t\t// the arrow won't show up on a node w/an opacity filter\n\t\t\t\tthis.domNode.style.filter=\"\";\n\t\t\t}\n\t\t},\n\n\t\thide: function(aroundNode){\n\t\t\t// summary:\n\t\t\t//\t\tHide the tooltip\n\n\t\t\tif(this._onDeck && this._onDeck[1] == aroundNode){\n\t\t\t\t// this hide request is for a show() that hasn't even started yet;\n\t\t\t\t// just cancel the pending show()\n\t\t\t\tthis._onDeck=null;\n\t\t\t}else if(this.aroundNode === aroundNode){\n\t\t\t\t// this hide request is for the currently displayed tooltip\n\t\t\t\tthis.fadeIn.stop();\n\t\t\t\tthis.isShowingNow = false;\n\t\t\t\tthis.aroundNode = null;\n\t\t\t\tthis.fadeOut.play();\n\t\t\t}else{\n\t\t\t\t// just ignore the call, it's for a tooltip that has already been erased\n\t\t\t}\n\n\t\t\tthis.onMouseEnter = this.onMouseLeave = noop;\n\t\t},\n\n\t\t_onHide: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled at end of fade-out operation\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tthis.domNode.style.cssText=\"\";\t// to position offscreen again\n\t\t\tthis.containerNode.innerHTML=\"\";\n\t\t\tif(this._onDeck){\n\t\t\t\t// a show request has been queued up; do it now\n\t\t\t\tthis.show.apply(this, this._onDeck);\n\t\t\t\tthis._onDeck=null;\n\t\t\t}\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\tMasterTooltip.extend({\n\t\t\t_setAutoTextDir: function(/*Object*/node){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tResolve \"auto\" text direction for children nodes\n\t\t\t\t// tags:\n\t\t\t\t//\t\tprivate\n\n\t\t\t\tthis.applyTextDir(node);\n\t\t\t\tarray.forEach(node.children, function(child){ this._setAutoTextDir(child); }, this);\n\t\t\t},\n\n\t\t\t_setTextDirAttr: function(/*String*/ textDir){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tSetter for textDir.\n\t\t\t\t// description:\n\t\t\t\t//\t\tUsers shouldn't call this function; they should be calling\n\t\t\t\t//\t\tset('textDir', value)\n\t\t\t\t// tags:\n\t\t\t\t//\t\tprivate\n\n\t\t\t\tthis._set(\"textDir\", textDir);\n\n\t\t\t\tif (textDir == \"auto\"){\n\t\t\t\t\tthis._setAutoTextDir(this.containerNode);\n\t\t\t\t}else{\n\t\t\t\t\tthis.containerNode.dir = this.textDir;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tdijit.showTooltip = function(innerHTML, aroundNode, position, rtl, textDir, onMouseEnter, onMouseLeave){\n\t\t// summary:\n\t\t//\t\tStatic method to display tooltip w/specified contents in specified position.\n\t\t//\t\tSee description of dijit/Tooltip.defaultPosition for details on position parameter.\n\t\t//\t\tIf position is not specified then dijit/Tooltip.defaultPosition is used.\n\t\t// innerHTML: String\n\t\t//\t\tContents of the tooltip\n\t\t// aroundNode: place.__Rectangle\n\t\t//\t\tSpecifies that tooltip should be next to this node / area\n\t\t// position: String[]?\n\t\t//\t\tList of positions to try to position tooltip (ex: [\"right\", \"above\"])\n\t\t// rtl: Boolean?\n\t\t//\t\tCorresponds to `WidgetBase.dir` attribute, where false means \"ltr\" and true\n\t\t//\t\tmeans \"rtl\"; specifies GUI direction, not text direction.\n\t\t// textDir: String?\n\t\t//\t\tCorresponds to `WidgetBase.textdir` attribute; specifies direction of text.\n\t\t// onMouseEnter: Function?\n\t\t//\t\tCallback function for mouse over on tooltip\n\t\t// onMouseLeave: Function?\n\t\t//\t\tCallback function for mouse leave on tooltip\n\n\t\t// After/before don't work, but for back-compat convert them to the working after-centered, before-centered.\n\t\t// Possibly remove this in 2.0. Alternately, get before/after to work.\n\t\tif(position){\n\t\t\tposition = array.map(position, function(val){\n\t\t\t\treturn {after: \"after-centered\", before: \"before-centered\"}[val] || val;\n\t\t\t});\n\t\t}\n\n\t\tif(!Tooltip._masterTT){ dijit._masterTT = Tooltip._masterTT = new MasterTooltip(); }\n\t\treturn Tooltip._masterTT.show(innerHTML, aroundNode, position, rtl, textDir, onMouseEnter, onMouseLeave);\n\t};\n\n\tdijit.hideTooltip = function(aroundNode){\n\t\t// summary:\n\t\t//\t\tStatic method to hide the tooltip displayed via showTooltip()\n\t\treturn Tooltip._masterTT && Tooltip._masterTT.hide(aroundNode);\n\t};\n\n\t// Possible states for a tooltip, see Tooltip.state property for definitions\n\tvar DORMANT = \"DORMANT\",\n\t\tSHOW_TIMER = \"SHOW TIMER\",\n\t\tSHOWING = \"SHOWING\",\n\t\tHIDE_TIMER = \"HIDE TIMER\";\n\n\tfunction noop(){}\n\n\tvar Tooltip = declare(\"dijit.Tooltip\", _Widget, {\n\t\t// summary:\n\t\t//\t\tPops up a tooltip (a help message) when you hover over a node.\n\t\t//\t\tAlso provides static show() and hide() methods that can be used without instantiating a dijit/Tooltip.\n\n\t\t// label: String\n\t\t//\t\tHTML to display in the tooltip.\n\t\t//\t\tSpecified as innerHTML when creating the widget from markup.\n\t\tlabel: \"\",\n\n\t\t// showDelay: Integer\n\t\t//\t\tNumber of milliseconds to wait after hovering over/focusing on the object, before\n\t\t//\t\tthe tooltip is displayed.\n\t\tshowDelay: 400,\n\n\t\t// hideDelay: Integer\n\t\t//\t\tNumber of milliseconds to wait after unhovering the object, before\n\t\t//\t\tthe tooltip is hidden. Note that blurring an object hides the tooltip immediately.\n\t\thideDelay: 400,\n\n\t\t// connectId: String|String[]|DomNode|DomNode[]\n\t\t//\t\tId of domNode(s) to attach the tooltip to.\n\t\t//\t\tWhen user hovers over specified dom node(s), the tooltip will appear.\n\t\tconnectId: [],\n\n\t\t// position: String[]\n\t\t//\t\tSee description of `dijit/Tooltip.defaultPosition` for details on position parameter.\n\t\tposition: [],\n\n\t\t// selector: String?\n\t\t//\t\tCSS expression to apply this Tooltip to descendants of connectIds, rather than to\n\t\t//\t\tthe nodes specified by connectIds themselves. Useful for applying a Tooltip to\n\t\t//\t\ta range of rows in a table, tree, etc. Use in conjunction with getContent() parameter.\n\t\t//\t\tEx: connectId: myTable, selector: \"tr\", getContent: function(node){ return ...; }\n\t\t//\n\t\t//\t\tThe application must require() an appropriate level of dojo/query to handle the selector.\n\t\tselector: \"\",\n\n\t\t// TODO: in 2.0 remove support for multiple connectIds. selector gives the same effect.\n\t\t// So, change connectId to a \"\", remove addTarget()/removeTarget(), etc.\n\n\t\t_setConnectIdAttr: function(/*String|String[]|DomNode|DomNode[]*/ newId){\n\t\t\t// summary:\n\t\t\t//\t\tConnect to specified node(s)\n\n\t\t\t// Remove connections to old nodes (if there are any)\n\t\t\tarray.forEach(this._connections || [], function(nested){\n\t\t\t\tarray.forEach(nested, function(handle){ handle.remove(); });\n\t\t\t}, this);\n\n\t\t\t// Make array of id's to connect to, excluding entries for nodes that don't exist yet, see startup()\n\t\t\tthis._connectIds = array.filter(lang.isArrayLike(newId) ? newId : (newId ? [newId] : []),\n\t\t\t\t\tfunction(id){ return dom.byId(id, this.ownerDocument); }, this);\n\n\t\t\t// Make connections\n\t\t\tthis._connections = array.map(this._connectIds, function(id){\n\t\t\t\tvar node = dom.byId(id, this.ownerDocument),\n\t\t\t\t\tselector = this.selector,\n\t\t\t\t\tdelegatedEvent = selector ?\n\t\t\t\t\t\tfunction(eventType){ return on.selector(selector, eventType); } :\n\t\t\t\t\t\tfunction(eventType){ return eventType; },\n\t\t\t\t\tself = this;\n\t\t\t\treturn [\n\t\t\t\t\ton(node, delegatedEvent(mouse.enter), function(){\n\t\t\t\t\t\tself._onHover(this);\n\t\t\t\t\t}),\n\t\t\t\t\ton(node, delegatedEvent(\"focusin\"), function(){\n\t\t\t\t\t\tself._onHover(this);\n\t\t\t\t\t}),\n\t\t\t\t\ton(node, delegatedEvent(mouse.leave), lang.hitch(self, \"_onUnHover\")),\n\t\t\t\t\ton(node, delegatedEvent(\"focusout\"), lang.hitch(self, \"set\", \"state\", DORMANT))\n\t\t\t\t];\n\t\t\t}, this);\n\n\t\t\tthis._set(\"connectId\", newId);\n\t\t},\n\n\t\taddTarget: function(/*DomNode|String*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tAttach tooltip to specified node if it's not already connected\n\n\t\t\t// TODO: remove in 2.0 and just use set(\"connectId\", ...) interface\n\n\t\t\tvar id = node.id || node;\n\t\t\tif(array.indexOf(this._connectIds, id) == -1){\n\t\t\t\tthis.set(\"connectId\", this._connectIds.concat(id));\n\t\t\t}\n\t\t},\n\n\t\tremoveTarget: function(/*DomNode|String*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tDetach tooltip from specified node\n\n\t\t\t// TODO: remove in 2.0 and just use set(\"connectId\", ...) interface\n\n\t\t\tvar id = node.id || node,\t// map from DOMNode back to plain id string\n\t\t\t\tidx = array.indexOf(this._connectIds, id);\n\t\t\tif(idx >= 0){\n\t\t\t\t// remove id (modifies original this._connectIds but that's OK in this case)\n\t\t\t\tthis._connectIds.splice(idx, 1);\n\t\t\t\tthis.set(\"connectId\", this._connectIds);\n\t\t\t}\n\t\t},\n\n\t\tbuildRendering: function(){\n\t\t\tthis.inherited(arguments);\n\t\t\tdomClass.add(this.domNode,\"dijitTooltipData\");\n\t\t},\n\n\t\tstartup: function(){\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// If this tooltip was created in a template, or for some other reason the specified connectId[s]\n\t\t\t// didn't exist during the widget's initialization, then connect now.\n\t\t\tvar ids = this.connectId;\n\t\t\tarray.forEach(lang.isArrayLike(ids) ? ids : [ids], this.addTarget, this);\n\t\t},\n\n\t\tgetContent: function(/*DomNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tUser overridable function that return the text to display in the tooltip.\n\t\t\t// tags:\n\t\t\t//\t\textension\n\t\t\treturn this.label || this.domNode.innerHTML;\n\t\t},\n\n\t\t// state: [private readonly] String\n\t\t//\t\tOne of:\n\t\t//\n\t\t//\t\t- DORMANT: tooltip not SHOWING\n\t\t//\t\t- SHOW TIMER: tooltip not SHOWING but timer set to show it\n\t\t//\t\t- SHOWING: tooltip displayed\n\t\t//\t\t- HIDE TIMER: tooltip displayed, but timer set to hide it\n\t\tstate: DORMANT,\n\t\t_setStateAttr: function(val){\n\t\t\tif(this.state == val ||\n\t\t\t\t(val == SHOW_TIMER && this.state == SHOWING) ||\n\t\t\t\t(val == HIDE_TIMER && this.state == DORMANT)){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this._hideTimer){\n\t\t\t\tthis._hideTimer.remove();\n\t\t\t\tdelete this._hideTimer;\n\t\t\t}\n\t\t\tif(this._showTimer){\n\t\t\t\tthis._showTimer.remove();\n\t\t\t\tdelete this._showTimer;\n\t\t\t}\n\n\t\t\tswitch(val){\n\t\t\t\tcase DORMANT:\n\t\t\t\t\tif(this._connectNode){\n\t\t\t\t\t\tTooltip.hide(this._connectNode);\n\t\t\t\t\t\tdelete this._connectNode;\n\t\t\t\t\t\tthis.onHide();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase SHOW_TIMER:\t // set timer to show tooltip\n\t\t\t\t\t// should only get here from a DORMANT state, i.e. tooltip can't be already SHOWING\n\t\t\t\t\tif(this.state != SHOWING){\n\t\t\t\t\t\tthis._showTimer = this.defer(function(){ this.set(\"state\", SHOWING); }, this.showDelay);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase SHOWING:\t\t// show tooltip and clear timers\n\t\t\t\t\tvar content = this.getContent(this._connectNode);\n\t\t\t\t\tif(!content){\n\t\t\t\t\t\tthis.set(\"state\", DORMANT);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Show tooltip and setup callbacks for mouseenter/mouseleave of tooltip itself\n\t\t\t\t\tTooltip.show(content, this._connectNode, this.position, !this.isLeftToRight(), this.textDir,\n\t\t\t\t\t\tlang.hitch(this, \"set\", \"state\", SHOWING), lang.hitch(this, \"set\", \"state\", HIDE_TIMER));\n\n\t\t\t\t\tthis.onShow(this._connectNode, this.position);\n\t\t\t\t\tbreak;\n\t\t\t\tcase HIDE_TIMER:\t// set timer set to hide tooltip\n\t\t\t\t\tthis._hideTimer = this.defer(function(){ this.set(\"state\", DORMANT); }, this.hideDelay);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._set(\"state\", val);\n\t\t},\n\n\t\t_onHover: function(/*DomNode*/ target){\n\t\t\t// summary:\n\t\t\t//\t\tDespite the name of this method, it actually handles both hover and focus\n\t\t\t//\t\tevents on the target node, setting a timer to show the tooltip.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tif(this._connectNode && target != this._connectNode){\n\t\t\t\t// Tooltip is displaying for another node\n\t\t\t\tthis.set(\"state\", DORMANT);\n\t\t\t}\n\t\t\tthis._connectNode = target;\t\t// _connectNode means \"tooltip currently displayed for this node\"\n\n\t\t\tthis.set(\"state\", SHOW_TIMER);\t// no-op if show-timer already set, or if already showing\n\t\t},\n\n\t\t_onUnHover: function(/*DomNode*/ target){\n\t\t\t// summary:\n\t\t\t//\t\tHandles mouseleave event on the target node, hiding the tooltip.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tthis.set(\"state\", HIDE_TIMER);\t\t// no-op if already dormant, or if hide-timer already set\n\t\t},\n\n\t\t// open() and close() aren't used anymore, except from the _BidiSupport/misc/Tooltip test.\n\t\t// Should probably remove for 2.0, but leaving for now.\n\t\topen: function(/*DomNode*/ target){\n\t\t\t// summary:\n\t\t\t//\t\tDisplay the tooltip; usually not called directly.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tthis.set(\"state\", DORMANT);\n\t\t\tthis._connectNode = target;\t\t// _connectNode means \"tooltip currently displayed for this node\"\n\t\t\tthis.set(\"state\", SHOWING);\n\t\t},\n\n\t\tclose: function(){\n\t\t\t// summary:\n\t\t\t//\t\tHide the tooltip or cancel timer for show of tooltip\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tthis.set(\"state\", DORMANT);\n\t\t},\n\n\t\tonShow: function(/*===== target, position =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the tooltip is shown\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tonHide: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the tooltip is hidden\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\tthis.set(\"state\", DORMANT);\n\n\t\t\t// Remove connections manually since they aren't registered to be removed by _WidgetBase\n\t\t\tarray.forEach(this._connections || [], function(nested){\n\t\t\t\tarray.forEach(nested, function(handle){ handle.remove(); });\n\t\t\t}, this);\n\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n\n\tTooltip._MasterTooltip = MasterTooltip;\t\t// for monkey patching\n\tTooltip.show = dijit.showTooltip;\t\t// export function through module return value\n\tTooltip.hide = dijit.hideTooltip;\t\t// export function through module return value\n\n\tTooltip.defaultPosition = [\"after-centered\", \"before-centered\"];\n\n\t/*=====\n\tlang.mixin(Tooltip, {\n\t\t // defaultPosition: String[]\n\t\t //\t\tThis variable controls the position of tooltips, if the position is not specified to\n\t\t //\t\tthe Tooltip widget or *TextBox widget itself. It's an array of strings with the values\n\t\t //\t\tpossible for `dijit/place.around()`. The recommended values are:\n\t\t //\n\t\t //\t\t- before-centered: centers tooltip to the left of the anchor node/widget, or to the right\n\t\t //\t\t in the case of RTL scripts like Hebrew and Arabic\n\t\t //\t\t- after-centered: centers tooltip to the right of the anchor node/widget, or to the left\n\t\t //\t\t in the case of RTL scripts like Hebrew and Arabic\n\t\t //\t\t- above-centered: tooltip is centered above anchor node\n\t\t //\t\t- below-centered: tooltip is centered above anchor node\n\t\t //\n\t\t //\t\tThe list is positions is tried, in order, until a position is found where the tooltip fits\n\t\t //\t\twithin the viewport.\n\t\t //\n\t\t //\t\tBe careful setting this parameter. A value of \"above-centered\" may work fine until the user scrolls\n\t\t //\t\tthe screen so that there's no room above the target node. Nodes with drop downs, like\n\t\t //\t\tDropDownButton or FilteringSelect, are especially problematic, in that you need to be sure\n\t\t //\t\tthat the drop down and tooltip don't overlap, even when the viewport is scrolled so that there\n\t\t //\t\tis only room below (or above) the target node, but not both.\n\t });\n\t=====*/\n\treturn Tooltip;\n});\n","define([\n\t\"dojo/Evented\",\n\t\"dojo/on\",\n\t\"dojo/domReady\",\n\t\"dojo/sniff\",\t// has(\"ie\"), has(\"ios\")\n\t\"dojo/window\" // getBox()\n], function(Evented, on, domReady, has, winUtils){\n\n\t// module:\n\t//\t\tdijit/Viewport\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tUtility singleton to watch for viewport resizes, avoiding duplicate notifications\n\t\t//\t\twhich can lead to infinite loops.\n\t\t// description:\n\t\t//\t\tUsage: Viewport.on(\"resize\", myCallback).\n\t\t//\n\t\t//\t\tmyCallback() is called without arguments in case it's _WidgetBase.resize(),\n\t\t//\t\twhich would interpret the argument as the size to make the widget.\n\t};\n\t=====*/\n\n\tvar Viewport = new Evented();\n\n\tvar focusedNode;\n\n\tdomReady(function(){\n\t\tvar oldBox = winUtils.getBox();\n\t\tViewport._rlh = on(window, \"resize\", function(){\n\t\t\tvar newBox = winUtils.getBox();\n\t\t\tif(oldBox.h == newBox.h && oldBox.w == newBox.w){ return; }\n\t\t\toldBox = newBox;\n\t\t\tViewport.emit(\"resize\");\n\t\t});\n\n\t\t// Also catch zoom changes on IE8, since they don't naturally generate resize events\n\t\tif(has(\"ie\") == 8){\n\t\t\tvar deviceXDPI = screen.deviceXDPI;\n\t\t\tsetInterval(function(){\n\t\t\t\tif(screen.deviceXDPI != deviceXDPI){\n\t\t\t\t\tdeviceXDPI = screen.deviceXDPI;\n\t\t\t\t\tViewport.emit(\"resize\");\n\t\t\t\t}\n\t\t\t}, 500);\n\t\t}\n\n\t\t// On iOS, keep track of the focused node so we can guess when the keyboard is/isn't being displayed.\n\t\tif(has(\"ios\")){\n\t\t\ton(document, \"focusin\", function(evt){\n\t\t\t\tfocusedNode = evt.target;\n\t\t\t});\n\t\t\ton(document, \"focusout\", function(evt){\n\t\t\t\tfocusedNode = null;\n\t\t\t});\n\t\t}\n\t});\n\n\tViewport.getEffectiveBox = function(/*Document*/ doc){\n\t\t// summary:\n\t\t//\t\tGet the size of the viewport, or on mobile devices, the part of the viewport not obscured by the\n\t\t//\t\tvirtual keyboard.\n\n\t\tvar box = winUtils.getBox(doc);\n\n\t\t// Account for iOS virtual keyboard, if it's being shown. Unfortunately no direct way to check or measure.\n\t\tvar tag = focusedNode && focusedNode.tagName && focusedNode.tagName.toLowerCase();\n\t\tif(has(\"ios\") && focusedNode && !focusedNode.readOnly && (tag == \"textarea\" || (tag == \"input\" &&\n\t\t\t/^(color|email|number|password|search|tel|text|url)$/.test(focusedNode.type)))){\n\n\t\t\t// Box represents the size of the viewport. Some of the viewport is likely covered by the keyboard.\n\t\t\t// Estimate height of visible viewport assuming viewport goes to bottom of screen, but is covered by keyboard.\n\t\t\tbox.h *= (orientation == 0 || orientation == 180 ? 0.66 : 0.40);\n\n\t\t\t// Above measurement will be inaccurate if viewport was scrolled up so far that it ends before the bottom\n\t\t\t// of the screen. In this case, keyboard isn't covering as much of the viewport as we thought.\n\t\t\t// We know the visible size is at least the distance from the top of the viewport to the focused node.\n\t\t\tvar rect = focusedNode.getBoundingClientRect();\n\t\t\tbox.h = Math.max(box.h, rect.top + rect.height);\n\t\t}\n\n\t\treturn box;\n\t};\n\n\treturn Viewport;\n});\n","define([\n\t\"require\",\n\t\"dojo/_base/array\", // array.forEach\n\t\"dojo/_base/connect\",\t// remove for 2.0\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/lang\", // lang.getObject\n\t\"dojo/mouse\",\n\t\"dojo/on\",\n\t\"dojo/touch\",\n\t\"./_WidgetBase\"\n], function(require, array, connect, declare, lang, mouse, on, touch, _WidgetBase){\n\n\t// module:\n\t//\t\tdijit/_AttachMixin\n\n\t// Map from string name like \"mouseenter\" to synthetic event like mouse.enter\n\tvar synthEvents = lang.delegate(touch, {\n\t\t\"mouseenter\": mouse.enter,\n\t\t\"mouseleave\": mouse.leave,\n\t\t\"keypress\": connect._keypress\t// remove for 2.0\n\t});\n\n\t// To be lightweight, _AttachMixin doesn't require() dijit/a11yclick.\n\t// If the subclass has a template using \"ondijitclick\", it must load dijit/a11yclick itself.\n\t// In that case, the a11yclick variable below will get set to point to that synthetic event.\n\tvar a11yclick;\n\n\tvar _AttachMixin = declare(\"dijit._AttachMixin\", null, {\n\t\t// summary:\n\t\t//\t\tMixin for widgets to attach to dom nodes and setup events via\n\t\t//\t\tconvenient data-dojo-attach-point and data-dojo-attach-event DOM attributes.\n\t\t//\n\t\t//\t\tSuperclass of _TemplatedMixin, and can also be used standalone when templates are pre-rendered on the\n\t\t//\t\tserver.\n\t\t//\n\t\t//\t\tDoes not [yet] handle widgets like ContentPane with this.containerNode set. It should skip\n\t\t//\t\tscanning for data-dojo-attach-point and data-dojo-attach-event inside this.containerNode, but it\n\t\t//\t\tdoesn't.\n\n/*=====\n\t\t// _attachPoints: [private] String[]\n\t\t//\t\tList of widget attribute names associated with data-dojo-attach-point=... in the\n\t\t//\t\ttemplate, ex: [\"containerNode\", \"labelNode\"]\n\t\t_attachPoints: [],\n\n\t\t// _attachEvents: [private] Handle[]\n\t\t//\t\tList of connections associated with data-dojo-attach-event=... in the\n\t\t//\t\ttemplate\n\t\t_attachEvents: [],\n\n\t\t// attachScope: [public] Object\n\t\t//\t\tObject to which attach points and events will be scoped. Defaults\n\t\t//\t\tto 'this'.\n\t\tattachScope: undefined,\n\n\t\t// searchContainerNode: [protected] Boolean\n\t\t//\t\tSearch descendants of this.containerNode for data-dojo-attach-point and data-dojo-attach-event.\n\t\t//\t\tShould generally be left false (the default value) both for performance and to avoid failures when\n\t\t//\t\tthis.containerNode holds other _AttachMixin instances with their own attach points and events.\n \t\tsearchContainerNode: false,\n =====*/\n\n\t\tconstructor: function(/*===== params, srcNodeRef =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tCreate the widget.\n\t\t\t// params: Object|null\n\t\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t\t// srcNodeRef: DOMNode|String?\n\t\t\t//\t\tIf a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree.\n\n\t\t\tthis._attachPoints = [];\n\t\t\tthis._attachEvents = [];\n\t\t},\n\n\n\t\tbuildRendering: function(){\n\t\t\t// summary:\n\t\t\t//\t\tAttach to DOM nodes marked with special attributes.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// recurse through the node, looking for, and attaching to, our\n\t\t\t// attachment points and events, which should be defined on the template node.\n\t\t\tthis._attachTemplateNodes(this.domNode);\n\n\t\t\tthis._beforeFillContent();\t\t// hook for _WidgetsInTemplateMixin\n\t\t},\n\n\t\t_beforeFillContent: function(){\n\t\t},\n\n\t\t_attachTemplateNodes: function(rootNode){\n\t\t\t// summary:\n\t\t\t//\t\tIterate through the dom nodes and attach functions and nodes accordingly.\n\t\t\t// description:\n\t\t\t//\t\tMap widget properties and functions to the handlers specified in\n\t\t\t//\t\tthe dom node and it's descendants. This function iterates over all\n\t\t\t//\t\tnodes and looks for these properties:\n\t\t\t//\n\t\t\t//\t\t- dojoAttachPoint/data-dojo-attach-point\n\t\t\t//\t\t- dojoAttachEvent/data-dojo-attach-event\n\t\t\t// rootNode: DomNode\n\t\t\t//\t\tThe node to search for properties. All descendants will be searched.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// DFS to process all nodes except those inside of this.containerNode\n\t\t\tvar node = rootNode;\n\t\t\twhile(true){\n\t\t\t\tif(node.nodeType == 1 && (this._processTemplateNode(node, function(n,p){ return n.getAttribute(p); },\n\t\t\t\t\t\tthis._attach) || this.searchContainerNode) && node.firstChild){\n\t\t\t\t\tnode = node.firstChild;\n\t\t\t\t}else{\n\t\t\t\t\tif(node == rootNode){ return; }\n\t\t\t\t\twhile(!node.nextSibling){\n\t\t\t\t\t\tnode = node.parentNode;\n\t\t\t\t\t\tif(node == rootNode){ return; }\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_processTemplateNode: function(/*DOMNode|Widget*/ baseNode, getAttrFunc, attachFunc){\n\t\t\t// summary:\n\t\t\t//\t\tProcess data-dojo-attach-point and data-dojo-attach-event for given node or widget.\n\t\t\t//\t\tReturns true if caller should process baseNode's children too.\n\n\t\t\tvar ret = true;\n\n\t\t\t// Process data-dojo-attach-point\n\t\t\tvar _attachScope = this.attachScope || this,\n\t\t\t\tattachPoint = getAttrFunc(baseNode, \"dojoAttachPoint\") || getAttrFunc(baseNode, \"data-dojo-attach-point\");\n\t\t\tif(attachPoint){\n\t\t\t\tvar point, points = attachPoint.split(/\\s*,\\s*/);\n\t\t\t\twhile((point = points.shift())){\n\t\t\t\t\tif(lang.isArray(_attachScope[point])){\n\t\t\t\t\t\t_attachScope[point].push(baseNode);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t_attachScope[point] = baseNode;\n\t\t\t\t\t}\n\t\t\t\t\tret = (point != \"containerNode\");\n\t\t\t\t\tthis._attachPoints.push(point);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process data-dojo-attach-event\n\t\t\tvar attachEvent = getAttrFunc(baseNode, \"dojoAttachEvent\") || getAttrFunc(baseNode, \"data-dojo-attach-event\");\n\t\t\tif(attachEvent){\n\t\t\t\t// NOTE: we want to support attributes that have the form\n\t\t\t\t// \"domEvent: nativeEvent, ...\"\n\t\t\t\tvar event, events = attachEvent.split(/\\s*,\\s*/);\n\t\t\t\tvar trim = lang.trim;\n\t\t\t\twhile((event = events.shift())){\n\t\t\t\t\tif(event){\n\t\t\t\t\t\tvar thisFunc = null;\n\t\t\t\t\t\tif(event.indexOf(\":\") != -1){\n\t\t\t\t\t\t\t// oh, if only JS had tuple assignment\n\t\t\t\t\t\t\tvar funcNameArr = event.split(\":\");\n\t\t\t\t\t\t\tevent = trim(funcNameArr[0]);\n\t\t\t\t\t\t\tthisFunc = trim(funcNameArr[1]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tevent = trim(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!thisFunc){\n\t\t\t\t\t\t\tthisFunc = event;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._attachEvents.push(attachFunc(baseNode, event, lang.hitch(_attachScope, thisFunc)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t},\n\n\t\t_attach: function(node, type, func){\n\t\t\t// summary:\n\t\t\t//\t\tRoughly corresponding to dojo/on, this is the default function for processing a\n\t\t\t//\t\tdata-dojo-attach-event. Meant to attach to DOMNodes, not to widgets.\n\t\t\t// node: DOMNode\n\t\t\t//\t\tThe node to setup a listener on.\n\t\t\t// type: String\n\t\t\t//\t\tEvent name like \"click\".\n\t\t\t// getAttrFunc: Function\n\t\t\t//\t\tFunction to get the specified property for a given DomNode/Widget.\n\t\t\t// attachFunc: Function?\n\t\t\t//\t\tAttaches an event handler from the specified node/widget to specified function.\n\n\t\t\t// Map special type names like \"mouseenter\" to synthetic events.\n\t\t\t// Subclasses are responsible to require() dijit/a11yclick if they want to use it.\n\t\t\ttype = type.replace(/^on/, \"\").toLowerCase();\n\t\t\tif(type == \"dijitclick\"){\n\t\t\t\ttype = a11yclick || (a11yclick = require(\"./a11yclick\"));\n\t\t\t}else{\n\t\t\t\ttype = synthEvents[type] || type;\n\t\t\t}\n\n\t\t\treturn on(node, type, func);\n\t\t},\n\n\t\t_detachTemplateNodes: function() {\n\t\t\t// summary:\n\t\t\t//\t\tDetach and clean up the attachments made in _attachtempalteNodes.\n\n\t\t\t// Delete all attach points to prevent IE6 memory leaks.\n\t\t\tvar _attachScope = this.attachScope || this;\n\t\t\tarray.forEach(this._attachPoints, function(point){\n\t\t\t\tdelete _attachScope[point];\n\t\t\t});\n\t\t\tthis._attachPoints = [];\n\n\t\t\t// And same for event handlers\n\t\t\tarray.forEach(this._attachEvents, function(handle){ handle.remove(); });\n\t\t\tthis._attachEvents = [];\n\t\t},\n\n\t\tdestroyRendering: function(){\n\t\t\tthis._detachTemplateNodes();\n\t\t\tthis.inherited(arguments);\n\t\t}\n\t});\n\n\t// These arguments can be specified for widgets which are used in templates.\n\t// Since any widget can be specified as sub widgets in template, mix it\n\t// into the base widget class. (This is a hack, but it's effective.).\n\t// Remove for 2.0. Also, hide from API doc parser.\n\tlang.extend(_WidgetBase, /*===== {} || =====*/ {\n\t\tdojoAttachEvent: \"\",\n\t\tdojoAttachPoint: \"\"\n\t});\n\t\n\treturn _AttachMixin;\n});\n","define([], function(){\n\n\t// module:\n\t//\t\tdijit/_BidiMixin\n\n\t// UCC - constants that will be used by bidi support.\n\tvar bidi_const = {\n\t\tLRM : '\\u200E',\n\t\tLRE : '\\u202A',\n\t\tPDF : '\\u202C',\n\t\tRLM : '\\u200f',\n\t\tRLE : '\\u202B'\n\t};\n\n\treturn {\n\t\t// summary:\n\t\t//\t\tWhen has(\"dojo-bidi\") is true, _WidgetBase will mixin this class. It enables support for the textdir\n\t\t//\t\tproperty to control text direction independently from the GUI direction.\n\t\t// description:\n\t\t//\t\tThere's a special need for displaying BIDI text in rtl direction\n\t\t//\t\tin ltr GUI, sometimes needed auto support.\n\t\t//\t\tIn creation of widget, if it's want to activate this class,\n\t\t//\t\tthe widget should define the \"textDir\".\n\n\t\tgetTextDir: function(/*String*/ text){\n\t\t\t// summary:\n\t\t\t//\t\tGets the right direction of text.\n\t\t\t// description:\n\t\t\t//\t\tIf textDir is ltr or rtl returns the value.\n\t\t\t//\t\tIf it's auto, calls to another function that responsible\n\t\t\t//\t\tfor checking the value, and defining the direction.\n\t\t\t// tags:\n\t\t\t//\t\tprotected.\n\t\t\treturn this.textDir == \"auto\" ? this._checkContextual(text) : this.textDir;\n\t\t},\n\n\t\t_checkContextual: function(text){\n\t\t\t// summary:\n\t\t\t//\t\tFinds the first strong (directional) character, return ltr if isLatin\n\t\t\t//\t\tor rtl if isBidiChar.\n\t\t\t// tags:\n\t\t\t//\t\tprivate.\n\n\t\t\t// look for strong (directional) characters\n\t\t\tvar fdc = /[A-Za-z\\u05d0-\\u065f\\u066a-\\u06ef\\u06fa-\\u07ff\\ufb1d-\\ufdff\\ufe70-\\ufefc]/.exec(text);\n\t\t\t// if found return the direction that defined by the character, else return widgets dir as defult.\n\t\t\treturn fdc ? ( fdc[0] <= 'z' ? \"ltr\" : \"rtl\" ) : this.dir ? this.dir : this.isLeftToRight() ? \"ltr\" : \"rtl\";\n\t\t},\n\n\t\tapplyTextDir: function(/*DOMNode*/ element, /*String?*/ text){\n\t\t\t// summary:\n\t\t\t//\t\tSet element.dir according to this.textDir, assuming this.textDir has a value.\n\t\t\t// element:\n\t\t\t//\t\tThe text element to be set. Should have dir property.\n\t\t\t// text:\n\t\t\t//\t\tIf specified, and this.textDir is \"auto\", for calculating the right transformation\n\t\t\t//\t\tOtherwise text read from element.\n\t\t\t// description:\n\t\t\t//\t\tIf textDir is ltr or rtl returns the value.\n\t\t\t//\t\tIf it's auto, calls to another function that responsible\n\t\t\t//\t\tfor checking the value, and defining the direction.\n\t\t\t// tags:\n\t\t\t//\t\tprotected.\n\n\t\t\tif(this.textDir){\n\t\t\t\tvar textDir = this.textDir;\n\t\t\t\tif(textDir == \"auto\"){\n\t\t\t\t\t// convert \"auto\" to either \"ltr\" or \"rtl\"\n\t\t\t\t\tif(typeof text === \"undefined\"){\n\t\t\t\t\t\t// text not specified, get text from element\n\t\t\t\t\t\tvar tagName = element.tagName.toLowerCase();\n\t\t\t\t\t\ttext = (tagName == \"input\" || tagName == \"textarea\") ? element.value :\n\t\t\t\t\t\t\telement.innerText || element.textContent || \"\";\n\t\t\t\t\t}\n\t\t\t\t\ttextDir = this._checkContextual(text);\n\t\t\t\t}\n\n\t\t\t\tif(element.dir != textDir){\n\t\t\t\t\t// set element's dir to match textDir, but not when textDir is null and not when it already matches\n\t\t\t\t\telement.dir = textDir;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tenforceTextDirWithUcc: function(option, text){\n\t\t\t// summary:\n\t\t\t//\t\tWraps by UCC (Unicode control characters) option's text according to this.textDir\n\t\t\t// option:\n\t\t\t//\t\tThe element (`<option>`) we wrapping the text for.\n\t\t\t// text:\n\t\t\t//\t\tThe text to be wrapped.\n\t\t\t// description:\n\t\t\t//\t\tThere's a dir problem with some HTML elements. For some elements (e.g. `<option>`, `<select>`)\n\t\t\t//\t\tdefining the dir in different direction then the GUI orientation, won't display correctly.\n\t\t\t//\t\tFF 3.6 will change the alignment of the text in option - this doesn't follow the bidi standards (static text\n\t\t\t//\t\tshould be aligned following GUI direction). IE8 and Opera11.10 completely ignore dir setting for `<option>`.\n\t\t\t//\t\tTherefore the only solution is to use UCC (Unicode control characters) to display the text in correct orientation.\n\t\t\t//\t\tThis function saves the original text value for later restoration if needed, for example if the textDir will change etc.\n\t\t\tif(this.textDir){\n\t\t\t\tif(option){\n\t\t\t\t\toption.originalText = text;\n\t\t\t\t}\n\t\t\t\tvar dir = this.textDir == \"auto\" ? this._checkContextual(text) : this.textDir;\n\t\t\t\treturn (dir == \"ltr\" ? bidi_const.LRE : bidi_const.RLE ) + text + bidi_const.PDF;\n\t\t\t}\n\t\t\treturn text;\n\t\t},\n\n\t\trestoreOriginalText: function(origObj){\n\t\t\t// summary:\n\t\t\t//\t\tRestores the text of origObj, if needed, after enforceTextDirWithUcc, e.g. set(\"textDir\", textDir).\n\t\t\t// origObj:\n\t\t\t//\t\tThe element (`<option>`) to restore.\n\t\t\t// description:\n\t\t\t//\t\tSets the text of origObj to origObj.originalText, which is the original text, without the UCCs.\n\t\t\t//\t\tThe function than removes the originalText from origObj!\n\t\t\tif(origObj.originalText){\n\t\t\t\torigObj.text = origObj.originalText;\n\t\t\t\tdelete origObj.originalText;\n\t\t\t}\n\t\t\treturn origObj;\n\t\t},\n\n\t\t_setTextDirAttr: function(/*String*/ textDir){\n\t\t\t// summary:\n\t\t\t//\t\tSetter for textDir.\n\t\t\t// description:\n\t\t\t//\t\tUsers shouldn't call this function; they should be calling\n\t\t\t//\t\tset('textDir', value)\n\t\t\tif(!this._created || this.textDir != textDir){\n\t\t\t\tthis._set(\"textDir\", textDir);\n\t\t\t\tvar node = null;\n\t\t\t\tif(this.displayNode){\n\t\t\t\t\tnode = this.displayNode;\n\t\t\t\t\tthis.displayNode.align = this.dir == \"rtl\" ? \"right\" : \"left\";\n\t\t\t\t}else{\n\t\t\t\t\tnode = this.textDirNode || this.focusNode || this.textbox;\n\t\t\t\t}\n\t\t\t\tif(node){\n\t\t\t\t\tthis.applyTextDir(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n});\n","define([\n\t\"./focus\",\n\t\"./_WidgetBase\",\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/_base/lang\" // lang.extend\n], function(focus, _WidgetBase, declare, lang){\n\n\t// module:\n\t//\t\tdijit/_FocusMixin\n\n\t// We don't know where _FocusMixin will occur in the inheritance chain, but we need the _onFocus()/_onBlur() below\n\t// to be last in the inheritance chain, so mixin to _WidgetBase.\n\tlang.extend(_WidgetBase, {\n\t\t// focused: [readonly] Boolean\n\t\t//\t\tThis widget or a widget it contains has focus, or is \"active\" because\n\t\t//\t\tit was recently clicked.\n\t\tfocused: false,\n\n\t\tonFocus: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the widget becomes \"active\" because\n\t\t\t//\t\tit or a widget inside of it either has focus, or has recently\n\t\t\t//\t\tbeen clicked.\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\tonBlur: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when the widget stops being \"active\" because\n\t\t\t//\t\tfocus moved to something outside of it, or the user\n\t\t\t//\t\tclicked somewhere outside of it, or the widget was\n\t\t\t//\t\thidden.\n\t\t\t// tags:\n\t\t\t//\t\tcallback\n\t\t},\n\n\t\t_onFocus: function(){\n\t\t\t// summary:\n\t\t\t//\t\tThis is where widgets do processing for when they are active,\n\t\t\t//\t\tsuch as changing CSS classes. See onFocus() for more details.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tthis.onFocus();\n\t\t},\n\n\t\t_onBlur: function(){\n\t\t\t// summary:\n\t\t\t//\t\tThis is where widgets do processing for when they stop being active,\n\t\t\t//\t\tsuch as changing CSS classes. See onBlur() for more details.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tthis.onBlur();\n\t\t}\n\t});\n\n\treturn declare(\"dijit._FocusMixin\", null, {\n\t\t// summary:\n\t\t//\t\tMixin to widget to provide _onFocus() and _onBlur() methods that\n\t\t//\t\tfire when a widget or its descendants get/lose focus\n\n\t\t// flag that I want _onFocus()/_onBlur() notifications from focus manager\n\t\t_focusManager: focus\n\t});\n\n});\n","define([\n\t\"dojo/on\",\n\t\"dojo/_base/array\", // array.forEach\n\t\"dojo/keys\", // keys.ENTER keys.SPACE\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/has\", // has(\"dom-addeventlistener\")\n\t\"./a11yclick\"\n], function(on, array, keys, declare, has, a11yclick){\n\n\t// module:\n\t//\t\tdijit/_OnDijitClickMixin\n\n\tvar ret = declare(\"dijit._OnDijitClickMixin\", null, {\n\t\t// summary:\n\t\t//\t\tDeprecated. New code should access the dijit/a11yclick event directly, ex:\n\t\t//\t\t|\tthis.own(on(node, a11yclick, function(){ ... }));\n\t\t//\n\t\t//\t\tMixing in this class will make _WidgetBase.connect(node, \"ondijitclick\", ...) work.\n\t\t//\t\tIt also used to be necessary to make templates with ondijitclick work, but now you can just require\n\t\t//\t\tdijit/a11yclick.\n\n\t\tconnect: function(obj, event, method){\n\t\t\t// override _WidgetBase.connect() to make this.connect(node, \"ondijitclick\", ...) work\n\t\t\treturn this.inherited(arguments, [obj, event == \"ondijitclick\" ? a11yclick : event, method]);\n\t\t}\n\t});\n\n\tret.a11yclick = a11yclick;\t// back compat\n\n\treturn ret;\n});\n","define([\n\t\"dojo/cache\",\t// dojo.cache\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom-construct\", // domConstruct.destroy, domConstruct.toDom\n\t\"dojo/_base/lang\", // lang.getObject\n\t\"dojo/on\",\n\t\"dojo/sniff\", // has(\"ie\")\n\t\"dojo/string\", // string.substitute string.trim\n\t\"./_AttachMixin\"\n], function(cache, declare, domConstruct, lang, on, has, string, _AttachMixin){\n\n\t// module:\n\t//\t\tdijit/_TemplatedMixin\n\n\tvar _TemplatedMixin = declare(\"dijit._TemplatedMixin\", _AttachMixin, {\n\t\t// summary:\n\t\t//\t\tMixin for widgets that are instantiated from a template\n\n\t\t// templateString: [protected] String\n\t\t//\t\tA string that represents the widget template.\n\t\t//\t\tUse in conjunction with dojo.cache() to load from a file.\n\t\ttemplateString: null,\n\n\t\t// templatePath: [protected deprecated] String\n\t\t//\t\tPath to template (HTML file) for this widget relative to dojo.baseUrl.\n\t\t//\t\tDeprecated: use templateString with require([... \"dojo/text!...\"], ...) instead\n\t\ttemplatePath: null,\n\n\t\t// skipNodeCache: [protected] Boolean\n\t\t//\t\tIf using a cached widget template nodes poses issues for a\n\t\t//\t\tparticular widget class, it can set this property to ensure\n\t\t//\t\tthat its template is always re-built from a string\n\t\t_skipNodeCache: false,\n\n/*=====\n\t\t// _rendered: Boolean\n\t\t//\t\tNot normally use, but this flag can be set by the app if the server has already rendered the template,\n\t\t//\t\ti.e. already inlining the template for the widget into the main page. Reduces _TemplatedMixin to\n\t\t//\t\tjust function like _AttachMixin.\n\t\t_rendered: false,\n=====*/\n\n\t\t// Set _AttachMixin.searchContainerNode to true for back-compat for widgets that have data-dojo-attach-point's\n\t\t// and events inside this.containerNode. Remove for 2.0.\n\t\tsearchContainerNode: true,\n\n\t\t_stringRepl: function(tmpl){\n\t\t\t// summary:\n\t\t\t//\t\tDoes substitution of ${foo} type properties in template string\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\t\t\tvar className = this.declaredClass, _this = this;\n\t\t\t// Cache contains a string because we need to do property replacement\n\t\t\t// do the property replacement\n\t\t\treturn string.substitute(tmpl, this, function(value, key){\n\t\t\t\tif(key.charAt(0) == '!'){ value = lang.getObject(key.substr(1), false, _this); }\n\t\t\t\tif(typeof value == \"undefined\"){ throw new Error(className+\" template:\"+key); } // a debugging aide\n\t\t\t\tif(value == null){ return \"\"; }\n\n\t\t\t\t// Substitution keys beginning with ! will skip the transform step,\n\t\t\t\t// in case a user wishes to insert unescaped markup, e.g. ${!foo}\n\t\t\t\treturn key.charAt(0) == \"!\" ? value : this._escapeValue(\"\" + value);\n\t\t\t}, this);\n\t\t},\n\n\t\t_escapeValue: function(/*String*/ val){\n\t\t\t// summary:\n\t\t\t//\t\tEscape a value to be inserted into the template, either into an attribute value\n\t\t\t//\t\t(ex: foo=\"${bar}\") or as inner text of an element (ex: <span>${foo}</span>)\n\n\t\t\t// Safer substitution, see heading \"Attribute values\" in\n\t\t\t// http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2\n\t\t\t// and also https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content\n\t\t\treturn val.replace(/[\"'<>&]/g, function(val){\n\t\t\t\treturn {\n\t\t\t\t\t\"&\": \"&amp;\",\n\t\t\t\t\t\"<\": \"&lt;\",\n\t\t\t\t\t\">\": \"&gt;\",\n\t\t\t\t\t\"\\\"\": \"&quot;\",\n\t\t\t\t\t\"'\": \"&#x27;\"\n\t\t\t\t}[val];\n\t\t\t});\n\t\t},\n\n\t\tbuildRendering: function(){\n\t\t\t// summary:\n\t\t\t//\t\tConstruct the UI for this widget from a template, setting this.domNode.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tif(!this._rendered){\n\t\t\t\tif(!this.templateString){\n\t\t\t\t\tthis.templateString = cache(this.templatePath, {sanitize: true});\n\t\t\t\t}\n\n\t\t\t\t// Lookup cached version of template, and download to cache if it\n\t\t\t\t// isn't there already. Returns either a DomNode or a string, depending on\n\t\t\t\t// whether or not the template contains ${foo} replacement parameters.\n\t\t\t\tvar cached = _TemplatedMixin.getCachedTemplate(this.templateString, this._skipNodeCache, this.ownerDocument);\n\n\t\t\t\tvar node;\n\t\t\t\tif(lang.isString(cached)){\n\t\t\t\t\tnode = domConstruct.toDom(this._stringRepl(cached), this.ownerDocument);\n\t\t\t\t\tif(node.nodeType != 1){\n\t\t\t\t\t\t// Flag common problems such as templates with multiple top level nodes (nodeType == 11)\n\t\t\t\t\t\tthrow new Error(\"Invalid template: \" + cached);\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\t// if it's a node, all we have to do is clone it\n\t\t\t\t\tnode = cached.cloneNode(true);\n\t\t\t\t}\n\n\t\t\t\tthis.domNode = node;\n\t\t\t}\n\n\t\t\t// Call down to _WidgetBase.buildRendering() to get base classes assigned\n\t\t\t// TODO: change the baseClass assignment to _setBaseClassAttr\n\t\t\tthis.inherited(arguments);\n\n\t\t\tif(!this._rendered){\n\t\t\t\tthis._fillContent(this.srcNodeRef);\n\t\t\t}\n\n\t\t\tthis._rendered = true;\n\t\t},\n\n\t\t_fillContent: function(/*DomNode*/ source){\n\t\t\t// summary:\n\t\t\t//\t\tRelocate source contents to templated container node.\n\t\t\t//\t\tthis.containerNode must be able to receive children, or exceptions will be thrown.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\tvar dest = this.containerNode;\n\t\t\tif(source && dest){\n\t\t\t\twhile(source.hasChildNodes()){\n\t\t\t\t\tdest.appendChild(source.firstChild);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n\n\t// key is templateString; object is either string or DOM tree\n\t_TemplatedMixin._templateCache = {};\n\n\t_TemplatedMixin.getCachedTemplate = function(templateString, alwaysUseString, doc){\n\t\t// summary:\n\t\t//\t\tStatic method to get a template based on the templatePath or\n\t\t//\t\ttemplateString key\n\t\t// templateString: String\n\t\t//\t\tThe template\n\t\t// alwaysUseString: Boolean\n\t\t//\t\tDon't cache the DOM tree for this template, even if it doesn't have any variables\n\t\t// doc: Document?\n\t\t//\t\tThe target document. Defaults to document global if unspecified.\n\t\t// returns: Mixed\n\t\t//\t\tEither string (if there are ${} variables that need to be replaced) or just\n\t\t//\t\ta DOM tree (if the node can be cloned directly)\n\n\t\t// is it already cached?\n\t\tvar tmplts = _TemplatedMixin._templateCache;\n\t\tvar key = templateString;\n\t\tvar cached = tmplts[key];\n\t\tif(cached){\n\t\t\ttry{\n\t\t\t\t// if the cached value is an innerHTML string (no ownerDocument) or a DOM tree created within the\n\t\t\t\t// current document, then use the current cached value\n\t\t\t\tif(!cached.ownerDocument || cached.ownerDocument == (doc || document)){\n\t\t\t\t\t// string or node of the same document\n\t\t\t\t\treturn cached;\n\t\t\t\t}\n\t\t\t}catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded\n\t\t\tdomConstruct.destroy(cached);\n\t\t}\n\n\t\ttemplateString = string.trim(templateString);\n\n\t\tif(alwaysUseString || templateString.match(/\\$\\{([^\\}]+)\\}/g)){\n\t\t\t// there are variables in the template so all we can do is cache the string\n\t\t\treturn (tmplts[key] = templateString); //String\n\t\t}else{\n\t\t\t// there are no variables in the template so we can cache the DOM tree\n\t\t\tvar node = domConstruct.toDom(templateString, doc);\n\t\t\tif(node.nodeType != 1){\n\t\t\t\tthrow new Error(\"Invalid template: \" + templateString);\n\t\t\t}\n\t\t\treturn (tmplts[key] = node); //Node\n\t\t}\n\t};\n\n\tif(has(\"ie\")){\n\t\ton(window, \"unload\", function(){\n\t\t\tvar cache = _TemplatedMixin._templateCache;\n\t\t\tfor(var key in cache){\n\t\t\t\tvar value = cache[key];\n\t\t\t\tif(typeof value == \"object\"){ // value is either a string or a DOM node template\n\t\t\t\t\tdomConstruct.destroy(value);\n\t\t\t\t}\n\t\t\t\tdelete cache[key];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn _TemplatedMixin;\n});\n","define([\n\t\"dojo/aspect\",\t// aspect.around\n\t\"dojo/_base/config\",\t// config.isDebug\n\t\"dojo/_base/connect\",\t// connect.connect\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/has\",\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/lang\", // lang.hitch\n\t\"dojo/query\",\n\t\"dojo/ready\",\n\t\"./registry\",\t// registry.byNode\n\t\"./_WidgetBase\",\n\t\"./_OnDijitClickMixin\",\n\t\"./_FocusMixin\",\n\t\"dojo/uacss\",\t\t// browser sniffing (included for back-compat; subclasses may be using)\n\t\"./hccss\"\t\t// high contrast mode sniffing (included to set CSS classes on <body>, module ret value unused)\n], function(aspect, config, connect, declare, has, kernel, lang, query, ready,\n\t\t\tregistry, _WidgetBase, _OnDijitClickMixin, _FocusMixin){\n\n\n// module:\n//\t\tdijit/_Widget\n\n\nfunction connectToDomNode(){\n\t// summary:\n\t//\t\tIf user connects to a widget method === this function, then they will\n\t//\t\tinstead actually be connecting the equivalent event on this.domNode\n}\n\n// Trap dojo.connect() calls to connectToDomNode methods, and redirect to _Widget.on()\nfunction aroundAdvice(originalConnect){\n\treturn function(obj, event, scope, method){\n\t\tif(obj && typeof event == \"string\" && obj[event] == connectToDomNode){\n\t\t\treturn obj.on(event.substring(2).toLowerCase(), lang.hitch(scope, method));\n\t\t}\n\t\treturn originalConnect.apply(connect, arguments);\n\t};\n}\naspect.around(connect, \"connect\", aroundAdvice);\nif(kernel.connect){\n\taspect.around(kernel, \"connect\", aroundAdvice);\n}\n\nvar _Widget = declare(\"dijit._Widget\", [_WidgetBase, _OnDijitClickMixin, _FocusMixin], {\n\t// summary:\n\t//\t\tOld base class for widgets. New widgets should extend `dijit/_WidgetBase` instead\n\t// description:\n\t//\t\tOld Base class for Dijit widgets.\n\t//\n\t//\t\tExtends _WidgetBase, adding support for:\n\t//\n\t//\t\t- declaratively/programatically specifying widget initialization parameters like\n\t//\t\t\tonMouseMove=\"foo\" that call foo when this.domNode gets a mousemove event\n\t//\t\t- ondijitclick:\n\t//\t\t\tSupport new data-dojo-attach-event=\"ondijitclick: ...\" that is triggered by a mouse click or a SPACE/ENTER keypress\n\t//\t\t- focus related functions:\n\t//\t\t\tIn particular, the onFocus()/onBlur() callbacks. Driven internally by\n\t//\t\t\tdijit/_base/focus.js.\n\t//\t\t- deprecated methods\n\t//\t\t- onShow(), onHide(), onClose()\n\t//\n\t//\t\tAlso, by loading code in dijit/_base, turns on:\n\t//\n\t//\t\t- browser sniffing (putting browser class like `dj_ie` on `<html>` node)\n\t//\t\t- high contrast mode sniffing (add `dijit_a11y` class to `<body>` if machine is in high contrast mode)\n\n\n\t////////////////// DEFERRED CONNECTS ///////////////////\n\n\tonClick: connectToDomNode,\n\t/*=====\n\tonClick: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of mouse click events.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonDblClick: connectToDomNode,\n\t/*=====\n\tonDblClick: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of mouse double click events.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonKeyDown: connectToDomNode,\n\t/*=====\n\tonKeyDown: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of keys being pressed down.\n\t\t// event:\n\t\t//\t\tkey Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonKeyPress: connectToDomNode,\n\t/*=====\n\tonKeyPress: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of printable keys being typed.\n\t\t// event:\n\t\t//\t\tkey Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonKeyUp: connectToDomNode,\n\t/*=====\n\tonKeyUp: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of keys being released.\n\t\t// event:\n\t\t//\t\tkey Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseDown: connectToDomNode,\n\t/*=====\n\tonMouseDown: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse button is pressed down.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseMove: connectToDomNode,\n\t/*=====\n\tonMouseMove: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves over nodes contained within this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseOut: connectToDomNode,\n\t/*=====\n\tonMouseOut: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseOver: connectToDomNode,\n\t/*=====\n\tonMouseOver: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseLeave: connectToDomNode,\n\t/*=====\n\tonMouseLeave: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves off of this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseEnter: connectToDomNode,\n\t/*=====\n\tonMouseEnter: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse moves onto this widget.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\tonMouseUp: connectToDomNode,\n\t/*=====\n\tonMouseUp: function(event){\n\t\t// summary:\n\t\t//\t\tConnect to this function to receive notifications of when the mouse button is released.\n\t\t// event:\n\t\t//\t\tmouse Event\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\t=====*/\n\n\tconstructor: function(params /*===== ,srcNodeRef =====*/){\n\t\t// summary:\n\t\t//\t\tCreate the widget.\n\t\t// params: Object|null\n\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t// srcNodeRef: DOMNode|String?\n\t\t//\t\tIf a srcNodeRef (DOM node) is specified:\n\t\t//\n\t\t//\t\t- use srcNodeRef.innerHTML as my contents\n\t\t//\t\t- if this is a behavioral widget then apply behavior to that srcNodeRef\n\t\t//\t\t- otherwise, replace srcNodeRef with my generated DOM tree\n\n\t\t// extract parameters like onMouseMove that should connect directly to this.domNode\n\t\tthis._toConnect = {};\n\t\tfor(var name in params){\n\t\t\tif(this[name] === connectToDomNode){\n\t\t\t\tthis._toConnect[name.replace(/^on/, \"\").toLowerCase()] = params[name];\n\t\t\t\tdelete params[name];\n\t\t\t}\n\t\t}\n\t},\n\n\tpostCreate: function(){\n\t\tthis.inherited(arguments);\n\n\t\t// perform connection from this.domNode to user specified handlers (ex: onMouseMove)\n\t\tfor(var name in this._toConnect){\n\t\t\tthis.on(name, this._toConnect[name]);\n\t\t}\n\t\tdelete this._toConnect;\n\t},\n\n\ton: function(/*String|Function*/ type, /*Function*/ func){\n\t\tif(this[this._onMap(type)] === connectToDomNode){\n\t\t\t// Use connect.connect() rather than on() to get handling for \"onmouseenter\" on non-IE,\n\t\t\t// normalization of onkeypress/onkeydown to behave like firefox, etc.\n\t\t\t// Also, need to specify context as \"this\" rather than the default context of the DOMNode\n\t\t\t// Remove in 2.0.\n\t\t\treturn connect.connect(this.domNode, type.toLowerCase(), this, func);\n\t\t}\n\t\treturn this.inherited(arguments);\n\t},\n\n\t_setFocusedAttr: function(val){\n\t\t// Remove this method in 2.0 (or sooner), just here to set _focused == focused, for back compat\n\t\t// (but since it's a private variable we aren't required to keep supporting it).\n\t\tthis._focused = val;\n\t\tthis._set(\"focused\", val);\n\t},\n\n\t////////////////// DEPRECATED METHODS ///////////////////\n\n\tsetAttribute: function(/*String*/ attr, /*anything*/ value){\n\t\t// summary:\n\t\t//\t\tDeprecated. Use set() instead.\n\t\t// tags:\n\t\t//\t\tdeprecated\n\t\tkernel.deprecated(this.declaredClass+\"::setAttribute(attr, value) is deprecated. Use set() instead.\", \"\", \"2.0\");\n\t\tthis.set(attr, value);\n\t},\n\n\tattr: function(/*String|Object*/name, /*Object?*/value){\n\t\t// summary:\n\t\t//\t\tThis method is deprecated, use get() or set() directly.\n\t\t// name:\n\t\t//\t\tThe property to get or set. If an object is passed here and not\n\t\t//\t\ta string, its keys are used as names of attributes to be set\n\t\t//\t\tand the value of the object as values to set in the widget.\n\t\t// value:\n\t\t//\t\tOptional. If provided, attr() operates as a setter. If omitted,\n\t\t//\t\tthe current value of the named property is returned.\n\t\t// tags:\n\t\t//\t\tdeprecated\n\n\t\tvar args = arguments.length;\n\t\tif(args >= 2 || typeof name === \"object\"){ // setter\n\t\t\treturn this.set.apply(this, arguments);\n\t\t}else{ // getter\n\t\t\treturn this.get(name);\n\t\t}\n\t},\n\n\tgetDescendants: function(){\n\t\t// summary:\n\t\t//\t\tReturns all the widgets contained by this, i.e., all widgets underneath this.containerNode.\n\t\t//\t\tThis method should generally be avoided as it returns widgets declared in templates, which are\n\t\t//\t\tsupposed to be internal/hidden, but it's left here for back-compat reasons.\n\n\t\tkernel.deprecated(this.declaredClass+\"::getDescendants() is deprecated. Use getChildren() instead.\", \"\", \"2.0\");\n\t\treturn this.containerNode ? query('[widgetId]', this.containerNode).map(registry.byNode) : []; // dijit/_WidgetBase[]\n\t},\n\n\t////////////////// MISCELLANEOUS METHODS ///////////////////\n\n\t_onShow: function(){\n\t\t// summary:\n\t\t//\t\tInternal method called when this widget is made visible.\n\t\t//\t\tSee `onShow` for details.\n\t\tthis.onShow();\n\t},\n\n\tonShow: function(){\n\t\t// summary:\n\t\t//\t\tCalled when this widget becomes the selected pane in a\n\t\t//\t\t`dijit/layout/TabContainer`, `dijit/layout/StackContainer`,\n\t\t//\t\t`dijit/layout/AccordionContainer`, etc.\n\t\t//\n\t\t//\t\tAlso called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\n\tonHide: function(){\n\t\t// summary:\n\t\t//\t\tCalled when another widget becomes the selected pane in a\n\t\t//\t\t`dijit/layout/TabContainer`, `dijit/layout/StackContainer`,\n\t\t//\t\t`dijit/layout/AccordionContainer`, etc.\n\t\t//\n\t\t//\t\tAlso called to indicate hide of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.\n\t\t// tags:\n\t\t//\t\tcallback\n\t},\n\n\tonClose: function(){\n\t\t// summary:\n\t\t//\t\tCalled when this widget is being displayed as a popup (ex: a Calendar popped\n\t\t//\t\tup from a DateTextBox), and it is hidden.\n\t\t//\t\tThis is called from the dijit.popup code, and should not be called directly.\n\t\t//\n\t\t//\t\tAlso used as a parameter for children of `dijit/layout/StackContainer` or subclasses.\n\t\t//\t\tCallback if a user tries to close the child. Child will be closed if this function returns true.\n\t\t// tags:\n\t\t//\t\textension\n\n\t\treturn true;\t\t// Boolean\n\t}\n});\n\n// For back-compat, remove in 2.0.\nif(has(\"dijit-legacy-requires\")){\n\tready(0, function(){\n\t\tvar requires = [\"dijit/_base\"];\n\t\trequire(requires);\t// use indirection so modules not rolled into a build\n\t});\n}\nreturn _Widget;\n});\n","define([\n\t\"require\", // require.toUrl\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/aspect\",\n\t\"dojo/_base/config\", // config.blankGif\n\t\"dojo/_base/connect\", // connect.connect\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom\", // dom.byId\n\t\"dojo/dom-attr\", // domAttr.set domAttr.remove\n\t\"dojo/dom-class\", // domClass.add domClass.replace\n\t\"dojo/dom-construct\", // domConstruct.destroy domConstruct.place\n\t\"dojo/dom-geometry\", // isBodyLtr\n\t\"dojo/dom-style\", // domStyle.set, domStyle.get\n\t\"dojo/has\",\n\t\"dojo/_base/kernel\",\n\t\"dojo/_base/lang\", // mixin(), isArray(), etc.\n\t\"dojo/on\",\n\t\"dojo/ready\",\n\t\"dojo/Stateful\", // Stateful\n\t\"dojo/topic\",\n\t\"dojo/_base/window\", // win.body()\n\t\"./Destroyable\",\n\t\"dojo/has!dojo-bidi?./_BidiMixin\",\n\t\"./registry\" // registry.getUniqueId(), registry.findWidgets()\n], function(require, array, aspect, config, connect, declare,\n\t\t\tdom, domAttr, domClass, domConstruct, domGeometry, domStyle, has, kernel,\n\t\t\tlang, on, ready, Stateful, topic, win, Destroyable, _BidiMixin, registry){\n\n\t// module:\n\t//\t\tdijit/_WidgetBase\n\n\t// Flag to make dijit load modules the app didn't explicitly request, for backwards compatibility\n\thas.add(\"dijit-legacy-requires\", !kernel.isAsync);\n\n\t// Flag to enable support for textdir attribute\n\thas.add(\"dojo-bidi\", false);\n\n\n\t// For back-compat, remove in 2.0.\n\tif(has(\"dijit-legacy-requires\")){\n\t\tready(0, function(){\n\t\t\tvar requires = [\"dijit/_base/manager\"];\n\t\t\trequire(requires);\t// use indirection so modules not rolled into a build\n\t\t});\n\t}\n\n\t// Nested hash listing attributes for each tag, all strings in lowercase.\n\t// ex: {\"div\": {\"style\": true, \"tabindex\" true}, \"form\": { ...\n\tvar tagAttrs = {};\n\n\tfunction getAttrs(obj){\n\t\tvar ret = {};\n\t\tfor(var attr in obj){\n\t\t\tret[attr.toLowerCase()] = true;\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction nonEmptyAttrToDom(attr){\n\t\t// summary:\n\t\t//\t\tReturns a setter function that copies the attribute to this.domNode,\n\t\t//\t\tor removes the attribute from this.domNode, depending on whether the\n\t\t//\t\tvalue is defined or not.\n\t\treturn function(val){\n\t\t\tdomAttr[val ? \"set\" : \"remove\"](this.domNode, attr, val);\n\t\t\tthis._set(attr, val);\n\t\t};\n\t}\n\n\tfunction isEqual(a, b){\n\t\t//\tsummary:\n\t\t//\t\tFunction that determines whether two values are identical,\n\t\t//\t\ttaking into account that NaN is not normally equal to itself\n\t\t//\t\tin JS.\n\n\t\treturn a === b || (/* a is NaN */ a !== a && /* b is NaN */ b !== b);\n\t}\n\n\tvar _WidgetBase = declare(\"dijit._WidgetBase\", [Stateful, Destroyable], {\n\t\t// summary:\n\t\t//\t\tFuture base class for all Dijit widgets.\n\t\t// description:\n\t\t//\t\tFuture base class for all Dijit widgets.\n\t\t//\t\t_Widget extends this class adding support for various features needed by desktop.\n\t\t//\n\t\t//\t\tProvides stubs for widget lifecycle methods for subclasses to extend, like postMixInProperties(), buildRendering(),\n\t\t//\t\tpostCreate(), startup(), and destroy(), and also public API methods like set(), get(), and watch().\n\t\t//\n\t\t//\t\tWidgets can provide custom setters/getters for widget attributes, which are called automatically by set(name, value).\n\t\t//\t\tFor an attribute XXX, define methods _setXXXAttr() and/or _getXXXAttr().\n\t\t//\n\t\t//\t\t_setXXXAttr can also be a string/hash/array mapping from a widget attribute XXX to the widget's DOMNodes:\n\t\t//\n\t\t//\t\t- DOM node attribute\n\t\t// |\t\t_setFocusAttr: {node: \"focusNode\", type: \"attribute\"}\n\t\t// |\t\t_setFocusAttr: \"focusNode\"\t(shorthand)\n\t\t// |\t\t_setFocusAttr: \"\"\t\t(shorthand, maps to this.domNode)\n\t\t//\t\tMaps this.focus to this.focusNode.focus, or (last example) this.domNode.focus\n\t\t//\n\t\t//\t\t- DOM node innerHTML\n\t\t//\t|\t\t_setTitleAttr: { node: \"titleNode\", type: \"innerHTML\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerHTML\n\t\t//\n\t\t//\t\t- DOM node innerText\n\t\t//\t|\t\t_setTitleAttr: { node: \"titleNode\", type: \"innerText\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerText\n\t\t//\n\t\t//\t\t- DOM node CSS class\n\t\t// |\t\t_setMyClassAttr: { node: \"domNode\", type: \"class\" }\n\t\t//\t\tMaps this.myClass to this.domNode.className\n\t\t//\n\t\t//\t\t- Toggle DOM node CSS class\n\t\t// |\t\t_setMyClassAttr: { node: \"domNode\", type: \"toggleClass\" }\n\t\t//\t\tToggles myClass on this.domNode by this.myClass\n\t\t//\n\t\t//\t\tIf the value of _setXXXAttr is an array, then each element in the array matches one of the\n\t\t//\t\tformats of the above list.\n\t\t//\n\t\t//\t\tIf the custom setter is null, no action is performed other than saving the new value\n\t\t//\t\tin the widget (in this).\n\t\t//\n\t\t//\t\tIf no custom setter is defined for an attribute, then it will be copied\n\t\t//\t\tto this.focusNode (if the widget defines a focusNode), or this.domNode otherwise.\n\t\t//\t\tThat's only done though for attributes that match DOMNode attributes (title,\n\t\t//\t\talt, aria-labelledby, etc.)\n\n\t\t// id: [const] String\n\t\t//\t\tA unique, opaque ID string that can be assigned by users or by the\n\t\t//\t\tsystem. If the developer passes an ID which is known not to be\n\t\t//\t\tunique, the specified ID is ignored and the system-generated ID is\n\t\t//\t\tused instead.\n\t\tid: \"\",\n\t\t_setIdAttr: \"domNode\", // to copy to this.domNode even for auto-generated id's\n\n\t\t// lang: [const] String\n\t\t//\t\tRarely used. Overrides the default Dojo locale used to render this widget,\n\t\t//\t\tas defined by the [HTML LANG](http://www.w3.org/TR/html401/struct/dirlang.html#adef-lang) attribute.\n\t\t//\t\tValue must be among the list of locales specified during by the Dojo bootstrap,\n\t\t//\t\tformatted according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt) (like en-us).\n\t\tlang: \"\",\n\t\t// set on domNode even when there's a focus node.\tbut don't set lang=\"\", since that's invalid.\n\t\t_setLangAttr: nonEmptyAttrToDom(\"lang\"),\n\n\t\t// dir: [const] String\n\t\t//\t\tBi-directional support, as defined by the [HTML DIR](http://www.w3.org/TR/html401/struct/dirlang.html#adef-dir)\n\t\t//\t\tattribute. Either left-to-right \"ltr\" or right-to-left \"rtl\". If undefined, widgets renders in page's\n\t\t//\t\tdefault direction.\n\t\tdir: \"\",\n\t\t// set on domNode even when there's a focus node.\tbut don't set dir=\"\", since that's invalid.\n\t\t_setDirAttr: nonEmptyAttrToDom(\"dir\"), // to set on domNode even when there's a focus node\n\n\t\t// class: String\n\t\t//\t\tHTML class attribute\n\t\t\"class\": \"\",\n\t\t_setClassAttr: { node: \"domNode\", type: \"class\" },\n\n\t\t// Override automatic assigning type --> focusNode, it causes exception on IE6-8.\n\t\t// Instead, type must be specified as ${type} in the template, as part of the original DOM.\n\t\t_setTypeAttr: null,\n\n\t\t// style: String||Object\n\t\t//\t\tHTML style attributes as cssText string or name/value hash\n\t\tstyle: \"\",\n\n\t\t// title: String\n\t\t//\t\tHTML title attribute.\n\t\t//\n\t\t//\t\tFor form widgets this specifies a tooltip to display when hovering over\n\t\t//\t\tthe widget (just like the native HTML title attribute).\n\t\t//\n\t\t//\t\tFor TitlePane or for when this widget is a child of a TabContainer, AccordionContainer,\n\t\t//\t\tetc., it's used to specify the tab label, accordion pane title, etc. In this case it's\n\t\t//\t\tinterpreted as HTML.\n\t\ttitle: \"\",\n\n\t\t// tooltip: String\n\t\t//\t\tWhen this widget's title attribute is used to for a tab label, accordion pane title, etc.,\n\t\t//\t\tthis specifies the tooltip to appear when the mouse is hovered over that text.\n\t\ttooltip: \"\",\n\n\t\t// baseClass: [protected] String\n\t\t//\t\tRoot CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate\n\t\t//\t\twidget state.\n\t\tbaseClass: \"\",\n\n\t\t// srcNodeRef: [readonly] DomNode\n\t\t//\t\tpointer to original DOM node\n\t\tsrcNodeRef: null,\n\n\t\t// domNode: [readonly] DomNode\n\t\t//\t\tThis is our visible representation of the widget! Other DOM\n\t\t//\t\tNodes may by assigned to other properties, usually through the\n\t\t//\t\ttemplate system's data-dojo-attach-point syntax, but the domNode\n\t\t//\t\tproperty is the canonical \"top level\" node in widget UI.\n\t\tdomNode: null,\n\n\t\t// containerNode: [readonly] DomNode\n\t\t//\t\tDesignates where children of the source DOM node will be placed.\n\t\t//\t\t\"Children\" in this case refers to both DOM nodes and widgets.\n\t\t//\t\tFor example, for myWidget:\n\t\t//\n\t\t//\t\t|\t<div data-dojo-type=myWidget>\n\t\t//\t\t|\t\t<b> here's a plain DOM node\n\t\t//\t\t|\t\t<span data-dojo-type=subWidget>and a widget</span>\n\t\t//\t\t|\t\t<i> and another plain DOM node </i>\n\t\t//\t\t|\t</div>\n\t\t//\n\t\t//\t\tcontainerNode would point to:\n\t\t//\n\t\t//\t\t|\t\t<b> here's a plain DOM node\n\t\t//\t\t|\t\t<span data-dojo-type=subWidget>and a widget</span>\n\t\t//\t\t|\t\t<i> and another plain DOM node </i>\n\t\t//\n\t\t//\t\tIn templated widgets, \"containerNode\" is set via a\n\t\t//\t\tdata-dojo-attach-point assignment.\n\t\t//\n\t\t//\t\tcontainerNode must be defined for any widget that accepts innerHTML\n\t\t//\t\t(like ContentPane or BorderContainer or even Button), and conversely\n\t\t//\t\tis null for widgets that don't, like TextBox.\n\t\tcontainerNode: null,\n\n\t\t// ownerDocument: [const] Document?\n\t\t//\t\tThe document this widget belongs to. If not specified to constructor, will default to\n\t\t//\t\tsrcNodeRef.ownerDocument, or if no sourceRef specified, then to the document global\n\t\townerDocument: null,\n\t\t_setOwnerDocumentAttr: function(val){\n\t\t\t// this setter is merely to avoid automatically trying to set this.domNode.ownerDocument\n\t\t\tthis._set(\"ownerDocument\", val);\n\t\t},\n\n\t\t/*=====\n\t\t// _started: [readonly] Boolean\n\t\t//\t\tstartup() has completed.\n\t\t_started: false,\n\t\t=====*/\n\n\t\t// attributeMap: [protected] Object\n\t\t//\t\tDeprecated.\tInstead of attributeMap, widget should have a _setXXXAttr attribute\n\t\t//\t\tfor each XXX attribute to be mapped to the DOM.\n\t\t//\n\t\t//\t\tattributeMap sets up a \"binding\" between attributes (aka properties)\n\t\t//\t\tof the widget and the widget's DOM.\n\t\t//\t\tChanges to widget attributes listed in attributeMap will be\n\t\t//\t\treflected into the DOM.\n\t\t//\n\t\t//\t\tFor example, calling set('title', 'hello')\n\t\t//\t\ton a TitlePane will automatically cause the TitlePane's DOM to update\n\t\t//\t\twith the new title.\n\t\t//\n\t\t//\t\tattributeMap is a hash where the key is an attribute of the widget,\n\t\t//\t\tand the value reflects a binding to a:\n\t\t//\n\t\t//\t\t- DOM node attribute\n\t\t// |\t\tfocus: {node: \"focusNode\", type: \"attribute\"}\n\t\t//\t\tMaps this.focus to this.focusNode.focus\n\t\t//\n\t\t//\t\t- DOM node innerHTML\n\t\t//\t|\t\ttitle: { node: \"titleNode\", type: \"innerHTML\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerHTML\n\t\t//\n\t\t//\t\t- DOM node innerText\n\t\t//\t|\t\ttitle: { node: \"titleNode\", type: \"innerText\" }\n\t\t//\t\tMaps this.title to this.titleNode.innerText\n\t\t//\n\t\t//\t\t- DOM node CSS class\n\t\t// |\t\tmyClass: { node: \"domNode\", type: \"class\" }\n\t\t//\t\tMaps this.myClass to this.domNode.className\n\t\t//\n\t\t//\t\tIf the value is an array, then each element in the array matches one of the\n\t\t//\t\tformats of the above list.\n\t\t//\n\t\t//\t\tThere are also some shorthands for backwards compatibility:\n\t\t//\n\t\t//\t\t- string --> { node: string, type: \"attribute\" }, for example:\n\t\t//\n\t\t//\t|\t\"focusNode\" ---> { node: \"focusNode\", type: \"attribute\" }\n\t\t//\n\t\t//\t\t- \"\" --> { node: \"domNode\", type: \"attribute\" }\n\t\tattributeMap: {},\n\n\t\t// _blankGif: [protected] String\n\t\t//\t\tPath to a blank 1x1 image.\n\t\t//\t\tUsed by `<img>` nodes in templates that really get their image via CSS background-image.\n\t\t_blankGif: config.blankGif || require.toUrl(\"dojo/resources/blank.gif\"),\n\n\t\t// textDir: String\n\t\t//\t\tBi-directional support,\tthe main variable which is responsible for the direction of the text.\n\t\t//\t\tThe text direction can be different than the GUI direction by using this parameter in creation\n\t\t//\t\tof a widget.\n\t\t//\n\t\t//\t\tThis property is only effective when `has(\"dojo-bidi\")` is defined to be true.\n\t\t//\n\t\t//\t\tAllowed values:\n\t\t//\n\t\t//\t\t1. \"\" - default value; text is same direction as widget\n\t\t//\t\t2. \"ltr\"\n\t\t//\t\t3. \"rtl\"\n\t\t//\t\t4. \"auto\" - contextual the direction of a text defined by first strong letter.\n\t\ttextDir: \"\",\n\n\t\t//////////// INITIALIZATION METHODS ///////////////////////////////////////\n\n\t\t/*=====\n\t\tconstructor: function(params, srcNodeRef){\n\t\t\t// summary:\n\t\t\t//\t\tCreate the widget.\n\t\t\t// params: Object|null\n\t\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t\t// srcNodeRef: DOMNode|String?\n\t\t\t//\t\tIf a srcNodeRef (DOM node) is specified:\n\t\t\t//\n\t\t\t//\t\t- use srcNodeRef.innerHTML as my contents\n\t\t\t//\t\t- if this is a behavioral widget then apply behavior to that srcNodeRef\n\t\t\t//\t\t- otherwise, replace srcNodeRef with my generated DOM tree\n\t\t},\n\t\t=====*/\n\n\t\t_introspect: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCollect metadata about this widget (only once per class, not once per instance):\n\t\t\t//\n\t\t\t//\t\t\t- list of attributes with custom setters, storing in this.constructor._setterAttrs\n\t\t\t//\t\t\t- generate this.constructor._onMap, mapping names like \"mousedown\" to functions like onMouseDown\n\n\t\t\tvar ctor = this.constructor;\n\t\t\tif(!ctor._setterAttrs){\n\t\t\t\tvar proto = ctor.prototype,\n\t\t\t\t\tattrs = ctor._setterAttrs = [], // attributes with custom setters\n\t\t\t\t\tonMap = (ctor._onMap = {});\n\n\t\t\t\t// Items in this.attributeMap are like custom setters. For back-compat, remove for 2.0.\n\t\t\t\tfor(var name in proto.attributeMap){\n\t\t\t\t\tattrs.push(name);\n\t\t\t\t}\n\n\t\t\t\t// Loop over widget properties, collecting properties with custom setters and filling in ctor._onMap.\n\t\t\t\tfor(name in proto){\n\t\t\t\t\tif(/^on/.test(name)){\n\t\t\t\t\t\tonMap[name.substring(2).toLowerCase()] = name;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(/^_set[A-Z](.*)Attr$/.test(name)){\n\t\t\t\t\t\tname = name.charAt(4).toLowerCase() + name.substr(5, name.length - 9);\n\t\t\t\t\t\tif(!proto.attributeMap || !(name in proto.attributeMap)){\n\t\t\t\t\t\t\tattrs.push(name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Note: this isn't picking up info on properties like aria-label and role, that don't have custom setters\n\t\t\t\t// but that set() maps to attributes on this.domNode or this.focusNode\n\t\t\t}\n\t\t},\n\n\t\tpostscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){\n\t\t\t// summary:\n\t\t\t//\t\tKicks off widget instantiation. See create() for details.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// Note that we skip calling this.inherited(), i.e. dojo/Stateful::postscript(), because 1.x widgets don't\n\t\t\t// expect their custom setters to get called until after buildRendering(). Consider changing for 2.0.\n\n\t\t\tthis.create(params, srcNodeRef);\n\t\t},\n\n\t\tcreate: function(params, srcNodeRef){\n\t\t\t// summary:\n\t\t\t//\t\tKick off the life-cycle of a widget\n\t\t\t// description:\n\t\t\t//\t\tCreate calls a number of widget methods (postMixInProperties, buildRendering, postCreate,\n\t\t\t//\t\tetc.), some of which of you'll want to override. See http://dojotoolkit.org/reference-guide/dijit/_WidgetBase.html\n\t\t\t//\t\tfor a discussion of the widget creation lifecycle.\n\t\t\t//\n\t\t\t//\t\tOf course, adventurous developers could override create entirely, but this should\n\t\t\t//\t\tonly be done as a last resort.\n\t\t\t// params: Object|null\n\t\t\t//\t\tHash of initialization parameters for widget, including scalar values (like title, duration etc.)\n\t\t\t//\t\tand functions, typically callbacks like onClick.\n\t\t\t//\t\tThe hash can contain any of the widget's properties, excluding read-only properties.\n\t\t\t// srcNodeRef: DOMNode|String?\n\t\t\t//\t\tIf a srcNodeRef (DOM node) is specified:\n\t\t\t//\n\t\t\t//\t\t- use srcNodeRef.innerHTML as my contents\n\t\t\t//\t\t- if this is a behavioral widget then apply behavior to that srcNodeRef\n\t\t\t//\t\t- otherwise, replace srcNodeRef with my generated DOM tree\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// First time widget is instantiated, scan prototype to figure out info about custom setters etc.\n\t\t\tthis._introspect();\n\n\t\t\t// store pointer to original DOM tree\n\t\t\tthis.srcNodeRef = dom.byId(srcNodeRef);\n\n\t\t\t// No longer used, remove for 2.0.\n\t\t\tthis._connects = [];\n\t\t\tthis._supportingWidgets = [];\n\n\t\t\t// this is here for back-compat, remove in 2.0 (but check NodeList-instantiate.html test)\n\t\t\tif(this.srcNodeRef && this.srcNodeRef.id && (typeof this.srcNodeRef.id == \"string\")){\n\t\t\t\tthis.id = this.srcNodeRef.id;\n\t\t\t}\n\n\t\t\t// mix in our passed parameters\n\t\t\tif(params){\n\t\t\t\tthis.params = params;\n\t\t\t\tlang.mixin(this, params);\n\t\t\t}\n\t\t\tthis.postMixInProperties();\n\n\t\t\t// Generate an id for the widget if one wasn't specified, or it was specified as id: undefined.\n\t\t\t// Do this before buildRendering() because it might expect the id to be there.\n\t\t\tif(!this.id){\n\t\t\t\tthis.id = registry.getUniqueId(this.declaredClass.replace(/\\./g, \"_\"));\n\t\t\t\tif(this.params){\n\t\t\t\t\t// if params contains {id: undefined}, prevent _applyAttributes() from processing it\n\t\t\t\t\tdelete this.params.id;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// The document and <body> node this widget is associated with\n\t\t\tthis.ownerDocument = this.ownerDocument || (this.srcNodeRef ? this.srcNodeRef.ownerDocument : document);\n\t\t\tthis.ownerDocumentBody = win.body(this.ownerDocument);\n\n\t\t\tregistry.add(this);\n\n\t\t\tthis.buildRendering();\n\n\t\t\tvar deleteSrcNodeRef;\n\n\t\t\tif(this.domNode){\n\t\t\t\t// Copy attributes listed in attributeMap into the [newly created] DOM for the widget.\n\t\t\t\t// Also calls custom setters for all attributes with custom setters.\n\t\t\t\tthis._applyAttributes();\n\n\t\t\t\t// If srcNodeRef was specified, then swap out original srcNode for this widget's DOM tree.\n\t\t\t\t// For 2.0, move this after postCreate(). postCreate() shouldn't depend on the\n\t\t\t\t// widget being attached to the DOM since it isn't when a widget is created programmatically like\n\t\t\t\t// new MyWidget({}).\tSee #11635.\n\t\t\t\tvar source = this.srcNodeRef;\n\t\t\t\tif(source && source.parentNode && this.domNode !== source){\n\t\t\t\t\tsource.parentNode.replaceChild(this.domNode, source);\n\t\t\t\t\tdeleteSrcNodeRef = true;\n\t\t\t\t}\n\n\t\t\t\t// Note: for 2.0 may want to rename widgetId to dojo._scopeName + \"_widgetId\",\n\t\t\t\t// assuming that dojo._scopeName even exists in 2.0\n\t\t\t\tthis.domNode.setAttribute(\"widgetId\", this.id);\n\t\t\t}\n\t\t\tthis.postCreate();\n\n\t\t\t// If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.\n\t\t\t// I think for back-compatibility it isn't deleting srcNodeRef until after postCreate() has run.\n\t\t\tif(deleteSrcNodeRef){\n\t\t\t\tdelete this.srcNodeRef;\n\t\t\t}\n\n\t\t\tthis._created = true;\n\t\t},\n\n\t\t_applyAttributes: function(){\n\t\t\t// summary:\n\t\t\t//\t\tStep during widget creation to copy widget attributes to the\n\t\t\t//\t\tDOM according to attributeMap and _setXXXAttr objects, and also to call\n\t\t\t//\t\tcustom _setXXXAttr() methods.\n\t\t\t//\n\t\t\t//\t\tSkips over blank/false attribute values, unless they were explicitly specified\n\t\t\t//\t\tas parameters to the widget, since those are the default anyway,\n\t\t\t//\t\tand setting tabIndex=\"\" is different than not setting tabIndex at all.\n\t\t\t//\n\t\t\t//\t\tFor backwards-compatibility reasons attributeMap overrides _setXXXAttr when\n\t\t\t//\t\t_setXXXAttr is a hash/string/array, but _setXXXAttr as a functions override attributeMap.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\t// Call this.set() for each property that was either specified as parameter to constructor,\n\t\t\t// or is in the list found above.\tFor correlated properties like value and displayedValue, the one\n\t\t\t// specified as a parameter should take precedence.\n\t\t\t// Particularly important for new DateTextBox({displayedValue: ...}) since DateTextBox's default value is\n\t\t\t// NaN and thus is not ignored like a default value of \"\".\n\n\t\t\t// Step 1: Save the current values of the widget properties that were specified as parameters to the constructor.\n\t\t\t// Generally this.foo == this.params.foo, except if postMixInProperties() changed the value of this.foo.\n\t\t\tvar params = {};\n\t\t\tfor(var key in this.params || {}){\n\t\t\t\tparams[key] = this._get(key);\n\t\t\t}\n\n\t\t\t// Step 2: Call set() for each property with a non-falsy value that wasn't passed as a parameter to the constructor\n\t\t\tarray.forEach(this.constructor._setterAttrs, function(key){\n\t\t\t\tif(!(key in params)){\n\t\t\t\t\tvar val = this._get(key);\n\t\t\t\t\tif(val){\n\t\t\t\t\t\tthis.set(key, val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, this);\n\n\t\t\t// Step 3: Call set() for each property that was specified as parameter to constructor.\n\t\t\t// Use params hash created above to ignore side effects from step #2 above.\n\t\t\tfor(key in params){\n\t\t\t\tthis.set(key, params[key]);\n\t\t\t}\n\t\t},\n\n\t\tpostMixInProperties: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCalled after the parameters to the widget have been read-in,\n\t\t\t//\t\tbut before the widget template is instantiated. Especially\n\t\t\t//\t\tuseful to set properties that are referenced in the widget\n\t\t\t//\t\ttemplate.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t},\n\n\t\tbuildRendering: function(){\n\t\t\t// summary:\n\t\t\t//\t\tConstruct the UI for this widget, setting this.domNode.\n\t\t\t//\t\tMost widgets will mixin `dijit._TemplatedMixin`, which implements this method.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tif(!this.domNode){\n\t\t\t\t// Create root node if it wasn't created by _TemplatedMixin\n\t\t\t\tthis.domNode = this.srcNodeRef || this.ownerDocument.createElement(\"div\");\n\t\t\t}\n\n\t\t\t// baseClass is a single class name or occasionally a space-separated list of names.\n\t\t\t// Add those classes to the DOMNode. If RTL mode then also add with Rtl suffix.\n\t\t\t// TODO: make baseClass custom setter\n\t\t\tif(this.baseClass){\n\t\t\t\tvar classes = this.baseClass.split(\" \");\n\t\t\t\tif(!this.isLeftToRight()){\n\t\t\t\t\tclasses = classes.concat(array.map(classes, function(name){\n\t\t\t\t\t\treturn name + \"Rtl\";\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\tdomClass.add(this.domNode, classes);\n\t\t\t}\n\t\t},\n\n\t\tpostCreate: function(){\n\t\t\t// summary:\n\t\t\t//\t\tProcessing after the DOM fragment is created\n\t\t\t// description:\n\t\t\t//\t\tCalled after the DOM fragment has been created, but not necessarily\n\t\t\t//\t\tadded to the document. Do not include any operations which rely on\n\t\t\t//\t\tnode dimensions or placement.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t},\n\n\t\tstartup: function(){\n\t\t\t// summary:\n\t\t\t//\t\tProcessing after the DOM fragment is added to the document\n\t\t\t// description:\n\t\t\t//\t\tCalled after a widget and its children have been created and added to the page,\n\t\t\t//\t\tand all related widgets have finished their create() cycle, up through postCreate().\n\t\t\t//\n\t\t\t//\t\tNote that startup() may be called while the widget is still hidden, for example if the widget is\n\t\t\t//\t\tinside a hidden dijit/Dialog or an unselected tab of a dijit/layout/TabContainer.\n\t\t\t//\t\tFor widgets that need to do layout, it's best to put that layout code inside resize(), and then\n\t\t\t//\t\textend dijit/layout/_LayoutWidget so that resize() is called when the widget is visible.\n\t\t\tif(this._started){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._started = true;\n\t\t\tarray.forEach(this.getChildren(), function(obj){\n\t\t\t\tif(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){\n\t\t\t\t\tobj.startup();\n\t\t\t\t\tobj._started = true;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t//////////// DESTROY FUNCTIONS ////////////////////////////////\n\n\t\tdestroyRecursive: function(/*Boolean?*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy this widget and its descendants\n\t\t\t// description:\n\t\t\t//\t\tThis is the generic \"destructor\" function that all widget users\n\t\t\t//\t\tshould call to cleanly discard with a widget. Once a widget is\n\t\t\t//\t\tdestroyed, it is removed from the manager object.\n\t\t\t// preserveDom:\n\t\t\t//\t\tIf true, this method will leave the original DOM structure\n\t\t\t//\t\talone of descendant Widgets. Note: This will NOT work with\n\t\t\t//\t\tdijit._TemplatedMixin widgets.\n\n\t\t\tthis._beingDestroyed = true;\n\t\t\tthis.destroyDescendants(preserveDom);\n\t\t\tthis.destroy(preserveDom);\n\t\t},\n\n\t\tdestroy: function(/*Boolean*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroy this widget, but not its descendants. Descendants means widgets inside of\n\t\t\t//\t\tthis.containerNode. Will also destroy any resources (including widgets) registered via this.own().\n\t\t\t//\n\t\t\t//\t\tThis method will also destroy internal widgets such as those created from a template,\n\t\t\t//\t\tassuming those widgets exist inside of this.domNode but outside of this.containerNode.\n\t\t\t//\n\t\t\t//\t\tFor 2.0 it's planned that this method will also destroy descendant widgets, so apps should not\n\t\t\t//\t\tdepend on the current ability to destroy a widget without destroying its descendants. Generally\n\t\t\t//\t\tthey should use destroyRecursive() for widgets with children.\n\t\t\t// preserveDom: Boolean\n\t\t\t//\t\tIf true, this method will leave the original DOM structure alone.\n\t\t\t//\t\tNote: This will not yet work with _TemplatedMixin widgets\n\n\t\t\tthis._beingDestroyed = true;\n\t\t\tthis.uninitialize();\n\n\t\t\tfunction destroy(w){\n\t\t\t\tif(w.destroyRecursive){\n\t\t\t\t\tw.destroyRecursive(preserveDom);\n\t\t\t\t}else if(w.destroy){\n\t\t\t\t\tw.destroy(preserveDom);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Back-compat, remove for 2.0\n\t\t\tarray.forEach(this._connects, lang.hitch(this, \"disconnect\"));\n\t\t\tarray.forEach(this._supportingWidgets, destroy);\n\n\t\t\t// Destroy supporting widgets, but not child widgets under this.containerNode (for 2.0, destroy child widgets\n\t\t\t// here too). if() statement is to guard against exception if destroy() called multiple times (see #15815).\n\t\t\tif(this.domNode){\n\t\t\t\tarray.forEach(registry.findWidgets(this.domNode, this.containerNode), destroy);\n\t\t\t}\n\n\t\t\tthis.destroyRendering(preserveDom);\n\t\t\tregistry.remove(this.id);\n\t\t\tthis._destroyed = true;\n\t\t},\n\n\t\tdestroyRendering: function(/*Boolean?*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tDestroys the DOM nodes associated with this widget.\n\t\t\t// preserveDom:\n\t\t\t//\t\tIf true, this method will leave the original DOM structure alone\n\t\t\t//\t\tduring tear-down. Note: this will not work with _Templated\n\t\t\t//\t\twidgets yet.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tif(this.bgIframe){\n\t\t\t\tthis.bgIframe.destroy(preserveDom);\n\t\t\t\tdelete this.bgIframe;\n\t\t\t}\n\n\t\t\tif(this.domNode){\n\t\t\t\tif(preserveDom){\n\t\t\t\t\tdomAttr.remove(this.domNode, \"widgetId\");\n\t\t\t\t}else{\n\t\t\t\t\tdomConstruct.destroy(this.domNode);\n\t\t\t\t}\n\t\t\t\tdelete this.domNode;\n\t\t\t}\n\n\t\t\tif(this.srcNodeRef){\n\t\t\t\tif(!preserveDom){\n\t\t\t\t\tdomConstruct.destroy(this.srcNodeRef);\n\t\t\t\t}\n\t\t\t\tdelete this.srcNodeRef;\n\t\t\t}\n\t\t},\n\n\t\tdestroyDescendants: function(/*Boolean?*/ preserveDom){\n\t\t\t// summary:\n\t\t\t//\t\tRecursively destroy the children of this widget and their\n\t\t\t//\t\tdescendants.\n\t\t\t// preserveDom:\n\t\t\t//\t\tIf true, the preserveDom attribute is passed to all descendant\n\t\t\t//\t\twidget's .destroy() method. Not for use with _Templated\n\t\t\t//\t\twidgets.\n\n\t\t\t// get all direct descendants and destroy them recursively\n\t\t\tarray.forEach(this.getChildren(), function(widget){\n\t\t\t\tif(widget.destroyRecursive){\n\t\t\t\t\twidget.destroyRecursive(preserveDom);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tuninitialize: function(){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated. Override destroy() instead to implement custom widget tear-down\n\t\t\t//\t\tbehavior.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn false;\n\t\t},\n\n\t\t////////////////// GET/SET, CUSTOM SETTERS, ETC. ///////////////////\n\n\t\t_setStyleAttr: function(/*String||Object*/ value){\n\t\t\t// summary:\n\t\t\t//\t\tSets the style attribute of the widget according to value,\n\t\t\t//\t\twhich is either a hash like {height: \"5px\", width: \"3px\"}\n\t\t\t//\t\tor a plain string\n\t\t\t// description:\n\t\t\t//\t\tDetermines which node to set the style on based on style setting\n\t\t\t//\t\tin attributeMap.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tvar mapNode = this.domNode;\n\n\t\t\t// Note: technically we should revert any style setting made in a previous call\n\t\t\t// to his method, but that's difficult to keep track of.\n\n\t\t\tif(lang.isObject(value)){\n\t\t\t\tdomStyle.set(mapNode, value);\n\t\t\t}else{\n\t\t\t\tif(mapNode.style.cssText){\n\t\t\t\t\tmapNode.style.cssText += \"; \" + value;\n\t\t\t\t}else{\n\t\t\t\t\tmapNode.style.cssText = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._set(\"style\", value);\n\t\t},\n\n\t\t_attrToDom: function(/*String*/ attr, /*String*/ value, /*Object?*/ commands){\n\t\t\t// summary:\n\t\t\t//\t\tReflect a widget attribute (title, tabIndex, duration etc.) to\n\t\t\t//\t\tthe widget DOM, as specified by commands parameter.\n\t\t\t//\t\tIf commands isn't specified then it's looked up from attributeMap.\n\t\t\t//\t\tNote some attributes like \"type\"\n\t\t\t//\t\tcannot be processed this way as they are not mutable.\n\t\t\t// attr:\n\t\t\t//\t\tName of member variable (ex: \"focusNode\" maps to this.focusNode) pointing\n\t\t\t//\t\tto DOMNode inside the widget, or alternately pointing to a subwidget\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tcommands = arguments.length >= 3 ? commands : this.attributeMap[attr];\n\n\t\t\tarray.forEach(lang.isArray(commands) ? commands : [commands], function(command){\n\n\t\t\t\t// Get target node and what we are doing to that node\n\t\t\t\tvar mapNode = this[command.node || command || \"domNode\"];\t// DOM node\n\t\t\t\tvar type = command.type || \"attribute\";\t// class, innerHTML, innerText, or attribute\n\n\t\t\t\tswitch(type){\n\t\t\t\t\tcase \"attribute\":\n\t\t\t\t\t\tif(lang.isFunction(value)){ // functions execute in the context of the widget\n\t\t\t\t\t\t\tvalue = lang.hitch(this, value);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get the name of the DOM node attribute; usually it's the same\n\t\t\t\t\t\t// as the name of the attribute in the widget (attr), but can be overridden.\n\t\t\t\t\t\t// Also maps handler names to lowercase, like onSubmit --> onsubmit\n\t\t\t\t\t\tvar attrName = command.attribute ? command.attribute :\n\t\t\t\t\t\t\t(/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr);\n\n\t\t\t\t\t\tif(mapNode.tagName){\n\t\t\t\t\t\t\t// Normal case, mapping to a DOMNode. Note that modern browsers will have a mapNode.set()\n\t\t\t\t\t\t\t// method, but for consistency we still call domAttr\n\t\t\t\t\t\t\tdomAttr.set(mapNode, attrName, value);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// mapping to a sub-widget\n\t\t\t\t\t\t\tmapNode.set(attrName, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"innerText\":\n\t\t\t\t\t\t// Deprecated, use \"textContent\" instead.\n\t\t\t\t\t\tmapNode.innerHTML = \"\";\n\t\t\t\t\t\tmapNode.appendChild(this.ownerDocument.createTextNode(value));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"textContent\":\n\t\t\t\t\t\tmapNode.textContent = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"innerHTML\":\n\t\t\t\t\t\tmapNode.innerHTML = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"class\":\n\t\t\t\t\t\tdomClass.replace(mapNode, value, this[attr]);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"toggleClass\":\n\t\t\t\t\t\tdomClass.toggle(mapNode, command.className || attr, value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}, this);\n\t\t},\n\n\t\tget: function(name){\n\t\t\t// summary:\n\t\t\t//\t\tGet a property from a widget.\n\t\t\t// name:\n\t\t\t//\t\tThe property to get.\n\t\t\t// description:\n\t\t\t//\t\tGet a named property from a widget. The property may\n\t\t\t//\t\tpotentially be retrieved via a getter method. If no getter is defined, this\n\t\t\t//\t\tjust retrieves the object's property.\n\t\t\t//\n\t\t\t//\t\tFor example, if the widget has properties `foo` and `bar`\n\t\t\t//\t\tand a method named `_getFooAttr()`, calling:\n\t\t\t//\t\t`myWidget.get(\"foo\")` would be equivalent to calling\n\t\t\t//\t\t`widget._getFooAttr()` and `myWidget.get(\"bar\")`\n\t\t\t//\t\twould be equivalent to the expression\n\t\t\t//\t\t`widget.bar2`\n\t\t\tvar names = this._getAttrNames(name);\n\t\t\treturn this[names.g] ? this[names.g]() : this._get(name);\n\t\t},\n\n\t\tset: function(name, value){\n\t\t\t// summary:\n\t\t\t//\t\tSet a property on a widget\n\t\t\t// name:\n\t\t\t//\t\tThe property to set.\n\t\t\t// value:\n\t\t\t//\t\tThe value to set in the property.\n\t\t\t// description:\n\t\t\t//\t\tSets named properties on a widget which may potentially be handled by a\n\t\t\t//\t\tsetter in the widget.\n\t\t\t//\n\t\t\t//\t\tFor example, if the widget has properties `foo` and `bar`\n\t\t\t//\t\tand a method named `_setFooAttr()`, calling\n\t\t\t//\t\t`myWidget.set(\"foo\", \"Howdy!\")` would be equivalent to calling\n\t\t\t//\t\t`widget._setFooAttr(\"Howdy!\")` and `myWidget.set(\"bar\", 3)`\n\t\t\t//\t\twould be equivalent to the statement `widget.bar = 3;`\n\t\t\t//\n\t\t\t//\t\tset() may also be called with a hash of name/value pairs, ex:\n\t\t\t//\n\t\t\t//\t|\tmyWidget.set({\n\t\t\t//\t|\t\tfoo: \"Howdy\",\n\t\t\t//\t|\t\tbar: 3\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t//\tThis is equivalent to calling `set(foo, \"Howdy\")` and `set(bar, 3)`\n\n\t\t\tif(typeof name === \"object\"){\n\t\t\t\tfor(var x in name){\n\t\t\t\t\tthis.set(x, name[x]);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tvar names = this._getAttrNames(name),\n\t\t\t\tsetter = this[names.s];\n\t\t\tif(lang.isFunction(setter)){\n\t\t\t\t// use the explicit setter\n\t\t\t\tvar result = setter.apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t}else{\n\t\t\t\t// Mapping from widget attribute to DOMNode/subwidget attribute/value/etc.\n\t\t\t\t// Map according to:\n\t\t\t\t//\t\t1. attributeMap setting, if one exists (TODO: attributeMap deprecated, remove in 2.0)\n\t\t\t\t//\t\t2. _setFooAttr: {...} type attribute in the widget (if one exists)\n\t\t\t\t//\t\t3. apply to focusNode or domNode if standard attribute name, excluding funcs like onClick.\n\t\t\t\t// Checks if an attribute is a \"standard attribute\" by whether the DOMNode JS object has a similar\n\t\t\t\t// attribute name (ex: accept-charset attribute matches jsObject.acceptCharset).\n\t\t\t\t// Note also that Tree.focusNode() is a function not a DOMNode, so test for that.\n\t\t\t\tvar defaultNode = this.focusNode && !lang.isFunction(this.focusNode) ? \"focusNode\" : \"domNode\",\n\t\t\t\t\ttag = this[defaultNode] && this[defaultNode].tagName,\n\t\t\t\t\tattrsForTag = tag && (tagAttrs[tag] || (tagAttrs[tag] = getAttrs(this[defaultNode]))),\n\t\t\t\t\tmap = name in this.attributeMap ? this.attributeMap[name] :\n\t\t\t\t\t\tnames.s in this ? this[names.s] :\n\t\t\t\t\t\t\t((attrsForTag && names.l in attrsForTag && typeof value != \"function\") ||\n\t\t\t\t\t\t\t\t/^aria-|^data-|^role$/.test(name)) ? defaultNode : null;\n\t\t\t\tif(map != null){\n\t\t\t\t\tthis._attrToDom(name, value, map);\n\t\t\t\t}\n\t\t\t\tthis._set(name, value);\n\t\t\t}\n\t\t\treturn result || this;\n\t\t},\n\n\t\t_attrPairNames: {}, // shared between all widgets\n\t\t_getAttrNames: function(name){\n\t\t\t// summary:\n\t\t\t//\t\tHelper function for get() and set().\n\t\t\t//\t\tCaches attribute name values so we don't do the string ops every time.\n\t\t\t// tags:\n\t\t\t//\t\tprivate\n\n\t\t\tvar apn = this._attrPairNames;\n\t\t\tif(apn[name]){\n\t\t\t\treturn apn[name];\n\t\t\t}\n\t\t\tvar uc = name.replace(/^[a-z]|-[a-zA-Z]/g, function(c){\n\t\t\t\treturn c.charAt(c.length - 1).toUpperCase();\n\t\t\t});\n\t\t\treturn (apn[name] = {\n\t\t\t\tn: name + \"Node\",\n\t\t\t\ts: \"_set\" + uc + \"Attr\", // converts dashes to camel case, ex: accept-charset --> _setAcceptCharsetAttr\n\t\t\t\tg: \"_get\" + uc + \"Attr\",\n\t\t\t\tl: uc.toLowerCase() // lowercase name w/out dashes, ex: acceptcharset\n\t\t\t});\n\t\t},\n\n\t\t_set: function(/*String*/ name, /*anything*/ value){\n\t\t\t// summary:\n\t\t\t//\t\tHelper function to set new value for specified property, and call handlers\n\t\t\t//\t\tregistered with watch() if the value has changed.\n\t\t\tvar oldValue = this[name];\n\t\t\tthis[name] = value;\n\t\t\tif(this._created && !isEqual(oldValue, value)){\n\t\t\t\tif(this._watchCallbacks){\n\t\t\t\t\tthis._watchCallbacks(name, oldValue, value);\n\t\t\t\t}\n\t\t\t\tthis.emit(\"attrmodified-\" + name, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tprevValue: oldValue,\n\t\t\t\t\t\tnewValue: value\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t_get: function(/*String*/ name){\n\t\t\t// summary:\n\t\t\t//\t\tHelper function to get value for specified property stored by this._set(),\n\t\t\t//\t\ti.e. for properties with custom setters. Used mainly by custom getters.\n\t\t\t//\n\t\t\t//\t\tFor example, CheckBox._getValueAttr() calls this._get(\"value\").\n\n\t\t\t// future: return name in this.props ? this.props[name] : this[name];\n\t\t\treturn this[name];\n\t\t},\n\n\t\temit: function(/*String*/ type, /*Object?*/ eventObj, /*Array?*/ callbackArgs){\n\t\t\t// summary:\n\t\t\t//\t\tUsed by widgets to signal that a synthetic event occurred, ex:\n\t\t\t//\t|\tmyWidget.emit(\"attrmodified-selectedChildWidget\", {}).\n\t\t\t//\n\t\t\t//\t\tEmits an event on this.domNode named type.toLowerCase(), based on eventObj.\n\t\t\t//\t\tAlso calls onType() method, if present, and returns value from that method.\n\t\t\t//\t\tBy default passes eventObj to callback, but will pass callbackArgs instead, if specified.\n\t\t\t//\t\tModifies eventObj by adding missing parameters (bubbles, cancelable, widget).\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\t// Specify fallback values for bubbles, cancelable in case they are not set in eventObj.\n\t\t\t// Also set pointer to widget, although since we can't add a pointer to the widget for native events\n\t\t\t// (see #14729), maybe we shouldn't do it here?\n\t\t\teventObj = eventObj || {};\n\t\t\tif(eventObj.bubbles === undefined){\n\t\t\t\teventObj.bubbles = true;\n\t\t\t}\n\t\t\tif(eventObj.cancelable === undefined){\n\t\t\t\teventObj.cancelable = true;\n\t\t\t}\n\t\t\tif(!eventObj.detail){\n\t\t\t\teventObj.detail = {};\n\t\t\t}\n\t\t\teventObj.detail.widget = this;\n\n\t\t\tvar ret, callback = this[\"on\" + type];\n\t\t\tif(callback){\n\t\t\t\tret = callback.apply(this, callbackArgs ? callbackArgs : [eventObj]);\n\t\t\t}\n\n\t\t\t// Emit event, but avoid spurious emit()'s as parent sets properties on child during startup/destroy\n\t\t\tif(this._started && !this._beingDestroyed){\n\t\t\t\ton.emit(this.domNode, type.toLowerCase(), eventObj);\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t},\n\n\t\ton: function(/*String|Function*/ type, /*Function*/ func){\n\t\t\t// summary:\n\t\t\t//\t\tCall specified function when event occurs, ex: myWidget.on(\"click\", function(){ ... }).\n\t\t\t// type:\n\t\t\t//\t\tName of event (ex: \"click\") or extension event like touch.press.\n\t\t\t// description:\n\t\t\t//\t\tCall specified function when event `type` occurs, ex: `myWidget.on(\"click\", function(){ ... })`.\n\t\t\t//\t\tNote that the function is not run in any particular scope, so if (for example) you want it to run in the\n\t\t\t//\t\twidget's scope you must do `myWidget.on(\"click\", lang.hitch(myWidget, func))`.\n\n\t\t\t// For backwards compatibility, if there's an onType() method in the widget then connect to that.\n\t\t\t// Remove in 2.0.\n\t\t\tvar widgetMethod = this._onMap(type);\n\t\t\tif(widgetMethod){\n\t\t\t\treturn aspect.after(this, widgetMethod, func, true);\n\t\t\t}\n\n\t\t\t// Otherwise, just listen for the event on this.domNode.\n\t\t\treturn this.own(on(this.domNode, type, func))[0];\n\t\t},\n\n\t\t_onMap: function(/*String|Function*/ type){\n\t\t\t// summary:\n\t\t\t//\t\tMaps on() type parameter (ex: \"mousemove\") to method name (ex: \"onMouseMove\").\n\t\t\t//\t\tIf type is a synthetic event like touch.press then returns undefined.\n\t\t\tvar ctor = this.constructor, map = ctor._onMap;\n\t\t\tif(!map){\n\t\t\t\tmap = (ctor._onMap = {});\n\t\t\t\tfor(var attr in ctor.prototype){\n\t\t\t\t\tif(/^on/.test(attr)){\n\t\t\t\t\t\tmap[attr.replace(/^on/, \"\").toLowerCase()] = attr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn map[typeof type == \"string\" && type.toLowerCase()];\t// String\n\t\t},\n\n\t\ttoString: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a string that represents the widget.\n\t\t\t// description:\n\t\t\t//\t\tWhen a widget is cast to a string, this method will be used to generate the\n\t\t\t//\t\toutput. Currently, it does not implement any sort of reversible\n\t\t\t//\t\tserialization.\n\t\t\treturn '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String\n\t\t},\n\n\t\tgetChildren: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns all direct children of this widget, i.e. all widgets underneath this.containerNode whose parent\n\t\t\t//\t\tis this widget. Note that it does not return all descendants, but rather just direct children.\n\t\t\t//\t\tAnalogous to [Node.childNodes](https://developer.mozilla.org/en-US/docs/DOM/Node.childNodes),\n\t\t\t//\t\texcept containing widgets rather than DOMNodes.\n\t\t\t//\n\t\t\t//\t\tThe result intentionally excludes internally created widgets (a.k.a. supporting widgets)\n\t\t\t//\t\toutside of this.containerNode.\n\t\t\t//\n\t\t\t//\t\tNote that the array returned is a simple array. Application code should not assume\n\t\t\t//\t\texistence of methods like forEach().\n\n\t\t\treturn this.containerNode ? registry.findWidgets(this.containerNode) : []; // dijit/_WidgetBase[]\n\t\t},\n\n\t\tgetParent: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the parent widget of this widget.\n\n\t\t\treturn registry.getEnclosingWidget(this.domNode.parentNode);\n\t\t},\n\n\t\tconnect: function(/*Object|null*/ obj, /*String|Function*/ event, /*String|Function*/ method){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use this.own(on(...)) or this.own(aspect.after(...)) instead.\n\t\t\t//\n\t\t\t//\t\tConnects specified obj/event to specified method of this object\n\t\t\t//\t\tand registers for disconnect() on widget destroy.\n\t\t\t//\n\t\t\t//\t\tProvide widget-specific analog to dojo.connect, except with the\n\t\t\t//\t\timplicit use of this widget as the target object.\n\t\t\t//\t\tEvents connected with `this.connect` are disconnected upon\n\t\t\t//\t\tdestruction.\n\t\t\t// returns:\n\t\t\t//\t\tA handle that can be passed to `disconnect` in order to disconnect before\n\t\t\t//\t\tthe widget is destroyed.\n\t\t\t// example:\n\t\t\t//\t|\tvar btn = new Button();\n\t\t\t//\t|\t// when foo.bar() is called, call the listener we're going to\n\t\t\t//\t|\t// provide in the scope of btn\n\t\t\t//\t|\tbtn.connect(foo, \"bar\", function(){\n\t\t\t//\t|\t\tconsole.debug(this.toString());\n\t\t\t//\t|\t});\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\treturn this.own(connect.connect(obj, event, this, method))[0];\t// handle\n\t\t},\n\n\t\tdisconnect: function(handle){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use handle.remove() instead.\n\t\t\t//\n\t\t\t//\t\tDisconnects handle created by `connect`.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\thandle.remove();\n\t\t},\n\n\t\tsubscribe: function(t, method){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use this.own(topic.subscribe()) instead.\n\t\t\t//\n\t\t\t//\t\tSubscribes to the specified topic and calls the specified method\n\t\t\t//\t\tof this object and registers for unsubscribe() on widget destroy.\n\t\t\t//\n\t\t\t//\t\tProvide widget-specific analog to dojo.subscribe, except with the\n\t\t\t//\t\timplicit use of this widget as the target object.\n\t\t\t// t: String\n\t\t\t//\t\tThe topic\n\t\t\t// method: Function\n\t\t\t//\t\tThe callback\n\t\t\t// example:\n\t\t\t//\t|\tvar btn = new Button();\n\t\t\t//\t|\t// when /my/topic is published, this button changes its label to\n\t\t\t//\t|\t// be the parameter of the topic.\n\t\t\t//\t|\tbtn.subscribe(\"/my/topic\", function(v){\n\t\t\t//\t|\t\tthis.set(\"label\", v);\n\t\t\t//\t|\t});\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn this.own(topic.subscribe(t, lang.hitch(this, method)))[0];\t// handle\n\t\t},\n\n\t\tunsubscribe: function(/*Object*/ handle){\n\t\t\t// summary:\n\t\t\t//\t\tDeprecated, will be removed in 2.0, use handle.remove() instead.\n\t\t\t//\n\t\t\t//\t\tUnsubscribes handle created by this.subscribe.\n\t\t\t//\t\tAlso removes handle from this widget's list of subscriptions\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\thandle.remove();\n\t\t},\n\n\t\tisLeftToRight: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturn this widget's explicit or implicit orientation (true for LTR, false for RTL)\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\t\t\treturn this.dir ? (this.dir.toLowerCase() == \"ltr\") : domGeometry.isBodyLtr(this.ownerDocument); //Boolean\n\t\t},\n\n\t\tisFocusable: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturn true if this widget can currently be focused\n\t\t\t//\t\tand false if not\n\t\t\treturn this.focus && (domStyle.get(this.domNode, \"display\") != \"none\");\n\t\t},\n\n\t\tplaceAt: function(/*String|DomNode|DocumentFragment|dijit/_WidgetBase*/ reference, /*String|Int?*/ position){\n\t\t\t// summary:\n\t\t\t//\t\tPlace this widget somewhere in the DOM based\n\t\t\t//\t\ton standard domConstruct.place() conventions.\n\t\t\t// description:\n\t\t\t//\t\tA convenience function provided in all _Widgets, providing a simple\n\t\t\t//\t\tshorthand mechanism to put an existing (or newly created) Widget\n\t\t\t//\t\tsomewhere in the dom, and allow chaining.\n\t\t\t// reference:\n\t\t\t//\t\tWidget, DOMNode, DocumentFragment, or id of widget or DOMNode\n\t\t\t// position:\n\t\t\t//\t\tIf reference is a widget (or id of widget), and that widget has an \".addChild\" method,\n\t\t\t//\t\tit will be called passing this widget instance into that method, supplying the optional\n\t\t\t//\t\tposition index passed. In this case position (if specified) should be an integer.\n\t\t\t//\n\t\t\t//\t\tIf reference is a DOMNode (or id matching a DOMNode but not a widget),\n\t\t\t//\t\tthe position argument can be a numeric index or a string\n\t\t\t//\t\t\"first\", \"last\", \"before\", or \"after\", same as dojo/dom-construct::place().\n\t\t\t// returns: dijit/_WidgetBase\n\t\t\t//\t\tProvides a useful return of the newly created dijit._Widget instance so you\n\t\t\t//\t\tcan \"chain\" this function by instantiating, placing, then saving the return value\n\t\t\t//\t\tto a variable.\n\t\t\t// example:\n\t\t\t//\t|\t// create a Button with no srcNodeRef, and place it in the body:\n\t\t\t//\t|\tvar button = new Button({ label:\"click\" }).placeAt(win.body());\n\t\t\t//\t|\t// now, 'button' is still the widget reference to the newly created button\n\t\t\t//\t|\tbutton.on(\"click\", function(e){ console.log('click'); }));\n\t\t\t// example:\n\t\t\t//\t|\t// create a button out of a node with id=\"src\" and append it to id=\"wrapper\":\n\t\t\t//\t|\tvar button = new Button({},\"src\").placeAt(\"wrapper\");\n\t\t\t// example:\n\t\t\t//\t|\t// place a new button as the first element of some div\n\t\t\t//\t|\tvar button = new Button({ label:\"click\" }).placeAt(\"wrapper\",\"first\");\n\t\t\t// example:\n\t\t\t//\t|\t// create a contentpane and add it to a TabContainer\n\t\t\t//\t|\tvar tc = dijit.byId(\"myTabs\");\n\t\t\t//\t|\tnew ContentPane({ href:\"foo.html\", title:\"Wow!\" }).placeAt(tc)\n\n\t\t\tvar refWidget = !reference.tagName && registry.byId(reference);\n\t\t\tif(refWidget && refWidget.addChild && (!position || typeof position === \"number\")){\n\t\t\t\t// Adding this to refWidget and can use refWidget.addChild() to handle everything.\n\t\t\t\trefWidget.addChild(this, position);\n\t\t\t}else{\n\t\t\t\t// \"reference\" is a plain DOMNode, or we can't use refWidget.addChild(). Use domConstruct.place() and\n\t\t\t\t// target refWidget.containerNode for nested placement (position==number, \"first\", \"last\", \"only\"), and\n\t\t\t\t// refWidget.domNode otherwise (\"after\"/\"before\"/\"replace\"). (But not supported officially, see #14946.)\n\t\t\t\tvar ref = refWidget && (\"domNode\" in refWidget) ?\n\t\t\t\t\t(refWidget.containerNode && !/after|before|replace/.test(position || \"\") ?\n\t\t\t\t\t\trefWidget.containerNode : refWidget.domNode) : dom.byId(reference, this.ownerDocument);\n\t\t\t\tdomConstruct.place(this.domNode, ref, position);\n\n\t\t\t\t// Start this iff it has a parent widget that's already started.\n\t\t\t\t// TODO: for 2.0 maybe it should also start the widget when this.getParent() returns null??\n\t\t\t\tif(!this._started && (this.getParent() || {})._started){\n\t\t\t\t\tthis.startup();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\n\t\tdefer: function(fcn, delay){\n\t\t\t// summary:\n\t\t\t//\t\tWrapper to setTimeout to avoid deferred functions executing\n\t\t\t//\t\tafter the originating widget has been destroyed.\n\t\t\t//\t\tReturns an object handle with a remove method (that returns null) (replaces clearTimeout).\n\t\t\t// fcn: Function\n\t\t\t//\t\tFunction reference.\n\t\t\t// delay: Number?\n\t\t\t//\t\tDelay, defaults to 0.\n\t\t\t// tags:\n\t\t\t//\t\tprotected\n\n\t\t\tvar timer = setTimeout(lang.hitch(this,\n\t\t\t\tfunction(){\n\t\t\t\t\tif(!timer){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttimer = null;\n\t\t\t\t\tif(!this._destroyed){\n\t\t\t\t\t\tlang.hitch(this, fcn)();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tdelay || 0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tremove: function(){\n\t\t\t\t\tif(timer){\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\ttimer = null;\n\t\t\t\t\t}\n\t\t\t\t\treturn null; // so this works well: handle = handle.remove();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n\n\tif(has(\"dojo-bidi\")){\n\t\t_WidgetBase.extend(_BidiMixin);\n\t}\n\n\treturn _WidgetBase;\n});\n","define([\n\t\"dojo/_base/array\",\n\t\"dojo/_base/config\", // defaultDuration\n\t\"dojo/_base/lang\",\n\t\"../registry\",\n\t\"../main\"\t// for setting exports to dijit namespace\n], function(array, config, lang, registry, dijit){\n\n\t// module:\n\t//\t\tdijit/_base/manager\n\n\tvar exports = {\n\t\t// summary:\n\t\t//\t\tDeprecated. Shim to methods on registry, plus a few other declarations.\n\t\t//\t\tNew code should access dijit/registry directly when possible.\n\t};\n\n\tarray.forEach([\"byId\", \"getUniqueId\", \"findWidgets\", \"_destroyAll\", \"byNode\", \"getEnclosingWidget\"], function(name){\n\t\texports[name] = registry[name];\n\t});\n\n\t lang.mixin(exports, {\n\t\t // defaultDuration: Integer\n\t\t //\t\tThe default fx.animation speed (in ms) to use for all Dijit\n\t\t //\t\ttransitional fx.animations, unless otherwise specified\n\t\t //\t\ton a per-instance basis. Defaults to 200, overrided by\n\t\t //\t\t`djConfig.defaultDuration`\n\t\t defaultDuration: config[\"defaultDuration\"] || 200\n\t });\n\n\tlang.mixin(dijit, exports);\n\n\t/*===== return exports; =====*/\n\treturn dijit;\t// for back compat :-(\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/dom\",\t\t\t// dom.byId\n\t\"dojo/dom-attr\", // domAttr.attr domAttr.has\n\t\"dojo/dom-style\", // domStyle.style\n\t\"dojo/_base/lang\", // lang.mixin()\n\t\"dojo/sniff\", // has(\"ie\") has(\"extend-dojo\")\n\t\"./main\"\t// for exporting methods to dijit namespace\n], function(array, dom, domAttr, domStyle, lang, has, dijit){\n\n\t// module:\n\t//\t\tdijit/a11y\n\n\tvar undefined;\n\n\tvar a11y = {\n\t\t// summary:\n\t\t//\t\tAccessibility utility functions (keyboard, tab stops, etc.)\n\n\t\t_isElementShown: function(/*Element*/ elem){\n\t\t\tvar s = domStyle.get(elem);\n\t\t\treturn (s.visibility != \"hidden\")\n\t\t\t\t&& (s.visibility != \"collapsed\")\n\t\t\t\t&& (s.display != \"none\")\n\t\t\t\t&& (domAttr.get(elem, \"type\") != \"hidden\");\n\t\t},\n\n\t\thasDefaultTabStop: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tTests if element is tab-navigable even without an explicit tabIndex setting\n\n\t\t\t// No explicit tabIndex setting, need to investigate node type\n\t\t\tswitch(elem.nodeName.toLowerCase()){\n\t\t\t\tcase \"a\":\n\t\t\t\t\t// An <a> w/out a tabindex is only navigable if it has an href\n\t\t\t\t\treturn domAttr.has(elem, \"href\");\n\t\t\t\tcase \"area\":\n\t\t\t\tcase \"button\":\n\t\t\t\tcase \"input\":\n\t\t\t\tcase \"object\":\n\t\t\t\tcase \"select\":\n\t\t\t\tcase \"textarea\":\n\t\t\t\t\t// These are navigable by default\n\t\t\t\t\treturn true;\n\t\t\t\tcase \"iframe\":\n\t\t\t\t\t// If it's an editor <iframe> then it's tab navigable.\n\t\t\t\t\tvar body;\n\t\t\t\t\ttry{\n\t\t\t\t\t\t// non-IE\n\t\t\t\t\t\tvar contentDocument = elem.contentDocument;\n\t\t\t\t\t\tif(\"designMode\" in contentDocument && contentDocument.designMode == \"on\"){\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbody = contentDocument.body;\n\t\t\t\t\t}catch(e1){\n\t\t\t\t\t\t// contentWindow.document isn't accessible within IE7/8\n\t\t\t\t\t\t// if the iframe.src points to a foreign url and this\n\t\t\t\t\t\t// page contains an element, that could get focus\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tbody = elem.contentWindow.document.body;\n\t\t\t\t\t\t}catch(e2){\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn body && (body.contentEditable == 'true' ||\n\t\t\t\t\t\t(body.firstChild && body.firstChild.contentEditable == 'true'));\n\t\t\t\tdefault:\n\t\t\t\t\treturn elem.contentEditable == 'true';\n\t\t\t}\n\t\t},\n\n\t\teffectiveTabIndex: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tReturns effective tabIndex of an element, either a number, or undefined if element isn't focusable.\n\n\t\t\tif(domAttr.get(elem, \"disabled\")){\n\t\t\t\treturn undefined;\n\t\t\t}else if(domAttr.has(elem, \"tabIndex\")){\n\t\t\t\t// Explicit tab index setting\n\t\t\t\treturn +domAttr.get(elem, \"tabIndex\");// + to convert string --> number\n\t\t\t}else{\n\t\t\t\t// No explicit tabIndex setting, so depends on node type\n\t\t\t\treturn a11y.hasDefaultTabStop(elem) ? 0 : undefined;\n\t\t\t}\n\t\t},\n\n\t\tisTabNavigable: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tTests if an element is tab-navigable\n\n\t\t\treturn a11y.effectiveTabIndex(elem) >= 0;\n\t\t},\n\n\t\tisFocusable: function(/*Element*/ elem){\n\t\t\t// summary:\n\t\t\t//\t\tTests if an element is focusable by tabbing to it, or clicking it with the mouse.\n\n\t\t\treturn a11y.effectiveTabIndex(elem) >= -1;\n\t\t},\n\n\t\t_getTabNavigable: function(/*DOMNode*/ root){\n\t\t\t// summary:\n\t\t\t//\t\tFinds descendants of the specified root node.\n\t\t\t// description:\n\t\t\t//\t\tFinds the following descendants of the specified root node:\n\t\t\t//\n\t\t\t//\t\t- the first tab-navigable element in document order\n\t\t\t//\t\t without a tabIndex or with tabIndex=\"0\"\n\t\t\t//\t\t- the last tab-navigable element in document order\n\t\t\t//\t\t without a tabIndex or with tabIndex=\"0\"\n\t\t\t//\t\t- the first element in document order with the lowest\n\t\t\t//\t\t positive tabIndex value\n\t\t\t//\t\t- the last element in document order with the highest\n\t\t\t//\t\t positive tabIndex value\n\t\t\tvar first, last, lowest, lowestTabindex, highest, highestTabindex, radioSelected = {};\n\n\t\t\tfunction radioName(node){\n\t\t\t\t// If this element is part of a radio button group, return the name for that group.\n\t\t\t\treturn node && node.tagName.toLowerCase() == \"input\" &&\n\t\t\t\t\tnode.type && node.type.toLowerCase() == \"radio\" &&\n\t\t\t\t\tnode.name && node.name.toLowerCase();\n\t\t\t}\n\n\t\t\tvar shown = a11y._isElementShown, effectiveTabIndex = a11y.effectiveTabIndex;\n\t\t\tvar walkTree = function(/*DOMNode*/ parent){\n\t\t\t\tfor(var child = parent.firstChild; child; child = child.nextSibling){\n\t\t\t\t\t// Skip text elements, hidden elements, and also non-HTML elements (those in custom namespaces) in IE,\n\t\t\t\t\t// since show() invokes getAttribute(\"type\"), which crash on VML nodes in IE.\n\t\t\t\t\tif(child.nodeType != 1 || (has(\"ie\") <= 9 && child.scopeName !== \"HTML\") || !shown(child)){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar tabindex = effectiveTabIndex(child);\n\t\t\t\t\tif(tabindex >= 0){\n\t\t\t\t\t\tif(tabindex == 0){\n\t\t\t\t\t\t\tif(!first){\n\t\t\t\t\t\t\t\tfirst = child;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlast = child;\n\t\t\t\t\t\t}else if(tabindex > 0){\n\t\t\t\t\t\t\tif(!lowest || tabindex < lowestTabindex){\n\t\t\t\t\t\t\t\tlowestTabindex = tabindex;\n\t\t\t\t\t\t\t\tlowest = child;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(!highest || tabindex >= highestTabindex){\n\t\t\t\t\t\t\t\thighestTabindex = tabindex;\n\t\t\t\t\t\t\t\thighest = child;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar rn = radioName(child);\n\t\t\t\t\t\tif(domAttr.get(child, \"checked\") && rn){\n\t\t\t\t\t\t\tradioSelected[rn] = child;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(child.nodeName.toUpperCase() != 'SELECT'){\n\t\t\t\t\t\twalkTree(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tif(shown(root)){\n\t\t\t\twalkTree(root);\n\t\t\t}\n\t\t\tfunction rs(node){\n\t\t\t\t// substitute checked radio button for unchecked one, if there is a checked one with the same name.\n\t\t\t\treturn radioSelected[radioName(node)] || node;\n\t\t\t}\n\n\t\t\treturn { first: rs(first), last: rs(last), lowest: rs(lowest), highest: rs(highest) };\n\t\t},\n\n\t\tgetFirstInTabbingOrder: function(/*String|DOMNode*/ root, /*Document?*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tFinds the descendant of the specified root node\n\t\t\t//\t\tthat is first in the tabbing order\n\t\t\tvar elems = a11y._getTabNavigable(dom.byId(root, doc));\n\t\t\treturn elems.lowest ? elems.lowest : elems.first; // DomNode\n\t\t},\n\n\t\tgetLastInTabbingOrder: function(/*String|DOMNode*/ root, /*Document?*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tFinds the descendant of the specified root node\n\t\t\t//\t\tthat is last in the tabbing order\n\t\t\tvar elems = a11y._getTabNavigable(dom.byId(root, doc));\n\t\t\treturn elems.last ? elems.last : elems.highest; // DomNode\n\t\t}\n\t};\n\n\thas(\"extend-dojo\") && lang.mixin(dijit, a11y);\n\n\treturn a11y;\n});\n","define([\n\t\"dojo/keys\", // keys.ENTER keys.SPACE\n\t\"dojo/mouse\",\n\t\"dojo/on\",\n\t\"dojo/touch\" // touch support for click is now there\n], function(keys, mouse, on, touch){\n\n\t// module:\n\t//\t\tdijit/a11yclick\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tCustom press, release, and click synthetic events\n\t\t//\t\twhich trigger on a left mouse click, touch, or space/enter keyup.\n\n\t\tclick: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tLogical click operation for mouse, touch, or keyboard (space/enter key)\n\t\t},\n\t\tpress: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tMousedown (left button), touchstart, or keydown (space or enter) corresponding to logical click operation.\n\t\t},\n\t\trelease: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tMouseup (left button), touchend, or keyup (space or enter) corresponding to logical click operation.\n\t\t},\n\t\tmove: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tMouse cursor or a finger is dragged over the given node.\n\t\t}\n\t};\n\t=====*/\n\n\tfunction clickKey(/*Event*/ e){\n\t\t// Test if this keyboard event should be tracked as the start (if keydown) or end (if keyup) of a click event.\n\t\t// Only track for nodes marked to be tracked, and not for buttons or inputs,\n\t\t// since buttons handle keyboard click natively, and text inputs should not\n\t\t// prevent typing spaces or newlines.\n\t\tif((e.keyCode === keys.ENTER || e.keyCode === keys.SPACE) && !/input|button|textarea/i.test(e.target.nodeName)){\n\n\t\t\t// Test if a node or its ancestor has been marked with the dojoClick property to indicate special processing\n\t\t\tfor(var node = e.target; node; node = node.parentNode){\n\t\t\t\tif(node.dojoClick){ return true; }\n\t\t\t}\n\t\t}\n\t}\n\n\tvar lastKeyDownNode;\n\n\ton(document, \"keydown\", function(e){\n\t\t//console.log(\"a11yclick: onkeydown, e.target = \", e.target, \", lastKeyDownNode was \", lastKeyDownNode, \", equality is \", (e.target === lastKeyDownNode));\n\t\tif(clickKey(e)){\n\t\t\t// needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work\n\t\t\tlastKeyDownNode = e.target;\n\n\t\t\t// Prevent viewport scrolling on space key in IE<9.\n\t\t\t// (Reproducible on test_Button.html on any of the first dijit/form/Button examples)\n\t\t\te.preventDefault();\n\t\t}else{\n\t\t\tlastKeyDownNode = null;\n\t\t}\n\t});\n\n\ton(document, \"keyup\", function(e){\n\t\t//console.log(\"a11yclick: onkeyup, e.target = \", e.target, \", lastKeyDownNode was \", lastKeyDownNode, \", equality is \", (e.target === lastKeyDownNode));\n\t\tif(clickKey(e) && e.target == lastKeyDownNode){\t// === breaks greasemonkey\n\t\t\t//need reset here or have problems in FF when focus returns to trigger element after closing popup/alert\n\t\t\tlastKeyDownNode = null;\n\n\t\t\ton.emit(e.target, \"click\", {\n\t\t\t\tcancelable: true,\n\t\t\t\tbubbles: true,\n\t\t\t\tctrlKey: e.ctrlKey,\n\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\tmetaKey: e.metaKey,\n\t\t\t\taltKey: e.altKey,\n\t\t\t\t_origType: e.type\n\t\t\t});\n\t\t}\n\t});\n\n\t// I want to return a hash of the synthetic events, but for backwards compatibility the main return value\n\t// needs to be the click event. Change for 2.0.\n\n\tvar click = function(node, listener){\n\t\t// Set flag on node so that keydown/keyup above emits click event.\n\t\t// Also enables fast click processing from dojo/touch.\n\t\tnode.dojoClick = true;\n\n\t\treturn on(node, \"click\", listener);\n\t};\n\tclick.click = click;\t// forward compatibility with 2.0\n\n\tclick.press = function(node, listener){\n\t\tvar touchListener = on(node, touch.press, function(evt){\n\t\t\tif(evt.type == \"mousedown\" && !mouse.isLeft(evt)){\n\t\t\t\t// Ignore right click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlistener(evt);\n\t\t}), keyListener = on(node, \"keydown\", function(evt){\n\t\t\tif(evt.keyCode === keys.ENTER || evt.keyCode === keys.SPACE){\n\t\t\t\tlistener(evt);\n\t\t\t}\n\t\t});\n\t\treturn {\n\t\t\tremove: function(){\n\t\t\t\ttouchListener.remove();\n\t\t\t\tkeyListener.remove();\n\t\t\t}\n\t\t};\n\t};\n\n\tclick.release = function(node, listener){\n\t\tvar touchListener = on(node, touch.release, function(evt){\n\t\t\tif(evt.type == \"mouseup\" && !mouse.isLeft(evt)){\n\t\t\t\t// Ignore right click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlistener(evt);\n\t\t}), keyListener = on(node, \"keyup\", function(evt){\n\t\t\tif(evt.keyCode === keys.ENTER || evt.keyCode === keys.SPACE){\n\t\t\t\tlistener(evt);\n\t\t\t}\n\t\t});\n\t\treturn {\n\t\t\tremove: function(){\n\t\t\t\ttouchListener.remove();\n\t\t\t\tkeyListener.remove();\n\t\t\t}\n\t\t};\n\t};\n\n\tclick.move = touch.move;\t// just for convenience\n\n\treturn click;\n});\n","define([\n\t\"dojo/aspect\",\n\t\"dojo/_base/declare\", // declare\n\t\"dojo/dom\", // domAttr.get dom.isDescendant\n\t\"dojo/dom-attr\", // domAttr.get dom.isDescendant\n\t\"dojo/dom-class\",\n\t\"dojo/dom-construct\", // connect to domConstruct.empty, domConstruct.destroy\n\t\"dojo/Evented\",\n\t\"dojo/_base/lang\", // lang.hitch\n\t\"dojo/on\",\n\t\"dojo/domReady\",\n\t\"dojo/sniff\", // has(\"ie\")\n\t\"dojo/Stateful\",\n\t\"dojo/_base/window\", // win.body\n\t\"dojo/window\", // winUtils.get\n\t\"./a11y\",\t// a11y.isTabNavigable\n\t\"./registry\",\t// registry.byId\n\t\"./main\"\t\t// to set dijit.focus\n], function(aspect, declare, dom, domAttr, domClass, domConstruct, Evented, lang, on, domReady, has, Stateful, win, winUtils,\n\t\t\ta11y, registry, dijit){\n\n\t// module:\n\t//\t\tdijit/focus\n\n\t// Time of the last focusin event\n\tvar lastFocusin;\n\n\t// Time of the last touch/mousedown or focusin event\n\tvar lastTouchOrFocusin;\n\n\tvar FocusManager = declare([Stateful, Evented], {\n\t\t// summary:\n\t\t//\t\tTracks the currently focused node, and which widgets are currently \"active\".\n\t\t//\t\tAccess via require([\"dijit/focus\"], function(focus){ ... }).\n\t\t//\n\t\t//\t\tA widget is considered active if it or a descendant widget has focus,\n\t\t//\t\tor if a non-focusable node of this widget or a descendant was recently clicked.\n\t\t//\n\t\t//\t\tCall focus.watch(\"curNode\", callback) to track the current focused DOMNode,\n\t\t//\t\tor focus.watch(\"activeStack\", callback) to track the currently focused stack of widgets.\n\t\t//\n\t\t//\t\tCall focus.on(\"widget-blur\", func) or focus.on(\"widget-focus\", ...) to monitor when\n\t\t//\t\twhen widgets become active/inactive\n\t\t//\n\t\t//\t\tFinally, focus(node) will focus a node, suppressing errors if the node doesn't exist.\n\n\t\t// curNode: DomNode\n\t\t//\t\tCurrently focused item on screen\n\t\tcurNode: null,\n\n\t\t// activeStack: dijit/_WidgetBase[]\n\t\t//\t\tList of currently active widgets (focused widget and it's ancestors)\n\t\tactiveStack: [],\n\n\t\tconstructor: function(){\n\t\t\t// Don't leave curNode/prevNode pointing to bogus elements\n\t\t\tvar check = lang.hitch(this, function(node){\n\t\t\t\tif(dom.isDescendant(this.curNode, node)){\n\t\t\t\t\tthis.set(\"curNode\", null);\n\t\t\t\t}\n\t\t\t\tif(dom.isDescendant(this.prevNode, node)){\n\t\t\t\t\tthis.set(\"prevNode\", null);\n\t\t\t\t}\n\t\t\t});\n\t\t\taspect.before(domConstruct, \"empty\", check);\n\t\t\taspect.before(domConstruct, \"destroy\", check);\n\t\t},\n\n\t\tregisterIframe: function(/*DomNode*/ iframe){\n\t\t\t// summary:\n\t\t\t//\t\tRegisters listeners on the specified iframe so that any click\n\t\t\t//\t\tor focus event on that iframe (or anything in it) is reported\n\t\t\t//\t\tas a focus/click event on the `<iframe>` itself.\n\t\t\t// description:\n\t\t\t//\t\tCurrently only used by editor.\n\t\t\t// returns:\n\t\t\t//\t\tHandle with remove() method to deregister.\n\t\t\treturn this.registerWin(iframe.contentWindow, iframe);\n\t\t},\n\n\t\tregisterWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){\n\t\t\t// summary:\n\t\t\t//\t\tRegisters listeners on the specified window (either the main\n\t\t\t//\t\twindow or an iframe's window) to detect when the user has clicked somewhere\n\t\t\t//\t\tor focused somewhere.\n\t\t\t// description:\n\t\t\t//\t\tUsers should call registerIframe() instead of this method.\n\t\t\t// targetWindow:\n\t\t\t//\t\tIf specified this is the window associated with the iframe,\n\t\t\t//\t\ti.e. iframe.contentWindow.\n\t\t\t// effectiveNode:\n\t\t\t//\t\tIf specified, report any focus events inside targetWindow as\n\t\t\t//\t\tan event on effectiveNode, rather than on evt.target.\n\t\t\t// returns:\n\t\t\t//\t\tHandle with remove() method to deregister.\n\n\t\t\t// TODO: make this function private in 2.0; Editor/users should call registerIframe(),\n\n\t\t\t// Listen for blur and focus events on targetWindow's document.\n\t\t\tvar _this = this,\n\t\t\t\tbody = targetWindow.document && targetWindow.document.body;\n\n\t\t\tif(body){\n\t\t\t\t// Listen for touches or mousedowns... could also use dojo/touch.press here.\n\t\t\t\tvar event = has(\"pointer-events\") ? \"pointerdown\" : has(\"MSPointer\") ? \"MSPointerDown\" :\n\t\t\t\t\thas(\"touch-events\") ? \"mousedown, touchstart\" : \"mousedown\";\n\t\t\t\tvar mdh = on(targetWindow.document, event, function(evt){\n\t\t\t\t\t// workaround weird IE bug where the click is on an orphaned node\n\t\t\t\t\t// (first time clicking a Select/DropDownButton inside a TooltipDialog).\n\t\t\t\t\t// actually, strangely this is happening on latest chrome too.\n\t\t\t\t\tif(evt && evt.target && evt.target.parentNode == null){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t_this._onTouchNode(effectiveNode || evt.target, \"mouse\");\n\t\t\t\t});\n\n\t\t\t\tvar fih = on(body, 'focusin', function(evt){\n\t\t\t\t\t// When you refocus the browser window, IE gives an event with an empty srcElement\n\t\t\t\t\tif(!evt.target.tagName) { return; }\n\n\t\t\t\t\t// IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1,\n\t\t\t\t\t// ignore those events\n\t\t\t\t\tvar tag = evt.target.tagName.toLowerCase();\n\t\t\t\t\tif(tag == \"#document\" || tag == \"body\"){ return; }\n\n\t\t\t\t\tif(a11y.isFocusable(evt.target)){\n\t\t\t\t\t\t_this._onFocusNode(effectiveNode || evt.target);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// Previous code called _onTouchNode() for any activate event on a non-focusable node. Can\n\t\t\t\t\t\t// probably just ignore such an event as it will be handled by onmousedown handler above, but\n\t\t\t\t\t\t// leaving the code for now.\n\t\t\t\t\t\t_this._onTouchNode(effectiveNode || evt.target);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tvar foh = on(body, 'focusout', function(evt){\n\t\t\t\t\t_this._onBlurNode(effectiveNode || evt.target);\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tremove: function(){\n\t\t\t\t\t\tmdh.remove();\n\t\t\t\t\t\tfih.remove();\n\t\t\t\t\t\tfoh.remove();\n\t\t\t\t\t\tmdh = fih = foh = null;\n\t\t\t\t\t\tbody = null;\t// prevent memory leak (apparent circular reference via closure)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t_onBlurNode: function(/*DomNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tCalled when focus leaves a node.\n\t\t\t//\t\tUsually ignored, _unless_ it *isn't* followed by touching another node,\n\t\t\t//\t\twhich indicates that we tabbed off the last field on the page,\n\t\t\t//\t\tin which case every widget is marked inactive\n\n\t\t\tvar now = (new Date()).getTime();\n\n\t\t\t// IE9+ and chrome have a problem where focusout events come after the corresponding focusin event.\n\t\t\t// For chrome problem see https://bugs.dojotoolkit.org/ticket/17668.\n\t\t\t// IE problem happens when moving focus from the Editor's <iframe> to a normal DOMNode.\n\t\t\tif(now < lastFocusin + 100){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the blur event isn't followed by a focus event, it means the user clicked on something unfocusable,\n\t\t\t// so clear focus.\n\t\t\tif(this._clearFocusTimer){\n\t\t\t\tclearTimeout(this._clearFocusTimer);\n\t\t\t}\n\t\t\tthis._clearFocusTimer = setTimeout(lang.hitch(this, function(){\n\t\t\t\tthis.set(\"prevNode\", this.curNode);\n\t\t\t\tthis.set(\"curNode\", null);\n\t\t\t}), 0);\n\n\t\t\t// Unset timer to zero-out widget stack; we'll reset it below if appropriate.\n\t\t\tif(this._clearActiveWidgetsTimer){\n\t\t\t\tclearTimeout(this._clearActiveWidgetsTimer);\n\t\t\t}\n\n\t\t\tif(now < lastTouchOrFocusin + 100){\n\t\t\t\t// This blur event is coming late (after the call to _onTouchNode() rather than before.\n\t\t\t\t// So let _onTouchNode() handle setting the widget stack.\n\t\t\t\t// See https://bugs.dojotoolkit.org/ticket/17668\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the blur event isn't followed (or preceded) by a focus or touch event then mark all widgets as inactive.\n\t\t\tthis._clearActiveWidgetsTimer = setTimeout(lang.hitch(this, function(){\n\t\t\t\tdelete this._clearActiveWidgetsTimer;\n\t\t\t\tthis._setStack([]);\n\t\t\t}), 0);\n\t\t},\n\n\t\t_onTouchNode: function(/*DomNode*/ node, /*String*/ by){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when node is focused or touched.\n\t\t\t//\t\tNote that _onFocusNode() calls _onTouchNode().\n\t\t\t// node:\n\t\t\t//\t\tThe node that was touched.\n\t\t\t// by:\n\t\t\t//\t\t\"mouse\" if the focus/touch was caused by a mouse down event\n\n\t\t\t// Keep track of time of last focusin or touch event.\n\t\t\tlastTouchOrFocusin = (new Date()).getTime();\n\n\t\t\tif(this._clearActiveWidgetsTimer){\n\t\t\t\t// forget the recent blur event\n\t\t\t\tclearTimeout(this._clearActiveWidgetsTimer);\n\t\t\t\tdelete this._clearActiveWidgetsTimer;\n\t\t\t}\n\n\t\t\t// if the click occurred on the scrollbar of a dropdown, treat it as a click on the dropdown,\n\t\t\t// even though the scrollbar is technically on the popup wrapper (see #10631)\n\t\t\tif(domClass.contains(node, \"dijitPopup\")){\n\t\t\t\tnode = node.firstChild;\n\t\t\t}\n\n\t\t\t// compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem)\n\t\t\tvar newStack=[];\n\t\t\ttry{\n\t\t\t\twhile(node){\n\t\t\t\t\tvar popupParent = domAttr.get(node, \"dijitPopupParent\");\n\t\t\t\t\tif(popupParent){\n\t\t\t\t\t\tnode=registry.byId(popupParent).domNode;\n\t\t\t\t\t}else if(node.tagName && node.tagName.toLowerCase() == \"body\"){\n\t\t\t\t\t\t// is this the root of the document or just the root of an iframe?\n\t\t\t\t\t\tif(node === win.body()){\n\t\t\t\t\t\t\t// node is the root of the main document\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// otherwise, find the iframe this node refers to (can't access it via parentNode,\n\t\t\t\t\t\t// need to do this trick instead). window.frameElement is supported in IE/FF/Webkit\n\t\t\t\t\t\tnode=winUtils.get(node.ownerDocument).frameElement;\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// if this node is the root node of a widget, then add widget id to stack,\n\t\t\t\t\t\t// except ignore clicks on disabled widgets (actually focusing a disabled widget still works,\n\t\t\t\t\t\t// to support MenuItem)\n\t\t\t\t\t\tvar id = node.getAttribute && node.getAttribute(\"widgetId\"),\n\t\t\t\t\t\t\twidget = id && registry.byId(id);\n\t\t\t\t\t\tif(widget && !(by == \"mouse\" && widget.get(\"disabled\"))){\n\t\t\t\t\t\t\tnewStack.unshift(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnode=node.parentNode;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}catch(e){ /* squelch */ }\n\n\t\t\tthis._setStack(newStack, by);\n\t\t},\n\n\t\t_onFocusNode: function(/*DomNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tCallback when node is focused\n\n\t\t\tif(!node){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(node.nodeType == 9){\n\t\t\t\t// Ignore focus events on the document itself. This is here so that\n\t\t\t\t// (for example) clicking the up/down arrows of a spinner\n\t\t\t\t// (which don't get focus) won't cause that widget to blur. (FF issue)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Keep track of time of last focusin event.\n\t\t\tlastFocusin = (new Date()).getTime();\n\n\t\t\t// There was probably a blur event right before this event, but since we have a new focus,\n\t\t\t// forget about the blur\n\t\t\tif(this._clearFocusTimer){\n\t\t\t\tclearTimeout(this._clearFocusTimer);\n\t\t\t\tdelete this._clearFocusTimer;\n\t\t\t}\n\n\t\t\tthis._onTouchNode(node);\n\n\t\t\tif(node == this.curNode){ return; }\n\t\t\tthis.set(\"prevNode\", this.curNode);\n\t\t\tthis.set(\"curNode\", node);\n\t\t},\n\n\t\t_setStack: function(/*String[]*/ newStack, /*String*/ by){\n\t\t\t// summary:\n\t\t\t//\t\tThe stack of active widgets has changed. Send out appropriate events and records new stack.\n\t\t\t// newStack:\n\t\t\t//\t\tarray of widget id's, starting from the top (outermost) widget\n\t\t\t// by:\n\t\t\t//\t\t\"mouse\" if the focus/touch was caused by a mouse down event\n\n\t\t\tvar oldStack = this.activeStack, lastOldIdx = oldStack.length - 1, lastNewIdx = newStack.length - 1;\n\n\t\t\tif(newStack[lastNewIdx] == oldStack[lastOldIdx]){\n\t\t\t\t// no changes, return now to avoid spurious notifications about changes to activeStack\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.set(\"activeStack\", newStack);\n\n\t\t\tvar widget, i;\n\n\t\t\t// for all elements that have gone out of focus, set focused=false\n\t\t\tfor(i = lastOldIdx; i >= 0 && oldStack[i] != newStack[i]; i--){\n\t\t\t\twidget = registry.byId(oldStack[i]);\n\t\t\t\tif(widget){\n\t\t\t\t\twidget._hasBeenBlurred = true;\t\t// TODO: used by form widgets, should be moved there\n\t\t\t\t\twidget.set(\"focused\", false);\n\t\t\t\t\tif(widget._focusManager == this){\n\t\t\t\t\t\twidget._onBlur(by);\n\t\t\t\t\t}\n\t\t\t\t\tthis.emit(\"widget-blur\", widget, by);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// for all element that have come into focus, set focused=true\n\t\t\tfor(i++; i <= lastNewIdx; i++){\n\t\t\t\twidget = registry.byId(newStack[i]);\n\t\t\t\tif(widget){\n\t\t\t\t\twidget.set(\"focused\", true);\n\t\t\t\t\tif(widget._focusManager == this){\n\t\t\t\t\t\twidget._onFocus(by);\n\t\t\t\t\t}\n\t\t\t\t\tthis.emit(\"widget-focus\", widget, by);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfocus: function(node){\n\t\t\t// summary:\n\t\t\t//\t\tFocus the specified node, suppressing errors if they occur\n\t\t\tif(node){\n\t\t\t\ttry{ node.focus(); }catch(e){/*quiet*/}\n\t\t\t}\n\t\t}\n\t});\n\n\tvar singleton = new FocusManager();\n\n\t// register top window and all the iframes it contains\n\tdomReady(function(){\n\t\tvar handle = singleton.registerWin(winUtils.get(document));\n\t\tif(has(\"ie\")){\n\t\t\ton(window, \"unload\", function(){\n\t\t\t\tif(handle){\t// because this gets called twice when doh.robot is running\n\t\t\t\t\thandle.remove();\n\t\t\t\t\thandle = null;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t// Setup dijit.focus as a pointer to the singleton but also (for backwards compatibility)\n\t// as a function to set focus. Remove for 2.0.\n\tdijit.focus = function(node){\n\t\tsingleton.focus(node);\t// indirection here allows dijit/_base/focus.js to override behavior\n\t};\n\tfor(var attr in singleton){\n\t\tif(!/^_/.test(attr)){\n\t\t\tdijit.focus[attr] = typeof singleton[attr] == \"function\" ? lang.hitch(singleton, attr) : singleton[attr];\n\t\t}\n\t}\n\tsingleton.watch(function(attr, oldVal, newVal){\n\t\tdijit.focus[attr] = newVal;\n\t});\n\n\treturn singleton;\n});\n","define([\"dojo/dom-class\", \"dojo/hccss\", \"dojo/domReady\", \"dojo/_base/window\"], function(domClass, has, domReady, win){\n\n\t// module:\n\t//\t\tdijit/hccss\n\n\t/*=====\n\treturn function(){\n\t\t// summary:\n\t\t//\t\tTest if computer is in high contrast mode, and sets `dijit_a11y` flag on `<body>` if it is.\n\t\t//\t\tDeprecated, use ``dojo/hccss`` instead.\n\t};\n\t=====*/\n\n\tdomReady(function(){\n\t\tif(has(\"highcontrast\")){\n\t\t\tdomClass.add(win.body(), \"dijit_a11y\");\n\t\t}\n\t});\n\n\treturn has;\n});\n","define([\n\t\"dojo/_base/kernel\"\n], function(dojo){\n\t// module:\n\t//\t\tdijit/main\n\n/*=====\nreturn {\n\t// summary:\n\t//\t\tThe dijit package main module.\n\t//\t\tDeprecated. Users should access individual modules (ex: dijit/registry) directly.\n};\n=====*/\n\n\treturn dojo.dijit;\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map array.some\n\t\"dojo/dom-geometry\", // domGeometry.position\n\t\"dojo/dom-style\", // domStyle.getComputedStyle\n\t\"dojo/_base/kernel\", // kernel.deprecated\n\t\"dojo/_base/window\", // win.body\n\t\"./Viewport\", // getEffectiveBox\n\t\"./main\"\t// dijit (defining dijit.place to match API doc)\n], function(array, domGeometry, domStyle, kernel, win, Viewport, dijit){\n\n\t// module:\n\t//\t\tdijit/place\n\n\n\tfunction _place(/*DomNode*/ node, choices, layoutNode, aroundNodeCoords){\n\t\t// summary:\n\t\t//\t\tGiven a list of spots to put node, put it at the first spot where it fits,\n\t\t//\t\tof if it doesn't fit anywhere then the place with the least overflow\n\t\t// choices: Array\n\t\t//\t\tArray of elements like: {corner: 'TL', pos: {x: 10, y: 20} }\n\t\t//\t\tAbove example says to put the top-left corner of the node at (10,20)\n\t\t// layoutNode: Function(node, aroundNodeCorner, nodeCorner, size)\n\t\t//\t\tfor things like tooltip, they are displayed differently (and have different dimensions)\n\t\t//\t\tbased on their orientation relative to the parent.\t This adjusts the popup based on orientation.\n\t\t//\t\tIt also passes in the available size for the popup, which is useful for tooltips to\n\t\t//\t\ttell them that their width is limited to a certain amount.\t layoutNode() may return a value expressing\n\t\t//\t\thow much the popup had to be modified to fit into the available space.\t This is used to determine\n\t\t//\t\twhat the best placement is.\n\t\t// aroundNodeCoords: Object\n\t\t//\t\tSize of aroundNode, ex: {w: 200, h: 50}\n\n\t\t// get {x: 10, y: 10, w: 100, h:100} type obj representing position of\n\t\t// viewport over document\n\t\tvar view = Viewport.getEffectiveBox(node.ownerDocument);\n\n\t\t// This won't work if the node is inside a <div style=\"position: relative\">,\n\t\t// so reattach it to <body>.\t (Otherwise, the positioning will be wrong\n\t\t// and also it might get cutoff.)\n\t\tif(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != \"body\"){\n\t\t\twin.body(node.ownerDocument).appendChild(node);\n\t\t}\n\n\t\tvar best = null;\n\t\tarray.some(choices, function(choice){\n\t\t\tvar corner = choice.corner;\n\t\t\tvar pos = choice.pos;\n\t\t\tvar overflow = 0;\n\n\t\t\t// calculate amount of space available given specified position of node\n\t\t\tvar spaceAvailable = {\n\t\t\t\tw: {\n\t\t\t\t\t'L': view.l + view.w - pos.x,\n\t\t\t\t\t'R': pos.x - view.l,\n\t\t\t\t\t'M': view.w\n\t\t\t\t}[corner.charAt(1)],\n\t\t\t\th: {\n\t\t\t\t\t'T': view.t + view.h - pos.y,\n\t\t\t\t\t'B': pos.y - view.t,\n\t\t\t\t\t'M': view.h\n\t\t\t\t}[corner.charAt(0)]\n\t\t\t};\n\n\t\t\t// Clear left/right position settings set earlier so they don't interfere with calculations,\n\t\t\t// specifically when layoutNode() (a.k.a. Tooltip.orient()) measures natural width of Tooltip\n\t\t\tvar s = node.style;\n\t\t\ts.left = s.right = \"auto\";\n\n\t\t\t// configure node to be displayed in given position relative to button\n\t\t\t// (need to do this in order to get an accurate size for the node, because\n\t\t\t// a tooltip's size changes based on position, due to triangle)\n\t\t\tif(layoutNode){\n\t\t\t\tvar res = layoutNode(node, choice.aroundCorner, corner, spaceAvailable, aroundNodeCoords);\n\t\t\t\toverflow = typeof res == \"undefined\" ? 0 : res;\n\t\t\t}\n\n\t\t\t// get node's size\n\t\t\tvar style = node.style;\n\t\t\tvar oldDisplay = style.display;\n\t\t\tvar oldVis = style.visibility;\n\t\t\tif(style.display == \"none\"){\n\t\t\t\tstyle.visibility = \"hidden\";\n\t\t\t\tstyle.display = \"\";\n\t\t\t}\n\t\t\tvar bb = domGeometry.position(node);\n\t\t\tstyle.display = oldDisplay;\n\t\t\tstyle.visibility = oldVis;\n\n\t\t\t// coordinates and size of node with specified corner placed at pos,\n\t\t\t// and clipped by viewport\n\t\t\tvar\n\t\t\t\tstartXpos = {\n\t\t\t\t\t'L': pos.x,\n\t\t\t\t\t'R': pos.x - bb.w,\n\t\t\t\t\t'M': Math.max(view.l, Math.min(view.l + view.w, pos.x + (bb.w >> 1)) - bb.w) // M orientation is more flexible\n\t\t\t\t}[corner.charAt(1)],\n\t\t\t\tstartYpos = {\n\t\t\t\t\t'T': pos.y,\n\t\t\t\t\t'B': pos.y - bb.h,\n\t\t\t\t\t'M': Math.max(view.t, Math.min(view.t + view.h, pos.y + (bb.h >> 1)) - bb.h)\n\t\t\t\t}[corner.charAt(0)],\n\t\t\t\tstartX = Math.max(view.l, startXpos),\n\t\t\t\tstartY = Math.max(view.t, startYpos),\n\t\t\t\tendX = Math.min(view.l + view.w, startXpos + bb.w),\n\t\t\t\tendY = Math.min(view.t + view.h, startYpos + bb.h),\n\t\t\t\twidth = endX - startX,\n\t\t\t\theight = endY - startY;\n\n\t\t\toverflow += (bb.w - width) + (bb.h - height);\n\n\t\t\tif(best == null || overflow < best.overflow){\n\t\t\t\tbest = {\n\t\t\t\t\tcorner: corner,\n\t\t\t\t\taroundCorner: choice.aroundCorner,\n\t\t\t\t\tx: startX,\n\t\t\t\t\ty: startY,\n\t\t\t\t\tw: width,\n\t\t\t\t\th: height,\n\t\t\t\t\toverflow: overflow,\n\t\t\t\t\tspaceAvailable: spaceAvailable\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn !overflow;\n\t\t});\n\n\t\t// In case the best position is not the last one we checked, need to call\n\t\t// layoutNode() again.\n\t\tif(best.overflow && layoutNode){\n\t\t\tlayoutNode(node, best.aroundCorner, best.corner, best.spaceAvailable, aroundNodeCoords);\n\t\t}\n\n\t\t// And then position the node. Do this last, after the layoutNode() above\n\t\t// has sized the node, due to browser quirks when the viewport is scrolled\n\t\t// (specifically that a Tooltip will shrink to fit as though the window was\n\t\t// scrolled to the left).\n\n\t\tvar top = best.y,\n\t\t\tside = best.x,\n\t\t\tbody = win.body(node.ownerDocument);\n\n\t\tif(/relative|absolute/.test(domStyle.get(body, \"position\"))){\n\t\t\t// compensate for margin on <body>, see #16148\n\t\t\ttop -= domStyle.get(body, \"marginTop\");\n\t\t\tside -= domStyle.get(body, \"marginLeft\");\n\t\t}\n\n\t\tvar s = node.style;\n\t\ts.top = top + \"px\";\n\t\ts.left = side + \"px\";\n\t\ts.right = \"auto\";\t// needed for FF or else tooltip goes to far left\n\n\t\treturn best;\n\t}\n\n\tvar reverse = {\n\t\t// Map from corner to kitty-corner\n\t\t\"TL\": \"BR\",\n\t\t\"TR\": \"BL\",\n\t\t\"BL\": \"TR\",\n\t\t\"BR\": \"TL\"\n\t};\n\n\tvar place = {\n\t\t// summary:\n\t\t//\t\tCode to place a DOMNode relative to another DOMNode.\n\t\t//\t\tLoad using require([\"dijit/place\"], function(place){ ... }).\n\n\t\tat: function(node, pos, corners, padding, layoutNode){\n\t\t\t// summary:\n\t\t\t//\t\tPositions node kitty-corner to the rectangle centered at (pos.x, pos.y) with width and height of\n\t\t\t//\t\tpadding.x * 2 and padding.y * 2, or zero if padding not specified. Picks first corner in corners[]\n\t\t\t//\t\twhere node is fully visible, or the corner where it's most visible.\n\t\t\t//\n\t\t\t//\t\tNode is assumed to be absolutely or relatively positioned.\n\t\t\t// node: DOMNode\n\t\t\t//\t\tThe node to position\n\t\t\t// pos: dijit/place.__Position\n\t\t\t//\t\tObject like {x: 10, y: 20}\n\t\t\t// corners: String[]\n\t\t\t//\t\tArray of Strings representing order to try corners of the node in, like [\"TR\", \"BL\"].\n\t\t\t//\t\tPossible values are:\n\t\t\t//\n\t\t\t//\t\t- \"BL\" - bottom left\n\t\t\t//\t\t- \"BR\" - bottom right\n\t\t\t//\t\t- \"TL\" - top left\n\t\t\t//\t\t- \"TR\" - top right\n\t\t\t// padding: dijit/place.__Position?\n\t\t\t//\t\tOptional param to set padding, to put some buffer around the element you want to position.\n\t\t\t//\t\tDefaults to zero.\n\t\t\t// layoutNode: Function(node, aroundNodeCorner, nodeCorner)\n\t\t\t//\t\tFor things like tooltip, they are displayed differently (and have different dimensions)\n\t\t\t//\t\tbased on their orientation relative to the parent. This adjusts the popup based on orientation.\n\t\t\t// example:\n\t\t\t//\t\tTry to place node's top right corner at (10,20).\n\t\t\t//\t\tIf that makes node go (partially) off screen, then try placing\n\t\t\t//\t\tbottom left corner at (10,20).\n\t\t\t//\t|\tplace(node, {x: 10, y: 20}, [\"TR\", \"BL\"])\n\t\t\tvar choices = array.map(corners, function(corner){\n\t\t\t\tvar c = {\n\t\t\t\t\tcorner: corner,\n\t\t\t\t\taroundCorner: reverse[corner],\t// so TooltipDialog.orient() gets aroundCorner argument set\n\t\t\t\t\tpos: {x: pos.x,y: pos.y}\n\t\t\t\t};\n\t\t\t\tif(padding){\n\t\t\t\t\tc.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x;\n\t\t\t\t\tc.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y;\n\t\t\t\t}\n\t\t\t\treturn c;\n\t\t\t});\n\n\t\t\treturn _place(node, choices, layoutNode);\n\t\t},\n\n\t\taround: function(\n\t\t\t/*DomNode*/\t\tnode,\n\t\t\t/*DomNode|dijit/place.__Rectangle*/ anchor,\n\t\t\t/*String[]*/\tpositions,\n\t\t\t/*Boolean*/\t\tleftToRight,\n\t\t\t/*Function?*/\tlayoutNode){\n\n\t\t\t// summary:\n\t\t\t//\t\tPosition node adjacent or kitty-corner to anchor\n\t\t\t//\t\tsuch that it's fully visible in viewport.\n\t\t\t// description:\n\t\t\t//\t\tPlace node such that corner of node touches a corner of\n\t\t\t//\t\taroundNode, and that node is fully visible.\n\t\t\t// anchor:\n\t\t\t//\t\tEither a DOMNode or a rectangle (object with x, y, width, height).\n\t\t\t// positions:\n\t\t\t//\t\tOrdered list of positions to try matching up.\n\t\t\t//\n\t\t\t//\t\t- before: places drop down to the left of the anchor node/widget, or to the right in the case\n\t\t\t//\t\t\tof RTL scripts like Hebrew and Arabic; aligns either the top of the drop down\n\t\t\t//\t\t\twith the top of the anchor, or the bottom of the drop down with bottom of the anchor.\n\t\t\t//\t\t- after: places drop down to the right of the anchor node/widget, or to the left in the case\n\t\t\t//\t\t\tof RTL scripts like Hebrew and Arabic; aligns either the top of the drop down\n\t\t\t//\t\t\twith the top of the anchor, or the bottom of the drop down with bottom of the anchor.\n\t\t\t//\t\t- before-centered: centers drop down to the left of the anchor node/widget, or to the right\n\t\t\t//\t\t\tin the case of RTL scripts like Hebrew and Arabic\n\t\t\t//\t\t- after-centered: centers drop down to the right of the anchor node/widget, or to the left\n\t\t\t//\t\t\tin the case of RTL scripts like Hebrew and Arabic\n\t\t\t//\t\t- above-centered: drop down is centered above anchor node\n\t\t\t//\t\t- above: drop down goes above anchor node, left sides aligned\n\t\t\t//\t\t- above-alt: drop down goes above anchor node, right sides aligned\n\t\t\t//\t\t- below-centered: drop down is centered above anchor node\n\t\t\t//\t\t- below: drop down goes below anchor node\n\t\t\t//\t\t- below-alt: drop down goes below anchor node, right sides aligned\n\t\t\t// layoutNode: Function(node, aroundNodeCorner, nodeCorner)\n\t\t\t//\t\tFor things like tooltip, they are displayed differently (and have different dimensions)\n\t\t\t//\t\tbased on their orientation relative to the parent.\t This adjusts the popup based on orientation.\n\t\t\t// leftToRight:\n\t\t\t//\t\tTrue if widget is LTR, false if widget is RTL. Affects the behavior of \"above\" and \"below\"\n\t\t\t//\t\tpositions slightly.\n\t\t\t// example:\n\t\t\t//\t|\tplaceAroundNode(node, aroundNode, ['below', 'above-alt']);\n\t\t\t//\t\tThis will try to position node such that node's top-left corner is at the same position\n\t\t\t//\t\tas the bottom left corner of the aroundNode (ie, put node below\n\t\t\t//\t\taroundNode, with left edges aligned).\tIf that fails it will try to put\n\t\t\t//\t\tthe bottom-right corner of node where the top right corner of aroundNode is\n\t\t\t//\t\t(ie, put node above aroundNode, with right edges aligned)\n\t\t\t//\n\n\t\t\t// If around is a DOMNode (or DOMNode id), convert to coordinates.\n\t\t\tvar aroundNodePos;\n\t\t\tif(typeof anchor == \"string\" || \"offsetWidth\" in anchor || \"ownerSVGElement\" in anchor){\n\t\t\t\taroundNodePos = domGeometry.position(anchor, true);\n\n\t\t\t\t// For above and below dropdowns, subtract width of border so that popup and aroundNode borders\n\t\t\t\t// overlap, preventing a double-border effect. Unfortunately, difficult to measure the border\n\t\t\t\t// width of either anchor or popup because in both cases the border may be on an inner node.\n\t\t\t\tif(/^(above|below)/.test(positions[0])){\n\t\t\t\t\tvar anchorBorder = domGeometry.getBorderExtents(anchor),\n\t\t\t\t\t\tanchorChildBorder = anchor.firstChild ? domGeometry.getBorderExtents(anchor.firstChild) : {t:0,l:0,b:0,r:0},\n\t\t\t\t\t\tnodeBorder = domGeometry.getBorderExtents(node),\n\t\t\t\t\t\tnodeChildBorder = node.firstChild ? domGeometry.getBorderExtents(node.firstChild) : {t:0,l:0,b:0,r:0};\n\t\t\t\t\taroundNodePos.y += Math.min(anchorBorder.t + anchorChildBorder.t, nodeBorder.t + nodeChildBorder.t);\n\t\t\t\t\taroundNodePos.h -= Math.min(anchorBorder.t + anchorChildBorder.t, nodeBorder.t+ nodeChildBorder.t) +\n\t\t\t\t\t\tMath.min(anchorBorder.b + anchorChildBorder.b, nodeBorder.b + nodeChildBorder.b);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\taroundNodePos = anchor;\n\t\t\t}\n\n\t\t\t// Compute position and size of visible part of anchor (it may be partially hidden by ancestor nodes w/scrollbars)\n\t\t\tif(anchor.parentNode){\n\t\t\t\t// ignore nodes between position:relative and position:absolute\n\t\t\t\tvar sawPosAbsolute = domStyle.getComputedStyle(anchor).position == \"absolute\";\n\t\t\t\tvar parent = anchor.parentNode;\n\t\t\t\twhile(parent && parent.nodeType == 1 && parent.nodeName != \"BODY\"){ //ignoring the body will help performance\n\t\t\t\t\tvar parentPos = domGeometry.position(parent, true),\n\t\t\t\t\t\tpcs = domStyle.getComputedStyle(parent);\n\t\t\t\t\tif(/relative|absolute/.test(pcs.position)){\n\t\t\t\t\t\tsawPosAbsolute = false;\n\t\t\t\t\t}\n\t\t\t\t\tif(!sawPosAbsolute && /hidden|auto|scroll/.test(pcs.overflow)){\n\t\t\t\t\t\tvar bottomYCoord = Math.min(aroundNodePos.y + aroundNodePos.h, parentPos.y + parentPos.h);\n\t\t\t\t\t\tvar rightXCoord = Math.min(aroundNodePos.x + aroundNodePos.w, parentPos.x + parentPos.w);\n\t\t\t\t\t\taroundNodePos.x = Math.max(aroundNodePos.x, parentPos.x);\n\t\t\t\t\t\taroundNodePos.y = Math.max(aroundNodePos.y, parentPos.y);\n\t\t\t\t\t\taroundNodePos.h = bottomYCoord - aroundNodePos.y;\n\t\t\t\t\t\taroundNodePos.w = rightXCoord - aroundNodePos.x;\n\t\t\t\t\t}\n\t\t\t\t\tif(pcs.position == \"absolute\"){\n\t\t\t\t\t\tsawPosAbsolute = true;\n\t\t\t\t\t}\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar x = aroundNodePos.x,\n\t\t\t\ty = aroundNodePos.y,\n\t\t\t\twidth = \"w\" in aroundNodePos ? aroundNodePos.w : (aroundNodePos.w = aroundNodePos.width),\n\t\t\t\theight = \"h\" in aroundNodePos ? aroundNodePos.h : (kernel.deprecated(\"place.around: dijit/place.__Rectangle: { x:\"+x+\", y:\"+y+\", height:\"+aroundNodePos.height+\", width:\"+width+\" } has been deprecated. Please use { x:\"+x+\", y:\"+y+\", h:\"+aroundNodePos.height+\", w:\"+width+\" }\", \"\", \"2.0\"), aroundNodePos.h = aroundNodePos.height);\n\n\t\t\t// Convert positions arguments into choices argument for _place()\n\t\t\tvar choices = [];\n\t\t\tfunction push(aroundCorner, corner){\n\t\t\t\tchoices.push({\n\t\t\t\t\taroundCorner: aroundCorner,\n\t\t\t\t\tcorner: corner,\n\t\t\t\t\tpos: {\n\t\t\t\t\t\tx: {\n\t\t\t\t\t\t\t'L': x,\n\t\t\t\t\t\t\t'R': x + width,\n\t\t\t\t\t\t\t'M': x + (width >> 1)\n\t\t\t\t\t\t}[aroundCorner.charAt(1)],\n\t\t\t\t\t\ty: {\n\t\t\t\t\t\t\t'T': y,\n\t\t\t\t\t\t\t'B': y + height,\n\t\t\t\t\t\t\t'M': y + (height >> 1)\n\t\t\t\t\t\t}[aroundCorner.charAt(0)]\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tarray.forEach(positions, function(pos){\n\t\t\t\tvar ltr = leftToRight;\n\t\t\t\tswitch(pos){\n\t\t\t\t\tcase \"above-centered\":\n\t\t\t\t\t\tpush(\"TM\", \"BM\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"below-centered\":\n\t\t\t\t\t\tpush(\"BM\", \"TM\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"after-centered\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"before-centered\":\n\t\t\t\t\t\tpush(ltr ? \"ML\" : \"MR\", ltr ? \"MR\" : \"ML\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"after\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"before\":\n\t\t\t\t\t\tpush(ltr ? \"TL\" : \"TR\", ltr ? \"TR\" : \"TL\");\n\t\t\t\t\t\tpush(ltr ? \"BL\" : \"BR\", ltr ? \"BR\" : \"BL\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"below-alt\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"below\":\n\t\t\t\t\t\t// first try to align left borders, next try to align right borders (or reverse for RTL mode)\n\t\t\t\t\t\tpush(ltr ? \"BL\" : \"BR\", ltr ? \"TL\" : \"TR\");\n\t\t\t\t\t\tpush(ltr ? \"BR\" : \"BL\", ltr ? \"TR\" : \"TL\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"above-alt\":\n\t\t\t\t\t\tltr = !ltr;\n\t\t\t\t\t\t// fall through\n\t\t\t\t\tcase \"above\":\n\t\t\t\t\t\t// first try to align left borders, next try to align right borders (or reverse for RTL mode)\n\t\t\t\t\t\tpush(ltr ? \"TL\" : \"TR\", ltr ? \"BL\" : \"BR\");\n\t\t\t\t\t\tpush(ltr ? \"TR\" : \"TL\", ltr ? \"BR\" : \"BL\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// To assist dijit/_base/place, accept arguments of type {aroundCorner: \"BL\", corner: \"TL\"}.\n\t\t\t\t\t\t// Not meant to be used directly. Remove for 2.0.\n\t\t\t\t\t\tpush(pos.aroundCorner, pos.corner);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar position = _place(node, choices, layoutNode, {w: width, h: height});\n\t\t\tposition.aroundNodePos = aroundNodePos;\n\n\t\t\treturn position;\n\t\t}\n\t};\n\n\t/*=====\n\tplace.__Position = {\n\t\t// x: Integer\n\t\t//\t\thorizontal coordinate in pixels, relative to document body\n\t\t// y: Integer\n\t\t//\t\tvertical coordinate in pixels, relative to document body\n\t};\n\tplace.__Rectangle = {\n\t\t// x: Integer\n\t\t//\t\thorizontal offset in pixels, relative to document body\n\t\t// y: Integer\n\t\t//\t\tvertical offset in pixels, relative to document body\n\t\t// w: Integer\n\t\t//\t\twidth in pixels. Can also be specified as \"width\" for backwards-compatibility.\n\t\t// h: Integer\n\t\t//\t\theight in pixels. Can also be specified as \"height\" for backwards-compatibility.\n\t};\n\t=====*/\n\n\treturn dijit.place = place;\t// setting dijit.place for back-compat, remove for 2.0\n});\n","define([\n\t\"dojo/_base/array\", // array.forEach array.map\n\t\"dojo/_base/window\", // win.body\n\t\"./main\"\t// dijit._scopeName\n], function(array, win, dijit){\n\n\t// module:\n\t//\t\tdijit/registry\n\n\tvar _widgetTypeCtr = {}, hash = {};\n\n\tvar registry = {\n\t\t// summary:\n\t\t//\t\tRegistry of existing widget on page, plus some utility methods.\n\n\t\t// length: Number\n\t\t//\t\tNumber of registered widgets\n\t\tlength: 0,\n\n\t\tadd: function(widget){\n\t\t\t// summary:\n\t\t\t//\t\tAdd a widget to the registry. If a duplicate ID is detected, a error is thrown.\n\t\t\t// widget: dijit/_WidgetBase\n\t\t\t//\t\tAny dijit/_WidgetBase subclass.\n\t\t\tif(hash[widget.id]){\n\t\t\t\tthrow new Error(\"Tried to register widget with id==\" + widget.id + \" but that id is already registered\");\n\t\t\t}\n\t\t\thash[widget.id] = widget;\n\t\t\tthis.length++;\n\t\t},\n\n\t\tremove: function(/*String*/ id){\n\t\t\t// summary:\n\t\t\t//\t\tRemove a widget from the registry. Does not destroy the widget; simply\n\t\t\t//\t\tremoves the reference.\n\t\t\tif(hash[id]){\n\t\t\t\tdelete hash[id];\n\t\t\t\tthis.length--;\n\t\t\t}\n\t\t},\n\n\t\tbyId: function(/*String|Widget*/ id){\n\t\t\t// summary:\n\t\t\t//\t\tFind a widget by it's id.\n\t\t\t//\t\tIf passed a widget then just returns the widget.\n\t\t\treturn typeof id == \"string\" ? hash[id] : id;\t// dijit/_WidgetBase\n\t\t},\n\n\t\tbyNode: function(/*DOMNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the widget corresponding to the given DOMNode\n\t\t\treturn hash[node.getAttribute(\"widgetId\")]; // dijit/_WidgetBase\n\t\t},\n\n\t\ttoArray: function(){\n\t\t\t// summary:\n\t\t\t//\t\tConvert registry into a true Array\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tWork with the widget .domNodes in a real Array\n\t\t\t//\t\t|\tarray.map(registry.toArray(), function(w){ return w.domNode; });\n\n\t\t\tvar ar = [];\n\t\t\tfor(var id in hash){\n\t\t\t\tar.push(hash[id]);\n\t\t\t}\n\t\t\treturn ar;\t// dijit/_WidgetBase[]\n\t\t},\n\n\t\tgetUniqueId: function(/*String*/widgetType){\n\t\t\t// summary:\n\t\t\t//\t\tGenerates a unique id for a given widgetType\n\n\t\t\tvar id;\n\t\t\tdo{\n\t\t\t\tid = widgetType + \"_\" +\n\t\t\t\t\t(widgetType in _widgetTypeCtr ?\n\t\t\t\t\t\t++_widgetTypeCtr[widgetType] : _widgetTypeCtr[widgetType] = 0);\n\t\t\t}while(hash[id]);\n\t\t\treturn dijit._scopeName == \"dijit\" ? id : dijit._scopeName + \"_\" + id; // String\n\t\t},\n\n\t\tfindWidgets: function(root, skipNode){\n\t\t\t// summary:\n\t\t\t//\t\tSearch subtree under root returning widgets found.\n\t\t\t//\t\tDoesn't search for nested widgets (ie, widgets inside other widgets).\n\t\t\t// root: DOMNode\n\t\t\t//\t\tNode to search under.\n\t\t\t// skipNode: DOMNode\n\t\t\t//\t\tIf specified, don't search beneath this node (usually containerNode).\n\n\t\t\tvar outAry = [];\n\n\t\t\tfunction getChildrenHelper(root){\n\t\t\t\tfor(var node = root.firstChild; node; node = node.nextSibling){\n\t\t\t\t\tif(node.nodeType == 1){\n\t\t\t\t\t\tvar widgetId = node.getAttribute(\"widgetId\");\n\t\t\t\t\t\tif(widgetId){\n\t\t\t\t\t\t\tvar widget = hash[widgetId];\n\t\t\t\t\t\t\tif(widget){\t// may be null on page w/multiple dojo's loaded\n\t\t\t\t\t\t\t\toutAry.push(widget);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else if(node !== skipNode){\n\t\t\t\t\t\t\tgetChildrenHelper(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgetChildrenHelper(root);\n\t\t\treturn outAry;\n\t\t},\n\n\t\t_destroyAll: function(){\n\t\t\t// summary:\n\t\t\t//\t\tCode to destroy all widgets and do other cleanup on page unload\n\n\t\t\t// Clean up focus manager lingering references to widgets and nodes\n\t\t\tdijit._curFocus = null;\n\t\t\tdijit._prevFocus = null;\n\t\t\tdijit._activeStack = [];\n\n\t\t\t// Destroy all the widgets, top down\n\t\t\tarray.forEach(registry.findWidgets(win.body()), function(widget){\n\t\t\t\t// Avoid double destroy of widgets like Menu that are attached to <body>\n\t\t\t\t// even though they are logically children of other widgets.\n\t\t\t\tif(!widget._destroyed){\n\t\t\t\t\tif(widget.destroyRecursive){\n\t\t\t\t\t\twidget.destroyRecursive();\n\t\t\t\t\t}else if(widget.destroy){\n\t\t\t\t\t\twidget.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tgetEnclosingWidget: function(/*DOMNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the widget whose DOM tree contains the specified DOMNode, or null if\n\t\t\t//\t\tthe node is not contained within the DOM tree of any widget\n\t\t\twhile(node){\n\t\t\t\tvar id = node.nodeType == 1 && node.getAttribute(\"widgetId\");\n\t\t\t\tif(id){\n\t\t\t\t\treturn hash[id];\n\t\t\t\t}\n\t\t\t\tnode = node.parentNode;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\n\t\t// In case someone needs to access hash.\n\t\t// Actually, this is accessed from WidgetSet back-compatibility code\n\t\t_hash: hash\n\t};\n\n\tdijit.registry = registry;\n\n\treturn registry;\n});\n","define(['dojo/_base/declare'], function (declare) {\n\t// a Filter builder\n\tfunction filterCreator(type) {\n\t\t// constructs a new filter based on type, used to create each comparison method\n\t\treturn function newFilter() {\n\t\t\tvar Filter = this.constructor;\n\t\t\tvar filter = new Filter();\n\t\t\tfilter.type = type;\n\t\t\t// ensure args is array so we can concat, slice, unshift\n\t\t\tfilter.args = Array.prototype.slice.call(arguments);\n\t\t\tif (this.type) {\n\t\t\t\t// we are chaining, so combine with an and operator\n\t\t\t\treturn filterCreator('and').call(Filter.prototype, this, filter);\n\t\t\t}\n\t\t\treturn filter;\n\t\t};\n\t}\n\tfunction logicalOperatorCreator(type) {\n\t\t// constructs a new logical operator 'filter', used to create each logical operation method\n\t\treturn function newLogicalOperator() {\n\t\t\tvar Filter = this.constructor;\n\t\t\tvar argsArray = [];\n\t\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\t\tvar arg = arguments[i];\n\t\t\t\targsArray.push(arg instanceof Filter ? arg : new Filter(arg));\n\t\t\t}\n\t\t\tvar filter = new Filter();\n\t\t\tfilter.type = type;\n\t\t\tfilter.args = argsArray;\n\t\t\tif (this.type === type) {\n\t\t\t\t// chaining, same type\n\t\t\t\t// combine arguments\n\t\t\t\tfilter.args = this.args.concat(argsArray);\n\t\t\t} else if (this.type) {\n\t\t\t\t// chaining, different type\n\t\t\t\t// add this filter to start of arguments\n\t\t\t\targsArray.unshift(this);\n\t\t\t} else if (argsArray.length === 1) {\n\t\t\t\t// not chaining and only one argument\n\t\t\t\t// returned filter is the same as the single argument\n\t\t\t\tif (argsArray[0].type) {\n\t\t\t\t\tfilter.type = argsArray[0].type;\n\t\t\t\t\tfilter.args = argsArray[0].args.slice();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filter;\n\t\t};\n\t}\n\tvar Filter = declare(null, {\n\t\tconstructor: function (filterArg) {\n\t\t\tvar argType = typeof filterArg;\n\t\t\tswitch (argType) {\n\t\t\t\tcase 'object':\n\t\t\t\t\tvar filter = this;\n\t\t\t\t\t// construct a filter based on the query object\n\t\t\t\t\tfor (var key in filterArg){\n\t\t\t\t\t\tvar value = filterArg[key];\n\t\t\t\t\t\tif (value instanceof this.constructor) {\n\t\t\t\t\t\t\t// fully construct the filter from the single arg\n\t\t\t\t\t\t\tfilter = filter[value.type](key, value.args[0]);\n\t\t\t\t\t\t} else if (value && value.test) {\n\t\t\t\t\t\t\t// support regex\n\t\t\t\t\t\t\tfilter = filter.match(key, value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfilter = filter.eq(key, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.type = filter.type;\n\t\t\t\t\tthis.args = filter.args;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'function': case 'string':\n\t\t\t\t\t// allow string and function args as well\n\t\t\t\t\tthis.type = argType;\n\t\t\t\t\tthis.args = [filterArg];\n\t\t\t}\n\t\t},\n\t\t// define our operators\n\t\tand: logicalOperatorCreator('and'),\n\t\tor: logicalOperatorCreator('or'),\n\t\teq: filterCreator('eq'),\n\t\tne: filterCreator('ne'),\n\t\tlt: filterCreator('lt'),\n\t\tlte: filterCreator('lte'),\n\t\tgt: filterCreator('gt'),\n\t\tgte: filterCreator('gte'),\n\t\tcontains: filterCreator('contains'),\n\t\t'in': filterCreator('in'),\n\t\tmatch: filterCreator('match')\n\t});\n\tFilter.filterCreator = filterCreator;\n\tFilter.logicalOperatorCreator = logicalOperatorCreator;\n\treturn Filter;\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/_base/lang',\n\t'dojo/_base/array',\n\t'./Store',\n\t'./Promised',\n\t'./SimpleQuery',\n\t'./QueryResults'\n], function (declare, lang, arrayUtil, Store, Promised, SimpleQuery, QueryResults) {\n\n\t// module:\n\t//\t\tdstore/Memory\n\treturn declare([Store, Promised, SimpleQuery ], {\n\t\tconstructor: function () {\n\t\t\t// summary:\n\t\t\t//\t\tCreates a memory object store.\n\t\t\t// options: dstore/Memory\n\t\t\t//\t\tThis provides any configuration information that will be mixed into the store.\n\t\t\t//\t\tThis should generally include the data property to provide the starting set of data.\n\n\t\t\t// Add a version property so subcollections can detect when they're using stale data\n\t\t\tthis.storage.version = 0;\n\t\t},\n\n\t\tpostscript: function () {\n\t\t\tthis.inherited(arguments);\n\n\t\t\t// Set the data in `postscript` so subclasses can override `data` in their constructors\n\t\t\t// (e.g., a LocalStorage store that retrieves its data from localStorage)\n\t\t\tthis.setData(this.data || []);\n\t\t},\n\n\t\t// data: Array\n\t\t//\t\tThe array of all the objects in the memory store\n\t\tdata: null,\n\n\t\tautoEmitEvents: false, // this is handled by the methods themselves\n\n\t\tgetSync: function (id) {\n\t\t\t// summary:\n\t\t\t//\t\tRetrieves an object by its identity\n\t\t\t// id: Number\n\t\t\t//\t\tThe identity to use to lookup the object\n\t\t\t// returns: Object\n\t\t\t//\t\tThe object in the store that matches the given id.\n\t\t\treturn this.storage.fullData[this.storage.index[id]];\n\t\t},\n\t\tputSync: function (object, options) {\n\t\t\t// summary:\n\t\t\t//\t\tStores an object\n\t\t\t// object: Object\n\t\t\t//\t\tThe object to store.\n\t\t\t// options: dstore/Store.PutDirectives?\n\t\t\t//\t\tAdditional metadata for storing the data. Includes an 'id'\n\t\t\t//\t\tproperty if a specific id is to be used.\n\t\t\t// returns: Number\n\n\t\t\toptions = options || {};\n\n\t\t\tvar storage = this.storage,\n\t\t\t\tindex = storage.index,\n\t\t\t\tdata = storage.fullData;\n\n\t\t\tvar Model = this.Model;\n\t\t\tif (Model && !(object instanceof Model)) {\n\t\t\t\t// if it is not the correct type, restore a\n\t\t\t\t// properly typed version of the object. Note that we do not allow\n\t\t\t\t// mutation here\n\t\t\t\tobject = this._restore(object);\n\t\t\t}\n\t\t\tvar id = this.getIdentity(object);\n\t\t\tif (id == null) {\n\t\t\t\tthis._setIdentity(object, ('id' in options) ? options.id : Math.random());\n\t\t\t\tid = this.getIdentity(object);\n\t\t\t}\n\t\t\tstorage.version++;\n\n\t\t\tvar eventType = id in index ? 'update' : 'add',\n\t\t\t\tevent = { target: object },\n\t\t\t\tpreviousIndex,\n\t\t\t\tdefaultDestination,\n\t\t\t\tdestination;\n\n\t\t\tif (eventType === 'update') {\n\t\t\t\tif (options.overwrite === false) {\n\t\t\t\t\tthrow new Error('Object already exists');\n\t\t\t\t} else {\n\t\t\t\t\tpreviousIndex = index[id];\n\t\t\t\t\tdefaultDestination = previousIndex;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdefaultDestination = this.defaultNewToStart ? 0 : data.length;\n\t\t\t}\n\n\t\t\tif ('beforeId' in options) {\n\t\t\t\tvar beforeId = options.beforeId;\n\n\t\t\t\tif (beforeId === null) {\n\t\t\t\t\tdestination = data.length;\n\n\t\t\t\t\tif (eventType === 'update') {\n\t\t\t\t\t\t--destination;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdestination = index[beforeId];\n\n\t\t\t\t\t// Account for the removed item\n\t\t\t\t\tif (previousIndex < destination) {\n\t\t\t\t\t\t--destination;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (destination !== undefined) {\n\t\t\t\t\tevent.beforeId = beforeId;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('options.beforeId was specified but no corresponding index was found');\n\t\t\t\t\tdestination = defaultDestination;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdestination = defaultDestination;\n\t\t\t}\n\n\t\t\tif (destination === previousIndex) {\n\t\t\t\tdata[destination] = object;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (previousIndex !== undefined) {\n\t\t\t\t\tdata.splice(previousIndex, 1);\n\t\t\t\t}\n\n\t\t\t\tdata.splice(destination, 0, object);\n\n\t\t\t\t// Items have been reordered so the index needs to be updated\n\t\t\t\tvar i = previousIndex === undefined ? destination : Math.min(previousIndex, destination);\n\t\t\t\tfor (var l = data.length; i < l; ++i) {\n\t\t\t\t\tindex[this.getIdentity(data[i])] = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.emit(eventType, event);\n\n\t\t\treturn object;\n\t\t},\n\t\taddSync: function (object, options) {\n\t\t\t// summary:\n\t\t\t//\t\tCreates an object, throws an error if the object already exists\n\t\t\t// object: Object\n\t\t\t//\t\tThe object to store.\n\t\t\t// options: dstore/Store.PutDirectives?\n\t\t\t//\t\tAdditional metadata for storing the data. Includes an 'id'\n\t\t\t//\t\tproperty if a specific id is to be used.\n\t\t\t// returns: Number\n\t\t\t(options = options || {}).overwrite = false;\n\t\t\t// call put with overwrite being false\n\t\t\treturn this.putSync(object, options);\n\t\t},\n\t\tremoveSync: function (id) {\n\t\t\t// summary:\n\t\t\t//\t\tDeletes an object by its identity\n\t\t\t// id: Number\n\t\t\t//\t\tThe identity to use to delete the object\n\t\t\t// returns: Boolean\n\t\t\t//\t\tReturns true if an object was removed, falsy (undefined) if no object matched the id\n\t\t\tvar storage = this.storage;\n\t\t\tvar index = storage.index;\n\t\t\tvar data = storage.fullData;\n\t\t\tif (id in index) {\n\t\t\t\tvar removed = data.splice(index[id], 1)[0];\n\t\t\t\t// now we have to reindex\n\t\t\t\tthis._reindex();\n\t\t\t\tthis.emit('delete', {id: id, target: removed});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tsetData: function (data) {\n\t\t\t// summary:\n\t\t\t//\t\tSets the given data as the source for this store, and indexes it\n\t\t\t// data: Object[]\n\t\t\t//\t\tAn array of objects to use as the source of data. Note that this\n\t\t\t//\t\tarray will not be copied, it is used directly and mutated as\n\t\t\t//\t\tdata changes.\n\n\t\t\tif (this.parse) {\n\t\t\t\tdata = this.parse(data);\n\t\t\t}\n\t\t\tif (data.items) {\n\t\t\t\t// just for convenience with the data format ItemFileReadStore expects\n\t\t\t\tthis.idProperty = data.identifier || this.idProperty;\n\t\t\t\tdata = data.items;\n\t\t\t}\n\t\t\tvar storage = this.storage;\n\t\t\tstorage.fullData = this.data = data;\n\t\t\tthis._reindex();\n\t\t},\n\n\t\t_reindex: function () {\n\t\t\tvar storage = this.storage;\n\t\t\tvar index = storage.index = {};\n\t\t\tvar data = storage.fullData;\n\t\t\tvar Model = this.Model;\n\t\t\tvar ObjectPrototype = Object.prototype;\n\t\t\tfor (var i = 0, l = data.length; i < l; i++) {\n\t\t\t\tvar object = data[i];\n\t\t\t\tif (Model && !(object instanceof Model)) {\n\t\t\t\t\tvar restoredObject = this._restore(object,\n\t\t\t\t\t\t\t// only allow mutation if it is a plain object\n\t\t\t\t\t\t\t// (which is generally the expected input),\n\t\t\t\t\t\t\t// if \"typed\" objects are actually passed in, we will\n\t\t\t\t\t\t\t// respect that, and leave the original alone\n\t\t\t\t\t\t\tobject.__proto__ === ObjectPrototype);\n\t\t\t\t\tif (object !== restoredObject) {\n\t\t\t\t\t\t// a new object was generated in the restoration process,\n\t\t\t\t\t\t// so we have to update the item in the data array.\n\t\t\t\t\t\tdata[i] = object = restoredObject;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tindex[this.getIdentity(object)] = i;\n\t\t\t}\n\t\t\tstorage.version++;\n\t\t},\n\n\t\tfetchSync: function () {\n\t\t\tvar data = this.data;\n\t\t\tif (!data || data._version !== this.storage.version) {\n\t\t\t\t// our data is absent or out-of-date, so we requery from the root\n\t\t\t\t// start with the root data\n\t\t\t\tdata = this.storage.fullData;\n\t\t\t\tvar queryLog = this.queryLog;\n\t\t\t\t// iterate through the query log, applying each querier\n\t\t\t\tfor (var i = 0, l = queryLog.length; i < l; i++) {\n\t\t\t\t\tdata = queryLog[i].querier(data);\n\t\t\t\t}\n\t\t\t\t// store it, with the storage version stamp\n\t\t\t\tdata._version = this.storage.version;\n\t\t\t\tthis.data = data;\n\t\t\t}\n\t\t\treturn new QueryResults(data);\n\t\t},\n\n\t\tfetchRangeSync: function (kwArgs) {\n\t\t\tvar data = this.fetchSync(),\n\t\t\t\tstart = kwArgs.start,\n\t\t\t\tend = kwArgs.end;\n\t\t\treturn new QueryResults(data.slice(start, end), {\n\t\t\t\ttotalLength: data.length\n\t\t\t});\n\t\t},\n\n\t\t_includePropertyInSubCollection: function (name) {\n\t\t\treturn name !== 'data' && this.inherited(arguments);\n\t\t}\n\t});\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/Deferred',\n\t'./QueryResults',\n\t'dojo/when'\n], function (declare, Deferred, QueryResults, when) {\n\t// module:\n\t//\t\tthis is a mixin that can be used to provide async methods,\n\t// \t\tby implementing their sync counterparts\n\tfunction promised(method, query) {\n\t\treturn function() {\n\t\t\tvar deferred = new Deferred();\n\t\t\ttry {\n\t\t\t\tdeferred.resolve(this[method].apply(this, arguments));\n\t\t\t} catch (error) {\n\t\t\t\tdeferred.reject(error);\n\t\t\t}\n\t\t\tif (query) {\n\t\t\t\t// need to create a QueryResults and ensure the totalLength is\n\t\t\t\t// a promise.\n\t\t\t\tvar queryResults = new QueryResults(deferred.promise);\n\t\t\t\tqueryResults.totalLength = when(queryResults.totalLength);\n\t\t\t\treturn queryResults;\n\t\t\t}\n\t\t\treturn deferred.promise;\n\t\t};\n\t}\n\treturn declare(null, {\n\t\tget: promised('getSync'),\n\t\tput: promised('putSync'),\n\t\tadd: promised('addSync'),\n\t\tremove: promised('removeSync'),\n\t\tfetch: promised('fetchSync', true),\n\t\tfetchRange: promised('fetchRangeSync', true)\n\t});\n});\n","define([], function () {\n\t/*=====\n\tvar __QueryMethodArgs = {\n\t\t// type: String\n\t\t//\t\tThe type of the query. This identifies the query's type in the query log\n\t\t//\t\tand the name of the corresponding query engine method.\n\t\t// normalizeArguments: Function?\n\t\t//\t\tA function that normalizes arguments for consumption by a query engine\n\t\t// applyQuery: Function?\n\t\t//\t\tA function that takes the query's new subcollection and the query's log entry\n\t\t//\t\tand applies it to the new subcollection. This is useful for collections that need\n\t\t//\t\tto both declare and implement new query methods.\n\t\t// querierFactory: Function?\n\t\t//\t\tA factory function that provides a default querier implementation to use when\n\t\t//\t\ta collection does not define its own querier factory method for this query type.\n\t};\n\t=====*/\n\treturn function QueryMethod(/*__QueryMethodArgs*/ kwArgs) {\n\t\t// summary:\n\t\t//\t\tThe constructor for a dstore collection query method\n\t\t// description:\n\t\t//\t\tThis is the constructor for a collection query method. It encapsulates the following:\n\t\t//\t\t* Creating a new subcollection for the query results\n\t\t//\t\t* Logging the query in the collection's `queryLog`\n\t\t//\t\t* Normalizing query arguments\n\t\t//\t\t* Applying the query engine\n\t\t// kwArgs:\n\t\t//\t\tThe properties that define the query method\n\t\t// returns: Function\n\t\t//\t\tReturns a function that takes query arguments and returns a new collection with\n\t\t//\t\tthe query associated with it.\n\n\t\tvar type = kwArgs.type,\n\t\t\tnormalizeArguments = kwArgs.normalizeArguments,\n\t\t\tapplyQuery = kwArgs.applyQuery,\n\t\t\tdefaultQuerierFactory = kwArgs.querierFactory;\n\n\t\treturn function () {\n\t\t\t// summary:\n\t\t\t//\t\tA query method whose arguments are determined by the query type\n\t\t\t// returns: dstore/Collection\n\t\t\t//\t\tA collection representing the query results\n\n\t\t\tvar originalArguments = Array.prototype.slice.call(arguments),\n\t\t\t\tnormalizedArguments = normalizeArguments\n\t\t\t\t\t? normalizeArguments.apply(this, originalArguments)\n\t\t\t\t\t: originalArguments,\n\t\t\t\tlogEntry = {\n\t\t\t\t\ttype: type,\n\t\t\t\t\targuments: originalArguments,\n\t\t\t\t\tnormalizedArguments: normalizedArguments\n\t\t\t\t},\n\t\t\t\tquerierFactory = this._getQuerierFactory(type) || defaultQuerierFactory;\n\n\t\t\tif (querierFactory) {\n\t\t\t\t// Call the query factory in store context to support things like\n\t\t\t\t// mapping a filter query's string argument to a custom filter method on the collection\n\t\t\t\tlogEntry.querier = querierFactory.apply(this, normalizedArguments);\n\t\t\t}\n\n\t\t\tvar newCollection = this._createSubCollection({\n\t\t\t\tqueryLog: this.queryLog.concat(logEntry)\n\t\t\t});\n\n\t\t\treturn applyQuery ? applyQuery.call(this, newCollection, logEntry) : newCollection;\n\t\t};\n\t};\n});\n","define(['dojo/_base/lang', 'dojo/when'], function (lang, when) {\n\tfunction forEach(callback, instance) {\n\t\treturn when(this, function(data) {\n\t\t\tfor (var i = 0, l = data.length; i < l; i++){\n\t\t\t\tcallback.call(instance, data[i], i, data);\n\t\t\t}\n\t\t});\n\t}\n\treturn function (data, options) {\n\t\tvar hasTotalLength = options && 'totalLength' in options;\n\t\tif(data.then) {\n\t\t\tdata = lang.delegate(data);\n\t\t\t// a promise for the eventual realization of the totalLength, in\n\t\t\t// case it comes from the resolved data\n\t\t\tvar totalLengthPromise = data.then(function (data) {\n\t\t\t\t// calculate total length, now that we have access to the resolved data\n\t\t\t\tvar totalLength = hasTotalLength ? options.totalLength :\n\t\t\t\t\t\tdata.totalLength || data.length;\n\t\t\t\t// make it available on the resolved data\n\t\t\t\tdata.totalLength = totalLength;\n\t\t\t\t// don't return the totalLength promise unless we need to, to avoid\n\t\t\t\t// triggering a lazy promise\n\t\t\t\treturn !hasTotalLength && totalLength;\n\t\t\t});\n\t\t\t// make the totalLength available on the promise (whether through the options or the enventual\n\t\t\t// access to the resolved data)\n\t\t\tdata.totalLength = hasTotalLength ? options.totalLength : totalLengthPromise;\n\t\t\t// make the response available as well\n\t\t\tdata.response = options && options.response;\n\t\t} else {\n\t\t\tdata.totalLength = hasTotalLength ? options.totalLength : data.length;\n\t\t}\n\n\t\tdata.forEach = forEach;\n\n\t\treturn data;\n\t};\n});\n","define([\n\t'dojo/_base/declare',\n\t'dojo/_base/array'\n], function (declare, arrayUtil) {\n\n\t// module:\n\t//\t\tdstore/SimpleQuery\n\n\tfunction makeGetter(property, queryAccessors) {\n\t\tif (property.indexOf('.') > -1) {\n\t\t\tvar propertyPath = property.split('.');\n\t\t\tvar pathLength = propertyPath.length;\n\t\t\treturn function (object) {\n\t\t\t\tfor (var i = 0; i < pathLength; i++) {\n\t\t\t\t\tobject = object && (queryAccessors && object.get ? object.get(propertyPath[i]) : object[propertyPath[i]]);\n\t\t\t\t}\n\t\t\t\treturn object;\n\t\t\t};\n\t\t}\n\t\t// else\n\t\treturn function (object) {\n\t\t\treturn object.get ? object.get(property) : object[property];\n\t\t};\n\t}\n\n\tvar comparators = {\n\t\teq: function eq(value, required) {\n\t\t\treturn value === required;\n\t\t},\n\t\t'in': function inComparator(value, required) {\n\t\t\t// allow for a collection of data\n\t\t\treturn arrayUtil.indexOf(required.data || required, value) > -1;\n\t\t},\n\t\tne: function ne(value, required) {\n\t\t\treturn value !== required;\n\t\t},\n\t\tlt: function lt(value, required) {\n\t\t\treturn value < required;\n\t\t},\n\t\tlte: function lte(value, required) {\n\t\t\treturn value <= required;\n\t\t},\n\t\tgt: function gt(value, required) {\n\t\t\treturn value > required;\n\t\t},\n\t\tgte: function gte(value, required) {\n\t\t\treturn value >= required;\n\t\t},\n\t\tmatch: function match(value, required, object) {\n\t\t\treturn required.test(value, object);\n\t\t},\n\t\tcontains: function contains(value, required, object, key) {\n\t\t\tvar collection = this;\n\t\t\tvar data;\n\n\t\t\tif (required.data) {\n\t\t\t\tdata = required.data;\n\t\t\t} else if(Array.isArray(required)) {\n\t\t\t\tdata = required;\n\t\t\t} else {\n\t\t\t\tdata = [required];\n\t\t\t}\n\n\t\t\treturn arrayUtil.every(data, function (requiredValue) {\n\t\t\t\tif (typeof requiredValue === 'object' && requiredValue.type) {\n\t\t\t\t\tvar comparator = collection._getFilterComparator(requiredValue.type);\n\t\t\t\t\treturn arrayUtil.some(value, function (item) {\n\t\t\t\t\t\treturn comparator.call(collection, item, requiredValue.args[1], object, key);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn arrayUtil.indexOf(value, requiredValue) > -1;\n\t\t\t});\n\t\t}\n\t};\n\n\treturn declare(null, {\n\t\t// summary:\n\t\t//\t\tMixin providing querier factories for core query types\n\n\t\t_createFilterQuerier: function (filter) {\n\t\t\t// create our matching filter function\n\t\t\tvar queryAccessors = this.queryAccessors;\n\t\t\tvar collection = this;\n\t\t\tvar querier = getQuerier(filter);\n\n\t\t\tfunction getQuerier(filter) {\n\t\t\t\tvar currentQuerier;\n\t\t\t\tvar nextQuerier;\n\t\t\t\tvar type = filter.type;\n\t\t\t\tvar args = filter.args;\n\t\t\t\tvar comparatorFunction = collection._getFilterComparator(type);\n\n\t\t\t\tif (comparatorFunction) {\n\t\t\t\t\t// it is a comparator\n\t\t\t\t\tvar firstArg = args[0];\n\t\t\t\t\tvar getProperty = makeGetter(firstArg, queryAccessors);\n\t\t\t\t\tvar secondArg = args[1];\n\n\t\t\t\t\tif (secondArg && secondArg.fetchSync) {\n\t\t\t\t\t\t// if it is a collection, fetch the contents (for `in` and `contains` operators)\n\t\t\t\t\t\tsecondArg = secondArg.fetchSync();\n\t\t\t\t\t}\n\n\t\t\t\t\treturn function comparator(object) {\n\t\t\t\t\t\t// get the value for the property and compare to expected value\n\t\t\t\t\t\treturn comparatorFunction.call(collection, getProperty(object), secondArg, object, firstArg);\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase 'and': case 'or':\n\t\t\t\t\t\tfor (var i = 0, l = args.length; i < l; i++) {\n\t\t\t\t\t\t\t// combine filters, using and or or\n\t\t\t\t\t\t\tnextQuerier = getQuerier(args[i]);\n\n\t\t\t\t\t\t\tif (currentQuerier) {\n\t\t\t\t\t\t\t\t// combine the last querier with a new one\n\t\t\t\t\t\t\t\tcurrentQuerier = (function(a, b) {\n\t\t\t\t\t\t\t\t\treturn type === 'and' ?\n\t\t\t\t\t\t\t\t\t\tfunction and(object) {\n\t\t\t\t\t\t\t\t\t\t\treturn a(object) && b(object);\n\t\t\t\t\t\t\t\t\t\t} :\n\t\t\t\t\t\t\t\t\t\tfunction or(object) {\n\t\t\t\t\t\t\t\t\t\t\treturn a(object) || b(object);\n\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t})(currentQuerier, nextQuerier);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcurrentQuerier = nextQuerier;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn currentQuerier;\n\t\t\t\t\tcase 'function':\n\t\t\t\t\t\treturn args[0];\n\t\t\t\t\tcase 'string':\n\t\t\t\t\t\t// named filter\n\t\t\t\t\t\tvar filterFunction = collection[args[0]];\n\t\t\t\t\t\tif (!filterFunction) {\n\t\t\t\t\t\t\tthrow new Error('No filter function ' + args[0] + ' was found in the collection');\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn filterFunction;\n\t\t\t\t\tcase undefined:\n\t\t\t\t\t\treturn function () {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error('Unknown filter operation \"' + type + '\"');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn function (data) {\n\t\t\t\treturn arrayUtil.filter(data, querier);\n\t\t\t};\n\t\t},\n\n\t\t_getFilterComparator: function (type) {\n\t\t\t// summary:\n\t\t\t//\t\tGet the comparator for the specified type\n\t\t\t// returns: Function?\n\n\t\t\treturn comparators[type] || this.inherited(arguments);\n\t\t},\n\n\t\t_createSelectQuerier: function (properties) {\n\t\t\treturn function (data) {\n\t\t\t\tvar l = properties.length;\n\t\t\t\treturn arrayUtil.map(data, properties instanceof Array ?\n\t\t\t\t\t// array of properties\n\t\t\t\t\tfunction (object) {\n\t\t\t\t\t\tvar selectedObject = {};\n\t\t\t\t\t\tfor (var i = 0; i < l; i++) {\n\t\t\t\t\t\t\tvar property = properties[i];\n\t\t\t\t\t\t\tselectedObject[property] = object[property];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn selectedObject;\n\t\t\t\t\t} :\n\t\t\t\t\t// single property\n\t\t\t\t\tfunction (object) {\n\t\t\t\t\t\treturn object[properties];\n\t\t\t\t\t});\n\t\t\t};\n\t\t},\n\n\t\t_createSortQuerier: function (sortOptions) {\n\t\t\tvar queryAccessors = this.queryAccessors;\n\n\t\t\treturn function (data) {\n\t\t\t\tdata = data.slice();\n\n\t\t\t\tif (typeof sortOptions === 'function') {\n\t\t\t\t\tdata.sort(sortOptions);\n\t\t\t\t}\n\t\t\t\telse if (sortOptions && sortOptions.length) {\n\t\t\t\t\tdata.sort(function (a, b) {\n\t\t\t\t\t\tfor (var i = 0; i < sortOptions.length; i++) {\n\t\t\t\t\t\t\tvar comparison;\n\t\t\t\t\t\t\tvar sorter = sortOptions[i];\n\t\t\t\t\t\t\tif (typeof sorter == 'function') {\n\t\t\t\t\t\t\t\tcomparison = sorter(a, b);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar getProperty = sorter.get || (sorter.get = makeGetter(sorter.property, queryAccessors));\n\t\t\t\t\t\t\t\tvar descending = sorter.descending;\n\t\t\t\t\t\t\t\tvar aValue = getProperty(a);\n\t\t\t\t\t\t\t\tvar bValue = getProperty(b);\n\n\t\t\t\t\t\t\t\taValue != null && (aValue = aValue.valueOf());\n\t\t\t\t\t\t\t\tbValue != null && (bValue = bValue.valueOf());\n\t\t\t\t\t\t\t\tif (aValue === bValue) {\n\t\t\t\t\t\t\t\t\tcomparison = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t// Prioritize undefined > null > defined\n\t\t\t\t\t\t\t\t\tvar isALessThanB = typeof bValue === 'undefined' ||\n\t\t\t\t\t\t\t\t\t\tbValue === null && typeof aValue !== 'undefined' ||\n\t\t\t\t\t\t\t\t\t\taValue != null && aValue < bValue;\n\t\t\t\t\t\t\t\t\tcomparison = Boolean(descending) === isALessThanB ? 1 : -1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (comparison !== 0) {\n\t\t\t\t\t\t\t\treturn comparison;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t});\n});\n","define([\n\t'dojo/_base/lang',\n\t'dojo/_base/array',\n\t'dojo/aspect',\n\t'dojo/has',\n\t'dojo/when',\n\t'dojo/_base/declare',\n\t'./QueryMethod',\n\t'./Filter',\n\t'dojo/Evented'\n], function (lang, arrayUtil, aspect, has, when, declare, QueryMethod, Filter, Evented) {\n\n\t// module:\n\t//\t\tdstore/Store\n\t/* jshint proto: true */\n\t// detect __proto__, and avoid using it on Firefox, as they warn about\n\t// deoptimizations. The watch method is a clear indicator of the Firefox\n\t// JS engine.\n\thas.add('object-proto', !!{}.__proto__ && !({}).watch);\n\tvar hasProto = has('object-proto');\n\n\tfunction emitUpdateEvent(type) {\n\t\treturn function (result, args) {\n\t\t\tvar self = this;\n\t\t\twhen(result, function (result) {\n\t\t\t\tvar event = { target: result },\n\t\t\t\t\toptions = args[1] || {};\n\t\t\t\tif ('beforeId' in options) {\n\t\t\t\t\tevent.beforeId = options.beforeId;\n\t\t\t\t}\n\t\t\t\tself.emit(type, event);\n\t\t\t});\n\n\t\t\treturn result;\n\t\t};\n\t}\n\n\tvar base = Evented;\n\t/*=====\n\tbase = [ Evented, Collection ];\n\t=====*/\n\n\treturn /*==== Store= ====*/declare(base, {\n\t\tconstructor: function (options) {\n\t\t\t// perform the mixin\n\t\t\toptions && declare.safeMixin(this, options);\n\n\t\t\tif (this.Model && this.Model.createSubclass) {\n\t\t\t\t// we need a distinct model for each store, so we can\n\t\t\t\t// save the reference back to this store on it.\n\t\t\t\t// we always create a new model to be safe.\n\t\t\t\tthis.Model = this.Model.createSubclass([]).extend({\n\t\t\t\t\t// give a reference back to the store for saving, etc.\n\t\t\t\t\t_store: this\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// the object the store can use for holding any local data or events\n\t\t\tthis.storage = new Evented();\n\t\t\tvar store = this;\n\t\t\tif (this.autoEmitEvents) {\n\t\t\t\t// emit events when modification operations are called\n\t\t\t\taspect.after(this, 'add', emitUpdateEvent('add'));\n\t\t\t\taspect.after(this, 'put', emitUpdateEvent('update'));\n\t\t\t\taspect.after(this, 'remove', function (result, args) {\n\t\t\t\t\twhen(result, function () {\n\t\t\t\t\t\tstore.emit('delete', {id: args[0]});\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t// autoEmitEvents: Boolean\n\t\t//\t\tIndicates if the events should automatically be fired for put, add, remove\n\t\t//\t\tmethod calls. Stores may wish to explicitly fire events, to control when\n\t\t//\t\tand which event is fired.\n\t\tautoEmitEvents: true,\n\n\t\t// idProperty: String\n\t\t//\t\tIndicates the property to use as the identity property. The values of this\n\t\t//\t\tproperty should be unique.\n\t\tidProperty: 'id',\n\n\t\t// queryAccessors: Boolean\n\t\t//\t\tIndicates if client-side query engine filtering should (if the store property is true)\n\t\t//\t\taccess object properties through the get() function (enabling querying by\n\t\t//\t\tcomputed properties), or if it should (by setting this to false) use direct/raw\n\t\t// \t\tproperty access (which may more closely follow database querying style).\n\t\tqueryAccessors: true,\n\n\t\tgetIdentity: function (object) {\n\t\t\t// summary:\n\t\t\t//\t\tReturns an object's identity\n\t\t\t// object: Object\n\t\t\t//\t\tThe object to get the identity from\n\t\t\t// returns: String|Number\n\n\t\t\treturn object.get ? object.get(this.idProperty) : object[this.idProperty];\n\t\t},\n\n\t\t_setIdentity: function (object, identityArg) {\n\t\t\t// summary:\n\t\t\t//\t\tSets an object's identity\n\t\t\t// description:\n\t\t\t//\t\tThis method sets an object's identity and is useful to override to support\n\t\t\t//\t\tmulti-key identities and object's whose properties are not stored directly on the object.\n\t\t\t// object: Object\n\t\t\t//\t\tThe target object\n\t\t\t// identityArg:\n\t\t\t//\t\tThe argument used to set the identity\n\n\t\t\tif (object.set) {\n\t\t\t\tobject.set(this.idProperty, identityArg);\n\t\t\t} else {\n\t\t\t\tobject[this.idProperty] = identityArg;\n\t\t\t}\n\t\t},\n\n\t\tforEach: function (callback, thisObject) {\n\t\t\tvar collection = this;\n\t\t\treturn when(this.fetch(), function (data) {\n\t\t\t\tfor (var i = 0, item; (item = data[i]) !== undefined; i++) {\n\t\t\t\t\tcallback.call(thisObject, item, i, collection);\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\t});\n\t\t},\n\n\t\tmatchesFilter: function (item) {\n\t\t\t// Allow the event to continue if the queryLog is empty (no filtering). Otherwise,\n\t\t\t// only allow the event to propagate if the item matches the query log.\n\t\t\tvar queryLog = this.queryLog;\n\t\t\tif (queryLog && item) {\n\t\t\t\tvar data = [item];\n\t\t\t\t// iterate through the query log, applying each querier\n\t\t\t\tfor (var i = 0, l = queryLog.length; i < l; i++) {\n\t\t\t\t\tdata = queryLog[i].querier(data);\n\t\t\t\t}\n\t\t\t\treturn data.length > 0;\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\ton: function (type, listener, filterEvents) {\n\t\t\tvar self = this;\n\t\t\treturn this.storage.on(type, function (event) {\n\t\t\t\tif (listener) {\n\t\t\t\t\tif (!filterEvents || self.matchesFilter(event && event.target)) {\n\t\t\t\t\t\tlistener && listener(event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\temit: function (type, event) {\n\t\t\tevent = event || {};\n\t\t\tevent.type = type;\n\t\t\ttry {\n\t\t\t\treturn this.storage.emit(type, event);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\t// Return the initial value of event.cancelable because a listener error makes it impossible\n\t\t\t\t// to know whether the event was actually canceled\n\t\t\t\treturn event.cancelable;\n\t\t\t}\n\t\t},\n\n\t\t// parse: Function\n\t\t//\t\tOne can provide a parsing function that will permit the parsing of the data. By\n\t\t//\t\tdefault we assume the provide data is a simple JavaScript array that requires\n\t\t//\t\tno parsing (subclass stores may provide their own default parse function)\n\t\tparse: null,\n\n\t\t// stringify: Function\n\t\t//\t\tFor stores that serialize data (to send to a server, for example) the stringify\n\t\t//\t\tfunction can be specified to control how objects are serialized to strings\n\t\tstringify: null,\n\n\t\t// Model: Function\n\t\t//\t\tThis should be a entity (like a class/constructor) with a 'prototype' property that will be\n\t\t//\t\tused as the prototype for all objects returned from this store. One can set\n\t\t//\t\tthis to the Model from dmodel/Model to return Model objects, or leave this\n\t\t//\t\tto null if you don't want any methods to decorate the returned\n\t\t//\t\tobjects (this can improve performance by avoiding prototype setting),\n\t\tModel: null,\n\n\t\t_restore: function (object, mutateAllowed) {\n\t\t\t// summary:\n\t\t\t//\t\tRestores a plain raw object, making an instance of the store's model.\n\t\t\t//\t\tThis is called when an object had been persisted into the underlying\n\t\t\t//\t\tmedium, and is now being restored. Typically restored objects will come\n\t\t\t//\t\tthrough a phase of deserialization (through JSON.parse, DB retrieval, etc.)\n\t\t\t//\t\tin which their __proto__ will be set to Object.prototype. To provide\n\t\t\t//\t\tdata model support, the returned object needs to be an instance of the model.\n\t\t\t//\t\tThis can be accomplished by setting __proto__ to the model's prototype\n\t\t\t//\t\tor by creating a new instance of the model, and copying the properties to it.\n\t\t\t//\t\tAlso, model's can provide their own restore method that will allow for\n\t\t\t//\t\tcustom model-defined behavior. However, one should be aware that copying\n\t\t\t//\t\tproperties is a slower operation than prototype assignment.\n\t\t\t//\t\tThe restore process is designed to be distinct from the create process\n\t\t\t//\t\tso their is a clear delineation between new objects and restored objects.\n\t\t\t// object: Object\n\t\t\t//\t\tThe raw object with the properties that need to be defined on the new\n\t\t\t//\t\tmodel instance\n\t\t\t// mutateAllowed: boolean\n\t\t\t//\t\tThis indicates if restore is allowed to mutate the original object\n\t\t\t//\t\t(by setting its __proto__). If this isn't true, than the restore should\n\t\t\t//\t\tcopy the object to a new object with the correct type.\n\t\t\t// returns: Object\n\t\t\t//\t\tAn instance of the store model, with all the properties that were defined\n\t\t\t//\t\ton object. This may or may not be the same object that was passed in.\n\t\t\tvar Model = this.Model;\n\t\t\tif (Model && object) {\n\t\t\t\tvar prototype = Model.prototype;\n\t\t\t\tvar restore = prototype._restore;\n\t\t\t\tif (restore) {\n\t\t\t\t\t// the prototype provides its own restore method\n\t\t\t\t\tobject = restore.call(object, Model, mutateAllowed);\n\t\t\t\t} else if (hasProto && mutateAllowed) {\n\t\t\t\t\t// the fast easy way\n\t\t\t\t\t// http://jsperf.com/setting-the-prototype\n\t\t\t\t\tobject.__proto__ = prototype;\n\t\t\t\t} else {\n\t\t\t\t\t// create a new object with the correct prototype\n\t\t\t\t\tobject = lang.delegate(prototype, object);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn object;\n\t\t},\n\n\t\tcreate: function (properties) {\n\t\t\t// summary:\n\t\t\t//\t\tThis creates a new instance from the store's model.\n\t\t\t//\tproperties:\n\t\t\t//\t\tThe properties that are passed to the model constructor to\n\t\t\t//\t\tbe copied onto the new instance. Note, that should only be called\n\t\t\t//\t\twhen new objects are being created, not when existing objects\n\t\t\t//\t\tare being restored from storage.\n\t\t\treturn new this.Model(properties);\n\t\t},\n\n\t\t_createSubCollection: function (kwArgs) {\n\t\t\tvar newCollection = lang.delegate(this.constructor.prototype);\n\n\t\t\tfor (var i in this) {\n\t\t\t\tif (this._includePropertyInSubCollection(i, newCollection)) {\n\t\t\t\t\tnewCollection[i] = this[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn declare.safeMixin(newCollection, kwArgs);\n\t\t},\n\n\t\t_includePropertyInSubCollection: function (name, subCollection) {\n\t\t\treturn !(name in subCollection) || subCollection[name] !== this[name];\n\t\t},\n\n\t\t// queryLog: __QueryLogEntry[]\n\t\t//\t\tThe query operations represented by this collection\n\t\tqueryLog: [],\t// NOTE: It's ok to define this on the prototype because the array instance is never modified\n\n\t\tfilter: new QueryMethod({\n\t\t\ttype: 'filter',\n\t\t\tnormalizeArguments: function (filter) {\n\t\t\t\tvar Filter = this.Filter;\n\t\t\t\tif (filter instanceof Filter) {\n\t\t\t\t\treturn [filter];\n\t\t\t\t}\n\t\t\t\treturn [new Filter(filter)];\n\t\t\t}\n\t\t}),\n\n\t\tFilter: Filter,\n\n\t\tsort: new QueryMethod({\n\t\t\ttype: 'sort',\n\t\t\tnormalizeArguments: function (property, descending) {\n\t\t\t\tvar sorted;\n\t\t\t\tif (typeof property === 'function') {\n\t\t\t\t\tsorted = [ property ];\n\t\t\t\t} else {\n\t\t\t\t\tif (property instanceof Array) {\n\t\t\t\t\t\tsorted = property.slice();\n\t\t\t\t\t} else if (typeof property === 'object') {\n\t\t\t\t\t\tsorted = [].slice.call(arguments);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsorted = [{ property: property, descending: descending }];\n\t\t\t\t\t}\n\n\t\t\t\t\tsorted = arrayUtil.map(sorted, function (sort) {\n\t\t\t\t\t\t// copy the sort object to avoid mutating the original arguments\n\t\t\t\t\t\tsort = lang.mixin({}, sort);\n\t\t\t\t\t\tsort.descending = !!sort.descending;\n\t\t\t\t\t\treturn sort;\n\t\t\t\t\t});\n\t\t\t\t\t// wrap in array because sort objects are a single array argument\n\t\t\t\t\tsorted = [ sorted ];\n\t\t\t\t}\n\t\t\t\treturn sorted;\n\t\t\t}\n\t\t}),\n\n\t\tselect: new QueryMethod({\n\t\t\ttype: 'select'\n\t\t}),\n\n\t\t_getQuerierFactory: function (type) {\n\t\t\tvar uppercaseType = type[0].toUpperCase() + type.substr(1);\n\t\t\treturn this['_create' + uppercaseType + 'Querier'];\n\t\t}\n\n/*====,\n\t\tget: function (id) {\n\t\t\t// summary:\n\t\t\t//\t\tRetrieves an object by its identity\n\t\t\t// id: Number\n\t\t\t//\t\tThe identity to use to lookup the object\n\t\t\t// returns: Object\n\t\t\t//\t\tThe object in the store that matches the given id.\n\t\t},\n\t\tput: function (object, directives) {\n\t\t\t// summary:\n\t\t\t//\t\tStores an object\n\t\t\t// object: Object\n\t\t\t//\t\tThe object to store.\n\t\t\t// directives: dstore/Store.PutDirectives?\n\t\t\t//\t\tAdditional directives for storing objects.\n\t\t\t// returns: Object\n\t\t\t//\t\tThe object that was stored, with any changes that were made by\n\t\t\t//\t\tthe storage system (like generated id)\n\t\t},\n\t\tadd: function (object, directives) {\n\t\t\t// summary:\n\t\t\t//\t\tCreates an object, throws an error if the object already exists\n\t\t\t// object: Object\n\t\t\t//\t\tThe object to store.\n\t\t\t// directives: dstore/Store.PutDirectives?\n\t\t\t//\t\tAdditional directives for creating objects.\n\t\t\t// returns: Object\n\t\t\t//\t\tThe object that was stored, with any changes that were made by\n\t\t\t//\t\tthe storage system (like generated id)\n\t\t},\n\t\tremove: function (id) {\n\t\t\t// summary:\n\t\t\t//\t\tDeletes an object by its identity\n\t\t\t// id: Number\n\t\t\t//\t\tThe identity to use to delete the object\n\t\t},\n\t\ttransaction: function () {\n\t\t\t// summary:\n\t\t\t//\t\tStarts a new transaction.\n\t\t\t//\t\tNote that a store user might not call transaction() prior to using put,\n\t\t\t//\t\tdelete, etc. in which case these operations effectively could be thought of\n\t\t\t//\t\tas \"auto-commit\" style actions.\n\t\t\t// returns: dstore/Store.Transaction\n\t\t\t//\t\tThis represents the new current transaction.\n\t\t},\n\t\tgetChildren: function (parent) {\n\t\t\t// summary:\n\t\t\t//\t\tRetrieves the children of an object.\n\t\t\t// parent: Object\n\t\t\t//\t\tThe object to find the children of.\n\t\t\t// returns: dstore/Store.Collection\n\t\t\t//\t\tA result set of the children of the parent object.\n\t\t}\n====*/\n\t});\n});\n\n\n/*====\n\tvar Collection = declare(null, {\n\t\t// summary:\n\t\t//\t\tThis is an abstract API for a collection of objects, which can be filtered,\n\t\t//\t\tsorted, and sliced to create new collections. This is considered to be base\n\t\t//\t\tinterface for all stores and query results in dstore. Note that the objects in the\n\t\t//\t\tcollection may not be immediately retrieved from the underlying data\n\t\t//\t\tstorage until they are actually accessed through forEach() or fetch().\n\n\t\tfilter: function (query) {\n\t\t\t// summary:\n\t\t\t//\t\tFilters the collection, returning a new subset collection\n\t\t\t// query: String|Object|Function\n\t\t\t//\t\tThe query to use for retrieving objects from the store.\n\t\t\t// returns: Collection\n\t\t},\n\t\tsort: function (property, descending) {\n\t\t\t// summary:\n\t\t\t//\t\tSorts the current collection into a new collection, reordering the objects by the provided sort order.\n\t\t\t// property: String|Function\n\t\t\t//\t\tThe property to sort on. Alternately a function can be provided to sort with\n\t\t\t// descending?: Boolean\n\t\t\t//\t\tIndicate if the sort order should be descending (defaults to ascending)\n\t\t\t// returns: Collection\n\t\t},\n\t\tfetchRange: function (kwArgs) {\n\t\t\t// summary:\n\t\t\t//\t\tRetrieves a range of objects from the collection, returning a promise to an array.\n\t\t\t// kwArgs.start: Number\n\t\t\t//\t\tThe starting index of objects to return (0-indexed)\n\t\t\t// kwArgs.end: Number\n\t\t\t//\t\tThe exclusive end of objects to return\n\t\t\t// returns: Collection\n\t\t},\n\t\tforEach: function (callback, thisObject) {\n\t\t\t// summary:\n\t\t\t//\t\tIterates over the query results, based on\n\t\t\t//\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach.\n\t\t\t//\t\tNote that this may executed asynchronously (in which case it will return a promise),\n\t\t\t//\t\tand the callback may be called after this function returns.\n\t\t\t// callback:\n\t\t\t//\t\tFunction that is called for each object in the query results\n\t\t\t// thisObject:\n\t\t\t//\t\tThe object to use as |this| in the callback.\n\t\t\t// returns:\n\t\t\t//\t\tundefined|Promise\n\t\t},\n\t\tfetch: function () {\n\t\t\t// summary:\n\t\t\t//\t\tThis can be called to materialize and request the data behind this collection.\n\t\t\t//\t\tOften collections may be lazy, and won't retrieve their underlying data until\n\t\t\t//\t\tforEach or fetch is called. This returns an array, or for asynchronous stores,\n\t\t\t//\t\tthis will return a promise, resolving to an array of objects, once the\n\t\t\t//\t\toperation is complete.\n\t\t\t//\treturns Array|Promise\n\t\t},\n\t\ton: function (type, listener) {\n\t\t\t// summary:\n\t\t\t//\t\tThis registers a callback for notification of when data is modified in the query results.\n\t\t\t// type: String\n\t\t\t//\t\tThere are four types of events defined in this API:\n\t\t\t//\t\t- add - A new object was added\n\t\t\t//\t\t- update - An object was updated\n\t\t\t//\t\t- delete - An object was deleted\n\t\t\t// listener: Function\n\t\t\t//\t\tThe listener function is called when objects in the query results are modified\n\t\t\t//\t\tto affect the query result. The listener function is called with a single event object argument:\n\t\t\t//\t\t| listener(event);\n\t\t\t//\n\t\t\t//\t\t- The event object as the following properties:\n\t\t\t//\t\t- type - The event type (of the four above)\n\t\t\t//\t\t- target - This indicates the object that was create or modified.\n\t\t\t//\t\t- id - If an object was removed, this indicates the object that was removed.\n\t\t\t//\t\tThe next two properties will only be available if array tracking is employed,\n\t\t\t//\t\twhich is usually provided by dstore/Trackable\n\t\t\t//\t\t- previousIndex - The previousIndex parameter indicates the index in the result array where\n\t\t\t//\t\tthe object used to be. If the value is -1, then the object is an addition to\n\t\t\t//\t\tthis result set (due to a new object being created, or changed such that it\n\t\t\t//\t\tis a part of the result set).\n\t\t\t//\t\t- index - The inex parameter indicates the index in the result array where\n\t\t\t//\t\tthe object should be now. If the value is -1, then the object is a removal\n\t\t\t//\t\tfrom this result set (due to an object being deleted, or changed such that it\n\t\t\t//\t\tis not a part of the result set).\n\n\t\t}\n\t});\n\n\tCollection.SortInformation = declare(null, {\n\t\t// summary:\n\t\t//\t\tAn object describing what property to sort on, and the direction of the sort.\n\t\t// property: String\n\t\t//\t\tThe name of the property to sort on.\n\t\t// descending: Boolean\n\t\t//\t\tThe direction of the sort. Default is false.\n\t});\n\tStore.Collection = Collection;\n\n\tStore.PutDirectives = declare(null, {\n\t\t// summary:\n\t\t//\t\tDirectives passed to put() and add() handlers for guiding the update and\n\t\t//\t\tcreation of stored objects.\n\t\t// id: String|Number?\n\t\t//\t\tIndicates the identity of the object if a new object is created\n\t\t// beforeId: String?\n\t\t//\t\tIf the collection of objects in the store has a natural ordering,\n\t\t//\t\tthis indicates that the created or updated object should be placed before the\n\t\t//\t\tobject whose identity is specified as the value of this property. A value of null indicates that the\n\t\t//\t\tobject should be last.\n\t\t// parent: Object?,\n\t\t//\t\tIf the store is hierarchical (with single parenting) this property indicates the\n\t\t//\t\tnew parent of the created or updated object.\n\t\t// overwrite: Boolean?\n\t\t//\t\tIf this is provided as a boolean it indicates that the object should or should not\n\t\t//\t\toverwrite an existing object. A value of true indicates that a new object\n\t\t//\t\tshould not be created, the operation should update an existing object. A\n\t\t//\t\tvalue of false indicates that an existing object should not be updated, a new\n\t\t//\t\tobject should be created (which is the same as an add() operation). When\n\t\t//\t\tthis property is not provided, either an update or creation is acceptable.\n\t});\n\n\tStore.Transaction = declare(null, {\n\t\t// summary:\n\t\t//\t\tThis is an object returned from transaction() calls that represents the current\n\t\t//\t\ttransaction.\n\n\t\tcommit: function () {\n\t\t\t// summary:\n\t\t\t//\t\tCommits the transaction. This may throw an error if it fails. Of if the operation\n\t\t\t//\t\tis asynchronous, it may return a promise that represents the eventual success\n\t\t\t//\t\tor failure of the commit.\n\t\t},\n\t\tabort: function (callback, thisObject) {\n\t\t\t// summary:\n\t\t\t//\t\tAborts the transaction. This may throw an error if it fails. Of if the operation\n\t\t\t//\t\tis asynchronous, it may return a promise that represents the eventual success\n\t\t\t//\t\tor failure of the abort.\n\t\t}\n\t});\n\n\tvar __QueryLogEntry = {\n\t\ttype: String\n\t\t\tThe query type\n\t\targuments: Array\n\t\t\tThe original query arguments\n\t\tnormalizedArguments: Array\n\t\t\tThe normalized query arguments\n\t\tquerier: Function?\n\t\t\tA client-side implementation of the query that takes an item array and returns an item array\n\t};\n====*/\n","/*\r\n * (C) Copyright IBM Corp. 2012, 2016 All Rights Reserved.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nmodule.exports = undefined;\r\n","define([\"dojo/i18n\", \"/home/runner/work/Visualization/Visualization/node_modules/dojo-webpack-plugin/loaders/dojo/runner.js\"\n,\"/home/runner/work/Visualization/Visualization/node_modules/dgrid/extensions/nls/pagination.js?absMid=dgrid/extensions/nls/pagination\"\n], function(loader, runner) {\n return runner(loader, \"dgrid/extensions/nls/pagination\", __webpack_require__.dj.c(), false);\n});","/*\n * (C) Copyright HCL Technologies Ltd. 2019\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\ndefine([], function() {\n\treturn function(ldr, name, req, async) {\n\t\tvar resolveFn, result, resultSet;\n\t\tldr.load(name, req, function(data) {\n\t\t\tresult = data;\n\t\t\tresultSet = true;\n\t\t\tif (resolveFn) {\n\t\t\t\tresolveFn(data);\n\t\t\t}\n\t\t}, {isBuild:true});\n\t\tif (resultSet) {\n\t\t\treturn result;\n\t\t} else if (!async) {\n\t\t\tthrow new Error(name + ' unavailable');\n\t\t}\n\t\tresult = new Promise(function(resolve) {\n\t\t\tresolveFn = resolve;\n\t\t});\n\t\tresult.__DOJO_WEBPACK_DEFINE_PROMISE__ = true;\n\t\treturn result;\n\t};\n});\n","module.exports = \"<div class=\\\"dijitTooltip dijitTooltipLeft\\\" id=\\\"dojoTooltip\\\" data-dojo-attach-event=\\\"mouseenter:onMouseEnter,mouseleave:onMouseLeave\\\"\\n\\t><div class=\\\"dijitTooltipConnector\\\" data-dojo-attach-point=\\\"connectorNode\\\"></div\\n\\t><div class=\\\"dijitTooltipContainer dijitTooltipContents\\\" data-dojo-attach-point=\\\"containerNode\\\" role='alert'></div\\n></div>\\n\"","define([\n\t\"./has\",\n\t\"./_base/lang\",\n\t\"./errors/CancelError\",\n\t\"./promise/Promise\",\n\t\"./has!config-deferredInstrumentation?./promise/instrumentation\"\n], function(has, lang, CancelError, Promise, instrumentation){\n\t\"use strict\";\n\n\t// module:\n\t//\t\tdojo/Deferred\n\n\tvar PROGRESS = 0,\n\t\t\tRESOLVED = 1,\n\t\t\tREJECTED = 2;\n\tvar FULFILLED_ERROR_MESSAGE = \"This deferred has already been fulfilled.\";\n\n\tvar freezeObject = Object.freeze || function(){};\n\n\tvar signalWaiting = function(waiting, type, result, rejection, deferred){\n\t\tif(has(\"config-deferredInstrumentation\")){\n\t\t\tif(type === REJECTED && Deferred.instrumentRejected && waiting.length === 0){\n\t\t\t\tDeferred.instrumentRejected(result, false, rejection, deferred);\n\t\t\t}\n\t\t}\n\n\t\tfor(var i = 0; i < waiting.length; i++){\n\t\t\tsignalListener(waiting[i], type, result, rejection);\n\t\t}\n\t};\n\n\tvar signalListener = function(listener, type, result, rejection){\n\t\tvar func = listener[type];\n\t\tvar deferred = listener.deferred;\n\t\tif(func){\n\t\t\ttry{\n\t\t\t\tvar newResult = func(result);\n\t\t\t\tif(type === PROGRESS){\n\t\t\t\t\tif(typeof newResult !== \"undefined\"){\n\t\t\t\t\t\tsignalDeferred(deferred, type, newResult);\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tif(newResult && typeof newResult.then === \"function\"){\n\t\t\t\t\t\tlistener.cancel = newResult.cancel;\n\t\t\t\t\t\tnewResult.then(\n\t\t\t\t\t\t\t\t// Only make resolvers if they're actually going to be used\n\t\t\t\t\t\t\t\tmakeDeferredSignaler(deferred, RESOLVED),\n\t\t\t\t\t\t\t\tmakeDeferredSignaler(deferred, REJECTED),\n\t\t\t\t\t\t\t\tmakeDeferredSignaler(deferred, PROGRESS));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsignalDeferred(deferred, RESOLVED, newResult);\n\t\t\t\t}\n\t\t\t}catch(error){\n\t\t\t\tsignalDeferred(deferred, REJECTED, error);\n\t\t\t}\n\t\t}else{\n\t\t\tsignalDeferred(deferred, type, result);\n\t\t}\n\n\t\tif(has(\"config-deferredInstrumentation\")){\n\t\t\tif(type === REJECTED && Deferred.instrumentRejected){\n\t\t\t\tDeferred.instrumentRejected(result, !!func, rejection, deferred.promise);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar makeDeferredSignaler = function(deferred, type){\n\t\treturn function(value){\n\t\t\tsignalDeferred(deferred, type, value);\n\t\t};\n\t};\n\n\tvar signalDeferred = function(deferred, type, result){\n\t\tif(!deferred.isCanceled()){\n\t\t\tswitch(type){\n\t\t\t\tcase PROGRESS:\n\t\t\t\t\tdeferred.progress(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase RESOLVED:\n\t\t\t\t\tdeferred.resolve(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase REJECTED:\n\t\t\t\t\tdeferred.reject(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\tvar Deferred = function(canceler){\n\t\t// summary:\n\t\t//\t\tCreates a new deferred. This API is preferred over\n\t\t//\t\t`dojo/_base/Deferred`.\n\t\t// description:\n\t\t//\t\tCreates a new deferred, as an abstraction over (primarily)\n\t\t//\t\tasynchronous operations. The deferred is the private interface\n\t\t//\t\tthat should not be returned to calling code. That's what the\n\t\t//\t\t`promise` is for. See `dojo/promise/Promise`.\n\t\t// canceler: Function?\n\t\t//\t\tWill be invoked if the deferred is canceled. The canceler\n\t\t//\t\treceives the reason the deferred was canceled as its argument.\n\t\t//\t\tThe deferred is rejected with its return value, or a new\n\t\t//\t\t`dojo/errors/CancelError` instance.\n\n\t\t// promise: dojo/promise/Promise\n\t\t//\t\tThe public promise object that clients can add callbacks to. \n\t\tvar promise = this.promise = new Promise();\n\n\t\tvar deferred = this;\n\t\tvar fulfilled, result, rejection;\n\t\tvar canceled = false;\n\t\tvar waiting = [];\n\n\t\tif(has(\"config-deferredInstrumentation\") && Error.captureStackTrace){\n\t\t\tError.captureStackTrace(deferred, Deferred);\n\t\t\tError.captureStackTrace(promise, Deferred);\n\t\t}\n\n\t\tthis.isResolved = promise.isResolved = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been resolved.\n\t\t\t// returns: Boolean\n\n\t\t\treturn fulfilled === RESOLVED;\n\t\t};\n\n\t\tthis.isRejected = promise.isRejected = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been rejected.\n\t\t\t// returns: Boolean\n\n\t\t\treturn fulfilled === REJECTED;\n\t\t};\n\n\t\tthis.isFulfilled = promise.isFulfilled = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been resolved or rejected.\n\t\t\t// returns: Boolean\n\n\t\t\treturn !!fulfilled;\n\t\t};\n\n\t\tthis.isCanceled = promise.isCanceled = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been canceled.\n\t\t\t// returns: Boolean\n\n\t\t\treturn canceled;\n\t\t};\n\n\t\tthis.progress = function(update, strict){\n\t\t\t// summary:\n\t\t\t//\t\tEmit a progress update on the deferred.\n\t\t\t// description:\n\t\t\t//\t\tEmit a progress update on the deferred. Progress updates\n\t\t\t//\t\tcan be used to communicate updates about the asynchronous\n\t\t\t//\t\toperation before it has finished.\n\t\t\t// update: any\n\t\t\t//\t\tThe progress update. Passed to progbacks.\n\t\t\t// strict: Boolean?\n\t\t\t//\t\tIf strict, will throw an error if the deferred has already\n\t\t\t//\t\tbeen fulfilled and consequently no progress can be emitted.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns the original promise for the deferred.\n\n\t\t\tif(!fulfilled){\n\t\t\t\tsignalWaiting(waiting, PROGRESS, update, null, deferred);\n\t\t\t\treturn promise;\n\t\t\t}else if(strict === true){\n\t\t\t\tthrow new Error(FULFILLED_ERROR_MESSAGE);\n\t\t\t}else{\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t};\n\n\t\tthis.resolve = function(value, strict){\n\t\t\t// summary:\n\t\t\t//\t\tResolve the deferred.\n\t\t\t// description:\n\t\t\t//\t\tResolve the deferred, putting it in a success state.\n\t\t\t// value: any\n\t\t\t//\t\tThe result of the deferred. Passed to callbacks.\n\t\t\t// strict: Boolean?\n\t\t\t//\t\tIf strict, will throw an error if the deferred has already\n\t\t\t//\t\tbeen fulfilled and consequently cannot be resolved.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns the original promise for the deferred.\n\n\t\t\tif(!fulfilled){\n\t\t\t\t// Set fulfilled, store value. After signaling waiting listeners unset\n\t\t\t\t// waiting.\n\t\t\t\tsignalWaiting(waiting, fulfilled = RESOLVED, result = value, null, deferred);\n\t\t\t\twaiting = null;\n\t\t\t\treturn promise;\n\t\t\t}else if(strict === true){\n\t\t\t\tthrow new Error(FULFILLED_ERROR_MESSAGE);\n\t\t\t}else{\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t};\n\n\t\tvar reject = this.reject = function(error, strict){\n\t\t\t// summary:\n\t\t\t//\t\tReject the deferred.\n\t\t\t// description:\n\t\t\t//\t\tReject the deferred, putting it in an error state.\n\t\t\t// error: any\n\t\t\t//\t\tThe error result of the deferred. Passed to errbacks.\n\t\t\t// strict: Boolean?\n\t\t\t//\t\tIf strict, will throw an error if the deferred has already\n\t\t\t//\t\tbeen fulfilled and consequently cannot be rejected.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns the original promise for the deferred.\n\n\t\t\tif(!fulfilled){\n\t\t\t\tif(has(\"config-deferredInstrumentation\") && Error.captureStackTrace){\n\t\t\t\t\tError.captureStackTrace(rejection = {}, reject);\n\t\t\t\t}\n\t\t\t\tsignalWaiting(waiting, fulfilled = REJECTED, result = error, rejection, deferred);\n\t\t\t\twaiting = null;\n\t\t\t\treturn promise;\n\t\t\t}else if(strict === true){\n\t\t\t\tthrow new Error(FULFILLED_ERROR_MESSAGE);\n\t\t\t}else{\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t};\n\n\t\tthis.then = promise.then = function(callback, errback, progback){\n\t\t\t// summary:\n\t\t\t//\t\tAdd new callbacks to the deferred.\n\t\t\t// description:\n\t\t\t//\t\tAdd new callbacks to the deferred. Callbacks can be added\n\t\t\t//\t\tbefore or after the deferred is fulfilled.\n\t\t\t// callback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise is resolved.\n\t\t\t//\t\tReceives the resolution value.\n\t\t\t// errback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise is rejected.\n\t\t\t//\t\tReceives the rejection error.\n\t\t\t// progback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise emits a progress\n\t\t\t//\t\tupdate. Receives the progress update.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns a new promise for the result of the callback(s).\n\t\t\t//\t\tThis can be used for chaining many asynchronous operations.\n\n\t\t\tvar listener = [progback, callback, errback];\n\t\t\t// Ensure we cancel the promise we're waiting for, or if callback/errback\n\t\t\t// have returned a promise, cancel that one.\n\t\t\tlistener.cancel = promise.cancel;\n\t\t\tlistener.deferred = new Deferred(function(reason){\n\t\t\t\t// Check whether cancel is really available, returned promises are not\n\t\t\t\t// required to expose `cancel`\n\t\t\t\treturn listener.cancel && listener.cancel(reason);\n\t\t\t});\n\t\t\tif(fulfilled && !waiting){\n\t\t\t\tsignalListener(listener, fulfilled, result, rejection);\n\t\t\t}else{\n\t\t\t\twaiting.push(listener);\n\t\t\t}\n\t\t\treturn listener.deferred.promise;\n\t\t};\n\n\t\tthis.cancel = promise.cancel = function(reason, strict){\n\t\t\t// summary:\n\t\t\t//\t\tInform the deferred it may cancel its asynchronous operation.\n\t\t\t// description:\n\t\t\t//\t\tInform the deferred it may cancel its asynchronous operation.\n\t\t\t//\t\tThe deferred's (optional) canceler is invoked and the\n\t\t\t//\t\tdeferred will be left in a rejected state. Can affect other\n\t\t\t//\t\tpromises that originate with the same deferred.\n\t\t\t// reason: any\n\t\t\t//\t\tA message that may be sent to the deferred's canceler,\n\t\t\t//\t\texplaining why it's being canceled.\n\t\t\t// strict: Boolean?\n\t\t\t//\t\tIf strict, will throw an error if the deferred has already\n\t\t\t//\t\tbeen fulfilled and consequently cannot be canceled.\n\t\t\t// returns: any\n\t\t\t//\t\tReturns the rejection reason if the deferred was canceled\n\t\t\t//\t\tnormally.\n\n\t\t\tif(!fulfilled){\n\t\t\t\t// Cancel can be called even after the deferred is fulfilled\n\t\t\t\tif(canceler){\n\t\t\t\t\tvar returnedReason = canceler(reason);\n\t\t\t\t\treason = typeof returnedReason === \"undefined\" ? reason : returnedReason;\n\t\t\t\t}\n\t\t\t\tcanceled = true;\n\t\t\t\tif(!fulfilled){\n\t\t\t\t\t// Allow canceler to provide its own reason, but fall back to a CancelError\n\t\t\t\t\tif(typeof reason === \"undefined\"){\n\t\t\t\t\t\treason = new CancelError();\n\t\t\t\t\t}\n\t\t\t\t\treject(reason);\n\t\t\t\t\treturn reason;\n\t\t\t\t}else if(fulfilled === REJECTED && result === reason){\n\t\t\t\t\treturn reason;\n\t\t\t\t}\n\t\t\t}else if(strict === true){\n\t\t\t\tthrow new Error(FULFILLED_ERROR_MESSAGE);\n\t\t\t}\n\t\t};\n\n\t\tfreezeObject(promise);\n\t};\n\n\tDeferred.prototype.toString = function(){\n\t\t// returns: String\n\t\t//\t\tReturns `[object Deferred]`.\n\n\t\treturn \"[object Deferred]\";\n\t};\n\n\tif(instrumentation){\n\t\tinstrumentation(Deferred);\n\t}\n\n\treturn Deferred;\n});\n","define([\"./aspect\", \"./on\"], function(aspect, on){\n\t// module:\n\t//\t\tdojo/Evented\n\n \t\"use strict\";\n \tvar after = aspect.after;\n\tfunction Evented(){\n\t\t// summary:\n\t\t//\t\tA class that can be used as a mixin or base class,\n\t\t//\t\tto add on() and emit() methods to a class\n\t\t//\t\tfor listening for events and emitting events:\n\t\t// example:\n\t\t//\t\t|\tdefine([\"dojo/Evented\", \"dojo/_base/declare\", \"dojo/Stateful\"\n\t\t//\t\t|\t], function(Evented, declare, Stateful){\n\t\t//\t\t|\t\tvar EventedStateful = declare([Evented, Stateful], {...});\n\t\t//\t\t|\t\tvar instance = new EventedStateful();\n\t\t//\t\t|\t\tinstance.on(\"open\", function(event){\n\t\t//\t\t|\t\t... do something with event\n\t\t//\t\t|\t });\n\t\t//\t\t|\n\t\t//\t\t|\tinstance.emit(\"open\", {name:\"some event\", ...});\n\t}\n\tEvented.prototype = {\n\t\ton: function(type, listener){\n\t\t\treturn on.parse(this, type, listener, function(target, type){\n\t\t\t\treturn after(target, 'on' + type, listener, true);\n\t\t\t});\n\t\t},\n\t\temit: function(type, event){\n\t\t\tvar args = [this];\n\t\t\targs.push.apply(args, arguments);\n\t\t\treturn on.emit.apply(on, args);\n\t\t}\n\t};\n\treturn Evented;\n});\n","define([\"./_base/kernel\", \"./query\", \"./_base/array\", \"./_base/lang\", \"./dom-class\", \"./dom-construct\", \"./dom-geometry\", \"./dom-attr\", \"./dom-style\"], function(dojo, query, array, lang, domCls, domCtr, domGeom, domAttr, domStyle){\n\n\t// module:\n\t//\t\tdojo/NodeList-dom.js\n\n\t/*=====\n\t return function(){\n\t\t // summary:\n\t\t //\t\tAdds DOM related methods to NodeList, and returns NodeList constructor.\n\t };\n\t =====*/\n\n\tvar magicGuard = function(a){\n\t\t// summary:\n\t\t//\t\tthe guard function for dojo/dom-attr() and dojo/dom-style()\n\t\treturn a.length == 1 && (typeof a[0] == \"string\"); // inline'd type check\n\t};\n\n\tvar orphan = function(node){\n\t\t// summary:\n\t\t//\t\tfunction to orphan nodes\n\t\tvar p = node.parentNode;\n\t\tif(p){\n\t\t\tp.removeChild(node);\n\t\t}\n\t};\n\t// FIXME: should we move orphan() to dojo/_base/html?\n\n\tvar NodeList = query.NodeList,\n\t\tawc = NodeList._adaptWithCondition,\n\t\taafe = NodeList._adaptAsForEach,\n\t\taam = NodeList._adaptAsMap;\n\n\tfunction getSet(module){\n\t\treturn function(node, name, value){\n\t\t\tif(arguments.length == 2){\n\t\t\t\treturn module[typeof name == \"string\" ? \"get\" : \"set\"](node, name);\n\t\t\t}\n\t\t\t// setter\n\t\t\treturn module.set(node, name, value);\n\t\t};\n\t}\n\n\tlang.extend(NodeList, {\n\t\t_normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){\n\t\t\t// summary:\n\t\t\t//\t\tnormalizes data to an array of items to insert.\n\t\t\t// description:\n\t\t\t//\t\tIf content is an object, it can have special properties \"template\" and\n\t\t\t//\t\t\"parse\". If \"template\" is defined, then the template value is run through\n\t\t\t//\t\tdojo/string.substitute (if dojo/string.substitute() has been required elsewhere),\n\t\t\t//\t\tor if templateFunc is a function on the content, that function will be used to\n\t\t\t//\t\ttransform the template into a final string to be used for for passing to dojo/dom-construct.toDom().\n\t\t\t//\t\tIf content.parse is true, then it is remembered for later, for when the content\n\t\t\t//\t\tnodes are inserted into the DOM. At that point, the nodes will be parsed for widgets\n\t\t\t//\t\t(if dojo/parser has been required elsewhere).\n\n\t\t\t//Wanted to just use a DocumentFragment, but for the array/NodeList\n\t\t\t//case that meant using cloneNode, but we may not want that.\n\t\t\t//Cloning should only happen if the node operations span\n\t\t\t//multiple refNodes. Also, need a real array, not a NodeList from the\n\t\t\t//DOM since the node movements could change those NodeLists.\n\n\t\t\tvar parse = content.parse === true;\n\n\t\t\t//Do we have an object that needs to be run through a template?\n\t\t\tif(typeof content.template == \"string\"){\n\t\t\t\tvar templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute);\n\t\t\t\tcontent = templateFunc ? templateFunc(content.template, content) : content;\n\t\t\t}\n\n\t\t\tvar type = (typeof content);\n\t\t\tif(type == \"string\" || type == \"number\"){\n\t\t\t\tcontent = domCtr.toDom(content, (refNode && refNode.ownerDocument));\n\t\t\t\tif(content.nodeType == 11){\n\t\t\t\t\t//DocumentFragment. It cannot handle cloneNode calls, so pull out the children.\n\t\t\t\t\tcontent = lang._toArray(content.childNodes);\n\t\t\t\t}else{\n\t\t\t\t\tcontent = [content];\n\t\t\t\t}\n\t\t\t}else if(!lang.isArrayLike(content)){\n\t\t\t\tcontent = [content];\n\t\t\t}else if(!lang.isArray(content)){\n\t\t\t\t//To get to this point, content is array-like, but\n\t\t\t\t//not an array, which likely means a DOM NodeList. Convert it now.\n\t\t\t\tcontent = lang._toArray(content);\n\t\t\t}\n\n\t\t\t//Pass around the parse info\n\t\t\tif(parse){\n\t\t\t\tcontent._runParse = true;\n\t\t\t}\n\t\t\treturn content; //Array\n\t\t},\n\n\t\t_cloneNode: function(/*DOMNode*/ node){\n\t\t\t// summary:\n\t\t\t//\t\tprivate utility to clone a node. Not very interesting in the vanilla\n\t\t\t//\t\tdojo/NodeList case, but delegates could do interesting things like\n\t\t\t//\t\tclone event handlers if that is derivable from the node.\n\t\t\treturn node.cloneNode(true);\n\t\t},\n\n\t\t_place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){\n\t\t\t// summary:\n\t\t\t//\t\tprivate utility to handle placing an array of nodes relative to another node.\n\t\t\t// description:\n\t\t\t//\t\tAllows for cloning the nodes in the array, and for\n\t\t\t//\t\toptionally parsing widgets, if ary._runParse is true.\n\n\t\t\t//Avoid a disallowed operation if trying to do an innerHTML on a non-element node.\n\t\t\tif(refNode.nodeType != 1 && position == \"only\"){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar rNode = refNode, tempNode;\n\n\t\t\t//Always cycle backwards in case the array is really a\n\t\t\t//DOM NodeList and the DOM operations take it out of the live collection.\n\t\t\tvar length = ary.length;\n\t\t\tfor(var i = length - 1; i >= 0; i--){\n\t\t\t\tvar node = (useClone ? this._cloneNode(ary[i]) : ary[i]);\n\n\t\t\t\t//If need widget parsing, use a temp node, instead of waiting after inserting into\n\t\t\t\t//real DOM because we need to start widget parsing at one node up from current node,\n\t\t\t\t//which could cause some already parsed widgets to be parsed again.\n\t\t\t\tif(ary._runParse && dojo.parser && dojo.parser.parse){\n\t\t\t\t\tif(!tempNode){\n\t\t\t\t\t\ttempNode = rNode.ownerDocument.createElement(\"div\");\n\t\t\t\t\t}\n\t\t\t\t\ttempNode.appendChild(node);\n\t\t\t\t\tdojo.parser.parse(tempNode);\n\t\t\t\t\tnode = tempNode.firstChild;\n\t\t\t\t\twhile(tempNode.firstChild){\n\t\t\t\t\t\ttempNode.removeChild(tempNode.firstChild);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(i == length - 1){\n\t\t\t\t\tdomCtr.place(node, rNode, position);\n\t\t\t\t}else{\n\t\t\t\t\trNode.parentNode.insertBefore(node, rNode);\n\t\t\t\t}\n\t\t\t\trNode = node;\n\t\t\t}\n\t\t},\n\n\n\t\tposition: aam(domGeom.position),\n\t\t/*=====\n\t\tposition: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns border-box objects (x/y/w/h) of all elements in a node list\n\t\t\t//\t\tas an Array (*not* a NodeList). Acts like `dojo/dom-geometry-position`, though\n\t\t\t//\t\tassumes the node passed is each node in this list.\n\n\t\t\treturn dojo.map(this, dojo.position); // Array\n\t\t},\n\t\t=====*/\n\n\t\tattr: awc(getSet(domAttr), magicGuard),\n\t\t/*=====\n\t\tattr: function(property, value){\n\t\t\t// summary:\n\t\t\t//\t\tgets or sets the DOM attribute for every element in the\n\t\t\t//\t\tNodeList. See also `dojo/dom-attr`\n\t\t\t// property: String\n\t\t\t//\t\tthe attribute to get/set\n\t\t\t// value: String?\n\t\t\t//\t\toptional. The value to set the property to\n\t\t\t// returns:\n\t\t\t//\t\tif no value is passed, the result is an array of attribute values\n\t\t\t//\t\tIf a value is passed, the return is this NodeList\n\t\t\t// example:\n\t\t\t//\t\tMake all nodes with a particular class focusable:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"], function(query){\n\t\t\t//\t|\t\tquery(\".focusable\").attr(\"tabIndex\", -1);\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tDisable a group of buttons:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"], function(query){\n\t\t\t//\t|\t\tquery(\"button.group\").attr(\"disabled\", true);\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tinnerHTML can be assigned or retrieved as well:\n\t\t\t//\t|\t// get the innerHTML (as an array) for each list item\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"], function(query){\n\t\t\t//\t|\t\tvar ih = query(\"li.replaceable\").attr(\"innerHTML\");\n\t\t\t//\t|\t});\n\t\t\treturn; // dojo/NodeList|Array\n\t\t},\n\t\t=====*/\n\n\t\tstyle: awc(getSet(domStyle), magicGuard),\n\t\t/*=====\n\t\tstyle: function(property, value){\n\t\t\t// summary:\n\t\t\t//\t\tgets or sets the CSS property for every element in the NodeList\n\t\t\t// property: String\n\t\t\t//\t\tthe CSS property to get/set, in JavaScript notation\n\t\t\t//\t\t(\"lineHieght\" instead of \"line-height\")\n\t\t\t// value: String?\n\t\t\t//\t\toptional. The value to set the property to\n\t\t\t// returns:\n\t\t\t//\t\tif no value is passed, the result is an array of strings.\n\t\t\t//\t\tIf a value is passed, the return is this NodeList\n\t\t\treturn; // dojo/NodeList\n\t\t\treturn; // Array\n\t\t},\n\t\t=====*/\n\n\t\taddClass: aafe(domCls.add),\n\t\t/*=====\n\t\taddClass: function(className){\n\t\t\t// summary:\n\t\t\t//\t\tadds the specified class to every node in the list\n\t\t\t// className: String|Array\n\t\t\t//\t\tA String class name to add, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\treturn; // dojo/NodeList\n\t\t},\n\t\t=====*/\n\n\t\tremoveClass: aafe(domCls.remove),\n\t\t/*=====\n\t\tremoveClass: function(className){\n\t\t\t// summary:\n\t\t\t//\t\tremoves the specified class from every node in the list\n\t\t\t// className: String|Array?\n\t\t\t//\t\tAn optional String class name to remove, or several space-separated\n\t\t\t//\t\tclass names, or an array of class names. If omitted, all class names\n\t\t\t//\t\twill be deleted.\n\t\t\t// returns:\n\t\t\t//\t\tthis list\n\t\t\treturn; // dojo/NodeList\n\t\t},\n\t\t=====*/\n\n\t\ttoggleClass: aafe(domCls.toggle),\n\t\t/*=====\n\t\ttoggleClass: function(className, condition){\n\t\t\t// summary:\n\t\t\t//\t\tAdds a class to node if not present, or removes if present.\n\t\t\t//\t\tPass a boolean condition if you want to explicitly add or remove.\n\t\t\t// condition: Boolean?\n\t\t\t//\t\tIf passed, true means to add the class, false means to remove.\n\t\t\t// className: String\n\t\t\t//\t\tthe CSS class to add\n\t\t\treturn; // dojo/NodeList\n\t\t},\n\t\t=====*/\n\n\t\treplaceClass: aafe(domCls.replace),\n\t\t/*=====\n\t\treplaceClass: function(addClassStr, removeClassStr){\n\t\t\t// summary:\n\t\t\t//\t\tReplaces one or more classes on a node if not present.\n\t\t\t//\t\tOperates more quickly than calling `removeClass()` and `addClass()`\n\t\t\t// addClassStr: String|Array\n\t\t\t//\t\tA String class name to add, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t// removeClassStr: String|Array?\n\t\t\t//\t\tA String class name to remove, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\treturn; // dojo/NodeList\n\t\t },\n\t\t =====*/\n\n\t\tempty: aafe(domCtr.empty),\n\t\t/*=====\n\t\tempty: function(){\n\t\t\t// summary:\n\t\t\t//\t\tclears all content from each node in the list. Effectively\n\t\t\t//\t\tequivalent to removing all child nodes from every item in\n\t\t\t//\t\tthe list.\n\t\t\treturn this.forEach(\"item.innerHTML='';\"); // dojo/NodeList\n\t\t\t// FIXME: should we be checking for and/or disposing of widgets below these nodes?\n\t\t},\n\t\t=====*/\n\n\t\tremoveAttr: aafe(domAttr.remove),\n\t\t/*=====\n\t\t removeAttr: function(name){\n\t\t\t// summary:\n\t\t\t//\t\tRemoves an attribute from each node in the list.\n\t\t\t// name: String\n\t\t\t//\t\tthe name of the attribute to remove\n\t\t\treturn;\t\t// dojo/NodeList\n\t\t},\n\t\t=====*/\n\n\t\tmarginBox: aam(domGeom.getMarginBox),\n\t\t/*=====\n\t\tmarginBox: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns margin-box size of nodes\n\t\t \treturn; // dojo/NodeList\n\t\t },\n\t\t =====*/\n\n\t\t// FIXME: connectPublisher()? connectRunOnce()?\n\n\t\t/*\n\t\tdestroy: function(){\n\t\t\t// summary:\n\t\t\t//\t\tdestroys every item in the list.\n\t\t\tthis.forEach(d.destroy);\n\t\t\t// FIXME: should we be checking for and/or disposing of widgets below these nodes?\n\t\t},\n\t\t*/\n\n\t\tplace: function(/*String||Node*/ queryOrNode, /*String*/ position){\n\t\t\t// summary:\n\t\t\t//\t\tplaces elements of this node list relative to the first element matched\n\t\t\t//\t\tby queryOrNode. Returns the original NodeList. See: `dojo/dom-construct.place`\n\t\t\t// queryOrNode:\n\t\t\t//\t\tmay be a string representing any valid CSS3 selector or a DOM node.\n\t\t\t//\t\tIn the selector case, only the first matching element will be used\n\t\t\t//\t\tfor relative positioning.\n\t\t\t// position:\n\t\t\t//\t\tcan be one of:\n\t\t\t//\n\t\t\t//\t\t-\t\"last\" (default)\n\t\t\t//\t\t-\t\"first\"\n\t\t\t//\t\t-\t\"before\"\n\t\t\t//\t\t-\t\"after\"\n\t\t\t//\t\t-\t\"only\"\n\t\t\t//\t\t-\t\"replace\"\n\t\t\t//\n\t\t\t//\t\tor an offset in the childNodes property\n\t\t\tvar item = query(queryOrNode)[0];\n\t\t\treturn this.forEach(function(node){ domCtr.place(node, item, position); }); // dojo/NodeList\n\t\t},\n\n\t\torphan: function(/*String?*/ filter){\n\t\t\t// summary:\n\t\t\t//\t\tremoves elements in this list that match the filter\n\t\t\t//\t\tfrom their parents and returns them as a new NodeList.\n\t\t\t// filter:\n\t\t\t//\t\tCSS selector like \".foo\" or \"div > span\"\n\t\t\t// returns:\n\t\t\t//\t\tNodeList containing the orphaned elements\n\t\t\treturn (filter ? query._filterResult(this, filter) : this).forEach(orphan); // dojo/NodeList\n\t\t},\n\n\t\tadopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){\n\t\t\t// summary:\n\t\t\t//\t\tplaces any/all elements in queryOrListOrNode at a\n\t\t\t//\t\tposition relative to the first element in this list.\n\t\t\t//\t\tReturns a dojo/NodeList of the adopted elements.\n\t\t\t// queryOrListOrNode:\n\t\t\t//\t\ta DOM node or a query string or a query result.\n\t\t\t//\t\tRepresents the nodes to be adopted relative to the\n\t\t\t//\t\tfirst element of this NodeList.\n\t\t\t// position:\n\t\t\t//\t\tcan be one of:\n\t\t\t//\n\t\t\t//\t\t-\t\"last\" (default)\n\t\t\t//\t\t-\t\"first\"\n\t\t\t//\t\t-\t\"before\"\n\t\t\t//\t\t-\t\"after\"\n\t\t\t//\t\t-\t\"only\"\n\t\t\t//\t\t-\t\"replace\"\n\t\t\t//\n\t\t\t//\t\tor an offset in the childNodes property\n\t\t\treturn query(queryOrListOrNode).place(this[0], position)._stash(this);\t// dojo/NodeList\n\t\t},\n\n\t\t// FIXME: do we need this?\n\t\tquery: function(/*String*/ queryStr){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new list whose members match the passed query,\n\t\t\t//\t\tassuming elements of the current NodeList as the root for\n\t\t\t//\t\teach search.\n\t\t\t// example:\n\t\t\t//\t\tassume a DOM created by this markup:\n\t\t\t//\t|\t<div id=\"foo\">\n\t\t\t//\t|\t\t<p>\n\t\t\t//\t|\t\t\tbacon is tasty, <span>dontcha think?</span>\n\t\t\t//\t|\t\t</p>\n\t\t\t//\t|\t</div>\n\t\t\t//\t|\t<div id=\"bar\">\n\t\t\t//\t|\t\t<p>great comedians may not be funny <span>in person</span></p>\n\t\t\t//\t|\t</div>\n\t\t\t//\t\tIf we are presented with the following definition for a NodeList:\n\t\t\t//\t|\trequire([\"dojo/dom\", \"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(dom, query){\n\t\t\t//\t|\t\tvar l = new NodeList(dom.byId(\"foo\"), dom.byId(\"bar\"));\n\t\t\t//\t\tit's possible to find all span elements under paragraphs\n\t\t\t//\t\tcontained by these elements with this sub-query:\n\t\t\t//\t|\t\tvar spans = l.query(\"p span\");\n\t\t\t//\t|\t});\n\n\t\t\t// FIXME: probably slow\n\t\t\tif(!queryStr){ return this; }\n\t\t\tvar ret = new NodeList;\n\t\t\tthis.map(function(node){\n\t\t\t\t// FIXME: why would we ever get undefined here?\n\t\t\t\tquery(queryStr, node).forEach(function(subNode){\n\t\t\t\t\tif(subNode !== undefined){\n\t\t\t\t\t\tret.push(subNode);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn ret._stash(this);\t// dojo/NodeList\n\t\t},\n\n\t\tfilter: function(/*String|Function*/ filter){\n\t\t\t// summary:\n\t\t\t//\t\t\"masks\" the built-in javascript filter() method (supported\n\t\t\t//\t\tin Dojo via `dojo.filter`) to support passing a simple\n\t\t\t//\t\tstring filter in addition to supporting filtering function\n\t\t\t//\t\tobjects.\n\t\t\t// filter:\n\t\t\t//\t\tIf a string, a CSS rule like \".thinger\" or \"div > span\".\n\t\t\t// example:\n\t\t\t//\t\t\"regular\" JS filter syntax as exposed in dojo.filter:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"*\").filter(function(item){\n\t\t\t//\t|\t\t\t// highlight every paragraph\n\t\t\t//\t|\t\t\treturn (item.nodeName == \"p\");\n\t\t\t//\t|\t\t}).style(\"backgroundColor\", \"yellow\");\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\tthe same filtering using a CSS selector\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"*\").filter(\"p\").styles(\"backgroundColor\", \"yellow\");\n\t\t\t//\t|\t});\n\t\t\tvar a = arguments, items = this, start = 0;\n\t\t\tif(typeof filter == \"string\"){ // inline'd type check\n\t\t\t\titems = query._filterResult(this, a[0]);\n\t\t\t\tif(a.length == 1){\n\t\t\t\t\t// if we only got a string query, pass back the filtered results\n\t\t\t\t\treturn items._stash(this); // dojo/NodeList\n\t\t\t\t}\n\t\t\t\t// if we got a callback, run it over the filtered items\n\t\t\t\tstart = 1;\n\t\t\t}\n\t\t\treturn this._wrap(array.filter(items, a[start], a[start + 1]), this);\t// dojo/NodeList\n\t\t},\n\n\t\t/*\n\t\t// FIXME: should this be \"copyTo\" and include parenting info?\n\t\tclone: function(){\n\t\t\t// summary:\n\t\t\t//\t\tcreates node clones of each element of this list\n\t\t\t//\t\tand returns a new list containing the clones\n\t\t},\n\t\t*/\n\n\t\taddContent: function(/*String||DomNode||Object||dojo/NodeList*/ content, /*String||Integer?*/ position){\n\t\t\t// summary:\n\t\t\t//\t\tadd a node, NodeList or some HTML as a string to every item in the\n\t\t\t//\t\tlist. Returns the original list.\n\t\t\t// description:\n\t\t\t//\t\ta copy of the HTML content is added to each item in the\n\t\t\t//\t\tlist, with an optional position argument. If no position\n\t\t\t//\t\targument is provided, the content is appended to the end of\n\t\t\t//\t\teach item.\n\t\t\t// content:\n\t\t\t//\t\tDOM node, HTML in string format, a NodeList or an Object. If a DOM node or\n\t\t\t//\t\tNodeList, the content will be cloned if the current NodeList has more than one\n\t\t\t//\t\telement. Only the DOM nodes are cloned, no event handlers. If it is an Object,\n\t\t\t//\t\tit should be an object with at \"template\" String property that has the HTML string\n\t\t\t//\t\tto insert. If dojo.string has already been dojo.required, then dojo.string.substitute\n\t\t\t//\t\twill be used on the \"template\" to generate the final HTML string. Other allowed\n\t\t\t//\t\tproperties on the object are: \"parse\" if the HTML\n\t\t\t//\t\tstring should be parsed for widgets (dojo.require(\"dojo.parser\") to get that\n\t\t\t//\t\toption to work), and \"templateFunc\" if a template function besides dojo.string.substitute\n\t\t\t//\t\tshould be used to transform the \"template\".\n\t\t\t// position:\n\t\t\t//\t\tcan be one of:\n\t\t\t//\n\t\t\t//\t\t-\t\"last\"||\"end\" (default)\n\t\t\t//\t\t-\t\"first||\"start\"\n\t\t\t//\t\t-\t\"before\"\n\t\t\t//\t\t-\t\"after\"\n\t\t\t//\t\t-\t\"replace\" (replaces nodes in this NodeList with new content)\n\t\t\t//\t\t-\t\"only\" (removes other children of the nodes so new content is the only child)\n\t\t\t//\n\t\t\t//\t\tor an offset in the childNodes property\n\t\t\t// example:\n\t\t\t//\t\tappends content to the end if the position is omitted\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"h3 > p\").addContent(\"hey there!\");\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tadd something to the front of each element that has a\n\t\t\t//\t\t\"thinger\" property:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"[thinger]\").addContent(\"...\", \"first\");\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tadds a header before each element of the list\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\".note\").addContent(\"<h4>NOTE:</h4>\", \"before\");\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tadd a clone of a DOM node to the end of every element in\n\t\t\t//\t\tthe list, removing it from its existing parent.\n\t\t\t//\t|\trequire([\"dojo/dom\", \"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(dom, query){\n\t\t\t//\t|\t\tquery(\".note\").addContent(dom.byId(\"foo\"));\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tAppend nodes from a templatized string.\n\t\t\t//\t|\trequire([\"dojo/string\", \"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(string, query){\n\t\t\t//\t|\t\tquery(\".note\").addContent({\n\t\t\t//\t|\t\t\ttemplate: '<b>${id}: </b><span>${name}</span>',\n\t\t\t//\t|\t\t\tid: \"user332\",\n\t\t\t//\t|\t\t\tname: \"Mr. Anderson\"\n\t\t\t//\t|\t\t});\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tAppend nodes from a templatized string that also has widgets parsed.\n\t\t\t//\t|\trequire([\"dojo/string\", \"dojo/parser\", \"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(string, parser, query){\n\t\t\t//\t|\t\tvar notes = query(\".note\").addContent({\n\t\t\t//\t|\t\t\ttemplate: '<button dojoType=\"dijit/form/Button\">${text}</button>',\n\t\t\t//\t|\t\t\tparse: true,\n\t\t\t//\t|\t\t\ttext: \"Send\"\n\t\t\t//\t|\t\t});\n\t\t\t//\t|\t});\n\t\t\tcontent = this._normalize(content, this[0]);\n\t\t\tfor(var i = 0, node; (node = this[i]); i++){\n\t\t\t\tif(content.length){\n\t\t\t\t\tthis._place(content, node, position, i > 0);\n\t\t\t\t}else{\n\t\t\t\t\t// if it is an empty array, we empty the target node\n\t\t\t\t\tdomCtr.empty(node);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this; // dojo/NodeList\n\t\t}\n\t});\n\n\treturn NodeList;\n});\n","define([\"./_base/declare\", \"./_base/lang\", \"./_base/array\", \"./when\"], function(declare, lang, array, when){\n\t// module:\n\t//\t\tdojo/Stateful\n\nreturn declare(\"dojo.Stateful\", null, {\n\t// summary:\n\t//\t\tBase class for objects that provide named properties with optional getter/setter\n\t//\t\tcontrol and the ability to watch for property changes\n\t//\n\t//\t\tThe class also provides the functionality to auto-magically manage getters\n\t//\t\tand setters for object attributes/properties.\n\t//\t\t\n\t//\t\tGetters and Setters should follow the format of _xxxGetter or _xxxSetter where \n\t//\t\tthe xxx is a name of the attribute to handle. So an attribute of \"foo\" \n\t//\t\twould have a custom getter of _fooGetter and a custom setter of _fooSetter.\n\t//\n\t// example:\n\t//\t|\trequire([\"dojo/Stateful\", function(Stateful) {\n\t//\t|\t\tvar obj = new Stateful();\n\t//\t|\t\tobj.watch(\"foo\", function(){\n\t//\t|\t\t\tconsole.log(\"foo changed to \" + this.get(\"foo\"));\n\t//\t|\t\t});\n\t//\t|\t\tobj.set(\"foo\",\"bar\");\n\t//\t|\t});\n\n\t// _attrPairNames: Hash\n\t//\t\tUsed across all instances a hash to cache attribute names and their getter \n\t//\t\tand setter names.\n\t_attrPairNames: {},\n\n\t_getAttrNames: function(name){\n\t\t// summary:\n\t\t//\t\tHelper function for get() and set().\n\t\t//\t\tCaches attribute name values so we don't do the string ops every time.\n\t\t// tags:\n\t\t//\t\tprivate\n\n\t\tvar apn = this._attrPairNames;\n\t\tif(apn[name]){ return apn[name]; }\n\t\treturn (apn[name] = {\n\t\t\ts: \"_\" + name + \"Setter\",\n\t\t\tg: \"_\" + name + \"Getter\"\n\t\t});\n\t},\n\n\tpostscript: function(/*Object?*/ params){\n\t\t// Automatic setting of params during construction\n\t\tif (params){ this.set(params); }\n\t},\n\n\t_get: function(name, names){\n\t\t// summary:\n\t\t//\t\tPrivate function that does a get based off a hash of names\n\t\t// names:\n\t\t//\t\tHash of names of custom attributes\n\t\treturn typeof this[names.g] === \"function\" ? this[names.g]() : this[name];\n\t},\n\tget: function(/*String*/name){\n\t\t// summary:\n\t\t//\t\tGet a property on a Stateful instance.\n\t\t// name:\n\t\t//\t\tThe property to get.\n\t\t// returns:\n\t\t//\t\tThe property value on this Stateful instance.\n\t\t// description:\n\t\t//\t\tGet a named property on a Stateful object. The property may\n\t\t//\t\tpotentially be retrieved via a getter method in subclasses. In the base class\n\t\t//\t\tthis just retrieves the object's property.\n\t\t// example:\n\t\t//\t|\trequire([\"dojo/Stateful\", function(Stateful) {\n\t\t//\t|\t\tvar stateful = new Stateful({foo: 3});\n\t\t//\t|\t\tstateful.get(\"foo\") // returns 3\n\t\t//\t|\t\tstateful.foo // returns 3\n\t\t//\t|\t});\n\n\t\treturn this._get(name, this._getAttrNames(name)); //Any\n\t},\n\tset: function(/*String*/name, /*Object*/value){\n\t\t// summary:\n\t\t//\t\tSet a property on a Stateful instance\n\t\t// name:\n\t\t//\t\tThe property to set.\n\t\t// value:\n\t\t//\t\tThe value to set in the property.\n\t\t// returns:\n\t\t//\t\tThe function returns this dojo.Stateful instance.\n\t\t// description:\n\t\t//\t\tSets named properties on a stateful object and notifies any watchers of\n\t\t//\t\tthe property. A programmatic setter may be defined in subclasses.\n\t\t// example:\n\t\t//\t|\trequire([\"dojo/Stateful\", function(Stateful) {\n\t\t//\t|\t\tvar stateful = new Stateful();\n\t\t//\t|\t\tstateful.watch(function(name, oldValue, value){\n\t\t//\t|\t\t\t// this will be called on the set below\n\t\t//\t|\t\t}\n\t\t//\t|\t\tstateful.set(foo, 5);\n\t\t//\tset() may also be called with a hash of name/value pairs, ex:\n\t\t//\t|\t\tstateful.set({\n\t\t//\t|\t\t\tfoo: \"Howdy\",\n\t\t//\t|\t\t\tbar: 3\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\tThis is equivalent to calling set(foo, \"Howdy\") and set(bar, 3)\n\n\t\t// If an object is used, iterate through object\n\t\tif(typeof name === \"object\"){\n\t\t\tfor(var x in name){\n\t\t\t\tif(name.hasOwnProperty(x) && x !=\"_watchCallbacks\"){\n\t\t\t\t\tthis.set(x, name[x]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tvar names = this._getAttrNames(name),\n\t\t\toldValue = this._get(name, names),\n\t\t\tsetter = this[names.s],\n\t\t\tresult;\n\t\tif(typeof setter === \"function\"){\n\t\t\t// use the explicit setter\n\t\t\tresult = setter.apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}else{\n\t\t\t// no setter so set attribute directly\n\t\t\tthis[name] = value;\n\t\t}\n\t\tif(this._watchCallbacks){\n\t\t\tvar self = this;\n\t\t\t// If setter returned a promise, wait for it to complete, otherwise call watches immediately\n\t\t\twhen(result, function(){\n\t\t\t\tself._watchCallbacks(name, oldValue, value);\n\t\t\t});\n\t\t}\n\t\treturn this; // dojo/Stateful\n\t},\n\t_changeAttrValue: function(name, value){\n\t\t// summary:\n\t\t//\t\tInternal helper for directly changing an attribute value.\n\t\t//\n\t\t// name: String\n\t\t//\t\tThe property to set.\n\t\t// value: Mixed\n\t\t//\t\tThe value to set in the property.\n\t\t//\n\t\t// description:\n\t\t//\t\tDirectly change the value of an attribute on an object, bypassing any \n\t\t//\t\taccessor setter. Also handles the calling of watch and emitting events. \n\t\t//\t\tIt is designed to be used by descendant class when there are two values \n\t\t//\t\tof attributes that are linked, but calling .set() is not appropriate.\n\n\t\tvar oldValue = this.get(name);\n\t\tthis[name] = value;\n\t\tif(this._watchCallbacks){\n\t\t\tthis._watchCallbacks(name, oldValue, value);\n\t\t}\n\t\treturn this; // dojo/Stateful\n\t},\n\twatch: function(/*String?*/name, /*Function*/callback){\n\t\t// summary:\n\t\t//\t\tWatches a property for changes\n\t\t// name:\n\t\t//\t\tIndicates the property to watch. This is optional (the callback may be the\n\t\t//\t\tonly parameter), and if omitted, all the properties will be watched\n\t\t// returns:\n\t\t//\t\tAn object handle for the watch. The unwatch method of this object\n\t\t//\t\tcan be used to discontinue watching this property:\n\t\t//\t\t|\tvar watchHandle = obj.watch(\"foo\", callback);\n\t\t//\t\t|\twatchHandle.unwatch(); // callback won't be called now\n\t\t// callback:\n\t\t//\t\tThe function to execute when the property changes. This will be called after\n\t\t//\t\tthe property has been changed. The callback will be called with the |this|\n\t\t//\t\tset to the instance, the first argument as the name of the property, the\n\t\t//\t\tsecond argument as the old value and the third argument as the new value.\n\n\t\tvar callbacks = this._watchCallbacks;\n\t\tif(!callbacks){\n\t\t\tvar self = this;\n\t\t\tcallbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){\n\t\t\t\tvar notify = function(propertyCallbacks){\n\t\t\t\t\tif(propertyCallbacks){\n\t\t\t\t\t\tpropertyCallbacks = propertyCallbacks.slice();\n\t\t\t\t\t\tfor(var i = 0, l = propertyCallbacks.length; i < l; i++){\n\t\t\t\t\t\t\tpropertyCallbacks[i].call(self, name, oldValue, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tnotify(callbacks['_' + name]);\n\t\t\t\tif(!ignoreCatchall){\n\t\t\t\t\tnotify(callbacks[\"*\"]); // the catch-all\n\t\t\t\t}\n\t\t\t}; // we use a function instead of an object so it will be ignored by JSON conversion\n\t\t}\n\t\tif(!callback && typeof name === \"function\"){\n\t\t\tcallback = name;\n\t\t\tname = \"*\";\n\t\t}else{\n\t\t\t// prepend with dash to prevent name conflicts with function (like \"name\" property)\n\t\t\tname = '_' + name;\n\t\t}\n\t\tvar propertyCallbacks = callbacks[name];\n\t\tif(typeof propertyCallbacks !== \"object\"){\n\t\t\tpropertyCallbacks = callbacks[name] = [];\n\t\t}\n\t\tpropertyCallbacks.push(callback);\n\n\t\t// TODO: Remove unwatch in 2.0\n\t\tvar handle = {};\n\t\thandle.unwatch = handle.remove = function(){\n\t\t\tvar index = array.indexOf(propertyCallbacks, callback);\n\t\t\tif(index > -1){\n\t\t\t\tpropertyCallbacks.splice(index, 1);\n\t\t\t}\n\t\t};\n\t\treturn handle; //Object\n\t}\n\n});\n\n});\n","define([\"./kernel\", \"./lang\", \"./array\", \"./config\"], function(dojo, lang, ArrayUtil, config){\n\n\tvar Color = dojo.Color = function(/*Array|String|Object*/ color){\n\t\t// summary:\n\t\t//\t\tTakes a named string, hex string, array of rgb or rgba values,\n\t\t//\t\tan object with r, g, b, and a properties, or another `Color` object\n\t\t//\t\tand creates a new Color instance to work from.\n\t\t//\n\t\t// example:\n\t\t//\t\tWork with a Color instance:\n\t\t//\t|\trequire([\"dojo/_base/color\"], function(Color){\n\t\t//\t|\t\tvar c = new Color();\n\t\t//\t|\t\tc.setColor([0,0,0]); // black\n\t\t//\t|\t\tvar hex = c.toHex(); // #000000\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tWork with a node's color:\n\t\t//\t| \n\t\t//\t|\trequire([\"dojo/_base/color\", \"dojo/dom-style\"], function(Color, domStyle){\n\t\t//\t|\t\tvar color = domStyle(\"someNode\", \"backgroundColor\");\n\t\t//\t|\t\tvar n = new Color(color);\n\t\t//\t|\t\t// adjust the color some\n\t\t//\t|\t\tn.r *= .5;\n\t\t//\t|\t\tconsole.log(n.toString()); // rgb(128, 255, 255);\n\t\t//\t|\t});\n\t\tif(color){ this.setColor(color); }\n\t};\n\n\t// FIXME:\n\t// there's got to be a more space-efficient way to encode or discover\n\t// these!! Use hex?\n\tColor.named = {\n\t\t// summary:\n\t\t//\t\tDictionary list of all CSS named colors, by name. Values are 3-item arrays with corresponding RG and B values.\n\t\t\"black\": [0,0,0],\n\t\t\"silver\": [192,192,192],\n\t\t\"gray\":\t [128,128,128],\n\t\t\"white\": [255,255,255],\n\t\t\"maroon\": [128,0,0],\n\t\t\"red\":\t [255,0,0],\n\t\t\"purple\": [128,0,128],\n\t\t\"fuchsia\":[255,0,255],\n\t\t\"green\": [0,128,0],\n\t\t\"lime\":\t [0,255,0],\n\t\t\"olive\": [128,128,0],\n\t\t\"yellow\": [255,255,0],\n\t\t\"navy\":\t [0,0,128],\n\t\t\"blue\":\t [0,0,255],\n\t\t\"teal\":\t [0,128,128],\n\t\t\"aqua\":\t [0,255,255],\n\t\t\"transparent\": config.transparentColor || [0,0,0,0]\n\t};\n\n\tlang.extend(Color, {\n\t\tr: 255, g: 255, b: 255, a: 1,\n\t\t_set: function(r, g, b, a){\n\t\t\tvar t = this; t.r = r; t.g = g; t.b = b; t.a = a;\n\t\t},\n\t\tsetColor: function(/*Array|String|Object*/ color){\n\t\t\t// summary:\n\t\t\t//\t\tTakes a named string, hex string, array of rgb or rgba values,\n\t\t\t//\t\tan object with r, g, b, and a properties, or another `Color` object\n\t\t\t//\t\tand sets this color instance to that value.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/_base/color\"], function(Color){\n\t\t\t//\t|\t\tvar c = new Color(); // no color\n\t\t\t//\t|\t\tc.setColor(\"#ededed\"); // greyish\n\t\t\t//\t|\t});\n\t\t\tif(lang.isString(color)){\n\t\t\t\tColor.fromString(color, this);\n\t\t\t}else if(lang.isArray(color)){\n\t\t\t\tColor.fromArray(color, this);\n\t\t\t}else{\n\t\t\t\tthis._set(color.r, color.g, color.b, color.a);\n\t\t\t\tif(!(color instanceof Color)){ this.sanitize(); }\n\t\t\t}\n\t\t\treturn this;\t// Color\n\t\t},\n\t\tsanitize: function(){\n\t\t\t// summary:\n\t\t\t//\t\tEnsures the object has correct attributes\n\t\t\t// description:\n\t\t\t//\t\tthe default implementation does nothing, include dojo.colors to\n\t\t\t//\t\taugment it with real checks\n\t\t\treturn this;\t// Color\n\t\t},\n\t\ttoRgb: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns 3 component array of rgb values\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/_base/color\"], function(Color){\n\t\t\t//\t|\t\tvar c = new Color(\"#000000\");\n\t\t\t//\t|\t\tconsole.log(c.toRgb()); // [0,0,0]\n\t\t\t//\t|\t});\n\t\t\tvar t = this;\n\t\t\treturn [t.r, t.g, t.b]; // Array\n\t\t},\n\t\ttoRgba: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a 4 component array of rgba values from the color\n\t\t\t//\t\trepresented by this object.\n\t\t\tvar t = this;\n\t\t\treturn [t.r, t.g, t.b, t.a];\t// Array\n\t\t},\n\t\ttoHex: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a CSS color string in hexadecimal representation\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/_base/color\"], function(Color){\n\t\t\t//\t|\t\tconsole.log(new Color([0,0,0]).toHex()); // #000000\n\t\t\t//\t|\t});\n\t\t\tvar arr = ArrayUtil.map([\"r\", \"g\", \"b\"], function(x){\n\t\t\t\tvar s = this[x].toString(16);\n\t\t\t\treturn s.length < 2 ? \"0\" + s : s;\n\t\t\t}, this);\n\t\t\treturn \"#\" + arr.join(\"\");\t// String\n\t\t},\n\t\ttoCss: function(/*Boolean?*/ includeAlpha){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a css color string in rgb(a) representation\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/_base/color\"], function(Color){\n\t\t\t//\t|\t\tvar c = new Color(\"#FFF\").toCss();\n\t\t\t//\t|\t\tconsole.log(c); // rgb('255','255','255')\n\t\t\t//\t|\t});\n\t\t\tvar t = this, rgb = t.r + \", \" + t.g + \", \" + t.b;\n\t\t\treturn (includeAlpha ? \"rgba(\" + rgb + \", \" + t.a : \"rgb(\" + rgb) + \")\";\t// String\n\t\t},\n\t\ttoString: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a visual representation of the color\n\t\t\treturn this.toCss(true); // String\n\t\t}\n\t});\n\n\tColor.blendColors = dojo.blendColors = function(\n\t\t/*Color*/ start,\n\t\t/*Color*/ end,\n\t\t/*Number*/ weight,\n\t\t/*Color?*/ obj\n\t){\n\t\t// summary:\n\t\t//\t\tBlend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,\n\t\t//\t\tcan reuse a previously allocated Color object for the result\n\t\tvar t = obj || new Color();\n\t\tt.r = Math.round(start.r + (end.r - start.r) * weight);\n\t\tt.g = Math.round(start.g + (end.g - start.g) * weight);\n\t\tt.b = Math.round(start.b + (end.b - start.b) * weight);\n\t\tt.a = start.a + (end.a - start.a) * weight;\n\t\treturn t.sanitize();\t// Color\n\t};\n\n\tColor.fromRgb = dojo.colorFromRgb = function(/*String*/ color, /*Color?*/ obj){\n\t\t// summary:\n\t\t//\t\tReturns a `Color` instance from a string of the form\n\t\t//\t\t\"rgb(...)\" or \"rgba(...)\". Optionally accepts a `Color`\n\t\t//\t\tobject to update with the parsed value and return instead of\n\t\t//\t\tcreating a new object.\n\t\t// returns:\n\t\t//\t\tA Color object. If obj is passed, it will be the return value.\n\t\tvar m = color.toLowerCase().match(/^rgba?\\(([\\s\\.,0-9]+)\\)/);\n\t\treturn m && Color.fromArray(m[1].split(/\\s*,\\s*/), obj);\t// Color\n\t};\n\n\tColor.fromHex = dojo.colorFromHex = function(/*String*/ color, /*Color?*/ obj){\n\t\t// summary:\n\t\t//\t\tConverts a hex string with a '#' prefix to a color object.\n\t\t//\t\tSupports 12-bit #rgb shorthand. Optionally accepts a\n\t\t//\t\t`Color` object to update with the parsed value.\n\t\t//\n\t\t// returns:\n\t\t//\t\tA Color object. If obj is passed, it will be the return value.\n\t\t//\n\t\t// example:\n\t\t//\t|\trequire([\"dojo/_base/color\"], function(Color){\n\t\t//\t|\t\tvar thing = new Color().fromHex(\"#ededed\"); // grey, longhand\n\t\t//\t|\t\tvar thing2 = new Color().fromHex(\"#000\"); // black, shorthand\n\t\t//\t|\t});\n\t\tvar t = obj || new Color(),\n\t\t\tbits = (color.length == 4) ? 4 : 8,\n\t\t\tmask = (1 << bits) - 1;\n\t\tcolor = Number(\"0x\" + color.substr(1));\n\t\tif(isNaN(color)){\n\t\t\treturn null; // Color\n\t\t}\n\t\tArrayUtil.forEach([\"b\", \"g\", \"r\"], function(x){\n\t\t\tvar c = color & mask;\n\t\t\tcolor >>= bits;\n\t\t\tt[x] = bits == 4 ? 17 * c : c;\n\t\t});\n\t\tt.a = 1;\n\t\treturn t;\t// Color\n\t};\n\n\tColor.fromArray = dojo.colorFromArray = function(/*Array*/ a, /*Color?*/ obj){\n\t\t// summary:\n\t\t//\t\tBuilds a `Color` from a 3 or 4 element array, mapping each\n\t\t//\t\telement in sequence to the rgb(a) values of the color.\n\t\t// example:\n\t\t//\t\t|\trequire([\"dojo/_base/color\"], function(Color){\n\t\t//\t\t|\t\tvar myColor = new Color().fromArray([237,237,237,0.5]); // grey, 50% alpha\n\t\t//\t\t|\t});\n\t\t// returns:\n\t\t//\t\tA Color object. If obj is passed, it will be the return value.\n\t\tvar t = obj || new Color();\n\t\tt._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));\n\t\tif(isNaN(t.a)){ t.a = 1; }\n\t\treturn t.sanitize();\t// Color\n\t};\n\n\tColor.fromString = dojo.colorFromString = function(/*String*/ str, /*Color?*/ obj){\n\t\t// summary:\n\t\t//\t\tParses `str` for a color value. Accepts hex, rgb, and rgba\n\t\t//\t\tstyle color values.\n\t\t// description:\n\t\t//\t\tAcceptable input values for str may include arrays of any form\n\t\t//\t\taccepted by dojo.colorFromArray, hex strings such as \"#aaaaaa\", or\n\t\t//\t\trgb or rgba strings such as \"rgb(133, 200, 16)\" or \"rgba(10, 10,\n\t\t//\t\t10, 50)\"\n\t\t// returns:\n\t\t//\t\tA Color object. If obj is passed, it will be the return value.\n\t\tvar a = Color.named[str];\n\t\treturn a && Color.fromArray(a, obj) || Color.fromRgb(str, obj) || Color.fromHex(str, obj);\t// Color\n\t};\n\n\treturn Color;\n});\n","define([\n\t\"./kernel\",\n\t\"../Deferred\",\n\t\"../promise/Promise\",\n\t\"../errors/CancelError\",\n\t\"../has\",\n\t\"./lang\",\n\t\"../when\"\n], function(dojo, NewDeferred, Promise, CancelError, has, lang, when){\n\t// module:\n\t//\t\tdojo/_base/Deferred\n\n\tvar mutator = function(){};\n\tvar freeze = Object.freeze || function(){};\n\t// A deferred provides an API for creating and resolving a promise.\n\tvar Deferred = dojo.Deferred = function(/*Function?*/ canceller){\n\t\t// summary:\n\t\t//\t\tDeprecated. This module defines the legacy dojo/_base/Deferred API.\n\t\t//\t\tNew code should use dojo/Deferred instead.\n\t\t// description:\n\t\t//\t\tThe Deferred API is based on the concept of promises that provide a\n\t\t//\t\tgeneric interface into the eventual completion of an asynchronous action.\n\t\t//\t\tThe motivation for promises fundamentally is about creating a\n\t\t//\t\tseparation of concerns that allows one to achieve the same type of\n\t\t//\t\tcall patterns and logical data flow in asynchronous code as can be\n\t\t//\t\tachieved in synchronous code. Promises allows one\n\t\t//\t\tto be able to call a function purely with arguments needed for\n\t\t//\t\texecution, without conflating the call with concerns of whether it is\n\t\t//\t\tsync or async. One shouldn't need to alter a call's arguments if the\n\t\t//\t\timplementation switches from sync to async (or vice versa). By having\n\t\t//\t\tasync functions return promises, the concerns of making the call are\n\t\t//\t\tseparated from the concerns of asynchronous interaction (which are\n\t\t//\t\thandled by the promise).\n\t\t//\n\t\t//\t\tThe Deferred is a type of promise that provides methods for fulfilling the\n\t\t//\t\tpromise with a successful result or an error. The most important method for\n\t\t//\t\tworking with Dojo's promises is the then() method, which follows the\n\t\t//\t\tCommonJS proposed promise API. An example of using a Dojo promise:\n\t\t//\n\t\t//\t\t|\tvar resultingPromise = someAsyncOperation.then(function(result){\n\t\t//\t\t|\t\t... handle result ...\n\t\t//\t\t|\t},\n\t\t//\t\t|\tfunction(error){\n\t\t//\t\t|\t\t... handle error ...\n\t\t//\t\t|\t});\n\t\t//\n\t\t//\t\tThe .then() call returns a new promise that represents the result of the\n\t\t//\t\texecution of the callback. The callbacks will never affect the original promises value.\n\t\t//\n\t\t//\t\tThe Deferred instances also provide the following functions for backwards compatibility:\n\t\t//\n\t\t//\t\t- addCallback(handler)\n\t\t//\t\t- addErrback(handler)\n\t\t//\t\t- callback(result)\n\t\t//\t\t- errback(result)\n\t\t//\n\t\t//\t\tCallbacks are allowed to return promises themselves, so\n\t\t//\t\tyou can build complicated sequences of events with ease.\n\t\t//\n\t\t//\t\tThe creator of the Deferred may specify a canceller. The canceller\n\t\t//\t\tis a function that will be called if Deferred.cancel is called\n\t\t//\t\tbefore the Deferred fires. You can use this to implement clean\n\t\t//\t\taborting of an XMLHttpRequest, etc. Note that cancel will fire the\n\t\t//\t\tdeferred with a CancelledError (unless your canceller returns\n\t\t//\t\tanother kind of error), so the errbacks should be prepared to\n\t\t//\t\thandle that error for cancellable Deferreds.\n\t\t// example:\n\t\t//\t|\tvar deferred = new Deferred();\n\t\t//\t|\tsetTimeout(function(){ deferred.callback({success: true}); }, 1000);\n\t\t//\t|\treturn deferred;\n\t\t// example:\n\t\t//\t\tDeferred objects are often used when making code asynchronous. It\n\t\t//\t\tmay be easiest to write functions in a synchronous manner and then\n\t\t//\t\tsplit code using a deferred to trigger a response to a long-lived\n\t\t//\t\toperation. For example, instead of register a callback function to\n\t\t//\t\tdenote when a rendering operation completes, the function can\n\t\t//\t\tsimply return a deferred:\n\t\t//\n\t\t//\t\t|\t// callback style:\n\t\t//\t\t|\tfunction renderLotsOfData(data, callback){\n\t\t//\t\t|\t\tvar success = false\n\t\t//\t\t|\t\ttry{\n\t\t//\t\t|\t\t\tfor(var x in data){\n\t\t//\t\t|\t\t\t\trenderDataitem(data[x]);\n\t\t//\t\t|\t\t\t}\n\t\t//\t\t|\t\t\tsuccess = true;\n\t\t//\t\t|\t\t}catch(e){ }\n\t\t//\t\t|\t\tif(callback){\n\t\t//\t\t|\t\t\tcallback(success);\n\t\t//\t\t|\t\t}\n\t\t//\t\t|\t}\n\t\t//\n\t\t//\t\t|\t// using callback style\n\t\t//\t\t|\trenderLotsOfData(someDataObj, function(success){\n\t\t//\t\t|\t\t// handles success or failure\n\t\t//\t\t|\t\tif(!success){\n\t\t//\t\t|\t\t\tpromptUserToRecover();\n\t\t//\t\t|\t\t}\n\t\t//\t\t|\t});\n\t\t//\t\t|\t// NOTE: no way to add another callback here!!\n\t\t// example:\n\t\t//\t\tUsing a Deferred doesn't simplify the sending code any, but it\n\t\t//\t\tprovides a standard interface for callers and senders alike,\n\t\t//\t\tproviding both with a simple way to service multiple callbacks for\n\t\t//\t\tan operation and freeing both sides from worrying about details\n\t\t//\t\tsuch as \"did this get called already?\". With Deferreds, new\n\t\t//\t\tcallbacks can be added at any time.\n\t\t//\n\t\t//\t\t|\t// Deferred style:\n\t\t//\t\t|\tfunction renderLotsOfData(data){\n\t\t//\t\t|\t\tvar d = new Deferred();\n\t\t//\t\t|\t\ttry{\n\t\t//\t\t|\t\t\tfor(var x in data){\n\t\t//\t\t|\t\t\t\trenderDataitem(data[x]);\n\t\t//\t\t|\t\t\t}\n\t\t//\t\t|\t\t\td.callback(true);\n\t\t//\t\t|\t\t}catch(e){\n\t\t//\t\t|\t\t\td.errback(new Error(\"rendering failed\"));\n\t\t//\t\t|\t\t}\n\t\t//\t\t|\t\treturn d;\n\t\t//\t\t|\t}\n\t\t//\n\t\t//\t\t|\t// using Deferred style\n\t\t//\t\t|\trenderLotsOfData(someDataObj).then(null, function(){\n\t\t//\t\t|\t\tpromptUserToRecover();\n\t\t//\t\t|\t});\n\t\t//\t\t|\t// NOTE: addErrback and addCallback both return the Deferred\n\t\t//\t\t|\t// again, so we could chain adding callbacks or save the\n\t\t//\t\t|\t// deferred for later should we need to be notified again.\n\t\t// example:\n\t\t//\t\tIn this example, renderLotsOfData is synchronous and so both\n\t\t//\t\tversions are pretty artificial. Putting the data display on a\n\t\t//\t\ttimeout helps show why Deferreds rock:\n\t\t//\n\t\t//\t\t|\t// Deferred style and async func\n\t\t//\t\t|\tfunction renderLotsOfData(data){\n\t\t//\t\t|\t\tvar d = new Deferred();\n\t\t//\t\t|\t\tsetTimeout(function(){\n\t\t//\t\t|\t\t\ttry{\n\t\t//\t\t|\t\t\t\tfor(var x in data){\n\t\t//\t\t|\t\t\t\t\trenderDataitem(data[x]);\n\t\t//\t\t|\t\t\t\t}\n\t\t//\t\t|\t\t\t\td.callback(true);\n\t\t//\t\t|\t\t\t}catch(e){\n\t\t//\t\t|\t\t\t\td.errback(new Error(\"rendering failed\"));\n\t\t//\t\t|\t\t\t}\n\t\t//\t\t|\t\t}, 100);\n\t\t//\t\t|\t\treturn d;\n\t\t//\t\t|\t}\n\t\t//\n\t\t//\t\t|\t// using Deferred style\n\t\t//\t\t|\trenderLotsOfData(someDataObj).then(null, function(){\n\t\t//\t\t|\t\tpromptUserToRecover();\n\t\t//\t\t|\t});\n\t\t//\n\t\t//\t\tNote that the caller doesn't have to change his code at all to\n\t\t//\t\thandle the asynchronous case.\n\n\t\tvar result, finished, canceled, fired, isError, head, nextListener;\n\t\tvar promise = (this.promise = new Promise());\n\n\t\tfunction complete(value){\n\t\t\tif(finished){\n\t\t\t\tthrow new Error(\"This deferred has already been resolved\");\n\t\t\t}\n\t\t\tresult = value;\n\t\t\tfinished = true;\n\t\t\tnotify();\n\t\t}\n\t\tfunction notify(){\n\t\t\tvar mutated;\n\t\t\twhile(!mutated && nextListener){\n\t\t\t\tvar listener = nextListener;\n\t\t\t\tnextListener = nextListener.next;\n\t\t\t\tif((mutated = (listener.progress == mutator))){ // assignment and check\n\t\t\t\t\tfinished = false;\n\t\t\t\t}\n\n\t\t\t\tvar func = (isError ? listener.error : listener.resolved);\n\t\t\t\tif(has(\"config-useDeferredInstrumentation\")){\n\t\t\t\t\tif(isError && NewDeferred.instrumentRejected){\n\t\t\t\t\t\tNewDeferred.instrumentRejected(result, !!func);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(func){\n\t\t\t\t\ttry{\n\t\t\t\t\t\tvar newResult = func(result);\n\t\t\t\t\t\tif (newResult && typeof newResult.then === \"function\"){\n\t\t\t\t\t\t\tnewResult.then(lang.hitch(listener.deferred, \"resolve\"), lang.hitch(listener.deferred, \"reject\"), lang.hitch(listener.deferred, \"progress\"));\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar unchanged = mutated && newResult === undefined;\n\t\t\t\t\t\tif(mutated && !unchanged){\n\t\t\t\t\t\t\tisError = newResult instanceof Error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlistener.deferred[unchanged && isError ? \"reject\" : \"resolve\"](unchanged ? result : newResult);\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tlistener.deferred.reject(e);\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tif(isError){\n\t\t\t\t\t\tlistener.deferred.reject(result);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlistener.deferred.resolve(result);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.isResolved = promise.isResolved = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been resolved.\n\t\t\t// returns: Boolean\n\n\t\t\treturn fired == 0;\n\t\t};\n\n\t\tthis.isRejected = promise.isRejected = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been rejected.\n\t\t\t// returns: Boolean\n\n\t\t\treturn fired == 1;\n\t\t};\n\n\t\tthis.isFulfilled = promise.isFulfilled = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been resolved or rejected.\n\t\t\t// returns: Boolean\n\n\t\t\treturn fired >= 0;\n\t\t};\n\n\t\tthis.isCanceled = promise.isCanceled = function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the deferred has been canceled.\n\t\t\t// returns: Boolean\n\n\t\t\treturn canceled;\n\t\t};\n\n\t\t// calling resolve will resolve the promise\n\t\tthis.resolve = this.callback = function(value){\n\t\t\t// summary:\n\t\t\t//\t\tFulfills the Deferred instance successfully with the provide value\n\t\t\tthis.fired = fired = 0;\n\t\t\tthis.results = [value, null];\n\t\t\tcomplete(value);\n\t\t};\n\n\n\t\t// calling error will indicate that the promise failed\n\t\tthis.reject = this.errback = function(error){\n\t\t\t// summary:\n\t\t\t//\t\tFulfills the Deferred instance as an error with the provided error\n\t\t\tisError = true;\n\t\t\tthis.fired = fired = 1;\n\t\t\tif(has(\"config-useDeferredInstrumentation\")){\n\t\t\t\tif(NewDeferred.instrumentRejected){\n\t\t\t\t\tNewDeferred.instrumentRejected(error, !!nextListener);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcomplete(error);\n\t\t\tthis.results = [null, error];\n\t\t};\n\t\t// call progress to provide updates on the progress on the completion of the promise\n\t\tthis.progress = function(update){\n\t\t\t// summary:\n\t\t\t//\t\tSend progress events to all listeners\n\t\t\tvar listener = nextListener;\n\t\t\twhile(listener){\n\t\t\t\tvar progress = listener.progress;\n\t\t\t\tprogress && progress(update);\n\t\t\t\tlistener = listener.next;\n\t\t\t}\n\t\t};\n\t\tthis.addCallbacks = function(callback, errback){\n\t\t\t// summary:\n\t\t\t//\t\tAdds callback and error callback for this deferred instance.\n\t\t\t// callback: Function?\n\t\t\t//\t\tThe callback attached to this deferred object.\n\t\t\t// errback: Function?\n\t\t\t//\t\tThe error callback attached to this deferred object.\n\t\t\t// returns:\n\t\t\t//\t\tReturns this deferred object.\n\t\t\tthis.then(callback, errback, mutator);\n\t\t\treturn this;\t// Deferred\n\t\t};\n\t\t// provide the implementation of the promise\n\t\tpromise.then = this.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){\n\t\t\t// summary:\n\t\t\t//\t\tAdds a fulfilledHandler, errorHandler, and progressHandler to be called for\n\t\t\t//\t\tcompletion of a promise. The fulfilledHandler is called when the promise\n\t\t\t//\t\tis fulfilled. The errorHandler is called when a promise fails. The\n\t\t\t//\t\tprogressHandler is called for progress events. All arguments are optional\n\t\t\t//\t\tand non-function values are ignored. The progressHandler is not only an\n\t\t\t//\t\toptional argument, but progress events are purely optional. Promise\n\t\t\t//\t\tproviders are not required to ever create progress events.\n\t\t\t//\n\t\t\t//\t\tThis function will return a new promise that is fulfilled when the given\n\t\t\t//\t\tfulfilledHandler or errorHandler callback is finished. This allows promise\n\t\t\t//\t\toperations to be chained together. The value returned from the callback\n\t\t\t//\t\thandler is the fulfillment value for the returned promise. If the callback\n\t\t\t//\t\tthrows an error, the returned promise will be moved to failed state.\n\t\t\t//\n\t\t\t// returns:\n\t\t\t//\t\tReturns a new promise that represents the result of the\n\t\t\t//\t\texecution of the callback. The callbacks will never affect the original promises value.\n\t\t\t// example:\n\t\t\t//\t\tAn example of using a CommonJS compliant promise:\n\t\t\t//\t\t|\tasyncComputeTheAnswerToEverything().\n\t\t\t//\t\t|\t\tthen(addTwo).\n\t\t\t//\t\t|\t\tthen(printResult, onError);\n\t\t\t//\t\t|\t>44\n\t\t\t//\n\t\t\tvar returnDeferred = progressCallback == mutator ? this : new Deferred(promise.cancel);\n\t\t\tvar listener = {\n\t\t\t\tresolved: resolvedCallback,\n\t\t\t\terror: errorCallback,\n\t\t\t\tprogress: progressCallback,\n\t\t\t\tdeferred: returnDeferred\n\t\t\t};\n\t\t\tif(nextListener){\n\t\t\t\thead = head.next = listener;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tnextListener = head = listener;\n\t\t\t}\n\t\t\tif(finished){\n\t\t\t\tnotify();\n\t\t\t}\n\t\t\treturn returnDeferred.promise; // Promise\n\t\t};\n\t\tvar deferred = this;\n\t\tpromise.cancel = this.cancel = function(){\n\t\t\t// summary:\n\t\t\t//\t\tCancels the asynchronous operation\n\t\t\tif(!finished){\n\t\t\t\tvar error = canceller && canceller(deferred);\n\t\t\t\tif(!finished){\n\t\t\t\t\tif (!(error instanceof Error)){\n\t\t\t\t\t\terror = new CancelError(error);\n\t\t\t\t\t}\n\t\t\t\t\terror.log = false;\n\t\t\t\t\tdeferred.reject(error);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcanceled = true;\n\t\t};\n\t\tfreeze(promise);\n\t};\n\tlang.extend(Deferred, {\n\t\taddCallback: function(/*Function*/ callback){\n\t\t\t// summary:\n\t\t\t//\t\tAdds successful callback for this deferred instance.\n\t\t\t// returns:\n\t\t\t//\t\tReturns this deferred object.\n\t\t\treturn this.addCallbacks(lang.hitch.apply(dojo, arguments));\t// Deferred\n\t\t},\n\n\t\taddErrback: function(/*Function*/ errback){\n\t\t\t// summary:\n\t\t\t//\t\tAdds error callback for this deferred instance.\n\t\t\t// returns:\n\t\t\t//\t\tReturns this deferred object.\n\t\t\treturn this.addCallbacks(null, lang.hitch.apply(dojo, arguments));\t// Deferred\n\t\t},\n\n\t\taddBoth: function(/*Function*/ callback){\n\t\t\t// summary:\n\t\t\t//\t\tAdd handler as both successful callback and error callback for this deferred instance.\n\t\t\t// returns:\n\t\t\t//\t\tReturns this deferred object.\n\t\t\tvar enclosed = lang.hitch.apply(dojo, arguments);\n\t\t\treturn this.addCallbacks(enclosed, enclosed);\t// Deferred\n\t\t},\n\t\tfired: -1\n\t});\n\n\tDeferred.when = dojo.when = when;\n\n\treturn Deferred;\n});\n","define([\"./kernel\", \"../query\", \"./array\", \"./html\", \"../NodeList-dom\"], function(dojo, query, array){\n\t// module:\n\t//\t\tdojo/_base/NodeList\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tThis module extends dojo/NodeList with the legacy connect(), coords(),\n\t\t//\t\tblur(), focus(), change(), click(), error(), keydown(), keypress(),\n\t\t//\t\tkeyup(), load(), mousedown(), mouseenter(), mouseleave(), mousemove(),\n\t\t//\t\tmouseout(), mouseover(), mouseup(), and submit() methods.\n\t};\n\t=====*/\n \n\tvar NodeList = query.NodeList,\n\t\tnlp = NodeList.prototype;\n\n\tnlp.connect = NodeList._adaptAsForEach(function(){\n\t\t// don't bind early to dojo.connect since we no longer explicitly depend on it\n\t\treturn dojo.connect.apply(this, arguments);\n\t});\n\t/*=====\n\tnlp.connect = function(methodName, objOrFunc, funcName){\n\t\t// summary:\n\t\t//\t\tAttach event handlers to every item of the NodeList. Uses dojo.connect()\n\t\t//\t\tso event properties are normalized.\n\t\t//\n\t\t//\t\tApplication must manually require() \"dojo/_base/connect\" before using this method.\n\t\t// methodName: String\n\t\t//\t\tthe name of the method to attach to. For DOM events, this should be\n\t\t//\t\tthe lower-case name of the event\n\t\t// objOrFunc: Object|Function|String\n\t\t//\t\tif 2 arguments are passed (methodName, objOrFunc), objOrFunc should\n\t\t//\t\treference a function or be the name of the function in the global\n\t\t//\t\tnamespace to attach. If 3 arguments are provided\n\t\t//\t\t(methodName, objOrFunc, funcName), objOrFunc must be the scope to\n\t\t//\t\tlocate the bound function in\n\t\t// funcName: String?\n\t\t//\t\toptional. A string naming the function in objOrFunc to bind to the\n\t\t//\t\tevent. May also be a function reference.\n\t\t// example:\n\t\t//\t\tadd an onclick handler to every button on the page\n\t\t//\t\t|\tquery(\"div:nth-child(odd)\").connect(\"onclick\", function(e){\n\t\t//\t\t|\t\tconsole.log(\"clicked!\");\n\t\t//\t\t|\t});\n\t\t// example:\n\t\t//\t\tattach foo.bar() to every odd div's onmouseover\n\t\t//\t\t|\tquery(\"div:nth-child(odd)\").connect(\"onmouseover\", foo, \"bar\");\n\n\t\treturn null;\t// NodeList\n\t};\n\t=====*/\n\n\tnlp.coords = NodeList._adaptAsMap(dojo.coords);\n\t/*=====\n\tnlp.coords = function(){\n\t\t// summary:\n\t\t//\t\tDeprecated: Use position() for border-box x/y/w/h\n\t\t//\t\tor marginBox() for margin-box w/h/l/t.\n\t\t//\t\tReturns the box objects of all elements in a node list as\n\t\t//\t\tan Array (*not* a NodeList). Acts like `domGeom.coords`, though assumes\n\t\t//\t\tthe node passed is each node in this list.\n\n\t\treturn []; // Array\n\t};\n\t=====*/\n\n\tNodeList.events = [\n\t\t// summary:\n\t\t//\t\tlist of all DOM events used in NodeList\n\t\t\"blur\", \"focus\", \"change\", \"click\", \"error\", \"keydown\", \"keypress\",\n\t\t\"keyup\", \"load\", \"mousedown\", \"mouseenter\", \"mouseleave\", \"mousemove\",\n\t\t\"mouseout\", \"mouseover\", \"mouseup\", \"submit\"\n\t];\n\n\t// FIXME: pseudo-doc the above automatically generated on-event functions\n\n\t// syntactic sugar for DOM events\n\tarray.forEach(NodeList.events, function(evt){\n\t\t\tvar _oe = \"on\" + evt;\n\t\t\tnlp[_oe] = function(a, b){\n\t\t\t\treturn this.connect(_oe, a, b);\n\t\t\t};\n\t\t\t\t// FIXME: should these events trigger publishes?\n\t\t\t\t/*\n\t\t\t\treturn (a ? this.connect(_oe, a, b) :\n\t\t\t\t\t\t\tthis.forEach(function(n){\n\t\t\t\t\t\t\t\t// FIXME:\n\t\t\t\t\t\t\t\t//\t\tlisteners get buried by\n\t\t\t\t\t\t\t\t//\t\taddEventListener and can't be dug back\n\t\t\t\t\t\t\t\t//\t\tout to be triggered externally.\n\t\t\t\t\t\t\t\t// see:\n\t\t\t\t\t\t\t\t//\t\thttp://developer.mozilla.org/en/docs/DOM:element\n\n\t\t\t\t\t\t\t\tconsole.log(n, evt, _oe);\n\n\t\t\t\t\t\t\t\t// FIXME: need synthetic event support!\n\t\t\t\t\t\t\t\tvar _e = { target: n, faux: true, type: evt };\n\t\t\t\t\t\t\t\t// dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });\n\t\t\t\t\t\t\t\ttry{ n[evt](_e); }catch(e){ console.log(e); }\n\t\t\t\t\t\t\t\ttry{ n[_oe](_e); }catch(e){ console.log(e); }\n\t\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\t*/\n\t\t}\n\t);\n\n\tdojo.NodeList = NodeList;\n\treturn NodeList;\n});\n","define([\"./kernel\", \"../has\", \"./lang\"], function(dojo, has, lang){\n\t// module:\n\t//\t\tdojo/_base/array\n\n\t// our old simple function builder stuff\n\tvar cache = {}, u;\n\n\tvar buildFn;\n\tif(!has(\"csp-restrictions\")){\n\t\tbuildFn = function (fn){\n\t\t\treturn cache[fn] = new Function(\"item\", \"index\", \"array\", fn); // Function\n\t\t};\n\t}\n\n\t// magic snippet: if(typeof fn == \"string\") fn = cache[fn] || buildFn(fn);\n\n\t// every & some\n\n\tfunction everyOrSome(some){\n\t\tvar every = !some;\n\t\treturn function(a, fn, o){\n\t\t\tvar i = 0, l = a && a.length || 0, result;\n\t\t\tif(l && typeof a == \"string\") a = a.split(\"\");\n\t\t\tif(typeof fn == \"string\"){\n\t\t\t\tif(has(\"csp-restrictions\")){\n\t\t\t\t\tthrow new TypeError(\"callback must be a function\");\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tfn = cache[fn] || buildFn(fn);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(o){\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tresult = !fn.call(o, a[i], i, a);\n\t\t\t\t\tif(some ^ result){\n\t\t\t\t\t\treturn !result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tresult = !fn(a[i], i, a);\n\t\t\t\t\tif(some ^ result){\n\t\t\t\t\t\treturn !result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn every; // Boolean\n\t\t};\n\t}\n\n\t// indexOf, lastIndexOf\n\n\tfunction index(up){\n\t\tvar delta = 1, lOver = 0, uOver = 0;\n\t\tif(!up){\n\t\t\tdelta = lOver = uOver = -1;\n\t\t}\n\t\treturn function(a, x, from, last){\n\t\t\tif(last && delta > 0){\n\t\t\t\t// TODO: why do we use a non-standard signature? why do we need \"last\"?\n\t\t\t\treturn array.lastIndexOf(a, x, from);\n\t\t\t}\n\t\t\tvar l = a && a.length || 0, end = up ? l + uOver : lOver, i;\n\t\t\tif(from === u){\n\t\t\t\ti = up ? lOver : l + uOver;\n\t\t\t}else{\n\t\t\t\tif(from < 0){\n\t\t\t\t\ti = l + from;\n\t\t\t\t\tif(i < 0){\n\t\t\t\t\t\ti = lOver;\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\ti = from >= l ? l + uOver : from;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(l && typeof a == \"string\") a = a.split(\"\");\n\t\t\tfor(; i != end; i += delta){\n\t\t\t\tif(a[i] == x){\n\t\t\t\t\treturn i; // Number\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1; // Number\n\t\t};\n\t}\n\n\tvar array = {\n\t\t// summary:\n\t\t//\t\tThe Javascript v1.6 array extensions.\n\n\t\tevery: everyOrSome(false),\n\t\t/*=====\n\t\t every: function(arr, callback, thisObject){\n\t\t\t // summary:\n\t\t\t //\t\tDetermines whether or not every item in arr satisfies the\n\t\t\t //\t\tcondition implemented by callback.\n\t\t\t // arr: Array|String\n\t\t\t //\t\tthe array to iterate on. If a string, operates on individual characters.\n\t\t\t // callback: Function|String\n\t\t\t //\t\ta function is invoked with three arguments: item, index,\n\t\t\t //\t\tand array and returns true if the condition is met.\n\t\t\t // thisObject: Object?\n\t\t\t //\t\tmay be used to scope the call to callback\n\t\t\t // returns: Boolean\n\t\t\t // description:\n\t\t\t //\t\tThis function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when\n\t\t\t //\t\trun over sparse arrays, this implementation passes the \"holes\" in the sparse array to\n\t\t\t //\t\tthe callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.\n\t\t\t //\t\tFor more details, see:\n\t\t\t //\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every\n\t\t\t // example:\n\t\t\t //\t|\t// returns false\n\t\t\t //\t|\tarray.every([1, 2, 3, 4], function(item){ return item>1; });\n\t\t\t // example:\n\t\t\t //\t|\t// returns true\n\t\t\t //\t|\tarray.every([1, 2, 3, 4], function(item){ return item>0; });\n\t\t },\n\t\t =====*/\n\n\t\tsome: everyOrSome(true),\n\t\t/*=====\n\t\tsome: function(arr, callback, thisObject){\n\t\t\t// summary:\n\t\t\t//\t\tDetermines whether or not any item in arr satisfies the\n\t\t\t//\t\tcondition implemented by callback.\n\t\t\t// arr: Array|String\n\t\t\t//\t\tthe array to iterate over. If a string, operates on individual characters.\n\t\t\t// callback: Function|String\n\t\t\t//\t\ta function is invoked with three arguments: item, index,\n\t\t\t//\t\tand array and returns true if the condition is met.\n\t\t\t// thisObject: Object?\n\t\t\t//\t\tmay be used to scope the call to callback\n\t\t\t// returns: Boolean\n\t\t\t// description:\n\t\t\t//\t\tThis function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when\n\t\t\t//\t\trun over sparse arrays, this implementation passes the \"holes\" in the sparse array to\n\t\t\t//\t\tthe callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.\n\t\t\t//\t\tFor more details, see:\n\t\t\t//\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some\n\t\t\t// example:\n\t\t\t//\t| // is true\n\t\t\t//\t| array.some([1, 2, 3, 4], function(item){ return item>1; });\n\t\t\t// example:\n\t\t\t//\t| // is false\n\t\t\t//\t| array.some([1, 2, 3, 4], function(item){ return item<1; });\n\t\t},\n\t\t=====*/\n\n\t\tindexOf: index(true),\n\t\t/*=====\n\t\tindexOf: function(arr, value, fromIndex, findLast){\n\t\t\t// summary:\n\t\t\t//\t\tlocates the first index of the provided value in the\n\t\t\t//\t\tpassed array. If the value is not found, -1 is returned.\n\t\t\t// description:\n\t\t\t//\t\tThis method corresponds to the JavaScript 1.6 Array.indexOf method, with two differences:\n\t\t\t//\n\t\t\t//\t\t1. when run over sparse arrays, the Dojo function invokes the callback for every index\n\t\t\t//\t\t whereas JavaScript 1.6's indexOf skips the holes in the sparse array.\n\t\t\t//\t\t2. uses equality (==) rather than strict equality (===)\n\t\t\t//\n\t\t\t//\t\tFor details on this method, see:\n\t\t\t//\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf\n\t\t\t// arr: Array\n\t\t\t// value: Object\n\t\t\t// fromIndex: Integer?\n\t\t\t// findLast: Boolean?\n\t\t\t//\t\tMakes indexOf() work like lastIndexOf(). Used internally; not meant for external usage.\n\t\t\t// returns: Number\n\t\t},\n\t\t=====*/\n\n\t\tlastIndexOf: index(false),\n\t\t/*=====\n\t\tlastIndexOf: function(arr, value, fromIndex){\n\t\t\t// summary:\n\t\t\t//\t\tlocates the last index of the provided value in the passed\n\t\t\t//\t\tarray. If the value is not found, -1 is returned.\n\t\t\t// description:\n\t\t \t//\t\tThis method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with two differences:\n\t\t \t//\n\t\t \t//\t\t1. when run over sparse arrays, the Dojo function invokes the callback for every index\n\t\t \t//\t\t whereas JavaScript 1.6's lasIndexOf skips the holes in the sparse array.\n\t\t \t//\t\t2. uses equality (==) rather than strict equality (===)\n\t\t \t//\n\t\t \t//\t\tFor details on this method, see:\n\t\t \t//\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf\n\t\t\t// arr: Array,\n\t\t\t// value: Object,\n\t\t\t// fromIndex: Integer?\n\t\t\t// returns: Number\n\t\t},\n\t\t=====*/\n\n\t\tforEach: function(arr, callback, thisObject){\n\t\t\t// summary:\n\t\t\t//\t\tfor every item in arr, callback is invoked. Return values are ignored.\n\t\t\t//\t\tIf you want to break out of the loop, consider using array.every() or array.some().\n\t\t\t//\t\tforEach does not allow breaking out of the loop over the items in arr.\n\t\t\t// arr:\n\t\t\t//\t\tthe array to iterate over. If a string, operates on individual characters.\n\t\t\t// callback:\n\t\t\t//\t\ta function is invoked with three arguments: item, index, and array\n\t\t\t// thisObject:\n\t\t\t//\t\tmay be used to scope the call to callback\n\t\t\t// description:\n\t\t\t//\t\tThis function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when\n\t\t\t//\t\trun over sparse arrays, this implementation passes the \"holes\" in the sparse array to\n\t\t\t//\t\tthe callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.\n\t\t\t//\t\tFor more details, see:\n\t\t\t//\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach\n\t\t\t// example:\n\t\t\t//\t| // log out all members of the array:\n\t\t\t//\t| array.forEach(\n\t\t\t//\t|\t\t[ \"thinger\", \"blah\", \"howdy\", 10 ],\n\t\t\t//\t|\t\tfunction(item){\n\t\t\t//\t|\t\t\tconsole.log(item);\n\t\t\t//\t|\t\t}\n\t\t\t//\t| );\n\t\t\t// example:\n\t\t\t//\t| // log out the members and their indexes\n\t\t\t//\t| array.forEach(\n\t\t\t//\t|\t\t[ \"thinger\", \"blah\", \"howdy\", 10 ],\n\t\t\t//\t|\t\tfunction(item, idx, arr){\n\t\t\t//\t|\t\t\tconsole.log(item, \"at index:\", idx);\n\t\t\t//\t|\t\t}\n\t\t\t//\t| );\n\t\t\t// example:\n\t\t\t//\t| // use a scoped object member as the callback\n\t\t\t//\t|\n\t\t\t//\t| var obj = {\n\t\t\t//\t|\t\tprefix: \"logged via obj.callback:\",\n\t\t\t//\t|\t\tcallback: function(item){\n\t\t\t//\t|\t\t\tconsole.log(this.prefix, item);\n\t\t\t//\t|\t\t}\n\t\t\t//\t| };\n\t\t\t//\t|\n\t\t\t//\t| // specifying the scope function executes the callback in that scope\n\t\t\t//\t| array.forEach(\n\t\t\t//\t|\t\t[ \"thinger\", \"blah\", \"howdy\", 10 ],\n\t\t\t//\t|\t\tobj.callback,\n\t\t\t//\t|\t\tobj\n\t\t\t//\t| );\n\t\t\t//\t|\n\t\t\t//\t| // alternately, we can accomplish the same thing with lang.hitch()\n\t\t\t//\t| array.forEach(\n\t\t\t//\t|\t\t[ \"thinger\", \"blah\", \"howdy\", 10 ],\n\t\t\t//\t|\t\tlang.hitch(obj, \"callback\")\n\t\t\t//\t| );\n\t\t\t// arr: Array|String\n\t\t\t// callback: Function|String\n\t\t\t// thisObject: Object?\n\n\t\t\tvar i = 0, l = arr && arr.length || 0;\n\t\t\tif(l && typeof arr == \"string\") arr = arr.split(\"\");\n\t\t\tif(typeof callback == \"string\"){\n\t\t\t\tif(has(\"csp-restrictions\")){\n\t\t\t\t\tthrow new TypeError(\"callback must be a function\");\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tcallback = cache[callback] || buildFn(callback);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(thisObject){\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tcallback.call(thisObject, arr[i], i, arr);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tcallback(arr[i], i, arr);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tmap: function(arr, callback, thisObject, Ctr){\n\t\t\t// summary:\n\t\t\t//\t\tapplies callback to each element of arr and returns\n\t\t\t//\t\tan Array with the results\n\t\t\t// arr: Array|String\n\t\t\t//\t\tthe array to iterate on. If a string, operates on\n\t\t\t//\t\tindividual characters.\n\t\t\t// callback: Function|String\n\t\t\t//\t\ta function is invoked with three arguments, (item, index,\n\t\t\t//\t\tarray),\t and returns a value\n\t\t\t// thisObject: Object?\n\t\t\t//\t\tmay be used to scope the call to callback\n\t\t\t// returns: Array\n\t\t\t// description:\n\t\t\t//\t\tThis function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when\n\t\t\t//\t\trun over sparse arrays, this implementation passes the \"holes\" in the sparse array to\n\t\t\t//\t\tthe callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.\n\t\t\t//\t\tFor more details, see:\n\t\t\t//\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\n\t\t\t// example:\n\t\t\t//\t| // returns [2, 3, 4, 5]\n\t\t\t//\t| array.map([1, 2, 3, 4], function(item){ return item+1 });\n\n\t\t\t// TODO: why do we have a non-standard signature here? do we need \"Ctr\"?\n\t\t\tvar i = 0, l = arr && arr.length || 0, out = new (Ctr || Array)(l);\n\t\t\tif(l && typeof arr == \"string\") arr = arr.split(\"\");\n\t\t\tif(typeof callback == \"string\"){\n\t\t\t\tif(has(\"csp-restrictions\")){\n\t\t\t\t\tthrow new TypeError(\"callback must be a function\");\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tcallback = cache[callback] || buildFn(callback);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(thisObject){\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tout[i] = callback.call(thisObject, arr[i], i, arr);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tout[i] = callback(arr[i], i, arr);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out; // Array\n\t\t},\n\n\t\tfilter: function(arr, callback, thisObject){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new Array with those items from arr that match the\n\t\t\t//\t\tcondition implemented by callback.\n\t\t\t// arr: Array\n\t\t\t//\t\tthe array to iterate over.\n\t\t\t// callback: Function|String\n\t\t\t//\t\ta function that is invoked with three arguments (item,\n\t\t\t//\t\tindex, array). The return of this function is expected to\n\t\t\t//\t\tbe a boolean which determines whether the passed-in item\n\t\t\t//\t\twill be included in the returned array.\n\t\t\t// thisObject: Object?\n\t\t\t//\t\tmay be used to scope the call to callback\n\t\t\t// returns: Array\n\t\t\t// description:\n\t\t\t//\t\tThis function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when\n\t\t\t//\t\trun over sparse arrays, this implementation passes the \"holes\" in the sparse array to\n\t\t\t//\t\tthe callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array.\n\t\t\t//\t\tFor more details, see:\n\t\t\t//\t\thttps://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\n\t\t\t// example:\n\t\t\t//\t| // returns [2, 3, 4]\n\t\t\t//\t| array.filter([1, 2, 3, 4], function(item){ return item>1; });\n\n\t\t\t// TODO: do we need \"Ctr\" here like in map()?\n\t\t\tvar i = 0, l = arr && arr.length || 0, out = [], value;\n\t\t\tif(l && typeof arr == \"string\") arr = arr.split(\"\");\n\t\t\tif(typeof callback == \"string\"){\n\t\t\t\tif(has(\"csp-restrictions\")){\n\t\t\t\t\tthrow new TypeError(\"callback must be a function\");\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tcallback = cache[callback] || buildFn(callback);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(thisObject){\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tvalue = arr[i];\n\t\t\t\t\tif(callback.call(thisObject, value, i, arr)){\n\t\t\t\t\t\tout.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tfor(; i < l; ++i){\n\t\t\t\t\tvalue = arr[i];\n\t\t\t\t\tif(callback(value, i, arr)){\n\t\t\t\t\t\tout.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out; // Array\n\t\t},\n\n\t\tclearCache: function(){\n\t\t\tcache = {};\n\t\t}\n\t};\n\n\n\thas(\"extend-dojo\") && lang.mixin(dojo, array);\n\n\treturn array;\n});\n","define([\"../global\", \"../has\", \"require\"], function(global, has, require){\n\t// module:\n\t//\t\tdojo/_base/config\n\n/*=====\nreturn {\n\t// summary:\n\t//\t\tThis module defines the user configuration during bootstrap.\n\t// description:\n\t//\t\tBy defining user configuration as a module value, an entire configuration can be specified in a build,\n\t//\t\tthereby eliminating the need for sniffing and or explicitly setting in the global variable dojoConfig.\n\t//\t\tAlso, when multiple instances of dojo exist in a single application, each will necessarily be located\n\t//\t\tat an unique absolute module identifier as given by the package configuration. Implementing configuration\n\t//\t\tas a module allows for specifying unique, per-instance configurations.\n\t// example:\n\t//\t\tCreate a second instance of dojo with a different, instance-unique configuration (assume the loader and\n\t//\t\tdojo.js are already loaded).\n\t//\t\t|\t// specify a configuration that creates a new instance of dojo at the absolute module identifier \"myDojo\"\n\t//\t\t|\trequire({\n\t//\t\t|\t\tpackages:[{\n\t//\t\t|\t\t\tname:\"myDojo\",\n\t//\t\t|\t\t\tlocation:\".\", //assume baseUrl points to dojo.js\n\t//\t\t|\t\t}]\n\t//\t\t|\t});\n\t//\t\t|\n\t//\t\t|\t// specify a configuration for the myDojo instance\n\t//\t\t|\tdefine(\"myDojo/config\", {\n\t//\t\t|\t\t// normal configuration variables go here, e.g.,\n\t//\t\t|\t\tlocale:\"fr-ca\"\n\t//\t\t|\t});\n\t//\t\t|\n\t//\t\t|\t// load and use the new instance of dojo\n\t//\t\t|\trequire([\"myDojo\"], function(dojo){\n\t//\t\t|\t\t// dojo is the new instance of dojo\n\t//\t\t|\t\t// use as required\n\t//\t\t|\t});\n\n\t// isDebug: Boolean\n\t//\t\tDefaults to `false`. If set to `true`, ensures that Dojo provides\n\t//\t\textended debugging feedback to the console.\n\tisDebug: false,\n\n\t// locale: String\n\t//\t\tThe locale to assume for loading localized resources in this page,\n\t//\t\tspecified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).\n\t//\t\tMust be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.\n\t//\t\tSee the documentation for `dojo.i18n` and `dojo.requireLocalization`\n\t//\t\tfor details on loading localized resources. If no locale is specified,\n\t//\t\tDojo assumes the locale of the user agent, according to `navigator.userLanguage`\n\t//\t\tor `navigator.language` properties.\n\tlocale: undefined,\n\n\t// extraLocale: Array\n\t//\t\tNo default value. Specifies additional locales whose\n\t//\t\tresources should also be loaded alongside the default locale when\n\t//\t\tcalls to `dojo.requireLocalization()` are processed.\n\textraLocale: undefined,\n\n\t// baseUrl: String\n\t//\t\tThe directory in which `dojo.js` is located. Under normal\n\t//\t\tconditions, Dojo auto-detects the correct location from which it\n\t//\t\twas loaded. You may need to manually configure `baseUrl` in cases\n\t//\t\twhere you have renamed `dojo.js` or in which `<base>` tags confuse\n\t//\t\tsome browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned\n\t//\t\teither the value of `djConfig.baseUrl` if one is provided or the\n\t//\t\tauto-detected root if not. Other modules are located relative to\n\t//\t\tthis path. The path should end in a slash.\n\tbaseUrl: undefined,\n\n\t// modulePaths: [deprecated] Object\n\t//\t\tA map of module names to paths relative to `dojo.baseUrl`. The\n\t//\t\tkey/value pairs correspond directly to the arguments which\n\t//\t\t`dojo.registerModulePath` accepts. Specifying\n\t//\t\t`djConfig.modulePaths = { \"foo\": \"../../bar\" }` is the equivalent\n\t//\t\tof calling `dojo.registerModulePath(\"foo\", \"../../bar\");`. Multiple\n\t//\t\tmodules may be configured via `djConfig.modulePaths`.\n\tmodulePaths: {},\n\n\t// addOnLoad: Function|Array\n\t//\t\tAdds a callback via dojo/ready. Useful when Dojo is added after\n\t//\t\tthe page loads and djConfig.afterOnLoad is true. Supports the same\n\t//\t\targuments as dojo/ready. When using a function reference, use\n\t//\t\t`djConfig.addOnLoad = function(){};`. For object with function name use\n\t//\t\t`djConfig.addOnLoad = [myObject, \"functionName\"];` and for object with\n\t//\t\tfunction reference use\n\t//\t\t`djConfig.addOnLoad = [myObject, function(){}];`\n\taddOnLoad: null,\n\n\t// parseOnLoad: Boolean\n\t//\t\tRun the parser after the page is loaded\n\tparseOnLoad: false,\n\n\t// require: String[]\n\t//\t\tAn array of module names to be loaded immediately after dojo.js has been included\n\t//\t\tin a page.\n\trequire: [],\n\n\t// defaultDuration: Number\n\t//\t\tDefault duration, in milliseconds, for wipe and fade animations within dijits.\n\t//\t\tAssigned to dijit.defaultDuration.\n\tdefaultDuration: 200,\n\n\t// dojoBlankHtmlUrl: String\n\t//\t\tUsed by some modules to configure an empty iframe. Used by dojo/io/iframe and\n\t//\t\tdojo/back, and dijit/popup support in IE where an iframe is needed to make sure native\n\t//\t\tcontrols do not bleed through the popups. Normally this configuration variable\n\t//\t\tdoes not need to be set, except when using cross-domain/CDN Dojo builds.\n\t//\t\tSave dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`\n\t//\t\tto the path on your domain your copy of blank.html.\n\tdojoBlankHtmlUrl: undefined,\n\n\t// ioPublish: Boolean?\n\t//\t\tSet this to true to enable publishing of topics for the different phases of\n\t//\t\tIO operations. Publishing is done via dojo/topic.publish(). See dojo/main.__IoPublish for a list\n\t//\t\tof topics that are published.\n\tioPublish: false,\n\n\t// transparentColor: Array\n\t//\t\tArray containing the r, g, b components used as transparent color in dojo.Color;\n\t//\t\tif undefined, [255,255,255] (white) will be used.\n\ttransparentColor: undefined,\n\t\n\t// deps: Function|Array\n\t//\t\tDefines dependencies to be used before the loader has been loaded.\n\t//\t\tWhen provided, they cause the loader to execute require(deps, callback) \n\t//\t\tonce it has finished loading. Should be used with callback.\n\tdeps: undefined,\n\t\n\t// callback: Function|Array\n\t//\t\tDefines a callback to be used when dependencies are defined before \n\t//\t\tthe loader has been loaded. When provided, they cause the loader to \n\t//\t\texecute require(deps, callback) once it has finished loading. \n\t//\t\tShould be used with deps.\n\tcallback: undefined,\n\t\n\t// deferredInstrumentation: Boolean\n\t//\t\tWhether deferred instrumentation should be loaded or included\n\t//\t\tin builds.\n\tdeferredInstrumentation: true,\n\n\t// useDeferredInstrumentation: Boolean|String\n\t//\t\tWhether the deferred instrumentation should be used.\n\t//\n\t//\t\t* `\"report-rejections\"`: report each rejection as it occurs.\n\t//\t\t* `true` or `1` or `\"report-unhandled-rejections\"`: wait 1 second\n\t//\t\t\tin an attempt to detect unhandled rejections.\n\tuseDeferredInstrumentation: \"report-unhandled-rejections\"\n};\n=====*/\n\n\tvar result = {};\n\tif(has(\"dojo-config-api\")){\n\t\t// must be the dojo loader; take a shallow copy of require.rawConfig\n\t\tvar src = require.rawConfig, p;\n\t\tfor(p in src){\n\t\t\tresult[p] = src[p];\n\t\t}\n\t}else{\n\t\tvar adviseHas = function(featureSet, prefix, booting){\n\t\t\tfor(p in featureSet){\n\t\t\t\tp!=\"has\" && has.add(prefix + p, featureSet[p], 0, booting);\n\t\t\t}\n\t\t};\n\t\tresult = has(\"dojo-loader\") ?\n\t\t\t// must be a built version of the dojo loader; all config stuffed in require.rawConfig\n\t\t\trequire.rawConfig :\n\t\t\t// a foreign loader\n\t\t\tglobal.dojoConfig || global.djConfig || {};\n\t\tadviseHas(result, \"config\", 1);\n\t\tadviseHas(result.has, \"\", 1);\n\t}\n\n\tif(!result.locale && typeof navigator != \"undefined\"){\n\t\t// Default locale for browsers (ensure it's read from user-settings not download locale).\n\t\tvar language = (navigator.languages && navigator.languages.length) ? navigator.languages[0] :\n\t\t\t(navigator.language || navigator.userLanguage);\n\t\tif(language){\n\t\t\tresult.locale = language.toLowerCase();\n\t\t}\n\t}\n\n\treturn result;\n});\n\n","define([\"./kernel\", \"../on\", \"../topic\", \"../aspect\", \"./event\", \"../mouse\", \"./sniff\", \"./lang\", \"../keys\"], function(dojo, on, hub, aspect, eventModule, mouse, has, lang){\n// module:\n//\t\tdojo/_base/connect\n\nhas.add(\"events-keypress-typed\", function(){ // keypresses should only occur a printable character is hit\n\tvar testKeyEvent = {charCode: 0};\n\ttry{\n\t\ttestKeyEvent = document.createEvent(\"KeyboardEvent\");\n\t\t(testKeyEvent.initKeyboardEvent || testKeyEvent.initKeyEvent).call(testKeyEvent, \"keypress\", true, true, null, false, false, false, false, 9, 3);\n\t}catch(e){}\n\treturn testKeyEvent.charCode == 0 && !has(\"opera\");\n});\n\nfunction connect_(obj, event, context, method, dontFix){\n\tmethod = lang.hitch(context, method);\n\tif(!obj || !(obj.addEventListener || obj.attachEvent)){\n\t\t// it is a not a DOM node and we are using the dojo.connect style of treating a\n\t\t// method like an event, must go right to aspect\n\t\treturn aspect.after(obj || dojo.global, event, method, true);\n\t}\n\tif(typeof event == \"string\" && event.substring(0, 2) == \"on\"){\n\t\tevent = event.substring(2);\n\t}\n\tif(!obj){\n\t\tobj = dojo.global;\n\t}\n\tif(!dontFix){\n\t\tswitch(event){\n\t\t\t// dojo.connect has special handling for these event types\n\t\t\tcase \"keypress\":\n\t\t\t\tevent = keypress;\n\t\t\t\tbreak;\n\t\t\tcase \"mouseenter\":\n\t\t\t\tevent = mouse.enter;\n\t\t\t\tbreak;\n\t\t\tcase \"mouseleave\":\n\t\t\t\tevent = mouse.leave;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn on(obj, event, method, dontFix);\n}\n\nvar _punctMap = {\n\t106:42,\n\t111:47,\n\t186:59,\n\t187:43,\n\t188:44,\n\t189:45,\n\t190:46,\n\t191:47,\n\t192:96,\n\t219:91,\n\t220:92,\n\t221:93,\n\t222:39,\n\t229:113\n};\nvar evtCopyKey = has(\"mac\") ? \"metaKey\" : \"ctrlKey\";\n\n\nvar _synthesizeEvent = function(evt, props){\n\tvar faux = lang.mixin({}, evt, props);\n\tsetKeyChar(faux);\n\t// FIXME: would prefer to use lang.hitch: lang.hitch(evt, evt.preventDefault);\n\t// but it throws an error when preventDefault is invoked on Safari\n\t// does Event.preventDefault not support \"apply\" on Safari?\n\tfaux.preventDefault = function(){ evt.preventDefault(); };\n\tfaux.stopPropagation = function(){ evt.stopPropagation(); };\n\treturn faux;\n};\nfunction setKeyChar(evt){\n\tevt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';\n\tevt.charOrCode = evt.keyChar || evt.keyCode;\n}\nvar keypress;\nif(has(\"events-keypress-typed\")){\n\t// this emulates Firefox's keypress behavior where every keydown can correspond to a keypress\n\tvar _trySetKeyCode = function(e, code){\n\t\ttry{\n\t\t\t// squelch errors when keyCode is read-only\n\t\t\t// (e.g. if keyCode is ctrl or shift)\n\t\t\treturn (e.keyCode = code);\n\t\t}catch(e){\n\t\t\treturn 0;\n\t\t}\n\t};\n\tkeypress = function(object, listener){\n\t\tvar keydownSignal = on(object, \"keydown\", function(evt){\n\t\t\t// munge key/charCode\n\t\t\tvar k=evt.keyCode;\n\t\t\t// These are Windows Virtual Key Codes\n\t\t\t// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp\n\t\t\tvar unprintable = (k!=13) && k!=32 && (k!=27||!has(\"ie\")) && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222) && k!=229;\n\t\t\t// synthesize keypress for most unprintables and CTRL-keys\n\t\t\tif(unprintable||evt.ctrlKey){\n\t\t\t\tvar c = unprintable ? 0 : k;\n\t\t\t\tif(evt.ctrlKey){\n\t\t\t\t\tif(k==3 || k==13){\n\t\t\t\t\t\treturn listener.call(evt.currentTarget, evt); // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively\n\t\t\t\t\t}else if(c>95 && c<106){\n\t\t\t\t\t\tc -= 48; // map CTRL-[numpad 0-9] to ASCII\n\t\t\t\t\t}else if((!evt.shiftKey)&&(c>=65&&c<=90)){\n\t\t\t\t\t\tc += 32; // map CTRL-[A-Z] to lowercase\n\t\t\t\t\t}else{\n\t\t\t\t\t\tc = _punctMap[c] || c; // map other problematic CTRL combinations to ASCII\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// simulate a keypress event\n\t\t\t\tvar faux = _synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});\n\t\t\t\tlistener.call(evt.currentTarget, faux);\n\t\t\t\tif(has(\"ie\")){\n\t\t\t\t\t_trySetKeyCode(evt, faux.keyCode);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar keypressSignal = on(object, \"keypress\", function(evt){\n\t\t\tvar c = evt.charCode;\n\t\t\tc = c>=32 ? c : 0;\n\t\t\tevt = _synthesizeEvent(evt, {charCode: c, faux: true});\n\t\t\treturn listener.call(this, evt);\n\t\t});\n\t\treturn {\n\t\t\tremove: function(){\n\t\t\t\tkeydownSignal.remove();\n\t\t\t\tkeypressSignal.remove();\n\t\t\t}\n\t\t};\n\t};\n}else{\n\tif(has(\"opera\")){\n\t\tkeypress = function(object, listener){\n\t\t\treturn on(object, \"keypress\", function(evt){\n\t\t\t\tvar c = evt.which;\n\t\t\t\tif(c==3){\n\t\t\t\t\tc=99; // Mozilla maps CTRL-BREAK to CTRL-c\n\t\t\t\t}\n\t\t\t\t// can't trap some keys at all, like INSERT and DELETE\n\t\t\t\t// there is no differentiating info between DELETE and \".\", or INSERT and \"-\"\n\t\t\t\tc = c<32 && !evt.shiftKey ? 0 : c;\n\t\t\t\tif(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){\n\t\t\t\t\t// lowercase CTRL-[A-Z] keys\n\t\t\t\t\tc += 32;\n\t\t\t\t}\n\t\t\t\treturn listener.call(this, _synthesizeEvent(evt, { charCode: c }));\n\t\t\t});\n\t\t};\n\t}else{\n\t\tkeypress = function(object, listener){\n\t\t\treturn on(object, \"keypress\", function(evt){\n\t\t\t\tsetKeyChar(evt);\n\t\t\t\treturn listener.call(this, evt);\n\t\t\t});\n\t\t};\n\t}\n}\n\nvar connect = {\n\t// summary:\n\t//\t\tThis module defines the dojo.connect API.\n\t//\t\tThis modules also provides keyboard event handling helpers.\n\t//\t\tThis module exports an extension event for emulating Firefox's keypress handling.\n\t//\t\tHowever, this extension event exists primarily for backwards compatibility and\n\t//\t\tis not recommended. WebKit and IE uses an alternate keypress handling (only\n\t//\t\tfiring for printable characters, to distinguish from keydown events), and most\n\t//\t\tconsider the WebKit/IE behavior more desirable.\n\n\t_keypress:keypress,\n\n\tconnect:function(obj, event, context, method, dontFix){\n\t\t// summary:\n\t\t//\t\t`dojo.connect` is a deprecated event handling and delegation method in\n\t\t//\t\tDojo. It allows one function to \"listen in\" on the execution of\n\t\t//\t\tany other, triggering the second whenever the first is called. Many\n\t\t//\t\tlisteners may be attached to a function, and source functions may\n\t\t//\t\tbe either regular function calls or DOM events.\n\t\t//\n\t\t// description:\n\t\t//\t\tConnects listeners to actions, so that after event fires, a\n\t\t//\t\tlistener is called with the same arguments passed to the original\n\t\t//\t\tfunction.\n\t\t//\n\t\t//\t\tSince `dojo.connect` allows the source of events to be either a\n\t\t//\t\t\"regular\" JavaScript function or a DOM event, it provides a uniform\n\t\t//\t\tinterface for listening to all the types of events that an\n\t\t//\t\tapplication is likely to deal with though a single, unified\n\t\t//\t\tinterface. DOM programmers may want to think of it as\n\t\t//\t\t\"addEventListener for everything and anything\".\n\t\t//\n\t\t//\t\tWhen setting up a connection, the `event` parameter must be a\n\t\t//\t\tstring that is the name of the method/event to be listened for. If\n\t\t//\t\t`obj` is null, `kernel.global` is assumed, meaning that connections\n\t\t//\t\tto global methods are supported but also that you may inadvertently\n\t\t//\t\tconnect to a global by passing an incorrect object name or invalid\n\t\t//\t\treference.\n\t\t//\n\t\t//\t\t`dojo.connect` generally is forgiving. If you pass the name of a\n\t\t//\t\tfunction or method that does not yet exist on `obj`, connect will\n\t\t//\t\tnot fail, but will instead set up a stub method. Similarly, null\n\t\t//\t\targuments may simply be omitted such that fewer than 4 arguments\n\t\t//\t\tmay be required to set up a connection See the examples for details.\n\t\t//\n\t\t//\t\tThe return value is a handle that is needed to\n\t\t//\t\tremove this connection with `dojo.disconnect`.\n\t\t//\n\t\t// obj: Object?\n\t\t//\t\tThe source object for the event function.\n\t\t//\t\tDefaults to `kernel.global` if null.\n\t\t//\t\tIf obj is a DOM node, the connection is delegated\n\t\t//\t\tto the DOM event manager (unless dontFix is true).\n\t\t//\n\t\t// event: String\n\t\t//\t\tString name of the event function in obj.\n\t\t//\t\tI.e. identifies a property `obj[event]`.\n\t\t//\n\t\t// context: Object|null\n\t\t//\t\tThe object that method will receive as \"this\".\n\t\t//\n\t\t//\t\tIf context is null and method is a function, then method\n\t\t//\t\tinherits the context of event.\n\t\t//\n\t\t//\t\tIf method is a string then context must be the source\n\t\t//\t\tobject object for method (context[method]). If context is null,\n\t\t//\t\tkernel.global is used.\n\t\t//\n\t\t// method: String|Function\n\t\t//\t\tA function reference, or name of a function in context.\n\t\t//\t\tThe function identified by method fires after event does.\n\t\t//\t\tmethod receives the same arguments as the event.\n\t\t//\t\tSee context argument comments for information on method's scope.\n\t\t//\n\t\t// dontFix: Boolean?\n\t\t//\t\tIf obj is a DOM node, set dontFix to true to prevent delegation\n\t\t//\t\tof this connection to the DOM event manager.\n\t\t//\n\t\t// example:\n\t\t//\t\tWhen obj.onchange(), do ui.update():\n\t\t//\t|\tdojo.connect(obj, \"onchange\", ui, \"update\");\n\t\t//\t|\tdojo.connect(obj, \"onchange\", ui, ui.update); // same\n\t\t//\n\t\t// example:\n\t\t//\t\tUsing return value for disconnect:\n\t\t//\t|\tvar link = dojo.connect(obj, \"onchange\", ui, \"update\");\n\t\t//\t|\t...\n\t\t//\t|\tdojo.disconnect(link);\n\t\t//\n\t\t// example:\n\t\t//\t\tWhen onglobalevent executes, watcher.handler is invoked:\n\t\t//\t|\tdojo.connect(null, \"onglobalevent\", watcher, \"handler\");\n\t\t//\n\t\t// example:\n\t\t//\t\tWhen ob.onCustomEvent executes, customEventHandler is invoked:\n\t\t//\t|\tdojo.connect(ob, \"onCustomEvent\", null, \"customEventHandler\");\n\t\t//\t|\tdojo.connect(ob, \"onCustomEvent\", \"customEventHandler\"); // same\n\t\t//\n\t\t// example:\n\t\t//\t\tWhen ob.onCustomEvent executes, customEventHandler is invoked\n\t\t//\t\twith the same scope (this):\n\t\t//\t|\tdojo.connect(ob, \"onCustomEvent\", null, customEventHandler);\n\t\t//\t|\tdojo.connect(ob, \"onCustomEvent\", customEventHandler); // same\n\t\t//\n\t\t// example:\n\t\t//\t\tWhen globalEvent executes, globalHandler is invoked\n\t\t//\t\twith the same scope (this):\n\t\t//\t|\tdojo.connect(null, \"globalEvent\", null, globalHandler);\n\t\t//\t|\tdojo.connect(\"globalEvent\", globalHandler); // same\n\n\t\t// normalize arguments\n\t\tvar a=arguments, args=[], i=0;\n\t\t// if a[0] is a String, obj was omitted\n\t\targs.push(typeof a[0] == \"string\" ? null : a[i++], a[i++]);\n\t\t// if the arg-after-next is a String or Function, context was NOT omitted\n\t\tvar a1 = a[i+1];\n\t\targs.push(typeof a1 == \"string\" || typeof a1 == \"function\" ? a[i++] : null, a[i++]);\n\t\t// absorb any additional arguments\n\t\tfor(var l=a.length; i<l; i++){\targs.push(a[i]); }\n\t\treturn connect_.apply(this, args);\n\t},\n\n\tdisconnect:function(handle){\n\t\t// summary:\n\t\t//\t\tRemove a link created by dojo.connect.\n\t\t// description:\n\t\t//\t\tRemoves the connection between event and the method referenced by handle.\n\t\t// handle: Handle\n\t\t//\t\tthe return value of the dojo.connect call that created the connection.\n\n\t\tif(handle){\n\t\t\thandle.remove();\n\t\t}\n\t},\n\n\tsubscribe:function(topic, context, method){\n\t\t// summary:\n\t\t//\t\tAttach a listener to a named topic. The listener function is invoked whenever the\n\t\t//\t\tnamed topic is published (see: dojo.publish).\n\t\t//\t\tReturns a handle which is needed to unsubscribe this listener.\n\t\t// topic: String\n\t\t//\t\tThe topic to which to subscribe.\n\t\t// context: Object?\n\t\t//\t\tScope in which method will be invoked, or null for default scope.\n\t\t// method: String|Function\n\t\t//\t\tThe name of a function in context, or a function reference. This is the function that\n\t\t//\t\tis invoked when topic is published.\n\t\t// example:\n\t\t//\t|\tdojo.subscribe(\"alerts\", null, function(caption, message){ alert(caption + \"\\n\" + message); });\n\t\t//\t|\tdojo.publish(\"alerts\", [ \"read this\", \"hello world\" ]);\n\t\treturn hub.subscribe(topic, lang.hitch(context, method));\n\t},\n\n\tpublish:function(topic, args){\n\t\t// summary:\n\t\t//\t\tInvoke all listener method subscribed to topic.\n\t\t// topic: String\n\t\t//\t\tThe name of the topic to publish.\n\t\t// args: Array?\n\t\t//\t\tAn array of arguments. The arguments will be applied\n\t\t//\t\tto each topic subscriber (as first class parameters, via apply).\n\t\t// example:\n\t\t//\t|\tdojo.subscribe(\"alerts\", null, function(caption, message){ alert(caption + \"\\n\" + message); };\n\t\t//\t|\tdojo.publish(\"alerts\", [ \"read this\", \"hello world\" ]);\n\t\treturn hub.publish.apply(hub, [topic].concat(args));\n\t},\n\n\tconnectPublisher:function(topic, obj, event){\n\t\t// summary:\n\t\t//\t\tEnsure that every time obj.event() is called, a message is published\n\t\t//\t\ton the topic. Returns a handle which can be passed to\n\t\t//\t\tdojo.disconnect() to disable subsequent automatic publication on\n\t\t//\t\tthe topic.\n\t\t// topic: String\n\t\t//\t\tThe name of the topic to publish.\n\t\t// obj: Object?\n\t\t//\t\tThe source object for the event function. Defaults to kernel.global\n\t\t//\t\tif null.\n\t\t// event: String\n\t\t//\t\tThe name of the event function in obj.\n\t\t//\t\tI.e. identifies a property obj[event].\n\t\t// example:\n\t\t//\t|\tdojo.connectPublisher(\"/ajax/start\", dojo, \"xhrGet\");\n\t\tvar pf = function(){ connect.publish(topic, arguments); };\n\t\treturn event ? connect.connect(obj, event, pf) : connect.connect(obj, pf); //Handle\n\t},\n\n\tisCopyKey: function(e){\n\t\t// summary:\n\t\t//\t\tChecks an event for the copy key (meta on Mac, and ctrl anywhere else)\n\t\t// e: Event\n\t\t//\t\tEvent object to examine\n\t\treturn e[evtCopyKey];\t// Boolean\n\t}\n};\n\nconnect.unsubscribe = connect.disconnect;\n/*=====\n connect.unsubscribe = function(handle){\n\t // summary:\n\t //\t\tRemove a topic listener.\n\t // handle: Handle\n\t //\t\tThe handle returned from a call to subscribe.\n\t // example:\n\t //\t|\tvar alerter = dojo.subscribe(\"alerts\", null, function(caption, message){ alert(caption + \"\\n\" + message); };\n\t //\t|\t...\n\t //\t|\tdojo.unsubscribe(alerter);\n };\n =====*/\n\nhas(\"extend-dojo\") && lang.mixin(dojo, connect);\nreturn connect;\n\n});\n\n\n","define([\"./kernel\", \"../has\", \"./lang\"], function(dojo, has, lang){\n\t// module:\n\t//\t\tdojo/_base/declare\n\n\tvar mix = lang.mixin, op = Object.prototype, opts = op.toString,\n\t\txtor, counter = 0, cname = \"constructor\";\n\n\tif(!has(\"csp-restrictions\")){\n\t\t// 'new Function()' is preferable when available since it does not create a closure\n\t\txtor = new Function;\n\t}else{\n\t\txtor = function(){};\n\t}\n\n\tfunction err(msg, cls){ throw new Error(\"declare\" + (cls ? \" \" + cls : \"\") + \": \" + msg); }\n\n\t// C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/)\n\tfunction c3mro(bases, className){\n\t\tvar result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1,\n\t\t\tl = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs;\n\n\t\t// build a list of bases naming them if needed\n\t\tfor(; i < l; ++i){\n\t\t\tbase = bases[i];\n\t\t\tif(!base){\n\t\t\t\terr(\"mixin #\" + i + \" is unknown. Did you use dojo.require to pull it in?\", className);\n\t\t\t}else if(opts.call(base) != \"[object Function]\"){\n\t\t\t\terr(\"mixin #\" + i + \" is not a callable constructor.\", className);\n\t\t\t}\n\t\t\tlin = base._meta ? base._meta.bases : [base];\n\t\t\ttop = 0;\n\t\t\t// add bases to the name map\n\t\t\tfor(j = lin.length - 1; j >= 0; --j){\n\t\t\t\tproto = lin[j].prototype;\n\t\t\t\tif(!proto.hasOwnProperty(\"declaredClass\")){\n\t\t\t\t\tproto.declaredClass = \"uniqName_\" + (counter++);\n\t\t\t\t}\n\t\t\t\tname = proto.declaredClass;\n\t\t\t\tif(!nameMap.hasOwnProperty(name)){\n\t\t\t\t\tnameMap[name] = {count: 0, refs: [], cls: lin[j]};\n\t\t\t\t\t++clsCount;\n\t\t\t\t}\n\t\t\t\trec = nameMap[name];\n\t\t\t\tif(top && top !== rec){\n\t\t\t\t\trec.refs.push(top);\n\t\t\t\t\t++top.count;\n\t\t\t\t}\n\t\t\t\ttop = rec;\n\t\t\t}\n\t\t\t++top.count;\n\t\t\troots[0].refs.push(top);\n\t\t}\n\n\t\t// remove classes without external references recursively\n\t\twhile(roots.length){\n\t\t\ttop = roots.pop();\n\t\t\tresult.push(top.cls);\n\t\t\t--clsCount;\n\t\t\t// optimization: follow a single-linked chain\n\t\t\twhile(refs = top.refs, refs.length == 1){\n\t\t\t\ttop = refs[0];\n\t\t\t\tif(!top || --top.count){\n\t\t\t\t\t// branch or end of chain => do not end to roots\n\t\t\t\t\ttop = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(top.cls);\n\t\t\t\t--clsCount;\n\t\t\t}\n\t\t\tif(top){\n\t\t\t\t// branch\n\t\t\t\tfor(i = 0, l = refs.length; i < l; ++i){\n\t\t\t\t\ttop = refs[i];\n\t\t\t\t\tif(!--top.count){\n\t\t\t\t\t\troots.push(top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(clsCount){\n\t\t\terr(\"can't build consistent linearization\", className);\n\t\t}\n\n\t\t// calculate the superclass offset\n\t\tbase = bases[0];\n\t\tresult[0] = base ?\n\t\t\tbase._meta && base === result[result.length - base._meta.bases.length] ?\n\t\t\t\tbase._meta.bases.length : 1 : 0;\n\n\t\treturn result;\n\t}\n\n\tfunction inherited(args, a, f, g){\n\t\tvar name, chains, bases, caller, meta, base, proto, opf, pos,\n\t\t\tcache = this._inherited = this._inherited || {};\n\n\t\t// crack arguments\n\t\tif(typeof args === \"string\"){\n\t\t\tname = args;\n\t\t\targs = a;\n\t\t\ta = f;\n\t\t\tf = g;\n\t\t}\n\n\t\tif(typeof args === \"function\"){\n\t\t\t// support strict mode\n\t\t\tcaller = args;\n\t\t\targs = a;\n\t\t\ta = f;\n\t\t}else{\n\t\t\ttry{\n\t\t\t\tcaller = args.callee;\n\t\t\t}catch (e){\n\t\t\t\tif(e instanceof TypeError){\n\t\t\t\t\t// caller was defined in a strict-mode context\n\t\t\t\t\terr(\"strict mode inherited() requires the caller function to be passed before arguments\", this.declaredClass);\n\t\t\t\t}else{\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tname = name || caller.nom;\n\t\tif(!name){\n\t\t\terr(\"can't deduce a name to call inherited()\", this.declaredClass);\n\t\t}\n\t\tf = g = 0;\n\n\t\tmeta = this.constructor._meta;\n\t\tbases = meta.bases;\n\n\t\tpos = cache.p;\n\t\tif(name != cname){\n\t\t\t// method\n\t\t\tif(cache.c !== caller){\n\t\t\t\t// cache bust\n\t\t\t\tpos = 0;\n\t\t\t\tbase = bases[0];\n\t\t\t\tmeta = base._meta;\n\t\t\t\tif(meta.hidden[name] !== caller){\n\t\t\t\t\t// error detection\n\t\t\t\t\tchains = meta.chains;\n\t\t\t\t\tif(chains && typeof chains[name] == \"string\"){\n\t\t\t\t\t\terr(\"calling chained method with inherited: \" + name, this.declaredClass);\n\t\t\t\t\t}\n\t\t\t\t\t// find caller\n\t\t\t\t\tdo{\n\t\t\t\t\t\tmeta = base._meta;\n\t\t\t\t\t\tproto = base.prototype;\n\t\t\t\t\t\tif(meta && (proto[name] === caller && proto.hasOwnProperty(name) || meta.hidden[name] === caller)){\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}while(base = bases[++pos]); // intentional assignment\n\t\t\t\t\tpos = base ? pos : -1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// find next\n\t\t\tbase = bases[++pos];\n\t\t\tif(base){\n\t\t\t\tproto = base.prototype;\n\t\t\t\tif(base._meta && proto.hasOwnProperty(name)){\n\t\t\t\t\tf = proto[name];\n\t\t\t\t}else{\n\t\t\t\t\topf = op[name];\n\t\t\t\t\tdo{\n\t\t\t\t\t\tproto = base.prototype;\n\t\t\t\t\t\tf = proto[name];\n\t\t\t\t\t\tif(f && (base._meta ? proto.hasOwnProperty(name) : f !== opf)){\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}while(base = bases[++pos]); // intentional assignment\n\t\t\t\t}\n\t\t\t}\n\t\t\tf = base && f || op[name];\n\t\t}else{\n\t\t\t// constructor\n\t\t\tif(cache.c !== caller){\n\t\t\t\t// cache bust\n\t\t\t\tpos = 0;\n\t\t\t\tmeta = bases[0]._meta;\n\t\t\t\tif(meta && meta.ctor !== caller){\n\t\t\t\t\t// error detection\n\t\t\t\t\tchains = meta.chains;\n\t\t\t\t\tif(!chains || chains.constructor !== \"manual\"){\n\t\t\t\t\t\terr(\"calling chained constructor with inherited\", this.declaredClass);\n\t\t\t\t\t}\n\t\t\t\t\t// find caller\n\t\t\t\t\twhile(base = bases[++pos]){ // intentional assignment\n\t\t\t\t\t\tmeta = base._meta;\n\t\t\t\t\t\tif(meta && meta.ctor === caller){\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpos = base ? pos : -1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// find next\n\t\t\twhile(base = bases[++pos]){\t// intentional assignment\n\t\t\t\tmeta = base._meta;\n\t\t\t\tf = meta ? meta.ctor : base;\n\t\t\t\tif(f){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tf = base && f;\n\t\t}\n\n\t\t// cache the found super method\n\t\tcache.c = f;\n\t\tcache.p = pos;\n\n\t\t// now we have the result\n\t\tif(f){\n\t\t\treturn a === true ? f : f.apply(this, a || args);\n\t\t}\n\t\t// intentionally no return if a super method was not found\n\t}\n\n\tfunction getInherited(name, args, a){\n\t\tif(typeof name === \"string\"){\n\t\t\tif (typeof args === \"function\") {\n\t\t\t\treturn this.__inherited(name, args, a, true);\n\t\t\t}\n\t\t\treturn this.__inherited(name, args, true);\n\t\t}\n\t\telse if (typeof name === \"function\") {\n\t\t\treturn this.__inherited(name, args, true);\n\t\t}\n\t\treturn this.__inherited(name, true);\n\t}\n\n\tfunction inherited__debug(args, a1, a2, a3){\n\t\tvar f = this.getInherited(args, a1, a2);\n\t\tif(f){\n\t\t\treturn f.apply(this, a3 || a2 || a1 || args);\n\t\t}\n\t\t// intentionally no return if a super method was not found\n\t}\n\n\tvar inheritedImpl = dojo.config.isDebug ? inherited__debug : inherited;\n\n\t// emulation of \"instanceof\"\n\tfunction isInstanceOf(cls){\n\t\tvar bases = this.constructor._meta.bases;\n\t\tfor(var i = 0, l = bases.length; i < l; ++i){\n\t\t\tif(bases[i] === cls){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn this instanceof cls;\n\t}\n\n\tfunction mixOwn(target, source){\n\t\t// add props adding metadata for incoming functions skipping a constructor\n\t\tfor(var name in source){\n\t\t\tif(name != cname && source.hasOwnProperty(name)){\n\t\t\t\ttarget[name] = source[name];\n\t\t\t}\n\t\t}\n\t\tif(has(\"bug-for-in-skips-shadowed\")){\n\t\t\tfor(var extraNames= lang._extraNames, i= extraNames.length; i;){\n\t\t\t\tname = extraNames[--i];\n\t\t\t\tif(name != cname && source.hasOwnProperty(name)){\n\t\t\t\t\t target[name] = source[name];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// implementation of safe mixin function\n\tfunction safeMixin(target, source){\n\t\t// summary:\n\t\t//\t\tMix in properties skipping a constructor and decorating functions\n\t\t//\t\tlike it is done by declare().\n\t\t// target: Object\n\t\t//\t\tTarget object to accept new properties.\n\t\t// source: Object\n\t\t//\t\tSource object for new properties.\n\t\t// description:\n\t\t//\t\tThis function is used to mix in properties like lang.mixin does,\n\t\t//\t\tbut it skips a constructor property and decorates functions like\n\t\t//\t\tdeclare() does.\n\t\t//\n\t\t//\t\tIt is meant to be used with classes and objects produced with\n\t\t//\t\tdeclare. Functions mixed in with dojo.safeMixin can use\n\t\t//\t\tthis.inherited() like normal methods.\n\t\t//\n\t\t//\t\tThis function is used to implement extend() method of a constructor\n\t\t//\t\tproduced with declare().\n\t\t//\n\t\t// example:\n\t\t//\t|\tvar A = declare(null, {\n\t\t//\t|\t\tm1: function(){\n\t\t//\t|\t\t\tconsole.log(\"A.m1\");\n\t\t//\t|\t\t},\n\t\t//\t|\t\tm2: function(){\n\t\t//\t|\t\t\tconsole.log(\"A.m2\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tvar B = declare(A, {\n\t\t//\t|\t\tm1: function(){\n\t\t//\t|\t\t\tthis.inherited(arguments);\n\t\t//\t|\t\t\tconsole.log(\"B.m1\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tB.extend({\n\t\t//\t|\t\tm2: function(){\n\t\t//\t|\t\t\tthis.inherited(arguments);\n\t\t//\t|\t\t\tconsole.log(\"B.m2\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tvar x = new B();\n\t\t//\t|\tdojo.safeMixin(x, {\n\t\t//\t|\t\tm1: function(){\n\t\t//\t|\t\t\tthis.inherited(arguments);\n\t\t//\t|\t\t\tconsole.log(\"X.m1\");\n\t\t//\t|\t\t},\n\t\t//\t|\t\tm2: function(){\n\t\t//\t|\t\t\tthis.inherited(arguments);\n\t\t//\t|\t\t\tconsole.log(\"X.m2\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tx.m2();\n\t\t//\t|\t// prints:\n\t\t//\t|\t// A.m1\n\t\t//\t|\t// B.m1\n\t\t//\t|\t// X.m1\n\n\t\tvar name, t;\n\t\t// add props adding metadata for incoming functions skipping a constructor\n\t\tfor(name in source){\n\t\t\tt = source[name];\n\t\t\tif((t !== op[name] || !(name in op)) && name != cname){\n\t\t\t\tif(opts.call(t) == \"[object Function]\"){\n\t\t\t\t\t// non-trivial function method => attach its name\n\t\t\t\t\tt.nom = name;\n\t\t\t\t}\n\t\t\t\ttarget[name] = t;\n\t\t\t}\n\t\t}\n\t\tif(has(\"bug-for-in-skips-shadowed\") && source){\n\t\t\tfor(var extraNames= lang._extraNames, i= extraNames.length; i;){\n\t\t\t\tname = extraNames[--i];\n\t\t\t\tt = source[name];\n\t\t\t\tif((t !== op[name] || !(name in op)) && name != cname){\n\t\t\t\t\tif(opts.call(t) == \"[object Function]\"){\n\t\t\t\t\t\t// non-trivial function method => attach its name\n\t\t\t\t\t\t t.nom = name;\n\t\t\t\t\t}\n\t\t\t\t\ttarget[name] = t;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t}\n\n\tfunction extend(source){\n\t\tdeclare.safeMixin(this.prototype, source);\n\t\treturn this;\n\t}\n\n\tfunction createSubclass(mixins, props){\n\t\t// crack parameters\n\t\tif(!(mixins instanceof Array || typeof mixins === 'function')){\n\t\t\tprops = mixins;\n\t\t\tmixins = undefined;\n\t\t}\n\n\t\tprops = props || {};\n\t\tmixins = mixins || [];\n\n\t\treturn declare([this].concat(mixins), props);\n\t}\n\n\t// chained constructor compatible with the legacy declare()\n\tfunction chainedConstructor(bases, ctorSpecial){\n\t\treturn function(){\n\t\t\tvar a = arguments, args = a, a0 = a[0], f, i, m,\n\t\t\t\tl = bases.length, preArgs;\n\n\t\t\tif(!(this instanceof a.callee)){\n\t\t\t\t// not called via new, so force it\n\t\t\t\treturn applyNew(a);\n\t\t\t}\n\n\t\t\t//this._inherited = {};\n\t\t\t// perform the shaman's rituals of the original declare()\n\t\t\t// 1) call two types of the preamble\n\t\t\tif(ctorSpecial && (a0 && a0.preamble || this.preamble)){\n\t\t\t\t// full blown ritual\n\t\t\t\tpreArgs = new Array(bases.length);\n\t\t\t\t// prepare parameters\n\t\t\t\tpreArgs[0] = a;\n\t\t\t\tfor(i = 0;;){\n\t\t\t\t\t// process the preamble of the 1st argument\n\t\t\t\t\ta0 = a[0];\n\t\t\t\t\tif(a0){\n\t\t\t\t\t\tf = a0.preamble;\n\t\t\t\t\t\tif(f){\n\t\t\t\t\t\t\ta = f.apply(this, a) || a;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// process the preamble of this class\n\t\t\t\t\tf = bases[i].prototype;\n\t\t\t\t\tf = f.hasOwnProperty(\"preamble\") && f.preamble;\n\t\t\t\t\tif(f){\n\t\t\t\t\t\ta = f.apply(this, a) || a;\n\t\t\t\t\t}\n\t\t\t\t\t// one peculiarity of the preamble:\n\t\t\t\t\t// it is called if it is not needed,\n\t\t\t\t\t// e.g., there is no constructor to call\n\t\t\t\t\t// let's watch for the last constructor\n\t\t\t\t\t// (see ticket #9795)\n\t\t\t\t\tif(++i == l){\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tpreArgs[i] = a;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 2) call all non-trivial constructors using prepared arguments\n\t\t\tfor(i = l - 1; i >= 0; --i){\n\t\t\t\tf = bases[i];\n\t\t\t\tm = f._meta;\n\t\t\t\tf = m ? m.ctor : f;\n\t\t\t\tif(f){\n\t\t\t\t\tf.apply(this, preArgs ? preArgs[i] : a);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 3) continue the original ritual: call the postscript\n\t\t\tf = this.postscript;\n\t\t\tif(f){\n\t\t\t\tf.apply(this, args);\n\t\t\t}\n\t\t};\n\t}\n\n\n\t// chained constructor compatible with the legacy declare()\n\tfunction singleConstructor(ctor, ctorSpecial){\n\t\treturn function(){\n\t\t\tvar a = arguments, t = a, a0 = a[0], f;\n\n\t\t\tif(!(this instanceof a.callee)){\n\t\t\t\t// not called via new, so force it\n\t\t\t\treturn applyNew(a);\n\t\t\t}\n\n\t\t\t//this._inherited = {};\n\t\t\t// perform the shaman's rituals of the original declare()\n\t\t\t// 1) call two types of the preamble\n\t\t\tif(ctorSpecial){\n\t\t\t\t// full blown ritual\n\t\t\t\tif(a0){\n\t\t\t\t\t// process the preamble of the 1st argument\n\t\t\t\t\tf = a0.preamble;\n\t\t\t\t\tif(f){\n\t\t\t\t\t\tt = f.apply(this, t) || t;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tf = this.preamble;\n\t\t\t\tif(f){\n\t\t\t\t\t// process the preamble of this class\n\t\t\t\t\tf.apply(this, t);\n\t\t\t\t\t// one peculiarity of the preamble:\n\t\t\t\t\t// it is called even if it is not needed,\n\t\t\t\t\t// e.g., there is no constructor to call\n\t\t\t\t\t// let's watch for the last constructor\n\t\t\t\t\t// (see ticket #9795)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 2) call a constructor\n\t\t\tif(ctor){\n\t\t\t\tctor.apply(this, a);\n\t\t\t}\n\t\t\t// 3) continue the original ritual: call the postscript\n\t\t\tf = this.postscript;\n\t\t\tif(f){\n\t\t\t\tf.apply(this, a);\n\t\t\t}\n\t\t};\n\t}\n\n\t// plain vanilla constructor (can use inherited() to call its base constructor)\n\tfunction simpleConstructor(bases){\n\t\treturn function(){\n\t\t\tvar a = arguments, i = 0, f, m;\n\n\t\t\tif(!(this instanceof a.callee)){\n\t\t\t\t// not called via new, so force it\n\t\t\t\treturn applyNew(a);\n\t\t\t}\n\n\t\t\t//this._inherited = {};\n\t\t\t// perform the shaman's rituals of the original declare()\n\t\t\t// 1) do not call the preamble\n\t\t\t// 2) call the top constructor (it can use this.inherited())\n\t\t\tfor(; f = bases[i]; ++i){ // intentional assignment\n\t\t\t\tm = f._meta;\n\t\t\t\tf = m ? m.ctor : f;\n\t\t\t\tif(f){\n\t\t\t\t\tf.apply(this, a);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 3) call the postscript\n\t\t\tf = this.postscript;\n\t\t\tif(f){\n\t\t\t\tf.apply(this, a);\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction chain(name, bases, reversed){\n\t\treturn function(){\n\t\t\tvar b, m, f, i = 0, step = 1;\n\t\t\tif(reversed){\n\t\t\t\ti = bases.length - 1;\n\t\t\t\tstep = -1;\n\t\t\t}\n\t\t\tfor(; b = bases[i]; i += step){ // intentional assignment\n\t\t\t\tm = b._meta;\n\t\t\t\tf = (m ? m.hidden : b.prototype)[name];\n\t\t\t\tif(f){\n\t\t\t\t\tf.apply(this, arguments);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// forceNew(ctor)\n\t// return a new object that inherits from ctor.prototype but\n\t// without actually running ctor on the object.\n\tfunction forceNew(ctor){\n\t\t// create object with correct prototype using a do-nothing\n\t\t// constructor\n\t\txtor.prototype = ctor.prototype;\n\t\tvar t = new xtor;\n\t\txtor.prototype = null;\t// clean up\n\t\treturn t;\n\t}\n\n\t// applyNew(args)\n\t// just like 'new ctor()' except that the constructor and its arguments come\n\t// from args, which must be an array or an arguments object\n\tfunction applyNew(args){\n\t\t// create an object with ctor's prototype but without\n\t\t// calling ctor on it.\n\t\tvar ctor = args.callee, t = forceNew(ctor);\n\t\t// execute the real constructor on the new object\n\t\tctor.apply(t, args);\n\t\treturn t;\n\t}\n\n\tfunction declare(className, superclass, props){\n\t\t// summary:\n\t\t//\t\tCreate a feature-rich constructor from compact notation.\n\t\t// className: String?\n\t\t//\t\tThe optional name of the constructor (loosely, a \"class\")\n\t\t//\t\tstored in the \"declaredClass\" property in the created prototype.\n\t\t//\t\tIt will be used as a global name for a created constructor.\n\t\t// superclass: Function|Function[]\n\t\t//\t\tMay be null, a Function, or an Array of Functions. This argument\n\t\t//\t\tspecifies a list of bases (the left-most one is the most deepest\n\t\t//\t\tbase).\n\t\t// props: Object\n\t\t//\t\tAn object whose properties are copied to the created prototype.\n\t\t//\t\tAdd an instance-initialization function by making it a property\n\t\t//\t\tnamed \"constructor\".\n\t\t// returns: dojo/_base/declare.__DeclareCreatedObject\n\t\t//\t\tNew constructor function.\n\t\t// description:\n\t\t//\t\tCreate a constructor using a compact notation for inheritance and\n\t\t//\t\tprototype extension.\n\t\t//\n\t\t//\t\tMixin ancestors provide a type of multiple inheritance.\n\t\t//\t\tPrototypes of mixin ancestors are copied to the new class:\n\t\t//\t\tchanges to mixin prototypes will not affect classes to which\n\t\t//\t\tthey have been mixed in.\n\t\t//\n\t\t//\t\tAncestors can be compound classes created by this version of\n\t\t//\t\tdeclare(). In complex cases all base classes are going to be\n\t\t//\t\tlinearized according to C3 MRO algorithm\n\t\t//\t\t(see http://www.python.org/download/releases/2.3/mro/ for more\n\t\t//\t\tdetails).\n\t\t//\n\t\t//\t\t\"className\" is cached in \"declaredClass\" property of the new class,\n\t\t//\t\tif it was supplied. The immediate super class will be cached in\n\t\t//\t\t\"superclass\" property of the new class.\n\t\t//\n\t\t//\t\tMethods in \"props\" will be copied and modified: \"nom\" property\n\t\t//\t\t(the declared name of the method) will be added to all copied\n\t\t//\t\tfunctions to help identify them for the internal machinery. Be\n\t\t//\t\tvery careful, while reusing methods: if you use the same\n\t\t//\t\tfunction under different names, it can produce errors in some\n\t\t//\t\tcases.\n\t\t//\n\t\t//\t\tIt is possible to use constructors created \"manually\" (without\n\t\t//\t\tdeclare()) as bases. They will be called as usual during the\n\t\t//\t\tcreation of an instance, their methods will be chained, and even\n\t\t//\t\tcalled by \"this.inherited()\".\n\t\t//\n\t\t//\t\tSpecial property \"-chains-\" governs how to chain methods. It is\n\t\t//\t\ta dictionary, which uses method names as keys, and hint strings\n\t\t//\t\tas values. If a hint string is \"after\", this method will be\n\t\t//\t\tcalled after methods of its base classes. If a hint string is\n\t\t//\t\t\"before\", this method will be called before methods of its base\n\t\t//\t\tclasses.\n\t\t//\n\t\t//\t\tIf \"constructor\" is not mentioned in \"-chains-\" property, it will\n\t\t//\t\tbe chained using the legacy mode: using \"after\" chaining,\n\t\t//\t\tcalling preamble() method before each constructor, if available,\n\t\t//\t\tand calling postscript() after all constructors were executed.\n\t\t//\t\tIf the hint is \"after\", it is chained as a regular method, but\n\t\t//\t\tpostscript() will be called after the chain of constructors.\n\t\t//\t\t\"constructor\" cannot be chained \"before\", but it allows\n\t\t//\t\ta special hint string: \"manual\", which means that constructors\n\t\t//\t\tare not going to be chained in any way, and programmer will call\n\t\t//\t\tthem manually using this.inherited(). In the latter case\n\t\t//\t\tpostscript() will be called after the construction.\n\t\t//\n\t\t//\t\tAll chaining hints are \"inherited\" from base classes and\n\t\t//\t\tpotentially can be overridden. Be very careful when overriding\n\t\t//\t\thints! Make sure that all chained methods can work in a proposed\n\t\t//\t\tmanner of chaining.\n\t\t//\n\t\t//\t\tOnce a method was chained, it is impossible to unchain it. The\n\t\t//\t\tonly exception is \"constructor\". You don't need to define a\n\t\t//\t\tmethod in order to supply a chaining hint.\n\t\t//\n\t\t//\t\tIf a method is chained, it cannot use this.inherited() because\n\t\t//\t\tall other methods in the hierarchy will be called automatically.\n\t\t//\n\t\t//\t\tUsually constructors and initializers of any kind are chained\n\t\t//\t\tusing \"after\" and destructors of any kind are chained as\n\t\t//\t\t\"before\". Note that chaining assumes that chained methods do not\n\t\t//\t\treturn any value: any returned value will be discarded.\n\t\t//\n\t\t// example:\n\t\t//\t|\tdeclare(\"my.classes.bar\", my.classes.foo, {\n\t\t//\t|\t\t// properties to be added to the class prototype\n\t\t//\t|\t\tsomeValue: 2,\n\t\t//\t|\t\t// initialization function\n\t\t//\t|\t\tconstructor: function(){\n\t\t//\t|\t\t\tthis.myComplicatedObject = new ReallyComplicatedObject();\n\t\t//\t|\t\t},\n\t\t//\t|\t\t// other functions\n\t\t//\t|\t\tsomeMethod: function(){\n\t\t//\t|\t\t\tdoStuff();\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t|\tvar MyBase = declare(null, {\n\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t//\t|\t\t// ...\n\t\t//\t|\t});\n\t\t//\t|\tvar MyClass1 = declare(MyBase, {\n\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t//\t|\t\t// ...\n\t\t//\t|\t});\n\t\t//\t|\tvar MyClass2 = declare(MyBase, {\n\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t//\t|\t\t// ...\n\t\t//\t|\t});\n\t\t//\t|\tvar MyDiamond = declare([MyClass1, MyClass2], {\n\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t//\t|\t\t// ...\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t|\tvar F = function(){ console.log(\"raw constructor\"); };\n\t\t//\t|\tF.prototype.method = function(){\n\t\t//\t|\t\tconsole.log(\"raw method\");\n\t\t//\t|\t};\n\t\t//\t|\tvar A = declare(F, {\n\t\t//\t|\t\tconstructor: function(){\n\t\t//\t|\t\t\tconsole.log(\"A.constructor\");\n\t\t//\t|\t\t},\n\t\t//\t|\t\tmethod: function(){\n\t\t//\t|\t\t\tconsole.log(\"before calling F.method...\");\n\t\t//\t|\t\t\tthis.inherited(arguments);\n\t\t//\t|\t\t\tconsole.log(\"...back in A\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tnew A().method();\n\t\t//\t|\t// will print:\n\t\t//\t|\t// raw constructor\n\t\t//\t|\t// A.constructor\n\t\t//\t|\t// before calling F.method...\n\t\t//\t|\t// raw method\n\t\t//\t|\t// ...back in A\n\t\t//\n\t\t// example:\n\t\t//\t|\tvar A = declare(null, {\n\t\t//\t|\t\t\"-chains-\": {\n\t\t//\t|\t\t\tdestroy: \"before\"\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tvar B = declare(A, {\n\t\t//\t|\t\tconstructor: function(){\n\t\t//\t|\t\t\tconsole.log(\"B.constructor\");\n\t\t//\t|\t\t},\n\t\t//\t|\t\tdestroy: function(){\n\t\t//\t|\t\t\tconsole.log(\"B.destroy\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tvar C = declare(B, {\n\t\t//\t|\t\tconstructor: function(){\n\t\t//\t|\t\t\tconsole.log(\"C.constructor\");\n\t\t//\t|\t\t},\n\t\t//\t|\t\tdestroy: function(){\n\t\t//\t|\t\t\tconsole.log(\"C.destroy\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tnew C().destroy();\n\t\t//\t|\t// prints:\n\t\t//\t|\t// B.constructor\n\t\t//\t|\t// C.constructor\n\t\t//\t|\t// C.destroy\n\t\t//\t|\t// B.destroy\n\t\t//\n\t\t// example:\n\t\t//\t|\tvar A = declare(null, {\n\t\t//\t|\t\t\"-chains-\": {\n\t\t//\t|\t\t\tconstructor: \"manual\"\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tvar B = declare(A, {\n\t\t//\t|\t\tconstructor: function(){\n\t\t//\t|\t\t\t// ...\n\t\t//\t|\t\t\t// call the base constructor with new parameters\n\t\t//\t|\t\t\tthis.inherited(arguments, [1, 2, 3]);\n\t\t//\t|\t\t\t// ...\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t|\tvar A = declare(null, {\n\t\t//\t|\t\t\"-chains-\": {\n\t\t//\t|\t\t\tm1: \"before\"\n\t\t//\t|\t\t},\n\t\t//\t|\t\tm1: function(){\n\t\t//\t|\t\t\tconsole.log(\"A.m1\");\n\t\t//\t|\t\t},\n\t\t//\t|\t\tm2: function(){\n\t\t//\t|\t\t\tconsole.log(\"A.m2\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tvar B = declare(A, {\n\t\t//\t|\t\t\"-chains-\": {\n\t\t//\t|\t\t\tm2: \"after\"\n\t\t//\t|\t\t},\n\t\t//\t|\t\tm1: function(){\n\t\t//\t|\t\t\tconsole.log(\"B.m1\");\n\t\t//\t|\t\t},\n\t\t//\t|\t\tm2: function(){\n\t\t//\t|\t\t\tconsole.log(\"B.m2\");\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\tvar x = new B();\n\t\t//\t|\tx.m1();\n\t\t//\t|\t// prints:\n\t\t//\t|\t// B.m1\n\t\t//\t|\t// A.m1\n\t\t//\t|\tx.m2();\n\t\t//\t|\t// prints:\n\t\t//\t|\t// A.m2\n\t\t//\t|\t// B.m2\n\n\t\t// crack parameters\n\t\tif(typeof className != \"string\"){\n\t\t\tprops = superclass;\n\t\t\tsuperclass = className;\n\t\t\tclassName = \"\";\n\t\t}\n\t\tprops = props || {};\n\n\t\tvar proto, i, t, ctor, name, bases, chains, mixins = 1, parents = superclass;\n\n\t\t// build a prototype\n\t\tif(opts.call(superclass) == \"[object Array]\"){\n\t\t\t// C3 MRO\n\t\t\tbases = c3mro(superclass, className);\n\t\t\tt = bases[0];\n\t\t\tmixins = bases.length - t;\n\t\t\tsuperclass = bases[mixins];\n\t\t}else{\n\t\t\tbases = [0];\n\t\t\tif(superclass){\n\t\t\t\tif(opts.call(superclass) == \"[object Function]\"){\n\t\t\t\t\tt = superclass._meta;\n\t\t\t\t\tbases = bases.concat(t ? t.bases : superclass);\n\t\t\t\t}else{\n\t\t\t\t\terr(\"base class is not a callable constructor.\", className);\n\t\t\t\t}\n\t\t\t}else if(superclass !== null){\n\t\t\t\terr(\"unknown base class. Did you use dojo.require to pull it in?\", className);\n\t\t\t}\n\t\t}\n\t\tif(superclass){\n\t\t\tfor(i = mixins - 1;; --i){\n\t\t\t\tproto = forceNew(superclass);\n\t\t\t\tif(!i){\n\t\t\t\t\t// stop if nothing to add (the last base)\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// mix in properties\n\t\t\t\tt = bases[i];\n\t\t\t\t(t._meta ? mixOwn : mix)(proto, t.prototype);\n\t\t\t\t// chain in new constructor\n\t\t\t\tif (has(\"csp-restrictions\")) {\n\t\t\t\t\tctor = function () {};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tctor = new Function;\n\t\t\t\t}\n\t\t\t\tctor.superclass = superclass;\n\t\t\t\tctor.prototype = proto;\n\t\t\t\tsuperclass = proto.constructor = ctor;\n\t\t\t}\n\t\t}else{\n\t\t\tproto = {};\n\t\t}\n\t\t// add all properties\n\t\tdeclare.safeMixin(proto, props);\n\t\t// add constructor\n\t\tt = props.constructor;\n\t\tif(t !== op.constructor){\n\t\t\tt.nom = cname;\n\t\t\tproto.constructor = t;\n\t\t}\n\n\t\t// collect chains and flags\n\t\tfor(i = mixins - 1; i; --i){ // intentional assignment\n\t\t\tt = bases[i]._meta;\n\t\t\tif(t && t.chains){\n\t\t\t\tchains = mix(chains || {}, t.chains);\n\t\t\t}\n\t\t}\n\t\tif(proto[\"-chains-\"]){\n\t\t\tchains = mix(chains || {}, proto[\"-chains-\"]);\n\t\t}\n\n\t\tif(superclass && superclass.prototype && superclass.prototype[\"-chains-\"]) {\n\t\t\tchains = mix(chains || {}, superclass.prototype[\"-chains-\"]);\n\t\t}\n\n\t\t// build ctor\n\t\tt = !chains || !chains.hasOwnProperty(cname);\n\t\tbases[0] = ctor = (chains && chains.constructor === \"manual\") ? simpleConstructor(bases) :\n\t\t\t(bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t));\n\n\t\t// add meta information to the constructor\n\t\tctor._meta = {bases: bases, hidden: props, chains: chains,\n\t\t\tparents: parents, ctor: props.constructor};\n\t\tctor.superclass = superclass && superclass.prototype;\n\t\tctor.extend = extend;\n\t\tctor.createSubclass = createSubclass;\n\t\tctor.prototype = proto;\n\t\tproto.constructor = ctor;\n\n\t\t// add \"standard\" methods to the prototype\n\t\tproto.getInherited = getInherited;\n\t\tproto.isInstanceOf = isInstanceOf;\n\t\tproto.inherited = inheritedImpl;\n\t\tproto.__inherited = inherited;\n\n\t\t// add name if specified\n\t\tif(className){\n\t\t\tproto.declaredClass = className;\n\t\t\tlang.setObject(className, ctor);\n\t\t}\n\n\t\t// build chains and add them to the prototype\n\t\tif(chains){\n\t\t\tfor(name in chains){\n\t\t\t\tif(proto[name] && typeof chains[name] == \"string\" && name != cname){\n\t\t\t\t\tt = proto[name] = chain(name, bases, chains[name] === \"after\");\n\t\t\t\t\tt.nom = name;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// chained methods do not return values\n\t\t// no need to chain \"invisible\" functions\n\n\t\treturn ctor;\t// Function\n\t}\n\n\t/*=====\n\tdeclare.__DeclareCreatedObject = {\n\t\t// summary:\n\t\t//\t\tdojo/_base/declare() returns a constructor `C`. `new C()` returns an Object with the following\n\t\t//\t\tmethods, in addition to the methods and properties specified via the arguments passed to declare().\n\n\t\tinherited: function(name, caller, args, newArgs){\n\t\t\t// summary:\n\t\t\t//\t\tCalls a super method.\n\t\t\t// name: String?\n\t\t\t//\t\tThe optional method name. Should be the same as the caller's\n\t\t\t//\t\tname. Usually \"name\" is specified in complex dynamic cases, when\n\t\t\t//\t\tthe calling method was dynamically added, undecorated by\n\t\t\t//\t\tdeclare(), and it cannot be determined.\n\t\t\t// caller: Function?\n\t\t\t//\t\tThe reference to the calling function. Required only if the\n\t\t\t//\t\tcall to \"this.inherited\" occurs from within strict-mode code.\n\t\t\t//\t\tIf the caller is omitted within strict-mode code, an error will\n\t\t\t//\t\tbe thrown.\n\t\t\t//\t\tThe best way to obtain a reference to the calling function is to\n\t\t\t//\t\tuse a named function expression (i.e. place a function name\n\t\t\t//\t\tafter the \"function\" keyword and before the open paren, as in\n\t\t\t//\t\t\"function fn(a, b)\"). If the function is parsed as an expression\n\t\t\t//\t\tand not a statement (i.e. it's not by itself on its own line),\n\t\t\t//\t\tthe function name will only be accessible as an identifier from\n\t\t\t//\t\twithin the body of the function.\n\t\t\t// args: Arguments\n\t\t\t//\t\tThe caller supply this argument, which should be the original\n\t\t\t//\t\t\"arguments\".\n\t\t\t// newArgs: Object?\n\t\t\t//\t\tIf \"true\", the found function will be returned without\n\t\t\t//\t\texecuting it.\n\t\t\t//\t\tIf Array, it will be used to call a super method. Otherwise\n\t\t\t//\t\t\"args\" will be used.\n\t\t\t// returns:\n\t\t\t//\t\tWhatever is returned by a super method, or a super method itself,\n\t\t\t//\t\tif \"true\" was specified as newArgs.\n\t\t\t// description:\n\t\t\t//\t\tThis method is used inside method of classes produced with\n\t\t\t//\t\tdeclare() to call a super method (next in the chain). It is\n\t\t\t//\t\tused for manually controlled chaining. Consider using the regular\n\t\t\t//\t\tchaining, because it is faster. Use \"this.inherited()\" only in\n\t\t\t//\t\tcomplex cases.\n\t\t\t//\n\t\t\t//\t\tThis method cannot me called from automatically chained\n\t\t\t//\t\tconstructors including the case of a special (legacy)\n\t\t\t//\t\tconstructor chaining. It cannot be called from chained methods.\n\t\t\t//\n\t\t\t//\t\tIf \"this.inherited()\" cannot find the next-in-chain method, it\n\t\t\t//\t\tdoes nothing and returns \"undefined\". The last method in chain\n\t\t\t//\t\tcan be a default method implemented in Object, which will be\n\t\t\t//\t\tcalled last.\n\t\t\t//\n\t\t\t//\t\tIf \"name\" is specified, it is assumed that the method that\n\t\t\t//\t\treceived \"args\" is the parent method for this call. It is looked\n\t\t\t//\t\tup in the chain list and if it is found the next-in-chain method\n\t\t\t//\t\tis called. If it is not found, the first-in-chain method is\n\t\t\t//\t\tcalled.\n\t\t\t//\n\t\t\t//\t\tIf \"name\" is not specified, it will be derived from the calling\n\t\t\t//\t\tmethod (using a methoid property \"nom\").\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\tvar B = declare(A, {\n\t\t\t//\t|\t\tmethod1: function(a, b, c){\n\t\t\t//\t|\t\t\tthis.inherited(arguments);\n\t\t\t//\t|\t\t},\n\t\t\t//\t|\t\tmethod2: function(a, b){\n\t\t\t//\t|\t\t\treturn this.inherited(arguments, [a + b]);\n\t\t\t//\t|\t\t}\n\t\t\t//\t|\t});\n\t\t\t//\t|\t// next method is not in the chain list because it is added\n\t\t\t//\t|\t// manually after the class was created.\n\t\t\t//\t|\tB.prototype.method3 = function(){\n\t\t\t//\t|\t\tconsole.log(\"This is a dynamically-added method.\");\n\t\t\t//\t|\t\tthis.inherited(\"method3\", arguments);\n\t\t\t//\t|\t};\n\t\t\t// example:\n\t\t\t//\t|\tvar B = declare(A, {\n\t\t\t//\t|\t\tmethod: function(a, b){\n\t\t\t//\t|\t\t\tvar super = this.inherited(arguments, true);\n\t\t\t//\t|\t\t\t// ...\n\t\t\t//\t|\t\t\tif(!super){\n\t\t\t//\t|\t\t\t\tconsole.log(\"there is no super method\");\n\t\t\t//\t|\t\t\t\treturn 0;\n\t\t\t//\t|\t\t\t}\n\t\t\t//\t|\t\t\treturn super.apply(this, arguments);\n\t\t\t//\t|\t\t}\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t|\t\"use strict\";\n\t\t\t//\t|\t// class is defined in strict-mode code,\n\t\t\t//\t|\t// so caller must be passed before arguments.\n\t\t\t//\t|\tvar B = declare(A, {\n\t\t\t//\t|\t\t// using a named function expression with \"fn\" as the name.\n\t\t\t//\t|\t\tmethod: function fn(a, b) {\n\t\t\t//\t|\t\t\tthis.inherited(fn, arguments);\n\t\t\t//\t|\t\t}\n\t\t\t//\t|\t});\n\t\t\treturn\t{};\t// Object\n\t\t},\n\n\t\tgetInherited: function(name, caller, args){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a super method.\n\t\t\t// name: String?\n\t\t\t//\t\tThe optional method name. Should be the same as the caller's\n\t\t\t//\t\tname. Usually \"name\" is specified in complex dynamic cases, when\n\t\t\t//\t\tthe calling method was dynamically added, undecorated by\n\t\t\t//\t\tdeclare(), and it cannot be determined.\n\t\t\t// caller: Function?\n\t\t\t//\t\tThe caller function. This is required when running in\n\t\t\t//\t\tstrict-mode code. A reference to the caller function\n\t\t\t//\t\tcan be obtained by using a named function expression\n\t\t\t//\t\t(e.g. function fn(a,b) {...}).\n\t\t\t// args: Arguments\n\t\t\t//\t\tThe caller supply this argument, which should be the original\n\t\t\t//\t\t\"arguments\".\n\t\t\t// returns:\n\t\t\t//\t\tReturns a super method (Function) or \"undefined\".\n\t\t\t// description:\n\t\t\t//\t\tThis method is a convenience method for \"this.inherited()\".\n\t\t\t//\t\tIt uses the same algorithm but instead of executing a super\n\t\t\t//\t\tmethod, it returns it, or \"undefined\" if not found.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\tvar B = declare(A, {\n\t\t\t//\t|\t\tmethod: function(a, b){\n\t\t\t//\t|\t\t\tvar super = this.getInherited(arguments);\n\t\t\t//\t|\t\t\t// ...\n\t\t\t//\t|\t\t\tif(!super){\n\t\t\t//\t|\t\t\t\tconsole.log(\"there is no super method\");\n\t\t\t//\t|\t\t\t\treturn 0;\n\t\t\t//\t|\t\t\t}\n\t\t\t//\t|\t\t\treturn super.apply(this, arguments);\n\t\t\t//\t|\t\t}\n\t\t\t//\t|\t});\n\t\t\t// example:\n\t\t\t//\t|\t\"use strict;\" // first line of function or file\n\t\t\t//\t|\t//...\n\t\t\t//\t|\tvar B = declare(A, {\n\t\t\t//\t|\t\t// Using a named function expression with \"fn\" as the name,\n\t\t\t//\t|\t\t// since we're in strict mode.\n\t\t\t//\t|\t\tmethod: function fn(a, b){\n\t\t\t//\t|\t\t\tvar super = this.getInherited(fn, arguments);\n\t\t\t//\t|\t\t\tif(super){\n\t\t\t//\t|\t\t\t\treturn super.apply(this, arguments);\n\t\t\t//\t|\t\t\t}\n\t\t\t//\t|\t\t}\n\t\t\t//\t|\t});\n\t\t\treturn\t{};\t// Object\n\t\t},\n\n\t\tisInstanceOf: function(cls){\n\t\t\t// summary:\n\t\t\t//\t\tChecks the inheritance chain to see if it is inherited from this\n\t\t\t//\t\tclass.\n\t\t\t// cls: Function\n\t\t\t//\t\tClass constructor.\n\t\t\t// returns:\n\t\t\t//\t\t\"true\", if this object is inherited from this class, \"false\"\n\t\t\t//\t\totherwise.\n\t\t\t// description:\n\t\t\t//\t\tThis method is used with instances of classes produced with\n\t\t\t//\t\tdeclare() to determine of they support a certain interface or\n\t\t\t//\t\tnot. It models \"instanceof\" operator.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\tvar A = declare(null, {\n\t\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t\t//\t|\t\t// ...\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar B = declare(null, {\n\t\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t\t//\t|\t\t// ...\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar C = declare([A, B], {\n\t\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t\t//\t|\t\t// ...\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar D = declare(A, {\n\t\t\t//\t|\t\t// constructor, properties, and methods go here\n\t\t\t//\t|\t\t// ...\n\t\t\t//\t|\t});\n\t\t\t//\t|\n\t\t\t//\t|\tvar a = new A(), b = new B(), c = new C(), d = new D();\n\t\t\t//\t|\n\t\t\t//\t|\tconsole.log(a.isInstanceOf(A)); // true\n\t\t\t//\t|\tconsole.log(b.isInstanceOf(A)); // false\n\t\t\t//\t|\tconsole.log(c.isInstanceOf(A)); // true\n\t\t\t//\t|\tconsole.log(d.isInstanceOf(A)); // true\n\t\t\t//\t|\n\t\t\t//\t|\tconsole.log(a.isInstanceOf(B)); // false\n\t\t\t//\t|\tconsole.log(b.isInstanceOf(B)); // true\n\t\t\t//\t|\tconsole.log(c.isInstanceOf(B)); // true\n\t\t\t//\t|\tconsole.log(d.isInstanceOf(B)); // false\n\t\t\t//\t|\n\t\t\t//\t|\tconsole.log(a.isInstanceOf(C)); // false\n\t\t\t//\t|\tconsole.log(b.isInstanceOf(C)); // false\n\t\t\t//\t|\tconsole.log(c.isInstanceOf(C)); // true\n\t\t\t//\t|\tconsole.log(d.isInstanceOf(C)); // false\n\t\t\t//\t|\n\t\t\t//\t|\tconsole.log(a.isInstanceOf(D)); // false\n\t\t\t//\t|\tconsole.log(b.isInstanceOf(D)); // false\n\t\t\t//\t|\tconsole.log(c.isInstanceOf(D)); // false\n\t\t\t//\t|\tconsole.log(d.isInstanceOf(D)); // true\n\t\t\treturn\t{};\t// Object\n\t\t},\n\n\t\textend: function(source){\n\t\t\t// summary:\n\t\t\t//\t\tAdds all properties and methods of source to constructor's\n\t\t\t//\t\tprototype, making them available to all instances created with\n\t\t\t//\t\tconstructor. This method is specific to constructors created with\n\t\t\t//\t\tdeclare().\n\t\t\t// source: Object\n\t\t\t//\t\tSource object which properties are going to be copied to the\n\t\t\t//\t\tconstructor's prototype.\n\t\t\t// description:\n\t\t\t//\t\tAdds source properties to the constructor's prototype. It can\n\t\t\t//\t\toverride existing properties.\n\t\t\t//\n\t\t\t//\t\tThis method is similar to dojo.extend function, but it is specific\n\t\t\t//\t\tto constructors produced by declare(). It is implemented\n\t\t\t//\t\tusing dojo.safeMixin, and it skips a constructor property,\n\t\t\t//\t\tand properly decorates copied functions.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\tvar A = declare(null, {\n\t\t\t//\t|\t\tm1: function(){},\n\t\t\t//\t|\t\ts1: \"Popokatepetl\"\n\t\t\t//\t|\t});\n\t\t\t//\t|\tA.extend({\n\t\t\t//\t|\t\tm1: function(){},\n\t\t\t//\t|\t\tm2: function(){},\n\t\t\t//\t|\t\tf1: true,\n\t\t\t//\t|\t\td1: 42\n\t\t\t//\t|\t});\n\t\t},\n\n\t\tcreateSubclass: function(mixins, props){\n\t\t\t// summary:\n\t\t\t//\t\tCreate a subclass of the declared class from a list of base classes.\n\t\t\t// mixins: Function[]\n\t\t\t//\t\tSpecifies a list of bases (the left-most one is the most deepest\n\t\t\t//\t\tbase).\n\t\t\t// props: Object?\n\t\t\t//\t\tAn optional object whose properties are copied to the created prototype.\n\t\t\t// returns: dojo/_base/declare.__DeclareCreatedObject\n\t\t\t//\t\tNew constructor function.\n\t\t\t// description:\n\t\t\t//\t\tCreate a constructor using a compact notation for inheritance and\n\t\t\t//\t\tprototype extension.\n\t\t\t//\n\t\t\t//\t\tMixin ancestors provide a type of multiple inheritance.\n\t\t\t//\t\tPrototypes of mixin ancestors are copied to the new class:\n\t\t\t//\t\tchanges to mixin prototypes will not affect classes to which\n\t\t\t//\t\tthey have been mixed in.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\tvar A = declare(null, {\n\t\t\t//\t|\t\tm1: function(){},\n\t\t\t//\t|\t\ts1: \"bar\"\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar B = declare(null, {\n\t\t\t//\t|\t\tm2: function(){},\n\t\t\t//\t|\t\ts2: \"foo\"\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar C = declare(null, {\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar D1 = A.createSubclass([B, C], {\n\t\t\t//\t|\t\tm1: function(){},\n\t\t\t//\t|\t\td1: 42\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar d1 = new D1();\n\t\t\t//\t|\n\t\t\t//\t|\t// this is equivalent to:\n\t\t\t//\t|\tvar D2 = declare([A, B, C], {\n\t\t\t//\t|\t\tm1: function(){},\n\t\t\t//\t|\t\td1: 42\n\t\t\t//\t|\t});\n\t\t\t//\t|\tvar d2 = new D2();\n\t\t}\n\t};\n\t=====*/\n\n\t// For back-compat, remove for 2.0\n\tdojo.safeMixin = declare.safeMixin = safeMixin;\n\tdojo.declare = declare;\n\n\treturn declare;\n});\n","define([\"./kernel\", \"../on\", \"../has\", \"../dom-geometry\"], function(dojo, on, has, dom){\n\t// module:\n\t//\t\tdojo/_base/event\n\n\tif(on._fixEvent){\n\t\tvar fixEvent = on._fixEvent;\n\t\ton._fixEvent = function(evt, se){\n\t\t\t// add some additional normalization for back-compat, this isn't in on.js because it is somewhat more expensive\n\t\t\tevt = fixEvent(evt, se);\n\t\t\tif(evt){\n\t\t\t\tdom.normalizeEvent(evt);\n\t\t\t}\n\t\t\treturn evt;\n\t\t};\t\t\n\t}\n\t\n\tvar ret = {\n\t\t// summary:\n\t\t//\t\tThis module defines dojo DOM event API. Usually you should use dojo/on, and evt.stopPropagation() +\n\t\t//\t\tevt.preventDefault(), rather than this module.\n\n\t\tfix: function(/*Event*/ evt, /*DOMNode*/ sender){\n\t\t\t// summary:\n\t\t\t//\t\tnormalizes properties on the event object including event\n\t\t\t//\t\tbubbling methods, keystroke normalization, and x/y positions\n\t\t\t// evt: Event\n\t\t\t//\t\tnative event object\n\t\t\t// sender: DOMNode\n\t\t\t//\t\tnode to treat as \"currentTarget\"\n\t\t\tif(on._fixEvent){\n\t\t\t\treturn on._fixEvent(evt, sender);\n\t\t\t}\n\t\t\treturn evt;\t// Event\n\t\t},\n\t\n\t\tstop: function(/*Event*/ evt){\n\t\t\t// summary:\n\t\t\t//\t\tprevents propagation and clobbers the default action of the\n\t\t\t//\t\tpassed event\n\t\t\t// evt: Event\n\t\t\t//\t\tThe event object. If omitted, window.event is used on IE.\n\t\t\tif(has(\"dom-addeventlistener\") || (evt && evt.preventDefault)){\n\t\t\t\tevt.preventDefault();\n\t\t\t\tevt.stopPropagation();\n\t\t\t}else{\n\t\t\t\tevt = evt || window.event;\n\t\t\t\tevt.cancelBubble = true;\n\t\t\t\ton._preventDefault.call(evt);\n\t\t\t}\n\t\t}\n\t};\n\n\tif(has(\"extend-dojo\")){\n\t\tdojo.fixEvent = ret.fix;\n\t\tdojo.stopEvent = ret.stop;\n\t}\n\n\treturn ret;\n});\n","define([\"./kernel\", \"./config\", /*===== \"./declare\", =====*/ \"./lang\", \"../Evented\", \"./Color\", \"../aspect\", \"../sniff\", \"../dom\", \"../dom-style\"],\n\tfunction(dojo, config, /*===== declare, =====*/ lang, Evented, Color, aspect, has, dom, style){\n\t// module:\n\t//\t\tdojo/_base/fx\n\t// notes:\n\t//\t\tAnimation loosely package based on Dan Pupius' work, contributed under CLA; see\n\t//\t\thttp://pupius.co.uk/js/Toolkit.Drawing.js\n\n\tvar _mixin = lang.mixin;\n\n\t// Module export\n\tvar basefx = {\n\t\t// summary:\n\t\t//\t\tThis module defines the base dojo/_base/fx implementation.\n\t};\n\n\tvar _Line = basefx._Line = function(/*int*/ start, /*int*/ end){\n\t\t// summary:\n\t\t//\t\tObject used to generate values from a start value to an end value\n\t\t// start: int\n\t\t//\t\tBeginning value for range\n\t\t// end: int\n\t\t//\t\tEnding value for range\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t};\n\n\t_Line.prototype.getValue = function(/*float*/ n){\n\t\t// summary:\n\t\t//\t\tReturns the point on the line\n\t\t// n:\n\t\t//\t\ta floating point number greater than 0 and less than 1\n\t\treturn ((this.end - this.start) * n) + this.start; // Decimal\n\t};\n\n\tvar Animation = basefx.Animation = function(args){\n\t\t// summary:\n\t\t//\t\tA generic animation class that fires callbacks into its handlers\n\t\t//\t\tobject at various states.\n\t\t// description:\n\t\t//\t\tA generic animation class that fires callbacks into its handlers\n\t\t//\t\tobject at various states. Nearly all dojo animation functions\n\t\t//\t\treturn an instance of this method, usually without calling the\n\t\t//\t\t.play() method beforehand. Therefore, you will likely need to\n\t\t//\t\tcall .play() on instances of `Animation` when one is\n\t\t//\t\treturned.\n\t\t// args: Object\n\t\t//\t\tThe 'magic argument', mixing all the properties into this\n\t\t//\t\tanimation instance.\n\n\t\t_mixin(this, args);\n\t\tif(lang.isArray(this.curve)){\n\t\t\tthis.curve = new _Line(this.curve[0], this.curve[1]);\n\t\t}\n\n\t};\n\tAnimation.prototype = new Evented();\n\n\tlang.extend(Animation, {\n\t\t// duration: Integer\n\t\t//\t\tThe time in milliseconds the animation will take to run\n\t\tduration: 350,\n\n\t/*=====\n\t\t// curve: _Line|Array\n\t\t//\t\tA two element array of start and end values, or a `_Line` instance to be\n\t\t//\t\tused in the Animation.\n\t\tcurve: null,\n\n\t\t// easing: Function?\n\t\t//\t\tA Function to adjust the acceleration (or deceleration) of the progress\n\t\t//\t\tacross a _Line\n\t\teasing: null,\n\t=====*/\n\n\t\t// repeat: Integer?\n\t\t//\t\tThe number of times to loop the animation\n\t\trepeat: 0,\n\n\t\t// rate: Integer?\n\t\t//\t\tthe time in milliseconds to wait before advancing to next frame\n\t\t//\t\t(used as a fps timer: 1000/rate = fps)\n\t\trate: 20 /* 50 fps */,\n\n\t/*=====\n\t\t// delay: Integer?\n\t\t//\t\tThe time in milliseconds to wait before starting animation after it\n\t\t//\t\thas been .play()'ed\n\t\tdelay: null,\n\n\t\t// beforeBegin: Event?\n\t\t//\t\tSynthetic event fired before a Animation begins playing (synchronous)\n\t\tbeforeBegin: null,\n\n\t\t// onBegin: Event?\n\t\t//\t\tSynthetic event fired as a Animation begins playing (useful?)\n\t\tonBegin: null,\n\n\t\t// onAnimate: Event?\n\t\t//\t\tSynthetic event fired at each interval of the Animation\n\t\tonAnimate: null,\n\n\t\t// onEnd: Event?\n\t\t//\t\tSynthetic event fired after the final frame of the Animation\n\t\tonEnd: null,\n\n\t\t// onPlay: Event?\n\t\t//\t\tSynthetic event fired any time the Animation is play()'ed\n\t\tonPlay: null,\n\n\t\t// onPause: Event?\n\t\t//\t\tSynthetic event fired when the Animation is paused\n\t\tonPause: null,\n\n\t\t// onStop: Event\n\t\t//\t\tSynthetic event fires when the Animation is stopped\n\t\tonStop: null,\n\n\t=====*/\n\n\t\t_percent: 0,\n\t\t_startRepeatCount: 0,\n\n\t\t_getStep: function(){\n\t\t\tvar _p = this._percent,\n\t\t\t\t_e = this.easing\n\t\t\t;\n\t\t\treturn _e ? _e(_p) : _p;\n\t\t},\n\t\t_fire: function(/*Event*/ evt, /*Array?*/ args){\n\t\t\t// summary:\n\t\t\t//\t\tConvenience function. Fire event \"evt\" and pass it the\n\t\t\t//\t\targuments specified in \"args\".\n\t\t\t// description:\n\t\t\t//\t\tConvenience function. Fire event \"evt\" and pass it the\n\t\t\t//\t\targuments specified in \"args\".\n\t\t\t//\t\tFires the callback in the scope of this Animation\n\t\t\t//\t\tinstance.\n\t\t\t// evt:\n\t\t\t//\t\tThe event to fire.\n\t\t\t// args:\n\t\t\t//\t\tThe arguments to pass to the event.\n\t\t\tvar a = args||[];\n\t\t\tif(this[evt]){\n\t\t\t\tif(config.debugAtAllCosts){\n\t\t\t\t\tthis[evt].apply(this, a);\n\t\t\t\t}else{\n\t\t\t\t\ttry{\n\t\t\t\t\t\tthis[evt].apply(this, a);\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t// squelch and log because we shouldn't allow exceptions in\n\t\t\t\t\t\t// synthetic event handlers to cause the internal timer to run\n\t\t\t\t\t\t// amuck, potentially pegging the CPU. I'm not a fan of this\n\t\t\t\t\t\t// squelch, but hopefully logging will make it clear what's\n\t\t\t\t\t\t// going on\n\t\t\t\t\t\tconsole.error(\"exception in animation handler for:\", evt);\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this; // Animation\n\t\t},\n\n\t\tplay: function(/*int?*/ delay, /*Boolean?*/ gotoStart){\n\t\t\t// summary:\n\t\t\t//\t\tStart the animation.\n\t\t\t// delay:\n\t\t\t//\t\tHow many milliseconds to delay before starting.\n\t\t\t// gotoStart:\n\t\t\t//\t\tIf true, starts the animation from the beginning; otherwise,\n\t\t\t//\t\tstarts it from its current position.\n\t\t\t// returns: Animation\n\t\t\t//\t\tThe instance to allow chaining.\n\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\tif(gotoStart){\n\t\t\t\t_t._stopTimer();\n\t\t\t\t_t._active = _t._paused = false;\n\t\t\t\t_t._percent = 0;\n\t\t\t}else if(_t._active && !_t._paused){\n\t\t\t\treturn _t;\n\t\t\t}\n\n\t\t\t_t._fire(\"beforeBegin\", [_t.node]);\n\n\t\t\tvar de = delay || _t.delay,\n\t\t\t\t_p = lang.hitch(_t, \"_play\", gotoStart);\n\n\t\t\tif(de > 0){\n\t\t\t\t_t._delayTimer = setTimeout(_p, de);\n\t\t\t\treturn _t;\n\t\t\t}\n\t\t\t_p();\n\t\t\treturn _t;\t// Animation\n\t\t},\n\n\t\t_play: function(gotoStart){\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\t_t._startTime = new Date().valueOf();\n\t\t\tif(_t._paused){\n\t\t\t\t_t._startTime -= _t.duration * _t._percent;\n\t\t\t}\n\n\t\t\t_t._active = true;\n\t\t\t_t._paused = false;\n\t\t\tvar value = _t.curve.getValue(_t._getStep());\n\t\t\tif(!_t._percent){\n\t\t\t\tif(!_t._startRepeatCount){\n\t\t\t\t\t_t._startRepeatCount = _t.repeat;\n\t\t\t\t}\n\t\t\t\t_t._fire(\"onBegin\", [value]);\n\t\t\t}\n\n\t\t\t_t._fire(\"onPlay\", [value]);\n\n\t\t\t_t._cycle();\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tpause: function(){\n\t\t\t// summary:\n\t\t\t//\t\tPauses a running animation.\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\t_t._stopTimer();\n\t\t\tif(!_t._active){ return _t; /*Animation*/ }\n\t\t\t_t._paused = true;\n\t\t\t_t._fire(\"onPause\", [_t.curve.getValue(_t._getStep())]);\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tgotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){\n\t\t\t// summary:\n\t\t\t//\t\tSets the progress of the animation.\n\t\t\t// percent:\n\t\t\t//\t\tA percentage in decimal notation (between and including 0.0 and 1.0).\n\t\t\t// andPlay:\n\t\t\t//\t\tIf true, play the animation after setting the progress.\n\t\t\tvar _t = this;\n\t\t\t_t._stopTimer();\n\t\t\t_t._active = _t._paused = true;\n\t\t\t_t._percent = percent;\n\t\t\tif(andPlay){ _t.play(); }\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tstop: function(/*boolean?*/ gotoEnd){\n\t\t\t// summary:\n\t\t\t//\t\tStops a running animation.\n\t\t\t// gotoEnd:\n\t\t\t//\t\tIf true, the animation will end.\n\t\t\tvar _t = this;\n\t\t\tif(_t._delayTimer){ _t._clearTimer(); }\n\t\t\tif(!_t._timer){ return _t; /* Animation */ }\n\t\t\t_t._stopTimer();\n\t\t\tif(gotoEnd){\n\t\t\t\t_t._percent = 1;\n\t\t\t}\n\t\t\t_t._fire(\"onStop\", [_t.curve.getValue(_t._getStep())]);\n\t\t\t_t._active = _t._paused = false;\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\tdestroy: function(){\n\t\t\t// summary:\n\t\t\t//\t\tcleanup the animation\n\t\t\tthis.stop();\n\t\t},\n\n\t\tstatus: function(){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a string token representation of the status of\n\t\t\t//\t\tthe animation, one of: \"paused\", \"playing\", \"stopped\"\n\t\t\tif(this._active){\n\t\t\t\treturn this._paused ? \"paused\" : \"playing\"; // String\n\t\t\t}\n\t\t\treturn \"stopped\"; // String\n\t\t},\n\n\t\t_cycle: function(){\n\t\t\tvar _t = this;\n\t\t\tif(_t._active){\n\t\t\t\tvar curr = new Date().valueOf();\n\t\t\t\t// Allow durations of 0 (instant) by setting step to 1 - see #13798\n\t\t\t\tvar step = _t.duration === 0 ? 1 : (curr - _t._startTime) / (_t.duration);\n\n\t\t\t\tif(step >= 1){\n\t\t\t\t\tstep = 1;\n\t\t\t\t}\n\t\t\t\t_t._percent = step;\n\n\t\t\t\t// Perform easing\n\t\t\t\tif(_t.easing){\n\t\t\t\t\tstep = _t.easing(step);\n\t\t\t\t}\n\n\t\t\t\t_t._fire(\"onAnimate\", [_t.curve.getValue(step)]);\n\n\t\t\t\tif(_t._percent < 1){\n\t\t\t\t\t_t._startTimer();\n\t\t\t\t}else{\n\t\t\t\t\t_t._active = false;\n\n\t\t\t\t\tif(_t.repeat > 0){\n\t\t\t\t\t\t_t.repeat--;\n\t\t\t\t\t\t_t.play(null, true);\n\t\t\t\t\t}else if(_t.repeat == -1){\n\t\t\t\t\t\t_t.play(null, true);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(_t._startRepeatCount){\n\t\t\t\t\t\t\t_t.repeat = _t._startRepeatCount;\n\t\t\t\t\t\t\t_t._startRepeatCount = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t_t._percent = 0;\n\t\t\t\t\t_t._fire(\"onEnd\", [_t.node]);\n\t\t\t\t\t!_t.repeat && _t._stopTimer();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn _t; // Animation\n\t\t},\n\n\t\t_clearTimer: function(){\n\t\t\t// summary:\n\t\t\t//\t\tClear the play delay timer\n\t\t\tclearTimeout(this._delayTimer);\n\t\t\tdelete this._delayTimer;\n\t\t}\n\n\t});\n\n\t// the local timer, stubbed into all Animation instances\n\tvar ctr = 0,\n\t\ttimer = null,\n\t\trunner = {\n\t\t\trun: function(){}\n\t\t};\n\n\tlang.extend(Animation, {\n\n\t\t_startTimer: function(){\n\t\t\tif(!this._timer){\n\t\t\t\tthis._timer = aspect.after(runner, \"run\", lang.hitch(this, \"_cycle\"), true);\n\t\t\t\tctr++;\n\t\t\t}\n\t\t\tif(!timer){\n\t\t\t\ttimer = setInterval(lang.hitch(runner, \"run\"), this.rate);\n\t\t\t}\n\t\t},\n\n\t\t_stopTimer: function(){\n\t\t\tif(this._timer){\n\t\t\t\tthis._timer.remove();\n\t\t\t\tthis._timer = null;\n\t\t\t\tctr--;\n\t\t\t}\n\t\t\tif(ctr <= 0){\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = null;\n\t\t\t\tctr = 0;\n\t\t\t}\n\t\t}\n\n\t});\n\n\tvar _makeFadeable =\n\t\thas(\"ie\") ? function(node){\n\t\t\t// only set the zoom if the \"tickle\" value would be the same as the\n\t\t\t// default\n\t\t\tvar ns = node.style;\n\t\t\t// don't set the width to auto if it didn't already cascade that way.\n\t\t\t// We don't want to f anyones designs\n\t\t\tif(!ns.width.length && style.get(node, \"width\") == \"auto\"){\n\t\t\t\tns.width = \"auto\";\n\t\t\t}\n\t\t} :\n\t\tfunction(){};\n\n\tbasefx._fade = function(/*Object*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will fade the node defined by\n\t\t//\t\targs.node from the start to end values passed (args.start\n\t\t//\t\targs.end) (end is mandatory, start is optional)\n\n\t\targs.node = dom.byId(args.node);\n\t\tvar fArgs = _mixin({ properties: {} }, args),\n\t\t\tprops = (fArgs.properties.opacity = {});\n\n\t\tprops.start = !(\"start\" in fArgs) ?\n\t\t\tfunction(){\n\t\t\t\treturn +style.get(fArgs.node, \"opacity\")||0;\n\t\t\t} : fArgs.start;\n\t\tprops.end = fArgs.end;\n\n\t\tvar anim = basefx.animateProperty(fArgs);\n\t\taspect.after(anim, \"beforeBegin\", lang.partial(_makeFadeable, fArgs.node), true);\n\n\t\treturn anim; // Animation\n\t};\n\n\t/*=====\n\tvar __FadeArgs = declare(null, {\n\t\t// node: DOMNode|String\n\t\t//\t\tThe node referenced in the animation\n\t\t// duration: Integer?\n\t\t//\t\tDuration of the animation in milliseconds.\n\t\t// easing: Function?\n\t\t//\t\tAn easing function.\n\t});\n\t=====*/\n\n\tbasefx.fadeIn = function(/*__FadeArgs*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will fade node defined in 'args' from\n\t\t//\t\tits current opacity to fully opaque.\n\t\treturn basefx._fade(_mixin({ end: 1 }, args)); // Animation\n\t};\n\n\tbasefx.fadeOut = function(/*__FadeArgs*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will fade node defined in 'args'\n\t\t//\t\tfrom its current opacity to fully transparent.\n\t\treturn basefx._fade(_mixin({ end: 0 }, args)); // Animation\n\t};\n\n\tbasefx._defaultEasing = function(/*Decimal?*/ n){\n\t\t// summary:\n\t\t//\t\tThe default easing function for Animation(s)\n\t\treturn 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2);\t// Decimal\n\t};\n\n\tvar PropLine = function(properties){\n\t\t// PropLine is an internal class which is used to model the values of\n\t\t// an a group of CSS properties across an animation lifecycle. In\n\t\t// particular, the \"getValue\" function handles getting interpolated\n\t\t// values between start and end for a particular CSS value.\n\t\tthis._properties = properties;\n\t\tfor(var p in properties){\n\t\t\tvar prop = properties[p];\n\t\t\tif(prop.start instanceof Color){\n\t\t\t\t// create a reusable temp color object to keep intermediate results\n\t\t\t\tprop.tempColor = new Color();\n\t\t\t}\n\t\t}\n\t};\n\n\tPropLine.prototype.getValue = function(r){\n\t\tvar ret = {};\n\t\tfor(var p in this._properties){\n\t\t\tvar prop = this._properties[p],\n\t\t\t\tstart = prop.start;\n\t\t\tif(start instanceof Color){\n\t\t\t\tret[p] = Color.blendColors(start, prop.end, r, prop.tempColor).toCss();\n\t\t\t}else if(!lang.isArray(start)){\n\t\t\t\tret[p] = ((prop.end - start) * r) + start + (p != \"opacity\" ? prop.units || \"px\" : 0);\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t};\n\n\t/*=====\n\tvar __AnimArgs = declare(__FadeArgs, {\n\t\t// properties: Object?\n\t\t//\t\tA hash map of style properties to Objects describing the transition,\n\t\t//\t\tsuch as the properties of _Line with an additional 'units' property\n\t\tproperties: {}\n\n\t\t//TODOC: add event callbacks\n\t});\n\t=====*/\n\n\tbasefx.animateProperty = function(/*__AnimArgs*/ args){\n\t\t// summary:\n\t\t//\t\tReturns an animation that will transition the properties of\n\t\t//\t\tnode defined in `args` depending how they are defined in\n\t\t//\t\t`args.properties`\n\t\t//\n\t\t// description:\n\t\t//\t\tFoundation of most `dojo/_base/fx`\n\t\t//\t\tanimations. It takes an object of \"properties\" corresponding to\n\t\t//\t\tstyle properties, and animates them in parallel over a set\n\t\t//\t\tduration.\n\t\t//\n\t\t// example:\n\t\t//\t\tA simple animation that changes the width of the specified node.\n\t\t//\t|\tbasefx.animateProperty({\n\t\t//\t|\t\tnode: \"nodeId\",\n\t\t//\t|\t\tproperties: { width: 400 },\n\t\t//\t|\t}).play();\n\t\t//\t\tDojo figures out the start value for the width and converts the\n\t\t//\t\tinteger specified for the width to the more expressive but\n\t\t//\t\tverbose form `{ width: { end: '400', units: 'px' } }` which you\n\t\t//\t\tcan also specify directly. Defaults to 'px' if omitted.\n\t\t//\n\t\t// example:\n\t\t//\t\tAnimate width, height, and padding over 2 seconds... the\n\t\t//\t\tpedantic way:\n\t\t//\t|\tbasefx.animateProperty({ node: node, duration:2000,\n\t\t//\t|\t\tproperties: {\n\t\t//\t|\t\t\twidth: { start: '200', end: '400', units:\"px\" },\n\t\t//\t|\t\t\theight: { start:'200', end: '400', units:\"px\" },\n\t\t//\t|\t\t\tpaddingTop: { start:'5', end:'50', units:\"px\" }\n\t\t//\t|\t\t}\n\t\t//\t|\t}).play();\n\t\t//\t\tNote 'paddingTop' is used over 'padding-top'. Multi-name CSS properties\n\t\t//\t\tare written using \"mixed case\", as the hyphen is illegal as an object key.\n\t\t//\n\t\t// example:\n\t\t//\t\tPlug in a different easing function and register a callback for\n\t\t//\t\twhen the animation ends. Easing functions accept values between\n\t\t//\t\tzero and one and return a value on that basis. In this case, an\n\t\t//\t\texponential-in curve.\n\t\t//\t|\tbasefx.animateProperty({\n\t\t//\t|\t\tnode: \"nodeId\",\n\t\t//\t|\t\t// dojo figures out the start value\n\t\t//\t|\t\tproperties: { width: { end: 400 } },\n\t\t//\t|\t\teasing: function(n){\n\t\t//\t|\t\t\treturn (n==0) ? 0 : Math.pow(2, 10 * (n - 1));\n\t\t//\t|\t\t},\n\t\t//\t|\t\tonEnd: function(node){\n\t\t//\t|\t\t\t// called when the animation finishes. The animation\n\t\t//\t|\t\t\t// target is passed to this function\n\t\t//\t|\t\t}\n\t\t//\t|\t}).play(500); // delay playing half a second\n\t\t//\n\t\t// example:\n\t\t//\t\tLike all `Animation`s, animateProperty returns a handle to the\n\t\t//\t\tAnimation instance, which fires the events common to Dojo FX. Use `aspect.after`\n\t\t//\t\tto access these events outside of the Animation definition:\n\t\t//\t|\tvar anim = basefx.animateProperty({\n\t\t//\t|\t\tnode:\"someId\",\n\t\t//\t|\t\tproperties:{\n\t\t//\t|\t\t\twidth:400, height:500\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\t|\taspect.after(anim, \"onEnd\", function(){\n\t\t//\t|\t\tconsole.log(\"animation ended\");\n\t\t//\t|\t}, true);\n\t\t//\t|\t// play the animation now:\n\t\t//\t|\tanim.play();\n\t\t//\n\t\t// example:\n\t\t//\t\tEach property can be a function whose return value is substituted along.\n\t\t//\t\tAdditionally, each measurement (eg: start, end) can be a function. The node\n\t\t//\t\treference is passed directly to callbacks.\n\t\t//\t|\tbasefx.animateProperty({\n\t\t//\t|\t\tnode:\"mine\",\n\t\t//\t|\t\tproperties:{\n\t\t//\t|\t\t\theight:function(node){\n\t\t//\t|\t\t\t\t// shrink this node by 50%\n\t\t//\t|\t\t\t\treturn domGeom.position(node).h / 2\n\t\t//\t|\t\t\t},\n\t\t//\t|\t\t\twidth:{\n\t\t//\t|\t\t\t\tstart:function(node){ return 100; },\n\t\t//\t|\t\t\t\tend:function(node){ return 200; }\n\t\t//\t|\t\t\t}\n\t\t//\t|\t\t}\n\t\t//\t|\t}).play();\n\t\t//\n\n\t\tvar n = args.node = dom.byId(args.node);\n\t\tif(!args.easing){ args.easing = dojo._defaultEasing; }\n\n\t\tvar anim = new Animation(args);\n\t\taspect.after(anim, \"beforeBegin\", lang.hitch(anim, function(){\n\t\t\tvar pm = {};\n\t\t\tfor(var p in this.properties){\n\t\t\t\t// Make shallow copy of properties into pm because we overwrite\n\t\t\t\t// some values below. In particular if start/end are functions\n\t\t\t\t// we don't want to overwrite them or the functions won't be\n\t\t\t\t// called if the animation is reused.\n\t\t\t\tif(p == \"width\" || p == \"height\"){\n\t\t\t\t\tthis.node.display = \"block\";\n\t\t\t\t}\n\t\t\t\tvar prop = this.properties[p];\n\t\t\t\tif(lang.isFunction(prop)){\n\t\t\t\t\tprop = prop(n);\n\t\t\t\t}\n\t\t\t\tprop = pm[p] = _mixin({}, (lang.isObject(prop) ? prop: { end: prop }));\n\n\t\t\t\tif(lang.isFunction(prop.start)){\n\t\t\t\t\tprop.start = prop.start(n);\n\t\t\t\t}\n\t\t\t\tif(lang.isFunction(prop.end)){\n\t\t\t\t\tprop.end = prop.end(n);\n\t\t\t\t}\n\t\t\t\tvar isColor = (p.toLowerCase().indexOf(\"color\") >= 0);\n\t\t\t\tvar getStyle = function getStyle(node, p){\n\t\t\t\t\t// domStyle.get(node, \"height\") can return \"auto\" or \"\" on IE; this is more reliable:\n\t\t\t\t\tvar v = { height: node.offsetHeight, width: node.offsetWidth }[p];\n\t\t\t\t\tif(v !== undefined){ return v; }\n\t\t\t\t\tv = style.get(node, p);\n\t\t\t\t\treturn (p == \"opacity\") ? +v : (isColor ? v : parseFloat(v));\n\t\t\t\t};\n\t\t\t\tif(!(\"end\" in prop)){\n\t\t\t\t\tprop.end = getStyle(n, p);\n\t\t\t\t}else if(!(\"start\" in prop)){\n\t\t\t\t\tprop.start = getStyle(n, p);\n\t\t\t\t}\n\n\t\t\t\tif(isColor){\n\t\t\t\t\tprop.start = new Color(prop.start);\n\t\t\t\t\tprop.end = new Color(prop.end);\n\t\t\t\t}else{\n\t\t\t\t\tprop.start = (p == \"opacity\") ? +prop.start : parseFloat(prop.start);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.curve = new PropLine(pm);\n\t\t}), true);\n\t\taspect.after(anim, \"onAnimate\", lang.hitch(style, \"set\", anim.node), true);\n\t\treturn anim; // Animation\n\t};\n\n\tbasefx.anim = function(\t/*DOMNode|String*/\tnode,\n\t\t\t\t\t\t\t/*Object*/\t\t\tproperties,\n\t\t\t\t\t\t\t/*Integer?*/\t\tduration,\n\t\t\t\t\t\t\t/*Function?*/\t\teasing,\n\t\t\t\t\t\t\t/*Function?*/\t\tonEnd,\n\t\t\t\t\t\t\t/*Integer?*/\t\tdelay){\n\t\t// summary:\n\t\t//\t\tA simpler interface to `animateProperty()`, also returns\n\t\t//\t\tan instance of `Animation` but begins the animation\n\t\t//\t\timmediately, unlike nearly every other Dojo animation API.\n\t\t// description:\n\t\t//\t\tSimpler (but somewhat less powerful) version\n\t\t//\t\tof `animateProperty`. It uses defaults for many basic properties\n\t\t//\t\tand allows for positional parameters to be used in place of the\n\t\t//\t\tpacked \"property bag\" which is used for other Dojo animation\n\t\t//\t\tmethods.\n\t\t//\n\t\t//\t\tThe `Animation` object returned will be already playing, so\n\t\t//\t\tcalling play() on it again is (usually) a no-op.\n\t\t// node:\n\t\t//\t\ta DOM node or the id of a node to animate CSS properties on\n\t\t// duration:\n\t\t//\t\tThe number of milliseconds over which the animation\n\t\t//\t\tshould run. Defaults to the global animation default duration\n\t\t//\t\t(350ms).\n\t\t// easing:\n\t\t//\t\tAn easing function over which to calculate acceleration\n\t\t//\t\tand deceleration of the animation through its duration.\n\t\t//\t\tA default easing algorithm is provided, but you may\n\t\t//\t\tplug in any you wish. A large selection of easing algorithms\n\t\t//\t\tare available in `dojo/fx/easing`.\n\t\t// onEnd:\n\t\t//\t\tA function to be called when the animation finishes\n\t\t//\t\trunning.\n\t\t// delay:\n\t\t//\t\tThe number of milliseconds to delay beginning the\n\t\t//\t\tanimation by. The default is 0.\n\t\t// example:\n\t\t//\t\tFade out a node\n\t\t//\t|\tbasefx.anim(\"id\", { opacity: 0 });\n\t\t// example:\n\t\t//\t\tFade out a node over a full second\n\t\t//\t|\tbasefx.anim(\"id\", { opacity: 0 }, 1000);\n\t\treturn basefx.animateProperty({ // Animation\n\t\t\tnode: node,\n\t\t\tduration: duration || Animation.prototype.duration,\n\t\t\tproperties: properties,\n\t\t\teasing: easing,\n\t\t\tonEnd: onEnd\n\t\t}).play(delay || 0);\n\t};\n\n\n\tif(has(\"extend-dojo\")){\n\t\t_mixin(dojo, basefx);\n\t\t// Alias to drop come 2.0:\n\t\tdojo._Animation = Animation;\n\t}\n\n\treturn basefx;\n});\n","define([\"./kernel\", \"../dom\", \"../dom-style\", \"../dom-attr\", \"../dom-prop\", \"../dom-class\", \"../dom-construct\", \"../dom-geometry\"], function(dojo, dom, style, attr, prop, cls, ctr, geom){\n\t// module:\n\t//\t\tdojo/dom\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tThis module is a stub for the core dojo DOM API.\n\t};\n\t=====*/\n\n\t// mix-in dom\n\tdojo.byId = dom.byId;\n\tdojo.isDescendant = dom.isDescendant;\n\tdojo.setSelectable = dom.setSelectable;\n\n\t// mix-in dom-attr\n\tdojo.getAttr = attr.get;\n\tdojo.setAttr = attr.set;\n\tdojo.hasAttr = attr.has;\n\tdojo.removeAttr = attr.remove;\n\tdojo.getNodeProp = attr.getNodeProp;\n\n\tdojo.attr = function(node, name, value){\n\t\t// summary:\n\t\t//\t\tGets or sets an attribute on an HTML element.\n\t\t// description:\n\t\t//\t\tHandles normalized getting and setting of attributes on DOM\n\t\t//\t\tNodes. If 2 arguments are passed, and a the second argument is a\n\t\t//\t\tstring, acts as a getter.\n\t\t//\n\t\t//\t\tIf a third argument is passed, or if the second argument is a\n\t\t//\t\tmap of attributes, acts as a setter.\n\t\t//\n\t\t//\t\tWhen passing functions as values, note that they will not be\n\t\t//\t\tdirectly assigned to slots on the node, but rather the default\n\t\t//\t\tbehavior will be removed and the new behavior will be added\n\t\t//\t\tusing `dojo.connect()`, meaning that event handler properties\n\t\t//\t\twill be normalized and that some caveats with regards to\n\t\t//\t\tnon-standard behaviors for onsubmit apply. Namely that you\n\t\t//\t\tshould cancel form submission using `dojo.stopEvent()` on the\n\t\t//\t\tpassed event object instead of returning a boolean value from\n\t\t//\t\tthe handler itself.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to get or set the attribute on\n\t\t// name: String|Object\n\t\t//\t\tthe name of the attribute to get or set.\n\t\t// value: String?\n\t\t//\t\tThe value to set for the attribute\n\t\t// returns:\n\t\t//\t\twhen used as a getter, the value of the requested attribute\n\t\t//\t\tor null if that attribute does not have a specified or\n\t\t//\t\tdefault value;\n\t\t//\n\t\t//\t\twhen used as a setter, the DOM node\n\t\t//\n\t\t// example:\n\t\t//\t|\t// get the current value of the \"foo\" attribute on a node\n\t\t//\t|\tdojo.attr(dojo.byId(\"nodeId\"), \"foo\");\n\t\t//\t|\t// or we can just pass the id:\n\t\t//\t|\tdojo.attr(\"nodeId\", \"foo\");\n\t\t//\n\t\t// example:\n\t\t//\t|\t// use attr() to set the tab index\n\t\t//\t|\tdojo.attr(\"nodeId\", \"tabIndex\", 3);\n\t\t//\t|\n\t\t//\n\t\t// example:\n\t\t//\tSet multiple values at once, including event handlers:\n\t\t//\t|\tdojo.attr(\"formId\", {\n\t\t//\t|\t\t\"foo\": \"bar\",\n\t\t//\t|\t\t\"tabIndex\": -1,\n\t\t//\t|\t\t\"method\": \"POST\",\n\t\t//\t|\t\t\"onsubmit\": function(e){\n\t\t//\t|\t\t\t// stop submitting the form. Note that the IE behavior\n\t\t//\t|\t\t\t// of returning true or false will have no effect here\n\t\t//\t|\t\t\t// since our handler is connect()ed to the built-in\n\t\t//\t|\t\t\t// onsubmit behavior and so we need to use\n\t\t//\t|\t\t\t// dojo.stopEvent() to ensure that the submission\n\t\t//\t|\t\t\t// doesn't proceed.\n\t\t//\t|\t\t\tdojo.stopEvent(e);\n\t\t//\t|\n\t\t//\t|\t\t\t// submit the form with Ajax\n\t\t//\t|\t\t\tdojo.xhrPost({ form: \"formId\" });\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tStyle is s special case: Only set with an object hash of styles\n\t\t//\t|\tdojo.attr(\"someNode\",{\n\t\t//\t|\t\tid:\"bar\",\n\t\t//\t|\t\tstyle:{\n\t\t//\t|\t\t\twidth:\"200px\", height:\"100px\", color:\"#000\"\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tAgain, only set style as an object hash of styles:\n\t\t//\t|\tvar obj = { color:\"#fff\", backgroundColor:\"#000\" };\n\t\t//\t|\tdojo.attr(\"someNode\", \"style\", obj);\n\t\t//\t|\n\t\t//\t|\t// though shorter to use `dojo.style()` in this case:\n\t\t//\t|\tdojo.style(\"someNode\", obj);\n\n\t\tif(arguments.length == 2){\n\t\t\treturn attr[typeof name == \"string\" ? \"get\" : \"set\"](node, name);\n\t\t}\n\t\treturn attr.set(node, name, value);\n\t};\n\n\t// mix-in dom-class\n\tdojo.hasClass = cls.contains;\n\tdojo.addClass = cls.add;\n\tdojo.removeClass = cls.remove;\n\tdojo.toggleClass = cls.toggle;\n\tdojo.replaceClass = cls.replace;\n\n\t// mix-in dom-construct\n\tdojo._toDom = dojo.toDom = ctr.toDom;\n\tdojo.place = ctr.place;\n\tdojo.create = ctr.create;\n\tdojo.empty = function(node){ ctr.empty(node); };\n\tdojo._destroyElement = dojo.destroy = function(node){ ctr.destroy(node); };\n\n\t// mix-in dom-geometry\n\tdojo._getPadExtents = dojo.getPadExtents = geom.getPadExtents;\n\tdojo._getBorderExtents = dojo.getBorderExtents = geom.getBorderExtents;\n\tdojo._getPadBorderExtents = dojo.getPadBorderExtents = geom.getPadBorderExtents;\n\tdojo._getMarginExtents = dojo.getMarginExtents = geom.getMarginExtents;\n\tdojo._getMarginSize = dojo.getMarginSize = geom.getMarginSize;\n\tdojo._getMarginBox = dojo.getMarginBox = geom.getMarginBox;\n\tdojo.setMarginBox = geom.setMarginBox;\n\tdojo._getContentBox = dojo.getContentBox = geom.getContentBox;\n\tdojo.setContentSize = geom.setContentSize;\n\tdojo._isBodyLtr = dojo.isBodyLtr = geom.isBodyLtr;\n\tdojo._docScroll = dojo.docScroll = geom.docScroll;\n\tdojo._getIeDocumentElementOffset = dojo.getIeDocumentElementOffset = geom.getIeDocumentElementOffset;\n\tdojo._fixIeBiDiScrollLeft = dojo.fixIeBiDiScrollLeft = geom.fixIeBiDiScrollLeft;\n\tdojo.position = geom.position;\n\n\tdojo.marginBox = function marginBox(/*DomNode|String*/node, /*Object?*/box){\n\t\t// summary:\n\t\t//\t\tGetter/setter for the margin-box of node.\n\t\t// description:\n\t\t//\t\tGetter/setter for the margin-box of node.\n\t\t//\t\tReturns an object in the expected format of box (regardless\n\t\t//\t\tif box is passed). The object might look like:\n\t\t//\t\t`{ l: 50, t: 200, w: 300: h: 150 }`\n\t\t//\t\tfor a node offset from its parent 50px to the left, 200px from\n\t\t//\t\tthe top with a margin width of 300px and a margin-height of\n\t\t//\t\t150px.\n\t\t// node:\n\t\t//\t\tid or reference to DOM Node to get/set box for\n\t\t// box:\n\t\t//\t\tIf passed, denotes that dojo.marginBox() should\n\t\t//\t\tupdate/set the margin box for node. Box is an object in the\n\t\t//\t\tabove format. All properties are optional if passed.\n\t\t// example:\n\t\t//\t\tRetrieve the margin box of a passed node\n\t\t//\t|\tvar box = dojo.marginBox(\"someNodeId\");\n\t\t//\t|\tconsole.dir(box);\n\t\t//\n\t\t// example:\n\t\t//\t\tSet a node's margin box to the size of another node\n\t\t//\t|\tvar box = dojo.marginBox(\"someNodeId\");\n\t\t//\t|\tdojo.marginBox(\"someOtherNode\", box);\n\t\treturn box ? geom.setMarginBox(node, box) : geom.getMarginBox(node); // Object\n\t};\n\n\tdojo.contentBox = function contentBox(/*DomNode|String*/node, /*Object?*/box){\n\t\t// summary:\n\t\t//\t\tGetter/setter for the content-box of node.\n\t\t// description:\n\t\t//\t\tReturns an object in the expected format of box (regardless if box is passed).\n\t\t//\t\tThe object might look like:\n\t\t//\t\t`{ l: 50, t: 200, w: 300: h: 150 }`\n\t\t//\t\tfor a node offset from its parent 50px to the left, 200px from\n\t\t//\t\tthe top with a content width of 300px and a content-height of\n\t\t//\t\t150px. Note that the content box may have a much larger border\n\t\t//\t\tor margin box, depending on the box model currently in use and\n\t\t//\t\tCSS values set/inherited for node.\n\t\t//\t\tWhile the getter will return top and left values, the\n\t\t//\t\tsetter only accepts setting the width and height.\n\t\t// node:\n\t\t//\t\tid or reference to DOM Node to get/set box for\n\t\t// box:\n\t\t//\t\tIf passed, denotes that dojo.contentBox() should\n\t\t//\t\tupdate/set the content box for node. Box is an object in the\n\t\t//\t\tabove format, but only w (width) and h (height) are supported.\n\t\t//\t\tAll properties are optional if passed.\n\t\treturn box ? geom.setContentSize(node, box) : geom.getContentBox(node); // Object\n\t};\n\n\tdojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){\n\t\t// summary:\n\t\t//\t\tDeprecated: Use position() for border-box x/y/w/h\n\t\t//\t\tor marginBox() for margin-box w/h/l/t.\n\t\t//\n\t\t//\t\tReturns an object that measures margin-box (w)idth/(h)eight\n\t\t//\t\tand absolute position x/y of the border-box. Also returned\n\t\t//\t\tis computed (l)eft and (t)op values in pixels from the\n\t\t//\t\tnode's offsetParent as returned from marginBox().\n\t\t//\t\tReturn value will be in the form:\n\t\t//|\t\t\t{ l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }\n\t\t//\t\tDoes not act as a setter. If includeScroll is passed, the x and\n\t\t//\t\ty params are affected as one would expect in dojo.position().\n\t\tdojo.deprecated(\"dojo.coords()\", \"Use dojo.position() or dojo.marginBox().\");\n\t\tnode = dom.byId(node);\n\t\tvar s = style.getComputedStyle(node), mb = geom.getMarginBox(node, s);\n\t\tvar abs = geom.position(node, includeScroll);\n\t\tmb.x = abs.x;\n\t\tmb.y = abs.y;\n\t\treturn mb;\t// Object\n\t};\n\n\t// mix-in dom-prop\n\tdojo.getProp = prop.get;\n\tdojo.setProp = prop.set;\n\n\tdojo.prop = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){\n\t\t// summary:\n\t\t//\t\tGets or sets a property on an HTML element.\n\t\t// description:\n\t\t//\t\tHandles normalized getting and setting of properties on DOM\n\t\t//\t\tNodes. If 2 arguments are passed, and a the second argument is a\n\t\t//\t\tstring, acts as a getter.\n\t\t//\n\t\t//\t\tIf a third argument is passed, or if the second argument is a\n\t\t//\t\tmap of attributes, acts as a setter.\n\t\t//\n\t\t//\t\tWhen passing functions as values, note that they will not be\n\t\t//\t\tdirectly assigned to slots on the node, but rather the default\n\t\t//\t\tbehavior will be removed and the new behavior will be added\n\t\t//\t\tusing `dojo.connect()`, meaning that event handler properties\n\t\t//\t\twill be normalized and that some caveats with regards to\n\t\t//\t\tnon-standard behaviors for onsubmit apply. Namely that you\n\t\t//\t\tshould cancel form submission using `dojo.stopEvent()` on the\n\t\t//\t\tpassed event object instead of returning a boolean value from\n\t\t//\t\tthe handler itself.\n\t\t// node:\n\t\t//\t\tid or reference to the element to get or set the property on\n\t\t// name:\n\t\t//\t\tthe name of the property to get or set.\n\t\t// value:\n\t\t//\t\tThe value to set for the property\n\t\t// returns:\n\t\t//\t\twhen used as a getter, the value of the requested property\n\t\t//\t\tor null if that attribute does not have a specified or\n\t\t//\t\tdefault value;\n\t\t//\n\t\t//\t\twhen used as a setter, the DOM node\n\t\t//\n\t\t// example:\n\t\t//\t|\t// get the current value of the \"foo\" property on a node\n\t\t//\t|\tdojo.prop(dojo.byId(\"nodeId\"), \"foo\");\n\t\t//\t|\t// or we can just pass the id:\n\t\t//\t|\tdojo.prop(\"nodeId\", \"foo\");\n\t\t//\n\t\t// example:\n\t\t//\t|\t// use prop() to set the tab index\n\t\t//\t|\tdojo.prop(\"nodeId\", \"tabIndex\", 3);\n\t\t//\t|\n\t\t//\n\t\t// example:\n\t\t//\tSet multiple values at once, including event handlers:\n\t\t//\t|\tdojo.prop(\"formId\", {\n\t\t//\t|\t\t\"foo\": \"bar\",\n\t\t//\t|\t\t\"tabIndex\": -1,\n\t\t//\t|\t\t\"method\": \"POST\",\n\t\t//\t|\t\t\"onsubmit\": function(e){\n\t\t//\t|\t\t\t// stop submitting the form. Note that the IE behavior\n\t\t//\t|\t\t\t// of returning true or false will have no effect here\n\t\t//\t|\t\t\t// since our handler is connect()ed to the built-in\n\t\t//\t|\t\t\t// onsubmit behavior and so we need to use\n\t\t//\t|\t\t\t// dojo.stopEvent() to ensure that the submission\n\t\t//\t|\t\t\t// doesn't proceed.\n\t\t//\t|\t\t\tdojo.stopEvent(e);\n\t\t//\t|\n\t\t//\t|\t\t\t// submit the form with Ajax\n\t\t//\t|\t\t\tdojo.xhrPost({ form: \"formId\" });\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tStyle is s special case: Only set with an object hash of styles\n\t\t//\t|\tdojo.prop(\"someNode\",{\n\t\t//\t|\t\tid:\"bar\",\n\t\t//\t|\t\tstyle:{\n\t\t//\t|\t\t\twidth:\"200px\", height:\"100px\", color:\"#000\"\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tAgain, only set style as an object hash of styles:\n\t\t//\t|\tvar obj = { color:\"#fff\", backgroundColor:\"#000\" };\n\t\t//\t|\tdojo.prop(\"someNode\", \"style\", obj);\n\t\t//\t|\n\t\t//\t|\t// though shorter to use `dojo.style()` in this case:\n\t\t//\t|\tdojo.style(\"someNode\", obj);\n\n\t\tif(arguments.length == 2){\n\t\t\treturn prop[typeof name == \"string\" ? \"get\" : \"set\"](node, name);\n\t\t}\n\t\t// setter\n\t\treturn prop.set(node, name, value);\n\t};\n\n\t// mix-in dom-style\n\tdojo.getStyle = style.get;\n\tdojo.setStyle = style.set;\n\tdojo.getComputedStyle = style.getComputedStyle;\n\tdojo.__toPixelValue = dojo.toPixelValue = style.toPixelValue;\n\n\tdojo.style = function(node, name, value){\n\t\t// summary:\n\t\t//\t\tAccesses styles on a node. If 2 arguments are\n\t\t//\t\tpassed, acts as a getter. If 3 arguments are passed, acts\n\t\t//\t\tas a setter.\n\t\t// description:\n\t\t//\t\tGetting the style value uses the computed style for the node, so the value\n\t\t//\t\twill be a calculated value, not just the immediate node.style value.\n\t\t//\t\tAlso when getting values, use specific style names,\n\t\t//\t\tlike \"borderBottomWidth\" instead of \"border\" since compound values like\n\t\t//\t\t\"border\" are not necessarily reflected as expected.\n\t\t//\t\tIf you want to get node dimensions, use `dojo.marginBox()`,\n\t\t//\t\t`dojo.contentBox()` or `dojo.position()`.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to node to get/set style for\n\t\t// name: String|Object?\n\t\t//\t\tthe style property to set in DOM-accessor format\n\t\t//\t\t(\"borderWidth\", not \"border-width\") or an object with key/value\n\t\t//\t\tpairs suitable for setting each property.\n\t\t// value: String?\n\t\t//\t\tIf passed, sets value on the node for style, handling\n\t\t//\t\tcross-browser concerns. When setting a pixel value,\n\t\t//\t\tbe sure to include \"px\" in the value. For instance, top: \"200px\".\n\t\t//\t\tOtherwise, in some cases, some browsers will not apply the style.\n\t\t// returns:\n\t\t//\t\twhen used as a getter, return the computed style of the node if passing in an ID or node,\n\t\t//\t\tor return the normalized, computed value for the property when passing in a node and a style property\n\t\t// example:\n\t\t//\t\tPassing only an ID or node returns the computed style object of\n\t\t//\t\tthe node:\n\t\t//\t|\tdojo.style(\"thinger\");\n\t\t// example:\n\t\t//\t\tPassing a node and a style property returns the current\n\t\t//\t\tnormalized, computed value for that property:\n\t\t//\t|\tdojo.style(\"thinger\", \"opacity\"); // 1 by default\n\t\t//\n\t\t// example:\n\t\t//\t\tPassing a node, a style property, and a value changes the\n\t\t//\t\tcurrent display of the node and returns the new computed value\n\t\t//\t|\tdojo.style(\"thinger\", \"opacity\", 0.5); // == 0.5\n\t\t//\n\t\t// example:\n\t\t//\t\tPassing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:\n\t\t//\t|\tdojo.style(\"thinger\", {\n\t\t//\t|\t\t\"opacity\": 0.5,\n\t\t//\t|\t\t\"border\": \"3px solid black\",\n\t\t//\t|\t\t\"height\": \"300px\"\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tWhen the CSS style property is hyphenated, the JavaScript property is camelCased.\n\t\t//\t\tfont-size becomes fontSize, and so on.\n\t\t//\t|\tdojo.style(\"thinger\",{\n\t\t//\t|\t\tfontSize:\"14pt\",\n\t\t//\t|\t\tletterSpacing:\"1.2em\"\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tdojo/NodeList implements .style() using the same syntax, omitting the \"node\" parameter, calling\n\t\t//\t\tdojo.style() on every element of the list. See: `dojo/query` and `dojo/NodeList`\n\t\t//\t|\tdojo.query(\".someClassName\").style(\"visibility\",\"hidden\");\n\t\t//\t|\t// or\n\t\t//\t|\tdojo.query(\"#baz > div\").style({\n\t\t//\t|\t\topacity:0.75,\n\t\t//\t|\t\tfontSize:\"13pt\"\n\t\t//\t|\t});\n\n\t\tswitch(arguments.length){\n\t\t\tcase 1:\n\t\t\t\treturn style.get(node);\n\t\t\tcase 2:\n\t\t\t\treturn style[typeof name == \"string\" ? \"get\" : \"set\"](node, name);\n\t\t}\n\t\t// setter\n\t\treturn style.set(node, name, value);\n\t};\n\n\treturn dojo;\n});\n","define([\"./kernel\", \"../json\"], function(dojo, json){\n\n// module:\n//\t\tdojo/_base/json\n\n/*=====\nreturn {\n\t// summary:\n\t//\t\tThis module defines the dojo JSON API.\n};\n=====*/\n\ndojo.fromJson = function(/*String*/ js){\n\t// summary:\n\t//\t\tParses a JavaScript expression and returns a JavaScript value.\n\t// description:\n\t//\t\tThrows for invalid JavaScript expressions. It does not use a strict JSON parser. It\n\t//\t\talways delegates to eval(). The content passed to this method must therefore come\n\t//\t\tfrom a trusted source.\n\t//\t\tIt is recommend that you use dojo/json's parse function for an\n\t//\t\timplementation uses the (faster) native JSON parse when available.\n\t// js:\n\t//\t\ta string literal of a JavaScript expression, for instance:\n\t//\t\t`'{ \"foo\": [ \"bar\", 1, { \"baz\": \"thud\" } ] }'`\n\n\treturn eval(\"(\" + js + \")\"); // Object\n};\n\n/*=====\ndojo._escapeString = function(){\n\t// summary:\n\t//\t\tAdds escape sequences for non-visual characters, double quote and\n\t//\t\tbackslash and surrounds with double quotes to form a valid string\n\t//\t\tliteral.\n};\n=====*/\ndojo._escapeString = json.stringify; // just delegate to json.stringify\n\ndojo.toJsonIndentStr = \"\\t\";\ndojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint){\n\t// summary:\n\t//\t\tReturns a [JSON](http://json.org) serialization of an object.\n\t// description:\n\t//\t\tReturns a [JSON](http://json.org) serialization of an object.\n\t//\t\tNote that this doesn't check for infinite recursion, so don't do that!\n\t//\t\tIt is recommend that you use dojo/json's stringify function for an lighter\n\t//\t\tand faster implementation that matches the native JSON API and uses the\n\t//\t\tnative JSON serializer when available.\n\t// it:\n\t//\t\tan object to be serialized. Objects may define their own\n\t//\t\tserialization via a special \"__json__\" or \"json\" function\n\t//\t\tproperty. If a specialized serializer has been defined, it will\n\t//\t\tbe used as a fallback.\n\t//\t\tNote that in 1.6, toJson would serialize undefined, but this no longer supported\n\t//\t\tsince it is not supported by native JSON serializer.\n\t// prettyPrint:\n\t//\t\tif true, we indent objects and arrays to make the output prettier.\n\t//\t\tThe variable `dojo.toJsonIndentStr` is used as the indent string --\n\t//\t\tto use something other than the default (tab), change that variable\n\t//\t\tbefore calling dojo.toJson().\n\t//\t\tNote that if native JSON support is available, it will be used for serialization,\n\t//\t\tand native implementations vary on the exact spacing used in pretty printing.\n\t// returns:\n\t//\t\tA JSON string serialization of the passed-in object.\n\t// example:\n\t//\t\tsimple serialization of a trivial object\n\t//\t\t|\tvar jsonStr = dojo.toJson({ howdy: \"stranger!\", isStrange: true });\n\t//\t\t|\tdoh.is('{\"howdy\":\"stranger!\",\"isStrange\":true}', jsonStr);\n\t// example:\n\t//\t\ta custom serializer for an objects of a particular class:\n\t//\t\t|\tdojo.declare(\"Furby\", null, {\n\t//\t\t|\t\tfurbies: \"are strange\",\n\t//\t\t|\t\tfurbyCount: 10,\n\t//\t\t|\t\t__json__: function(){\n\t//\t\t|\t\t},\n\t//\t\t|\t});\n\n\t// use dojo/json\n\treturn json.stringify(it, function(key, value){\n\t\tif(value){\n\t\t\tvar tf = value.__json__||value.json;\n\t\t\tif(typeof tf == \"function\"){\n\t\t\t\treturn tf.call(value);\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}, prettyPrint && dojo.toJsonIndentStr);\t// String\n};\n\nreturn dojo;\n});\n","define([\"../global\", \"../has\", \"./config\", \"require\", \"module\"], function(global, has, config, require, module){\n\t// module:\n\t//\t\tdojo/_base/kernel\n\n\t// This module is the foundational module of the dojo boot sequence; it defines the dojo object.\n\n\tvar\n\t\t// loop variables for this module\n\t\ti, p,\n\n\t\t// create dojo, dijit, and dojox\n\t\t// FIXME: in 2.0 remove dijit, dojox being created by dojo\n\t\tdijit = {},\n\t\tdojox = {},\n\t\tdojo = {\n\t\t\t// summary:\n\t\t\t//\t\tThis module is the foundational module of the dojo boot sequence; it defines the dojo object.\n\n\t\t\t// notice dojo takes ownership of the value of the config module\n\t\t\tconfig:config,\n\t\t\tglobal:global,\n\t\t\tdijit:dijit,\n\t\t\tdojox:dojox\n\t\t};\n\n\n\t// Configure the scope map. For a 100% AMD application, the scope map is not needed other than to provide\n\t// a _scopeName property for the dojo, dijit, and dojox root object so those packages can create\n\t// unique names in the global space.\n\t//\n\t// Built, legacy modules use the scope map to allow those modules to be expressed as if dojo, dijit, and dojox,\n\t// where global when in fact they are either global under different names or not global at all. In v1.6-, the\n\t// config variable \"scopeMap\" was used to map names as used within a module to global names. This has been\n\t// subsumed by the AMD map configuration variable which can relocate packages to different names. For backcompat,\n\t// only the \"*\" mapping is supported. See http://livedocs.dojotoolkit.org/developer/design/loader#legacy-cross-domain-mode for details.\n\t//\n\t// The following computations contort the packageMap for this dojo instance into a scopeMap.\n\tvar scopeMap =\n\t\t\t// a map from a name used in a legacy module to the (global variable name, object addressed by that name)\n\t\t\t// always map dojo, dijit, and dojox\n\t\t\t{\n\t\t\t\tdojo:[\"dojo\", dojo],\n\t\t\t\tdijit:[\"dijit\", dijit],\n\t\t\t\tdojox:[\"dojox\", dojox]\n\t\t\t},\n\n\t\tpackageMap =\n\t\t\t// the package map for this dojo instance; note, a foreign loader or no pacakgeMap results in the above default config\n\t\t\t(require.map && require.map[module.id.match(/[^\\/]+/)[0]]),\n\n\t\titem;\n\n\n\t// process all mapped top-level names for this instance of dojo\n\tfor(p in packageMap){\n\t\tif(scopeMap[p]){\n\t\t\t// mapped dojo, dijit, or dojox\n\t\t\tscopeMap[p][0] = packageMap[p];\n\t\t}else{\n\t\t\t// some other top-level name\n\t\t\tscopeMap[p] = [packageMap[p], {}];\n\t\t}\n\t}\n\n\t// publish those names to _scopeName and, optionally, the global namespace\n\tfor(p in scopeMap){\n\t\titem = scopeMap[p];\n\t\titem[1]._scopeName = item[0];\n\t\tif(!config.noGlobals){\n\t\t\tglobal[item[0]] = item[1];\n\t\t}\n\t}\n\tdojo.scopeMap = scopeMap;\n\n\t/*===== dojo.__docParserConfigureScopeMap(scopeMap); =====*/\n\n\t// FIXME: dojo.baseUrl and dojo.config.baseUrl should be deprecated\n\tdojo.baseUrl = dojo.config.baseUrl = require.baseUrl;\n\tdojo.isAsync = !has(\"dojo-loader\") || require.async;\n\tdojo.locale = config.locale;\n\n\tvar rev = \"$Rev:$\".match(/[0-9a-f]{7,}/);\n\tdojo.version = {\n\t\t// summary:\n\t\t//\t\tVersion number of the Dojo Toolkit\n\t\t// description:\n\t\t//\t\tHash about the version, including\n\t\t//\n\t\t//\t\t- major: Integer: Major version. If total version is \"1.2.0beta1\", will be 1\n\t\t//\t\t- minor: Integer: Minor version. If total version is \"1.2.0beta1\", will be 2\n\t\t//\t\t- patch: Integer: Patch version. If total version is \"1.2.0beta1\", will be 0\n\t\t//\t\t- flag: String: Descriptor flag. If total version is \"1.2.0beta1\", will be \"beta1\"\n\t\t//\t\t- revision: Number: The Git rev from which dojo was pulled\n\n\t\tmajor: 1, minor: 17, patch: 3, flag: \"\",\n\t\trevision: rev ? rev[0] : NaN,\n\t\ttoString: function(){\n\t\t\tvar v = dojo.version;\n\t\t\treturn v.major + \".\" + v.minor + \".\" + v.patch + v.flag + \" (\" + v.revision + \")\";\t// String\n\t\t}\n\t};\n\n\t// If has(\"extend-dojo\") is truthy, then as a dojo module is defined it should push it's definitions\n\t// into the dojo object, and conversely. In 2.0, it will likely be unusual to augment another object\n\t// as a result of defining a module. This has feature gives a way to force 2.0 behavior as the code\n\t// is migrated. Absent specific advice otherwise, set extend-dojo to truthy.\n\thas.add(\"extend-dojo\", 1);\n\n\tif(!has(\"csp-restrictions\")){\n\t\t(Function(\"d\", \"d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}\"))(dojo);\n\t}\n\t/*=====\n\tdojo.eval = function(scriptText){\n\t\t// summary:\n\t\t//\t\tA legacy method created for use exclusively by internal Dojo methods. Do not use this method\n\t\t//\t\tdirectly unless you understand its possibly-different implications on the platforms your are targeting.\n\t\t// description:\n\t\t//\t\tMakes an attempt to evaluate scriptText in the global scope. The function works correctly for browsers\n\t\t//\t\tthat support indirect eval.\n\t\t//\n\t\t//\t\tAs usual, IE does not. On IE, the only way to implement global eval is to\n\t\t//\t\tuse execScript. Unfortunately, execScript does not return a value and breaks some current usages of dojo.eval.\n\t\t//\t\tThis implementation uses the technique of executing eval in the scope of a function that is a single scope\n\t\t//\t\tframe below the global scope; thereby coming close to the global scope. Note carefully that\n\t\t//\n\t\t//\t\tdojo.eval(\"var pi = 3.14;\");\n\t\t//\n\t\t//\t\twill define global pi in non-IE environments, but define pi only in a temporary local scope for IE. If you want\n\t\t//\t\tto define a global variable using dojo.eval, write something like\n\t\t//\n\t\t//\t\tdojo.eval(\"window.pi = 3.14;\")\n\t\t// scriptText:\n\t\t//\t\tThe text to evaluation.\n\t\t// returns:\n\t\t//\t\tThe result of the evaluation. Often `undefined`\n\t};\n\t=====*/\n\n\n\tif(has(\"host-rhino\")){\n\t\tdojo.exit = function(exitcode){\n\t\t\tquit(exitcode);\n\t\t};\n\t}else{\n\t\tdojo.exit = function(){\n\t\t};\n\t}\n\n\tif(!has(\"host-webworker\")){\n\t\t// console is immutable in FF30+, https://bugs.dojotoolkit.org/ticket/18100\n\t\thas.add(\"dojo-guarantee-console\",\n\t\t\t// ensure that console.log, console.warn, etc. are defined\n\t\t\t1\n\t\t);\n\t}\n\n\tif(has(\"dojo-guarantee-console\")){\n\t\t// IE 9 bug: https://bugs.dojotoolkit.org/ticket/18197\n\t\thas.add(\"console-as-object\", function () {\n\t\t\treturn Function.prototype.bind && console && typeof console.log === \"object\";\n\t\t});\n\n\t\ttypeof console != \"undefined\" || (console = {}); // intentional assignment\n\t\t//\tBe careful to leave 'log' always at the end\n\t\tvar cn = [\n\t\t\t\"assert\", \"count\", \"debug\", \"dir\", \"dirxml\", \"error\", \"group\",\n\t\t\t\"groupEnd\", \"info\", \"profile\", \"profileEnd\", \"time\", \"timeEnd\",\n\t\t\t\"trace\", \"warn\", \"log\"\n\t\t];\n\t\tvar tn;\n\t\ti = 0;\n\t\twhile((tn = cn[i++])){\n\t\t\tif(!console[tn]){\n\t\t\t\t(function(){\n\t\t\t\t\tvar tcn = tn + \"\";\n\t\t\t\t\tconsole[tcn] = ('log' in console) ? function(){\n\t\t\t\t\t\tvar a = Array.prototype.slice.call(arguments);\n\t\t\t\t\t\ta.unshift(tcn + \":\");\n\t\t\t\t\t\tconsole[\"log\"](a.join(\" \"));\n\t\t\t\t\t} : function(){};\n\t\t\t\t\tconsole[tcn]._fake = true;\n\t\t\t\t})();\n\t\t\t}else if(has(\"console-as-object\")){\n\t\t\t\tconsole[tn] = Function.prototype.bind.call(console[tn], console);\n\t\t\t}\n\t\t}\n\t}\n\n\thas.add(\"dojo-debug-messages\",\n\t\t// include dojo.deprecated/dojo.experimental implementations\n\t\t!!config.isDebug\n\t);\n\tdojo.deprecated = dojo.experimental = function(){};\n\tif(has(\"dojo-debug-messages\")){\n\t\tdojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){\n\t\t\t// summary:\n\t\t\t//\t\tLog a debug message to indicate that a behavior has been\n\t\t\t//\t\tdeprecated.\n\t\t\t// behaviour: String\n\t\t\t//\t\tThe API or behavior being deprecated. Usually in the form\n\t\t\t//\t\tof \"myApp.someFunction()\".\n\t\t\t// extra: String?\n\t\t\t//\t\tText to append to the message. Often provides advice on a\n\t\t\t//\t\tnew function or facility to achieve the same goal during\n\t\t\t//\t\tthe deprecation period.\n\t\t\t// removal: String?\n\t\t\t//\t\tText to indicate when in the future the behavior will be\n\t\t\t//\t\tremoved. Usually a version number.\n\t\t\t// example:\n\t\t\t//\t| dojo.deprecated(\"myApp.getTemp()\", \"use myApp.getLocaleTemp() instead\", \"1.0\");\n\n\t\t\tvar message = \"DEPRECATED: \" + behaviour;\n\t\t\tif(extra){ message += \" \" + extra; }\n\t\t\tif(removal){ message += \" -- will be removed in version: \" + removal; }\n\t\t\tconsole.warn(message);\n\t\t};\n\n\t\tdojo.experimental = function(/* String */ moduleName, /* String? */ extra){\n\t\t\t// summary:\n\t\t\t//\t\tMarks code as experimental.\n\t\t\t// description:\n\t\t\t//\t\tThis can be used to mark a function, file, or module as\n\t\t\t//\t\texperimental.\t Experimental code is not ready to be used, and the\n\t\t\t//\t\tAPIs are subject to change without notice.\tExperimental code may be\n\t\t\t//\t\tcompleted deleted without going through the normal deprecation\n\t\t\t//\t\tprocess.\n\t\t\t// moduleName: String\n\t\t\t//\t\tThe name of a module, or the name of a module file or a specific\n\t\t\t//\t\tfunction\n\t\t\t// extra: String?\n\t\t\t//\t\tsome additional message for the user\n\t\t\t// example:\n\t\t\t//\t| dojo.experimental(\"dojo.data.Result\");\n\t\t\t// example:\n\t\t\t//\t| dojo.experimental(\"dojo.weather.toKelvin()\", \"PENDING approval from NOAA\");\n\n\t\t\tvar message = \"EXPERIMENTAL: \" + moduleName + \" -- APIs subject to change without notice.\";\n\t\t\tif(extra){ message += \" \" + extra; }\n\t\t\tconsole.warn(message);\n\t\t};\n\t}\n\n\thas.add(\"dojo-modulePaths\",\n\t\t// consume dojo.modulePaths processing\n\t\t1\n\t);\n\tif(has(\"dojo-modulePaths\")){\n\t\t// notice that modulePaths won't be applied to any require's before the dojo/_base/kernel factory is run;\n\t\t// this is the v1.6- behavior.\n\t\tif(config.modulePaths){\n\t\t\tdojo.deprecated(\"dojo.modulePaths\", \"use paths configuration\");\n\t\t\tvar paths = {};\n\t\t\tfor(p in config.modulePaths){\n\t\t\t\tpaths[p.replace(/\\./g, \"/\")] = config.modulePaths[p];\n\t\t\t}\n\t\t\trequire({paths:paths});\n\t\t}\n\t}\n\n\thas.add(\"dojo-moduleUrl\",\n\t\t// include dojo.moduleUrl\n\t\t1\n\t);\n\tif(has(\"dojo-moduleUrl\")){\n\t\tdojo.moduleUrl = function(/*String*/module, /*String?*/url){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a URL relative to a module.\n\t\t\t// example:\n\t\t\t//\t|\tvar pngPath = dojo.moduleUrl(\"acme\",\"images/small.png\");\n\t\t\t//\t|\tconsole.dir(pngPath); // list the object properties\n\t\t\t//\t|\t// create an image and set it's source to pngPath's value:\n\t\t\t//\t|\tvar img = document.createElement(\"img\");\n\t\t\t//\t|\timg.src = pngPath;\n\t\t\t//\t|\t// add our image to the document\n\t\t\t//\t|\tdojo.body().appendChild(img);\n\t\t\t// example:\n\t\t\t//\t\tyou may de-reference as far as you like down the package\n\t\t\t//\t\thierarchy. This is sometimes handy to avoid lengthy relative\n\t\t\t//\t\turls or for building portable sub-packages. In this example,\n\t\t\t//\t\tthe `acme.widget` and `acme.util` directories may be located\n\t\t\t//\t\tunder different roots (see `dojo.registerModulePath`) but the\n\t\t\t//\t\tthe modules which reference them can be unaware of their\n\t\t\t//\t\trelative locations on the filesystem:\n\t\t\t//\t|\t// somewhere in a configuration block\n\t\t\t//\t|\tdojo.registerModulePath(\"acme.widget\", \"../../acme/widget\");\n\t\t\t//\t|\tdojo.registerModulePath(\"acme.util\", \"../../util\");\n\t\t\t//\t|\n\t\t\t//\t|\t// ...\n\t\t\t//\t|\n\t\t\t//\t|\t// code in a module using acme resources\n\t\t\t//\t|\tvar tmpltPath = dojo.moduleUrl(\"acme.widget\",\"templates/template.html\");\n\t\t\t//\t|\tvar dataPath = dojo.moduleUrl(\"acme.util\",\"resources/data.json\");\n\n\t\t\tdojo.deprecated(\"dojo.moduleUrl()\", \"use require.toUrl\", \"2.0\");\n\n\t\t\t// require.toUrl requires a filetype; therefore, just append the suffix \"/*.*\" to guarantee a filetype, then\n\t\t\t// remove the suffix from the result. This way clients can request a url w/out a filetype. This should be\n\t\t\t// rare, but it maintains backcompat for the v1.x line (note: dojo.moduleUrl will be removed in v2.0).\n\t\t\t// Notice * is an illegal filename so it won't conflict with any real path map that may exist the paths config.\n\t\t\tvar result = null;\n\t\t\tif(module){\n\t\t\t\tresult = require.toUrl(module.replace(/\\./g, \"/\") + (url ? (\"/\" + url) : \"\") + \"/*.*\").replace(/\\/\\*\\.\\*/, \"\") + (url ? \"\" : \"/\");\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n\n\tdojo._hasResource = {}; // for backward compatibility with layers built with 1.6 tooling\n\n\treturn dojo;\n});\n","define([\"./kernel\", \"../has\", \"../sniff\"], function(dojo, has){\n\t// module:\n\t//\t\tdojo/_base/lang\n\n\thas.add(\"bug-for-in-skips-shadowed\", function(){\n\t\t// if true, the for-in iterator skips object properties that exist in Object's prototype (IE 6 - ?)\n\t\tfor(var i in {toString: 1}){\n\t\t\treturn 0;\n\t\t}\n\t\treturn 1;\n\t});\n\n\t// Helper methods\n\tvar _extraNames =\n\t\t\thas(\"bug-for-in-skips-shadowed\") ?\n\t\t\t\t\"hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor\".split(\".\") : [],\n\n\t\t_extraLen = _extraNames.length,\n\n\t\tgetProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){\n\t\t\tif(!context){\n\t\t\t\tif(parts[0] && dojo.scopeMap[parts[0]]) {\n\t\t\t\t\t// Voodoo code from the old days where \"dojo\" or \"dijit\" maps to some special object\n\t\t\t\t\t// rather than just window.dojo\n\t\t\t\t\tcontext = dojo.scopeMap[parts.shift()][1];\n\t\t\t\t}else{\n\t\t\t\t\tcontext = dojo.global;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry{\n\t\t\t\tfor(var i = 0; i < parts.length; i++){\n\t\t\t\t\tvar p = parts[i];\n\t\t\t\t\t// Fix for prototype pollution CVE-2021-23450\n\t\t\t\t\tif (p === '__proto__' || p === 'constructor') {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif(!(p in context)){\n\t\t\t\t\t\tif(create){\n\t\t\t\t\t\t\tcontext[p] = {};\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\treturn;\t\t// return undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontext = context[p];\n\t\t\t\t}\n\t\t\t\treturn context; // mixed\n\t\t\t}catch(e){\n\t\t\t\t// \"p in context\" throws an exception when context is a number, boolean, etc. rather than an object,\n\t\t\t\t// so in that corner case just return undefined (by having no return statement)\n\t\t\t}\n\t\t},\n\n\t\topts = Object.prototype.toString,\n\n\t\tefficient = function(obj, offset, startWith){\n\t\t\treturn (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));\n\t\t},\n\n\t\t_pattern = /\\{([^\\}]+)\\}/g;\n\n\t// Module export\n\tvar lang = {\n\t\t// summary:\n\t\t//\t\tThis module defines Javascript language extensions.\n\n\t\t// _extraNames: String[]\n\t\t//\t\tLists property names that must be explicitly processed during for-in iteration\n\t\t//\t\tin environments that have has(\"bug-for-in-skips-shadowed\") true.\n\t\t_extraNames:_extraNames,\n\n\t\t_mixin: function(dest, source, copyFunc){\n\t\t\t// summary:\n\t\t\t//\t\tCopies/adds all properties of source to dest; returns dest.\n\t\t\t// dest: Object\n\t\t\t//\t\tThe object to which to copy/add all properties contained in source.\n\t\t\t// source: Object\n\t\t\t//\t\tThe object from which to draw all properties to copy into dest.\n\t\t\t// copyFunc: Function?\n\t\t\t//\t\tThe process used to copy/add a property in source; defaults to the Javascript assignment operator.\n\t\t\t// returns:\n\t\t\t//\t\tdest, as modified\n\t\t\t// description:\n\t\t\t//\t\tAll properties, including functions (sometimes termed \"methods\"), excluding any non-standard extensions\n\t\t\t//\t\tfound in Object.prototype, are copied/added to dest. Copying/adding each particular property is\n\t\t\t//\t\tdelegated to copyFunc (if any); copyFunc defaults to the Javascript assignment operator if not provided.\n\t\t\t//\t\tNotice that by default, _mixin executes a so-called \"shallow copy\" and aggregate types are copied/added by reference.\n\t\t\tvar name, s, i, empty = {};\n\t\t\tfor(name in source){\n\t\t\t\t// the (!(name in empty) || empty[name] !== s) condition avoids copying properties in \"source\"\n\t\t\t\t// inherited from Object.prototype.\t For example, if dest has a custom toString() method,\n\t\t\t\t// don't overwrite it with the toString() method that source inherited from Object.prototype\n\t\t\t\ts = source[name];\n\t\t\t\tif(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){\n\t\t\t\t\tdest[name] = copyFunc ? copyFunc(s) : s;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(has(\"bug-for-in-skips-shadowed\")){\n\t\t\t\tif(source){\n\t\t\t\t\tfor(i = 0; i < _extraLen; ++i){\n\t\t\t\t\t\tname = _extraNames[i];\n\t\t\t\t\t\ts = source[name];\n\t\t\t\t\t\tif(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){\n\t\t\t\t\t\t\tdest[name] = copyFunc ? copyFunc(s) : s;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn dest; // Object\n\t\t},\n\n\t\tmixin: function(dest, sources){\n\t\t\t// summary:\n\t\t\t//\t\tCopies/adds all properties of one or more sources to dest; returns dest.\n\t\t\t// dest: Object\n\t\t\t//\t\tThe object to which to copy/add all properties contained in source. If dest is falsy, then\n\t\t\t//\t\ta new object is manufactured before copying/adding properties begins.\n\t\t\t// sources: Object...\n\t\t\t//\t\tOne of more objects from which to draw all properties to copy into dest. sources are processed\n\t\t\t//\t\tleft-to-right and if more than one of these objects contain the same property name, the right-most\n\t\t\t//\t\tvalue \"wins\".\n\t\t\t// returns: Object\n\t\t\t//\t\tdest, as modified\n\t\t\t// description:\n\t\t\t//\t\tAll properties, including functions (sometimes termed \"methods\"), excluding any non-standard extensions\n\t\t\t//\t\tfound in Object.prototype, are copied/added from sources to dest. sources are processed left to right.\n\t\t\t//\t\tThe Javascript assignment operator is used to copy/add each property; therefore, by default, mixin\n\t\t\t//\t\texecutes a so-called \"shallow copy\" and aggregate types are copied/added by reference.\n\t\t\t// example:\n\t\t\t//\t\tmake a shallow copy of an object\n\t\t\t//\t|\tvar copy = lang.mixin({}, source);\n\t\t\t// example:\n\t\t\t//\t\tmany class constructors often take an object which specifies\n\t\t\t//\t\tvalues to be configured on the object. In this case, it is\n\t\t\t//\t\toften simplest to call `lang.mixin` on the `this` object:\n\t\t\t//\t|\tdeclare(\"acme.Base\", null, {\n\t\t\t//\t|\t\tconstructor: function(properties){\n\t\t\t//\t|\t\t\t// property configuration:\n\t\t\t//\t|\t\t\tlang.mixin(this, properties);\n\t\t\t//\t|\n\t\t\t//\t|\t\t\tconsole.log(this.quip);\n\t\t\t//\t|\t\t\t//\t...\n\t\t\t//\t|\t\t},\n\t\t\t//\t|\t\tquip: \"I wasn't born yesterday, you know - I've seen movies.\",\n\t\t\t//\t|\t\t// ...\n\t\t\t//\t|\t});\n\t\t\t//\t|\n\t\t\t//\t|\t// create an instance of the class and configure it\n\t\t\t//\t|\tvar b = new acme.Base({quip: \"That's what it does!\" });\n\t\t\t// example:\n\t\t\t//\t\tcopy in properties from multiple objects\n\t\t\t//\t|\tvar flattened = lang.mixin(\n\t\t\t//\t|\t\t{\n\t\t\t//\t|\t\t\tname: \"Frylock\",\n\t\t\t//\t|\t\t\tbraces: true\n\t\t\t//\t|\t\t},\n\t\t\t//\t|\t\t{\n\t\t\t//\t|\t\t\tname: \"Carl Brutanananadilewski\"\n\t\t\t//\t|\t\t}\n\t\t\t//\t|\t);\n\t\t\t//\t|\n\t\t\t//\t|\t// will print \"Carl Brutanananadilewski\"\n\t\t\t//\t|\tconsole.log(flattened.name);\n\t\t\t//\t|\t// will print \"true\"\n\t\t\t//\t|\tconsole.log(flattened.braces);\n\n\t\t\tif(!dest){ dest = {}; }\n\t\t\tfor(var i = 1, l = arguments.length; i < l; i++){\n\t\t\t\tlang._mixin(dest, arguments[i]);\n\t\t\t}\n\t\t\treturn dest; // Object\n\t\t},\n\n\t\tsetObject: function(name, value, context){\n\t\t\t// summary:\n\t\t\t//\t\tSet a property from a dot-separated string, such as \"A.B.C\"\n\t\t\t// description:\n\t\t\t//\t\tUseful for longer api chains where you have to test each object in\n\t\t\t//\t\tthe chain, or when you have an object reference in string format.\n\t\t\t//\t\tObjects are created as needed along `path`. Returns the passed\n\t\t\t//\t\tvalue if setting is successful or `undefined` if not.\n\t\t\t// name: String\n\t\t\t//\t\tPath to a property, in the form \"A.B.C\".\n\t\t\t// value: anything\n\t\t\t//\t\tvalue or object to place at location given by name\n\t\t\t// context: Object?\n\t\t\t//\t\tOptional. Object to use as root of path. Defaults to\n\t\t\t//\t\t`dojo.global`.\n\t\t\t// example:\n\t\t\t//\t\tset the value of `foo.bar.baz`, regardless of whether\n\t\t\t//\t\tintermediate objects already exist:\n\t\t\t//\t| lang.setObject(\"foo.bar.baz\", value);\n\t\t\t// example:\n\t\t\t//\t\twithout `lang.setObject`, we often see code like this:\n\t\t\t//\t| // ensure that intermediate objects are available\n\t\t\t//\t| if(!obj[\"parent\"]){ obj.parent = {}; }\n\t\t\t//\t| if(!obj.parent[\"child\"]){ obj.parent.child = {}; }\n\t\t\t//\t| // now we can safely set the property\n\t\t\t//\t| obj.parent.child.prop = \"some value\";\n\t\t\t//\t\twhereas with `lang.setObject`, we can shorten that to:\n\t\t\t//\t| lang.setObject(\"parent.child.prop\", \"some value\", obj);\n\n\t\t\tvar parts = name.split(\".\"), p = parts.pop(), obj = getProp(parts, true, context);\n\t\t\treturn obj && p ? (obj[p] = value) : undefined; // Object\n\t\t},\n\n\t\tgetObject: function(name, create, context){\n\t\t\t// summary:\n\t\t\t//\t\tGet a property from a dot-separated string, such as \"A.B.C\"\n\t\t\t// description:\n\t\t\t//\t\tUseful for longer api chains where you have to test each object in\n\t\t\t//\t\tthe chain, or when you have an object reference in string format.\n\t\t\t// name: String\n\t\t\t//\t\tPath to an property, in the form \"A.B.C\".\n\t\t\t// create: Boolean?\n\t\t\t//\t\tOptional. Defaults to `false`. If `true`, Objects will be\n\t\t\t//\t\tcreated at any point along the 'path' that is undefined.\n\t\t\t// context: Object?\n\t\t\t//\t\tOptional. Object to use as root of path. Defaults to\n\t\t\t//\t\t'dojo.global'. Null may be passed.\n\t\t\treturn !name ? context : getProp(name.split(\".\"), create, context); // Object\n\t\t},\n\n\t\texists: function(name, obj){\n\t\t\t// summary:\n\t\t\t//\t\tdetermine if an object supports a given method\n\t\t\t// description:\n\t\t\t//\t\tuseful for longer api chains where you have to test each object in\n\t\t\t//\t\tthe chain. Useful for object and method detection.\n\t\t\t// name: String\n\t\t\t//\t\tPath to an object, in the form \"A.B.C\".\n\t\t\t// obj: Object?\n\t\t\t//\t\tObject to use as root of path. Defaults to\n\t\t\t//\t\t'dojo.global'. Null may be passed.\n\t\t\t// example:\n\t\t\t//\t| // define an object\n\t\t\t//\t| var foo = {\n\t\t\t//\t|\t\tbar: { }\n\t\t\t//\t| };\n\t\t\t//\t|\n\t\t\t//\t| // search the global scope\n\t\t\t//\t| lang.exists(\"foo.bar\"); // true\n\t\t\t//\t| lang.exists(\"foo.bar.baz\"); // false\n\t\t\t//\t|\n\t\t\t//\t| // search from a particular scope\n\t\t\t//\t| lang.exists(\"bar\", foo); // true\n\t\t\t//\t| lang.exists(\"bar.baz\", foo); // false\n\t\t\treturn lang.getObject(name, false, obj) !== undefined; // Boolean\n\t\t},\n\n\t\t// Crockford (ish) functions\n\n\t\tisString: function(it){\n\t\t\t// summary:\n\t\t\t//\t\tReturn true if it is a String\n\t\t\t// it: anything\n\t\t\t//\t\tItem to test.\n\t\t\treturn (typeof it == \"string\" || it instanceof String); // Boolean\n\t\t},\n\n\t\tisArray: Array.isArray || function(it){\n\t\t\t// summary:\n\t\t\t//\t\tReturn true if it is an Array.\n\t\t\t// it: anything\n\t\t\t//\t\tItem to test.\n\t\t\treturn opts.call(it) == \"[object Array]\"; // Boolean\n\t\t},\n\n\t\tisFunction: function(it){\n\t\t\t// summary:\n\t\t\t//\t\tReturn true if it is a Function\n\t\t\t// it: anything\n\t\t\t//\t\tItem to test.\n\t\t\treturn opts.call(it) === \"[object Function]\";\n\t\t},\n\n\t\tisObject: function(it){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if it is a JavaScript object (or an Array, a Function\n\t\t\t//\t\tor null)\n\t\t\t// it: anything\n\t\t\t//\t\tItem to test.\n\t\t\treturn it !== undefined &&\n\t\t\t\t(it === null || typeof it == \"object\" || lang.isArray(it) || lang.isFunction(it)); // Boolean\n\t\t},\n\n\t\tisArrayLike: function(it){\n\t\t\t// summary:\n\t\t\t//\t\tsimilar to isArray() but more permissive\n\t\t\t// it: anything\n\t\t\t//\t\tItem to test.\n\t\t\t// returns:\n\t\t\t//\t\tIf it walks like a duck and quacks like a duck, return `true`\n\t\t\t// description:\n\t\t\t//\t\tDoesn't strongly test for \"arrayness\". Instead, settles for \"isn't\n\t\t\t//\t\ta string or number and has a length property\". Arguments objects\n\t\t\t//\t\tand DOM collections will return true when passed to\n\t\t\t//\t\tisArrayLike(), but will return false when passed to\n\t\t\t//\t\tisArray().\n\t\t\treturn !!it && // Boolean\n\t\t\t\t// keep out built-in constructors (Number, String, ...) which have length\n\t\t\t\t// properties\n\t\t\t\t!lang.isString(it) && !lang.isFunction(it) &&\n\t\t\t\t!(it.tagName && it.tagName.toLowerCase() == 'form') &&\n\t\t\t\t(lang.isArray(it) || isFinite(it.length));\n\t\t},\n\n\t\tisAlien: function(it){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if it is a built-in function or some other kind of\n\t\t\t//\t\toddball that *should* report as a function but doesn't\n\t\t\treturn it && !lang.isFunction(it) && /\\{\\s*\\[native code\\]\\s*\\}/.test(String(it)); // Boolean\n\t\t},\n\n\t\textend: function(ctor, props){\n\t\t\t// summary:\n\t\t\t//\t\tAdds all properties and methods of props to constructor's\n\t\t\t//\t\tprototype, making them available to all instances created with\n\t\t\t//\t\tconstructor.\n\t\t\t// ctor: Object\n\t\t\t//\t\tTarget constructor to extend.\n\t\t\t// props: Object\n\t\t\t//\t\tOne or more objects to mix into ctor.prototype\n\t\t\tfor(var i=1, l=arguments.length; i<l; i++){\n\t\t\t\tlang._mixin(ctor.prototype, arguments[i]);\n\t\t\t}\n\t\t\treturn ctor; // Object\n\t\t},\n\n\t\t_hitchArgs: function(scope, method){\n\t\t\tvar pre = lang._toArray(arguments, 2);\n\t\t\tvar named = lang.isString(method);\n\t\t\treturn function(){\n\t\t\t\t// arrayify arguments\n\t\t\t\tvar args = lang._toArray(arguments);\n\t\t\t\t// locate our method\n\t\t\t\tvar f = named ? (scope||dojo.global)[method] : method;\n\t\t\t\t// invoke with collected args\n\t\t\t\treturn f && f.apply(scope || this, pre.concat(args)); // mixed\n\t\t\t}; // Function\n\t\t},\n\n\t\thitch: function(scope, method){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a function that will only ever execute in the given scope.\n\t\t\t//\t\tThis allows for easy use of object member functions\n\t\t\t//\t\tin callbacks and other places in which the \"this\" keyword may\n\t\t\t//\t\totherwise not reference the expected scope.\n\t\t\t//\t\tAny number of default positional arguments may be passed as parameters\n\t\t\t//\t\tbeyond \"method\".\n\t\t\t//\t\tEach of these values will be used to \"placehold\" (similar to curry)\n\t\t\t//\t\tfor the hitched function.\n\t\t\t// scope: Object\n\t\t\t//\t\tThe scope to use when method executes. If method is a string,\n\t\t\t//\t\tscope is also the object containing method.\n\t\t\t// method: Function|String...\n\t\t\t//\t\tA function to be hitched to scope, or the name of the method in\n\t\t\t//\t\tscope to be hitched.\n\t\t\t// example:\n\t\t\t//\t|\tlang.hitch(foo, \"bar\")();\n\t\t\t//\t\truns foo.bar() in the scope of foo\n\t\t\t// example:\n\t\t\t//\t|\tlang.hitch(foo, myFunction);\n\t\t\t//\t\treturns a function that runs myFunction in the scope of foo\n\t\t\t// example:\n\t\t\t//\t\tExpansion on the default positional arguments passed along from\n\t\t\t//\t\thitch. Passed args are mixed first, additional args after.\n\t\t\t//\t|\tvar foo = { bar: function(a, b, c){ console.log(a, b, c); } };\n\t\t\t//\t|\tvar fn = lang.hitch(foo, \"bar\", 1, 2);\n\t\t\t//\t|\tfn(3); // logs \"1, 2, 3\"\n\t\t\t// example:\n\t\t\t//\t|\tvar foo = { bar: 2 };\n\t\t\t//\t|\tlang.hitch(foo, function(){ this.bar = 10; })();\n\t\t\t//\t\texecute an anonymous function in scope of foo\n\t\t\tif(arguments.length > 2){\n\t\t\t\treturn lang._hitchArgs.apply(dojo, arguments); // Function\n\t\t\t}\n\t\t\tif(!method){\n\t\t\t\tmethod = scope;\n\t\t\t\tscope = null;\n\t\t\t}\n\t\t\tif(lang.isString(method)){\n\t\t\t\tscope = scope || dojo.global;\n\t\t\t\tif(!scope[method]){ throw(['lang.hitch: scope[\"', method, '\"] is null (scope=\"', scope, '\")'].join('')); }\n\t\t\t\treturn function(){ return scope[method].apply(scope, arguments || []); }; // Function\n\t\t\t}\n\t\t\treturn !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function\n\t\t},\n\n\t\tdelegate: (function(){\n\t\t\t// boodman/crockford delegation w/ cornford optimization\n\t\t\tfunction TMP(){}\n\t\t\treturn function(obj, props){\n\t\t\t\tTMP.prototype = obj;\n\t\t\t\tvar tmp = new TMP();\n\t\t\t\tTMP.prototype = null;\n\t\t\t\tif(props){\n\t\t\t\t\tlang._mixin(tmp, props);\n\t\t\t\t}\n\t\t\t\treturn tmp; // Object\n\t\t\t};\n\t\t})(),\n\t\t/*=====\n\t\tdelegate: function(obj, props){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new object which \"looks\" to obj for properties which it\n\t\t\t//\t\tdoes not have a value for. Optionally takes a bag of properties to\n\t\t\t//\t\tseed the returned object with initially.\n\t\t\t// description:\n\t\t\t//\t\tThis is a small implementation of the Boodman/Crockford delegation\n\t\t\t//\t\tpattern in JavaScript. An intermediate object constructor mediates\n\t\t\t//\t\tthe prototype chain for the returned object, using it to delegate\n\t\t\t//\t\tdown to obj for property lookup when object-local lookup fails.\n\t\t\t//\t\tThis can be thought of similarly to ES4's \"wrap\", save that it does\n\t\t\t//\t\tnot act on types but rather on pure objects.\n\t\t\t// obj: Object\n\t\t\t//\t\tThe object to delegate to for properties not found directly on the\n\t\t\t//\t\treturn object or in props.\n\t\t\t// props: Object...\n\t\t\t//\t\tan object containing properties to assign to the returned object\n\t\t\t// returns:\n\t\t\t//\t\tan Object of anonymous type\n\t\t\t// example:\n\t\t\t//\t|\tvar foo = { bar: \"baz\" };\n\t\t\t//\t|\tvar thinger = lang.delegate(foo, { thud: \"xyzzy\"});\n\t\t\t//\t|\tthinger.bar == \"baz\"; // delegated to foo\n\t\t\t//\t|\tfoo.thud == undefined; // by definition\n\t\t\t//\t|\tthinger.thud == \"xyzzy\"; // mixed in from props\n\t\t\t//\t|\tfoo.bar = \"thonk\";\n\t\t\t//\t|\tthinger.bar == \"thonk\"; // still delegated to foo's bar\n\t\t},\n\t\t=====*/\n\n\t\t_toArray: has(\"ie\") ?\n\t\t\t(function(){\n\t\t\t\tfunction slow(obj, offset, startWith){\n\t\t\t\t\tvar arr = startWith||[];\n\t\t\t\t\tfor(var x = offset || 0; x < obj.length; x++){\n\t\t\t\t\t\tarr.push(obj[x]);\n\t\t\t\t\t}\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\t\t\t\treturn function(obj){\n\t\t\t\t\treturn ((obj.item) ? slow : efficient).apply(this, arguments);\n\t\t\t\t};\n\t\t\t})() : efficient,\n\t\t/*=====\n\t\t _toArray: function(obj, offset, startWith){\n\t\t\t // summary:\n\t\t\t //\t\tConverts an array-like object (i.e. arguments, DOMCollection) to an\n\t\t\t //\t\tarray. Returns a new Array with the elements of obj.\n\t\t\t // obj: Object\n\t\t\t //\t\tthe object to \"arrayify\". We expect the object to have, at a\n\t\t\t //\t\tminimum, a length property which corresponds to integer-indexed\n\t\t\t //\t\tproperties.\n\t\t\t // offset: Number?\n\t\t\t //\t\tthe location in obj to start iterating from. Defaults to 0.\n\t\t\t //\t\tOptional.\n\t\t\t // startWith: Array?\n\t\t\t //\t\tAn array to pack with the properties of obj. If provided,\n\t\t\t //\t\tproperties in obj are appended at the end of startWith and\n\t\t\t //\t\tstartWith is the returned array.\n\t\t },\n\t\t =====*/\n\n\t\tpartial: function(/*Function|String*/ method /*, ...*/){\n\t\t\t// summary:\n\t\t\t//\t\tsimilar to hitch() except that the scope object is left to be\n\t\t\t//\t\twhatever the execution context eventually becomes.\n\t\t\t// description:\n\t\t\t//\t\tCalling lang.partial is the functional equivalent of calling:\n\t\t\t//\t\t|\tlang.hitch(null, funcName, ...);\n\t\t\t// method:\n\t\t\t//\t\tThe function to \"wrap\"\n\t\t\tvar arr = [ null ];\n\t\t\treturn lang.hitch.apply(dojo, arr.concat(lang._toArray(arguments))); // Function\n\t\t},\n\n\t\tclone: function(/*anything*/ src){\n\t\t\t// summary:\n\t\t\t//\t\tClones objects (including DOM nodes) and all children.\n\t\t\t//\t\tWarning: do not clone cyclic structures.\n\t\t\t// src:\n\t\t\t//\t\tThe object to clone\n\t\t\tif(!src || typeof src != \"object\" || lang.isFunction(src)){\n\t\t\t\t// null, undefined, any non-object, or function\n\t\t\t\treturn src;\t// anything\n\t\t\t}\n\t\t\tif(src.nodeType && \"cloneNode\" in src){\n\t\t\t\t// DOM Node\n\t\t\t\treturn src.cloneNode(true); // Node\n\t\t\t}\n\t\t\tif(src instanceof Date){\n\t\t\t\t// Date\n\t\t\t\treturn new Date(src.getTime());\t// Date\n\t\t\t}\n\t\t\tif(src instanceof RegExp){\n\t\t\t\t// RegExp\n\t\t\t\treturn new RegExp(src); // RegExp\n\t\t\t}\n\t\t\tvar r, i, l;\n\t\t\tif(lang.isArray(src)){\n\t\t\t\t// array\n\t\t\t\tr = [];\n\t\t\t\tfor(i = 0, l = src.length; i < l; ++i){\n\t\t\t\t\tif(i in src){\n\t\t\t\t\t\tr[i] = lang.clone(src[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// we don't clone functions for performance reasons\n\t\t\t\t//\t\t}else if(d.isFunction(src)){\n\t\t\t\t//\t\t\t// function\n\t\t\t\t//\t\t\tr = function(){ return src.apply(this, arguments); };\n\t\t\t}else{\n\t\t\t\t// generic objects\n\t\t\t\tr = src.constructor ? new src.constructor() : {};\n\t\t\t}\n\t\t\treturn lang._mixin(r, src, lang.clone);\n\t\t},\n\n\n\t\ttrim: String.prototype.trim ?\n\t\t\tfunction(str){ return str.trim(); } :\n\t\t\tfunction(str){ return str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, ''); },\n\t\t/*=====\n\t\t trim: function(str){\n\t\t\t // summary:\n\t\t\t //\t\tTrims whitespace from both sides of the string\n\t\t\t // str: String\n\t\t\t //\t\tString to be trimmed\n\t\t\t // returns: String\n\t\t\t //\t\tReturns the trimmed string\n\t\t\t // description:\n\t\t\t //\t\tThis version of trim() was selected for inclusion into the base due\n\t\t\t //\t\tto its compact size and relatively good performance\n\t\t\t //\t\t(see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)\n\t\t\t //\t\tUses String.prototype.trim instead, if available.\n\t\t\t //\t\tThe fastest but longest version of this function is located at\n\t\t\t //\t\tlang.string.trim()\n\t\t },\n\t\t =====*/\n\n\t\treplace: function(tmpl, map, pattern){\n\t\t\t// summary:\n\t\t\t//\t\tPerforms parameterized substitutions on a string. Throws an\n\t\t\t//\t\texception if any parameter is unmatched.\n\t\t\t// tmpl: String\n\t\t\t//\t\tString to be used as a template.\n\t\t\t// map: Object|Function\n\t\t\t//\t\tIf an object, it is used as a dictionary to look up substitutions.\n\t\t\t//\t\tIf a function, it is called for every substitution with following parameters:\n\t\t\t//\t\ta whole match, a name, an offset, and the whole template\n\t\t\t//\t\tstring (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace\n\t\t\t//\t\tfor more details).\n\t\t\t// pattern: RegEx?\n\t\t\t//\t\tOptional regular expression objects that overrides the default pattern.\n\t\t\t//\t\tMust be global and match one item. The default is: /\\{([^\\}]+)\\}/g,\n\t\t\t//\t\twhich matches patterns like that: \"{xxx}\", where \"xxx\" is any sequence\n\t\t\t//\t\tof characters, which doesn't include \"}\".\n\t\t\t// returns: String\n\t\t\t//\t\tReturns the substituted string.\n\t\t\t// example:\n\t\t\t//\t|\t// uses a dictionary for substitutions:\n\t\t\t//\t|\tlang.replace(\"Hello, {name.first} {name.last} AKA {nick}!\",\n\t\t\t//\t|\t\t{\n\t\t\t//\t|\t\t\tnick: \"Bob\",\n\t\t\t//\t|\t\t\tname: {\n\t\t\t//\t|\t\t\t\tfirst:\t\"Robert\",\n\t\t\t//\t|\t\t\t\tmiddle: \"X\",\n\t\t\t//\t|\t\t\t\tlast:\t\t\"Cringely\"\n\t\t\t//\t|\t\t\t}\n\t\t\t//\t|\t\t});\n\t\t\t//\t|\t// returns: Hello, Robert Cringely AKA Bob!\n\t\t\t// example:\n\t\t\t//\t|\t// uses an array for substitutions:\n\t\t\t//\t|\tlang.replace(\"Hello, {0} {2}!\",\n\t\t\t//\t|\t\t[\"Robert\", \"X\", \"Cringely\"]);\n\t\t\t//\t|\t// returns: Hello, Robert Cringely!\n\t\t\t// example:\n\t\t\t//\t|\t// uses a function for substitutions:\n\t\t\t//\t|\tfunction sum(a){\n\t\t\t//\t|\t\tvar t = 0;\n\t\t\t//\t|\t\tarrayforEach(a, function(x){ t += x; });\n\t\t\t//\t|\t\treturn t;\n\t\t\t//\t|\t}\n\t\t\t//\t|\tlang.replace(\n\t\t\t//\t|\t\t\"{count} payments averaging {avg} USD per payment.\",\n\t\t\t//\t|\t\tlang.hitch(\n\t\t\t//\t|\t\t\t{ payments: [11, 16, 12] },\n\t\t\t//\t|\t\t\tfunction(_, key){\n\t\t\t//\t|\t\t\t\tswitch(key){\n\t\t\t//\t|\t\t\t\t\tcase \"count\": return this.payments.length;\n\t\t\t//\t|\t\t\t\t\tcase \"min\":\t\treturn Math.min.apply(Math, this.payments);\n\t\t\t//\t|\t\t\t\t\tcase \"max\":\t\treturn Math.max.apply(Math, this.payments);\n\t\t\t//\t|\t\t\t\t\tcase \"sum\":\t\treturn sum(this.payments);\n\t\t\t//\t|\t\t\t\t\tcase \"avg\":\t\treturn sum(this.payments) / this.payments.length;\n\t\t\t//\t|\t\t\t\t}\n\t\t\t//\t|\t\t\t}\n\t\t\t//\t|\t\t)\n\t\t\t//\t|\t);\n\t\t\t//\t|\t// prints: 3 payments averaging 13 USD per payment.\n\t\t\t// example:\n\t\t\t//\t|\t// uses an alternative PHP-like pattern for substitutions:\n\t\t\t//\t|\tlang.replace(\"Hello, ${0} ${2}!\",\n\t\t\t//\t|\t\t[\"Robert\", \"X\", \"Cringely\"], /\\$\\{([^\\}]+)\\}/g);\n\t\t\t//\t|\t// returns: Hello, Robert Cringely!\n\n\t\t\treturn tmpl.replace(pattern || _pattern, lang.isFunction(map) ?\n\t\t\t\tmap : function(_, k){ return lang.getObject(k, false, map); });\n\t\t}\n\t};\n\n\thas(\"extend-dojo\") && lang.mixin(dojo, lang);\n\n\treturn lang;\n});\n","define([\"../query\", \"./NodeList\"], function(query){\n\t// module:\n\t//\t\tdojo/_base/query\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tDeprecated. Use dojo/query instead.\n\t};\n\t=====*/\n\n\treturn query;\n});\n","define([\"./kernel\", \"./lang\", \"../sniff\"], function(dojo, lang, has){\n\t// module:\n\t//\t\tdojo/_base/sniff\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tDeprecated. New code should use dojo/sniff.\n\t\t//\t\tThis module populates the dojo browser version sniffing properties like dojo.isIE.\n\t};\n\t=====*/\n\n\tif(!has(\"host-browser\")){\n\t\treturn has;\n\t}\n\n\t// no idea what this is for, or if it's used\n\tdojo._name = \"browser\";\n\n\tlang.mixin(dojo, {\n\t\t// isBrowser: Boolean\n\t\t//\t\tTrue if the client is a web-browser\n\t\tisBrowser: true,\n\n\t\t// isFF: Number|undefined\n\t\t//\t\tVersion as a Number if client is FireFox. undefined otherwise. Corresponds to\n\t\t//\t\tmajor detected FireFox version (1.5, 2, 3, etc.)\n\t\tisFF: has(\"ff\"),\n\n\t\t// isIE: Number|undefined\n\t\t//\t\tVersion as a Number if client is MSIE(PC). undefined otherwise. Corresponds to\n\t\t//\t\tmajor detected IE version (6, 7, 8, etc.)\n\t\tisIE: has(\"ie\"),\n\n\t\t// isKhtml: Number|undefined\n\t\t//\t\tVersion as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major\n\t\t//\t\tdetected version.\n\t\tisKhtml: has(\"khtml\"),\n\n\t\t// isWebKit: Number|undefined\n\t\t//\t\tVersion as a Number if client is a WebKit-derived browser (Konqueror,\n\t\t//\t\tSafari, Chrome, etc.). undefined otherwise.\n\t\tisWebKit: has(\"webkit\"),\n\n\t\t// isMozilla: Number|undefined\n\t\t//\t\tVersion as a Number if client is a Mozilla-based browser (Firefox,\n\t\t//\t\tSeaMonkey). undefined otherwise. Corresponds to major detected version.\n\t\tisMozilla: has(\"mozilla\"),\n\t\t// isMoz: Number|undefined\n\t\t//\t\tVersion as a Number if client is a Mozilla-based browser (Firefox,\n\t\t//\t\tSeaMonkey). undefined otherwise. Corresponds to major detected version.\n\t\tisMoz: has(\"mozilla\"),\n\n\t\t// isOpera: Number|undefined\n\t\t//\t\tVersion as a Number if client is Opera. undefined otherwise. Corresponds to\n\t\t//\t\tmajor detected version.\n\t\tisOpera: has(\"opera\"),\n\n\t\t// isSafari: Number|undefined\n\t\t//\t\tVersion as a Number if client is Safari or iPhone. undefined otherwise.\n\t\tisSafari: has(\"safari\"),\n\n\t\t// isChrome: Number|undefined\n\t\t//\t\tVersion as a Number if client is Chrome browser. undefined otherwise.\n\t\tisChrome: has(\"chrome\"),\n\n\t\t// isMac: Boolean\n\t\t//\t\tTrue if the client runs on Mac\n\t\tisMac: has(\"mac\"),\n\n\t\t// isIos: Number|undefined\n\t\t//\t\tVersion as a Number if client is iPhone, iPod, or iPad. undefined otherwise.\n\t\tisIos: has(\"ios\"),\n\n\t\t// isAndroid: Number|undefined\n\t\t//\t\tVersion as a Number if client is android browser. undefined otherwise.\n\t\tisAndroid: has(\"android\"),\n\n\t\t// isWii: Boolean\n\t\t//\t\tTrue if client is Wii\n\t\tisWii: has(\"wii\"),\n\n\t\t// isQuirks: Boolean\n\t\t//\t\tPage is in quirks mode.\n\t\tisQuirks: has(\"quirks\"),\n\n\t\t// isAir: Boolean\n\t\t//\t\tTrue if client is Adobe Air\n\t\tisAir: has(\"air\")\n\t});\n\n\treturn has;\n});\n","define([\"./kernel\", \"./lang\", \"../sniff\"], function(dojo, lang, has){\n// module:\n//\t\tdojo/_base/window\n\nvar ret = {\n\t// summary:\n\t//\t\tAPI to save/set/restore the global/document scope.\n\n\tglobal: dojo.global,\n\t/*=====\n\t global: {\n\t\t // summary:\n\t\t //\t\tAlias for the current window. 'global' can be modified\n\t\t //\t\tfor temporary context shifting. See also withGlobal().\n\t\t // description:\n\t\t //\t\tUse this rather than referring to 'window' to ensure your code runs\n\t\t //\t\tcorrectly in managed contexts.\n\t },\n\t =====*/\n\n\tdoc: dojo.global[\"document\"] || null,\n\t/*=====\n\tdoc: {\n\t\t// summary:\n\t\t//\t\tAlias for the current document. 'doc' can be modified\n\t\t//\t\tfor temporary context shifting. See also withDoc().\n\t\t// description:\n\t\t//\t\tUse this rather than referring to 'window.document' to ensure your code runs\n\t\t//\t\tcorrectly in managed contexts.\n\t\t// example:\n\t\t//\t|\tn.appendChild(dojo.doc.createElement('div'));\n\t},\n\t=====*/\n\n\tbody: function(/*Document?*/ doc){\n\t\t// summary:\n\t\t//\t\tReturn the body element of the specified document or of dojo/_base/window::doc.\n\t\t// example:\n\t\t//\t|\twin.body().appendChild(dojo.doc.createElement('div'));\n\n\t\t// Note: document.body is not defined for a strict xhtml document\n\t\t// Would like to memoize this, but dojo.doc can change vi dojo.withDoc().\n\t\tdoc = doc || dojo.doc;\n\t\treturn doc.body || doc.getElementsByTagName(\"body\")[0]; // Node\n\t},\n\n\tsetContext: function(/*Object*/ globalObject, /*DocumentElement*/ globalDocument){\n\t\t// summary:\n\t\t//\t\tchanges the behavior of many core Dojo functions that deal with\n\t\t//\t\tnamespace and DOM lookup, changing them to work in a new global\n\t\t//\t\tcontext (e.g., an iframe). The varibles dojo.global and dojo.doc\n\t\t//\t\tare modified as a result of calling this function and the result of\n\t\t//\t\t`dojo.body()` likewise differs.\n\t\tdojo.global = ret.global = globalObject;\n\t\tdojo.doc = ret.doc = globalDocument;\n\t},\n\n\twithGlobal: function(\t/*Object*/ globalObject,\n\t\t\t\t\t\t\t/*Function*/ callback,\n\t\t\t\t\t\t\t/*Object?*/ thisObject,\n\t\t\t\t\t\t\t/*Array?*/ cbArguments){\n\t\t// summary:\n\t\t//\t\tInvoke callback with globalObject as dojo.global and\n\t\t//\t\tglobalObject.document as dojo.doc.\n\t\t// description:\n\t\t//\t\tInvoke callback with globalObject as dojo.global and\n\t\t//\t\tglobalObject.document as dojo.doc. If provided, globalObject\n\t\t//\t\twill be executed in the context of object thisObject\n\t\t//\t\tWhen callback() returns or throws an error, the dojo.global\n\t\t//\t\tand dojo.doc will be restored to its previous state.\n\n\t\tvar oldGlob = dojo.global;\n\t\ttry{\n\t\t\tdojo.global = ret.global = globalObject;\n\t\t\treturn ret.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);\n\t\t}finally{\n\t\t\tdojo.global = ret.global = oldGlob;\n\t\t}\n\t},\n\n\twithDoc: function(\t/*DocumentElement*/ documentObject,\n\t\t\t\t\t\t/*Function*/ callback,\n\t\t\t\t\t\t/*Object?*/ thisObject,\n\t\t\t\t\t\t/*Array?*/ cbArguments){\n\t\t// summary:\n\t\t//\t\tInvoke callback with documentObject as dojo/_base/window::doc.\n\t\t// description:\n\t\t//\t\tInvoke callback with documentObject as dojo/_base/window::doc. If provided,\n\t\t//\t\tcallback will be executed in the context of object thisObject\n\t\t//\t\tWhen callback() returns or throws an error, the dojo/_base/window::doc will\n\t\t//\t\tbe restored to its previous state.\n\n\t\tvar oldDoc = ret.doc,\n\t\t\toldQ = has(\"quirks\"),\n\t\t\toldIE = has(\"ie\"), isIE, mode, pwin;\n\n\t\ttry{\n\t\t\tdojo.doc = ret.doc = documentObject;\n\t\t\t// update dojo.isQuirks and the value of the has feature \"quirks\".\n\t\t\t// remove setting dojo.isQuirks and dojo.isIE for 2.0\n\t\t\tdojo.isQuirks = has.add(\"quirks\", dojo.doc.compatMode == \"BackCompat\", true, true); // no need to check for QuirksMode which was Opera 7 only\n\n\t\t\tif(has(\"ie\")){\n\t\t\t\tif((pwin = documentObject.parentWindow) && pwin.navigator){\n\t\t\t\t\t// re-run IE detection logic and update dojo.isIE / has(\"ie\")\n\t\t\t\t\t// (the only time parentWindow/navigator wouldn't exist is if we were not\n\t\t\t\t\t// passed an actual legitimate document object)\n\t\t\t\t\tisIE = parseFloat(pwin.navigator.appVersion.split(\"MSIE \")[1]) || undefined;\n\t\t\t\t\tmode = documentObject.documentMode;\n\t\t\t\t\tif(mode && mode != 5 && Math.floor(isIE) != mode){\n\t\t\t\t\t\tisIE = mode;\n\t\t\t\t\t}\n\t\t\t\t\tdojo.isIE = has.add(\"ie\", isIE, true, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(thisObject && typeof callback == \"string\"){\n\t\t\t\tcallback = thisObject[callback];\n\t\t\t}\n\n\t\t\treturn callback.apply(thisObject, cbArguments || []);\n\t\t}finally{\n\t\t\tdojo.doc = ret.doc = oldDoc;\n\t\t\tdojo.isQuirks = has.add(\"quirks\", oldQ, true, true);\n\t\t\tdojo.isIE = has.add(\"ie\", oldIE, true, true);\n\t\t}\n\t}\n};\n\nhas(\"extend-dojo\") && lang.mixin(dojo, ret);\n\nreturn ret;\n\n});\n","define([\n\t\"./kernel\",\n\t\"./sniff\",\n\t\"require\",\n\t\"../io-query\",\n\t/*===== \"./declare\", =====*/\n\t\"../dom\",\n\t\"../dom-form\",\n\t\"./Deferred\",\n\t\"./config\",\n\t\"./json\",\n\t\"./lang\",\n\t\"./array\",\n\t\"../on\",\n\t\"../aspect\",\n\t\"../request/watch\",\n\t\"../request/xhr\",\n\t\"../request/util\"\n], function(dojo, has, require, ioq, /*===== declare, =====*/ dom, domForm, Deferred, config, json, lang, array, on, aspect, watch, _xhr, util){\n\t// module:\n\t//\t\tdojo/_base/xhr\n\n\t/*=====\n\tdojo._xhrObj = function(){\n\t\t// summary:\n\t\t//\t\tdoes the work of portably generating a new XMLHTTPRequest object.\n\t};\n\t=====*/\n\tdojo._xhrObj = _xhr._create;\n\n\tvar cfg = dojo.config;\n\n\t// mix in io-query and dom-form\n\tdojo.objectToQuery = ioq.objectToQuery;\n\tdojo.queryToObject = ioq.queryToObject;\n\tdojo.fieldToObject = domForm.fieldToObject;\n\tdojo.formToObject = domForm.toObject;\n\tdojo.formToQuery = domForm.toQuery;\n\tdojo.formToJson = domForm.toJson;\n\n\t// need to block async callbacks from snatching this thread as the result\n\t// of an async callback might call another sync XHR, this hangs khtml forever\n\t// must checked by watchInFlight()\n\n\tdojo._blockAsync = false;\n\n\t// MOW: remove dojo._contentHandlers alias in 2.0\n\tvar handlers = dojo._contentHandlers = dojo.contentHandlers = {\n\t\t// summary:\n\t\t//\t\tA map of available XHR transport handle types. Name matches the\n\t\t//\t\t`handleAs` attribute passed to XHR calls.\n\t\t// description:\n\t\t//\t\tA map of available XHR transport handle types. Name matches the\n\t\t//\t\t`handleAs` attribute passed to XHR calls. Each contentHandler is\n\t\t//\t\tcalled, passing the xhr object for manipulation. The return value\n\t\t//\t\tfrom the contentHandler will be passed to the `load` or `handle`\n\t\t//\t\tfunctions defined in the original xhr call.\n\t\t// example:\n\t\t//\t\tCreating a custom content-handler:\n\t\t//\t|\txhr.contentHandlers.makeCaps = function(xhr){\n\t\t//\t|\t\treturn xhr.responseText.toUpperCase();\n\t\t//\t|\t}\n\t\t//\t|\t// and later:\n\t\t//\t|\tdojo.xhrGet({\n\t\t//\t|\t\turl:\"foo.txt\",\n\t\t//\t|\t\thandleAs:\"makeCaps\",\n\t\t//\t|\t\tload: function(data){ /* data is a toUpper version of foo.txt */ }\n\t\t//\t|\t});\n\n\t\t\"text\": function(xhr){\n\t\t\t// summary:\n\t\t\t//\t\tA contentHandler which simply returns the plaintext response data\n\t\t\treturn xhr.responseText;\n\t\t},\n\t\t\"json\": function(xhr){\n\t\t\t// summary:\n\t\t\t//\t\tA contentHandler which returns a JavaScript object created from the response data\n\t\t\treturn json.fromJson(xhr.responseText || null);\n\t\t},\n\t\t\"json-comment-filtered\": function(xhr){\n\t\t\t// summary:\n\t\t\t//\t\tA contentHandler which expects comment-filtered JSON.\n\t\t\t// description:\n\t\t\t//\t\tA contentHandler which expects comment-filtered JSON.\n\t\t\t//\t\tthe json-comment-filtered option was implemented to prevent\n\t\t\t//\t\t\"JavaScript Hijacking\", but it is less secure than standard JSON. Use\n\t\t\t//\t\tstandard JSON instead. JSON prefixing can be used to subvert hijacking.\n\t\t\t//\n\t\t\t//\t\tWill throw a notice suggesting to use application/json mimetype, as\n\t\t\t//\t\tjson-commenting can introduce security issues. To decrease the chances of hijacking,\n\t\t\t//\t\tuse the standard `json` contentHandler, and prefix your \"JSON\" with: {}&&\n\t\t\t//\n\t\t\t//\t\tuse djConfig.useCommentedJson = true to turn off the notice\n\t\t\tif(!config.useCommentedJson){\n\t\t\t\tconsole.warn(\"Consider using the standard mimetype:application/json.\"\n\t\t\t\t\t+ \" json-commenting can introduce security issues. To\"\n\t\t\t\t\t+ \" decrease the chances of hijacking, use the standard the 'json' handler and\"\n\t\t\t\t\t+ \" prefix your json with: {}&&\\n\"\n\t\t\t\t\t+ \"Use djConfig.useCommentedJson=true to turn off this message.\");\n\t\t\t}\n\n\t\t\tvar value = xhr.responseText;\n\t\t\tvar cStartIdx = value.indexOf(\"\\/*\");\n\t\t\tvar cEndIdx = value.lastIndexOf(\"*\\/\");\n\t\t\tif(cStartIdx == -1 || cEndIdx == -1){\n\t\t\t\tthrow new Error(\"JSON was not comment filtered\");\n\t\t\t}\n\t\t\treturn json.fromJson(value.substring(cStartIdx+2, cEndIdx));\n\t\t},\n\t\t\"javascript\": function(xhr){\n\t\t\t// summary:\n\t\t\t//\t\tA contentHandler which evaluates the response data, expecting it to be valid JavaScript\n\n\t\t\t// FIXME: try Moz and IE specific eval variants?\n\t\t\treturn dojo.eval(xhr.responseText);\n\t\t},\n\t\t\"xml\": function(xhr){\n\t\t\t// summary:\n\t\t\t//\t\tA contentHandler returning an XML Document parsed from the response data\n\t\t\tvar result = xhr.responseXML;\n\n\t\t\tif(result && has(\"dom-qsa2.1\") && !result.querySelectorAll && has(\"dom-parser\")){\n\t\t\t\t// http://bugs.dojotoolkit.org/ticket/15631\n\t\t\t\t// IE9 supports a CSS3 querySelectorAll implementation, but the DOM implementation\n\t\t\t\t// returned by IE9 xhr.responseXML does not. Manually create the XML DOM to gain\n\t\t\t\t// the fuller-featured implementation and avoid bugs caused by the inconsistency\n\t\t\t\tresult = new DOMParser().parseFromString(xhr.responseText, \"application/xml\");\n\t\t\t}\n\n\t\t\tif(has(\"ie\")){\n\t\t\t\tif((!result || !result.documentElement)){\n\t\t\t\t\t//WARNING: this branch used by the xml handling in dojo.io.iframe,\n\t\t\t\t\t//so be sure to test dojo.io.iframe if making changes below.\n\t\t\t\t\tvar ms = function(n){ return \"MSXML\" + n + \".DOMDocument\"; };\n\t\t\t\t\tvar dp = [\"Microsoft.XMLDOM\", ms(6), ms(4), ms(3), ms(2)];\n\t\t\t\t\tarray.some(dp, function(p){\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tvar dom = new ActiveXObject(p);\n\t\t\t\t\t\t\tdom.async = false;\n\t\t\t\t\t\t\tdom.loadXML(xhr.responseText);\n\t\t\t\t\t\t\tresult = dom;\n\t\t\t\t\t\t}catch(e){ return false; }\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result; // DOMDocument\n\t\t},\n\t\t\"json-comment-optional\": function(xhr){\n\t\t\t// summary:\n\t\t\t//\t\tA contentHandler which checks the presence of comment-filtered JSON and\n\t\t\t//\t\talternates between the `json` and `json-comment-filtered` contentHandlers.\n\t\t\tif(xhr.responseText && /^[^{\\[]*\\/\\*/.test(xhr.responseText)){\n\t\t\t\treturn handlers[\"json-comment-filtered\"](xhr);\n\t\t\t}else{\n\t\t\t\treturn handlers[\"json\"](xhr);\n\t\t\t}\n\t\t}\n\t};\n\n\t/*=====\n\n\t// kwargs function parameter definitions. Assigning to dojo namespace rather than making them local variables\n\t// because they are used by dojo/io modules too\n\n\tdojo.__IoArgs = declare(null, {\n\t\t// url: String\n\t\t//\t\tURL to server endpoint.\n\t\t// content: Object?\n\t\t//\t\tContains properties with string values. These\n\t\t//\t\tproperties will be serialized as name1=value2 and\n\t\t//\t\tpassed in the request.\n\t\t// timeout: Integer?\n\t\t//\t\tMilliseconds to wait for the response. If this time\n\t\t//\t\tpasses, the then error callbacks are called.\n\t\t// form: DOMNode?\n\t\t//\t\tDOM node for a form. Used to extract the form values\n\t\t//\t\tand send to the server.\n\t\t// preventCache: Boolean?\n\t\t//\t\tDefault is false. If true, then a\n\t\t//\t\t\"dojo.preventCache\" parameter is sent in the request\n\t\t//\t\twith a value that changes with each request\n\t\t//\t\t(timestamp). Useful only with GET-type requests.\n\t\t// handleAs: String?\n\t\t//\t\tAcceptable values depend on the type of IO\n\t\t//\t\ttransport (see specific IO calls for more information).\n\t\t// rawBody: String?\n\t\t//\t\tSets the raw body for an HTTP request. If this is used, then the content\n\t\t//\t\tproperty is ignored. This is mostly useful for HTTP methods that have\n\t\t//\t\ta body to their requests, like PUT or POST. This property can be used instead\n\t\t//\t\tof postData and putData for dojo/_base/xhr.rawXhrPost and dojo/_base/xhr.rawXhrPut respectively.\n\t\t// ioPublish: Boolean?\n\t\t//\t\tSet this explicitly to false to prevent publishing of topics related to\n\t\t//\t\tIO operations. Otherwise, if djConfig.ioPublish is set to true, topics\n\t\t//\t\twill be published via dojo/topic.publish() for different phases of an IO operation.\n\t\t//\t\tSee dojo/main.__IoPublish for a list of topics that are published.\n\n\t\tload: function(response, ioArgs){\n\t\t\t// summary:\n\t\t\t//\t\tThis function will be\n\t\t\t//\t\tcalled on a successful HTTP response code.\n\t \t\t// ioArgs: dojo/main.__IoCallbackArgs\n\t\t\t//\t\tProvides additional information about the request.\n\t\t\t// response: Object\n\t\t\t//\t\tThe response in the format as defined with handleAs.\n\t\t},\n\n\t\terror: function(response, ioArgs){\n\t\t\t// summary:\n\t\t\t//\t\tThis function will\n\t\t\t//\t\tbe called when the request fails due to a network or server error, the url\n\t\t\t//\t\tis invalid, etc. It will also be called if the load or handle callback throws an\n\t\t\t//\t\texception, unless djConfig.debugAtAllCosts is true.\t This allows deployed applications\n\t\t\t//\t\tto continue to run even when a logic error happens in the callback, while making\n\t\t\t//\t\tit easier to troubleshoot while in debug mode.\n\t\t\t// ioArgs: dojo/main.__IoCallbackArgs\n\t\t\t//\t\tProvides additional information about the request.\n\t\t\t// response: Object\n\t\t\t//\t\tThe response in the format as defined with handleAs.\n\t\t},\n\n\t\thandle: function(loadOrError, response, ioArgs){\n\t\t\t// summary:\n\t \t\t//\t\tThis function will\n\t \t\t//\t\tbe called at the end of every request, whether or not an error occurs.\n\t\t\t// loadOrError: String\n\t\t\t//\t\tProvides a string that tells you whether this function\n\t\t\t//\t\twas called because of success (load) or failure (error).\n\t\t\t// response: Object\n\t\t\t//\t\tThe response in the format as defined with handleAs.\n\t\t\t// ioArgs: dojo/main.__IoCallbackArgs\n\t\t\t//\t\tProvides additional information about the request.\n\t\t}\n\t});\n\n\tdojo.__IoCallbackArgs = declare(null, {\n\t\t// args: Object\n\t\t//\t\tthe original object argument to the IO call.\n\t\t// xhr: XMLHttpRequest\n\t\t//\t\tFor XMLHttpRequest calls only, the\n\t\t//\t\tXMLHttpRequest object that was used for the\n\t\t//\t\trequest.\n\t\t// url: String\n\t\t//\t\tThe final URL used for the call. Many times it\n\t\t//\t\twill be different than the original args.url\n\t\t//\t\tvalue.\n\t\t// query: String\n\t\t//\t\tFor non-GET requests, the\n\t\t//\t\tname1=value1&name2=value2 parameters sent up in\n\t\t//\t\tthe request.\n\t\t// handleAs: String\n\t\t//\t\tThe final indicator on how the response will be\n\t\t//\t\thandled.\n\t\t// id: String\n\t\t//\t\tFor dojo/io/script calls only, the internal\n\t\t//\t\tscript ID used for the request.\n\t\t// canDelete: Boolean\n\t\t//\t\tFor dojo/io/script calls only, indicates\n\t\t//\t\twhether the script tag that represents the\n\t\t//\t\trequest can be deleted after callbacks have\n\t\t//\t\tbeen called. Used internally to know when\n\t\t//\t\tcleanup can happen on JSONP-type requests.\n\t\t// json: Object\n\t\t//\t\tFor dojo/io/script calls only: holds the JSON\n\t\t//\t\tresponse for JSONP-type requests. Used\n\t\t//\t\tinternally to hold on to the JSON responses.\n\t\t//\t\tYou should not need to access it directly --\n\t\t//\t\tthe same object should be passed to the success\n\t\t//\t\tcallbacks directly.\n\t});\n\n\tdojo.__IoPublish = declare(null, {\n\t\t// summary:\n\t\t//\t\tThis is a list of IO topics that can be published\n\t\t//\t\tif djConfig.ioPublish is set to true. IO topics can be\n\t\t//\t\tpublished for any Input/Output, network operation. So,\n\t\t//\t\tdojo.xhr, dojo.io.script and dojo.io.iframe can all\n\t\t//\t\ttrigger these topics to be published.\n\t\t// start: String\n\t\t//\t\t\"/dojo/io/start\" is sent when there are no outstanding IO\n\t\t//\t\trequests, and a new IO request is started. No arguments\n\t\t//\t\tare passed with this topic.\n\t\t// send: String\n\t\t//\t\t\"/dojo/io/send\" is sent whenever a new IO request is started.\n\t\t//\t\tIt passes the dojo.Deferred for the request with the topic.\n\t\t// load: String\n\t\t//\t\t\"/dojo/io/load\" is sent whenever an IO request has loaded\n\t\t//\t\tsuccessfully. It passes the response and the dojo.Deferred\n\t\t//\t\tfor the request with the topic.\n\t\t// error: String\n\t\t//\t\t\"/dojo/io/error\" is sent whenever an IO request has errored.\n\t\t//\t\tIt passes the error and the dojo.Deferred\n\t\t//\t\tfor the request with the topic.\n\t\t// done: String\n\t\t//\t\t\"/dojo/io/done\" is sent whenever an IO request has completed,\n\t\t//\t\teither by loading or by erroring. It passes the error and\n\t\t//\t\tthe dojo.Deferred for the request with the topic.\n\t\t// stop: String\n\t\t//\t\t\"/dojo/io/stop\" is sent when all outstanding IO requests have\n\t\t//\t\tfinished. No arguments are passed with this topic.\n\t});\n\t=====*/\n\n\n\tdojo._ioSetArgs = function(/*dojo/main.__IoArgs*/args,\n\t\t\t/*Function*/canceller,\n\t\t\t/*Function*/okHandler,\n\t\t\t/*Function*/errHandler){\n\t\t// summary:\n\t\t//\t\tsets up the Deferred and ioArgs property on the Deferred so it\n\t\t//\t\tcan be used in an io call.\n\t\t// args:\n\t\t//\t\tThe args object passed into the public io call. Recognized properties on\n\t\t//\t\tthe args object are:\n\t\t// canceller:\n\t\t//\t\tThe canceller function used for the Deferred object. The function\n\t\t//\t\twill receive one argument, the Deferred object that is related to the\n\t\t//\t\tcanceller.\n\t\t// okHandler:\n\t\t//\t\tThe first OK callback to be registered with Deferred. It has the opportunity\n\t\t//\t\tto transform the OK response. It will receive one argument -- the Deferred\n\t\t//\t\tobject returned from this function.\n\t\t// errHandler:\n\t\t//\t\tThe first error callback to be registered with Deferred. It has the opportunity\n\t\t//\t\tto do cleanup on an error. It will receive two arguments: error (the\n\t\t//\t\tError object) and dfd, the Deferred object returned from this function.\n\n\t\tvar ioArgs = {args: args, url: args.url};\n\n\t\t//Get values from form if requested.\n\t\tvar formObject = null;\n\t\tif(args.form){\n\t\t\tvar form = dom.byId(args.form);\n\t\t\t//IE requires going through getAttributeNode instead of just getAttribute in some form cases,\n\t\t\t//so use it for all. See #2844\n\t\t\tvar actnNode = form.getAttributeNode(\"action\");\n\t\t\tioArgs.url = ioArgs.url || (actnNode ? actnNode.value : (dojo.doc ? dojo.doc.URL : null));\n\t\t\tformObject = domForm.toObject(form);\n\t\t}\n\n\t\t// set up the query params\n\t\tvar miArgs = {};\n\n\t\tif(formObject){\n\t\t\t// potentially over-ride url-provided params w/ form values\n\t\t\tlang.mixin(miArgs, formObject);\n\t\t}\n\t\tif(args.content){\n\t\t\t// stuff in content over-rides what's set by form\n\t\t\tlang.mixin(miArgs, args.content);\n\t\t}\n\t\tif(args.preventCache){\n\t\t\tmiArgs[\"dojo.preventCache\"] = new Date().valueOf();\n\t\t}\n\t\tioArgs.query = ioq.objectToQuery(miArgs);\n\n\t\t// .. and the real work of getting the deferred in order, etc.\n\t\tioArgs.handleAs = args.handleAs || \"text\";\n\t\tvar d = new Deferred(function(dfd){\n\t\t\tdfd.canceled = true;\n\t\t\tcanceller && canceller(dfd);\n\n\t\t\tvar err = dfd.ioArgs.error;\n\t\t\tif(!err){\n\t\t\t\terr = new Error(\"request cancelled\");\n\t\t\t\terr.dojoType=\"cancel\";\n\t\t\t\tdfd.ioArgs.error = err;\n\t\t\t}\n\t\t\treturn err;\n\t\t});\n\t\td.addCallback(okHandler);\n\n\t\t//Support specifying load, error and handle callback functions from the args.\n\t\t//For those callbacks, the \"this\" object will be the args object.\n\t\t//The callbacks will get the deferred result value as the\n\t\t//first argument and the ioArgs object as the second argument.\n\t\tvar ld = args.load;\n\t\tif(ld && lang.isFunction(ld)){\n\t\t\td.addCallback(function(value){\n\t\t\t\treturn ld.call(args, value, ioArgs);\n\t\t\t});\n\t\t}\n\t\tvar err = args.error;\n\t\tif(err && lang.isFunction(err)){\n\t\t\td.addErrback(function(value){\n\t\t\t\treturn err.call(args, value, ioArgs);\n\t\t\t});\n\t\t}\n\t\tvar handle = args.handle;\n\t\tif(handle && lang.isFunction(handle)){\n\t\t\td.addBoth(function(value){\n\t\t\t\treturn handle.call(args, value, ioArgs);\n\t\t\t});\n\t\t}\n\n\t\t// Attach error handler last (not including topic publishing)\n\t\t// to catch any errors that may have been generated from load\n\t\t// or handle functions.\n\t\td.addErrback(function(error){\n\t\t\treturn errHandler(error, d);\n\t\t});\n\n\t\t//Plug in topic publishing, if dojo.publish is loaded.\n\t\tif(cfg.ioPublish && dojo.publish && ioArgs.args.ioPublish !== false){\n\t\t\td.addCallbacks(\n\t\t\t\tfunction(res){\n\t\t\t\t\tdojo.publish(\"/dojo/io/load\", [d, res]);\n\t\t\t\t\treturn res;\n\t\t\t\t},\n\t\t\t\tfunction(res){\n\t\t\t\t\tdojo.publish(\"/dojo/io/error\", [d, res]);\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t);\n\t\t\td.addBoth(function(res){\n\t\t\t\tdojo.publish(\"/dojo/io/done\", [d, res]);\n\t\t\t\treturn res;\n\t\t\t});\n\t\t}\n\n\t\td.ioArgs = ioArgs;\n\n\t\t// FIXME: need to wire up the xhr object's abort method to something\n\t\t// analogous in the Deferred\n\t\treturn d;\n\t};\n\n\tvar _deferredOk = function(/*Deferred*/dfd){\n\t\t// summary:\n\t\t//\t\tokHandler function for dojo._ioSetArgs call.\n\n\t\tvar ret = handlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);\n\t\treturn ret === undefined ? null : ret;\n\t};\n\tvar _deferError = function(/*Error*/error, /*Deferred*/dfd){\n\t\t// summary:\n\t\t//\t\terrHandler function for dojo._ioSetArgs call.\n\n\t\tif(!dfd.ioArgs.args.failOk){\n\t\t\tconsole.error(error);\n\t\t}\n\t\treturn error;\n\t};\n\n\t//Use a separate count for knowing if we are starting/stopping io calls.\n\tvar _checkPubCount = function(dfd){\n\t\tif(_pubCount <= 0){\n\t\t\t_pubCount = 0;\n\t\t\tif(cfg.ioPublish && dojo.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){\n\t\t\t\tdojo.publish(\"/dojo/io/stop\");\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _pubCount = 0;\n\taspect.after(watch, \"_onAction\", function(){\n\t\t_pubCount -= 1;\n\t});\n\taspect.after(watch, \"_onInFlight\", _checkPubCount);\n\n\tdojo._ioCancelAll = watch.cancelAll;\n\t/*=====\n\tdojo._ioCancelAll = function(){\n\t\t// summary:\n\t\t//\t\tCancels all pending IO requests, regardless of IO type\n\t\t//\t\t(xhr, script, iframe).\n\t};\n\t=====*/\n\n\tdojo._ioNotifyStart = function(/*Deferred*/dfd){\n\t\t// summary:\n\t\t//\t\tIf dojo.publish is available, publish topics\n\t\t//\t\tabout the start of a request queue and/or the\n\t\t//\t\tthe beginning of request.\n\t\t//\n\t\t//\t\tUsed by IO transports. An IO transport should\n\t\t//\t\tcall this method before making the network connection.\n\t\tif(cfg.ioPublish && dojo.publish && dfd.ioArgs.args.ioPublish !== false){\n\t\t\tif(!_pubCount){\n\t\t\t\tdojo.publish(\"/dojo/io/start\");\n\t\t\t}\n\t\t\t_pubCount += 1;\n\t\t\tdojo.publish(\"/dojo/io/send\", [dfd]);\n\t\t}\n\t};\n\n\tdojo._ioWatch = function(dfd, validCheck, ioCheck, resHandle){\n\t\t// summary:\n\t\t//\t\tWatches the io request represented by dfd to see if it completes.\n\t\t// dfd: Deferred\n\t\t//\t\tThe Deferred object to watch.\n\t\t// validCheck: Function\n\t\t//\t\tFunction used to check if the IO request is still valid. Gets the dfd\n\t\t//\t\tobject as its only argument.\n\t\t// ioCheck: Function\n\t\t//\t\tFunction used to check if basic IO call worked. Gets the dfd\n\t\t//\t\tobject as its only argument.\n\t\t// resHandle: Function\n\t\t//\t\tFunction used to process response. Gets the dfd\n\t\t//\t\tobject as its only argument.\n\n\t\tvar args = dfd.ioArgs.options = dfd.ioArgs.args;\n\t\tlang.mixin(dfd, {\n\t\t\tresponse: dfd.ioArgs,\n\t\t\tisValid: function(response){\n\t\t\t\treturn validCheck(dfd);\n\t\t\t},\n\t\t\tisReady: function(response){\n\t\t\t\treturn ioCheck(dfd);\n\t\t\t},\n\t\t\thandleResponse: function(response){\n\t\t\t\treturn resHandle(dfd);\n\t\t\t}\n\t\t});\n\t\twatch(dfd);\n\n\t\t_checkPubCount(dfd);\n\t};\n\n\tvar _defaultContentType = \"application/x-www-form-urlencoded\";\n\n\tdojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){\n\t\t// summary:\n\t\t//\t\tAdds query params discovered by the io deferred construction to the URL.\n\t\t//\t\tOnly use this for operations which are fundamentally GET-type operations.\n\t\tif(ioArgs.query.length){\n\t\t\tioArgs.url += (ioArgs.url.indexOf(\"?\") == -1 ? \"?\" : \"&\") + ioArgs.query;\n\t\t\tioArgs.query = null;\n\t\t}\n\t};\n\n\t/*=====\n\tdojo.__XhrArgs = declare(dojo.__IoArgs, {\n\t\t// summary:\n\t\t//\t\tIn addition to the properties listed for the dojo._IoArgs type,\n\t\t//\t\tthe following properties are allowed for dojo.xhr* methods.\n\t\t// handleAs: String?\n\t\t//\t\tAcceptable values are: text (default), json, json-comment-optional,\n\t\t//\t\tjson-comment-filtered, javascript, xml. See `dojo/_base/xhr.contentHandlers`\n\t \t// sync: Boolean?\n\t\t//\t\tfalse is default. Indicates whether the request should\n\t\t//\t\tbe a synchronous (blocking) request.\n\t\t// headers: Object?\n\t\t//\t\tAdditional HTTP headers to send in the request.\n\t\t// failOk: Boolean?\n\t\t//\t\tfalse is default. Indicates whether a request should be\n\t\t//\t\tallowed to fail (and therefore no console error message in\n\t\t//\t\tthe event of a failure)\n\t\t// contentType: String|Boolean\n\t\t//\t\t\"application/x-www-form-urlencoded\" is default. Set to false to\n\t\t//\t\tprevent a Content-Type header from being sent, or to a string\n\t\t//\t\tto send a different Content-Type.\n\t });\n\t=====*/\n\n\tdojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){\n\t\t// summary:\n\t\t//\t\tDeprecated. Use dojo/request instead.\n\t\t// description:\n\t\t//\t\tSends an HTTP request with the given method.\n\t\t//\t\tSee also dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts\n\t\t//\t\tfor those HTTP methods. There are also methods for \"raw\" PUT and POST methods\n\t\t//\t\tvia dojo.rawXhrPut() and dojo.rawXhrPost() respectively.\n\t\t// method:\n\t\t//\t\tHTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase.\n\t\t// hasBody:\n\t\t//\t\tIf the request has an HTTP body, then pass true for hasBody.\n\n\t\tvar rDfd;\n\t\t//Make the Deferred object for this xhr request.\n\t\tvar dfd = dojo._ioSetArgs(args, function(dfd){\n\t\t\trDfd && rDfd.cancel();\n\t\t}, _deferredOk, _deferError);\n\t\tvar ioArgs = dfd.ioArgs;\n\n\t\t//Allow for specifying the HTTP body completely.\n\t\tif(\"postData\" in args){\n\t\t\tioArgs.query = args.postData;\n\t\t}else if(\"putData\" in args){\n\t\t\tioArgs.query = args.putData;\n\t\t}else if(\"rawBody\" in args){\n\t\t\tioArgs.query = args.rawBody;\n\t\t}else if((arguments.length > 2 && !hasBody) || \"POST|PUT\".indexOf(method.toUpperCase()) === -1){\n\t\t\t//Check for hasBody being passed. If no hasBody,\n\t\t\t//then only append query string if not a POST or PUT request.\n\t\t\tdojo._ioAddQueryToUrl(ioArgs);\n\t\t}\n\n\t\tvar options = {\n\t\t\tmethod: method,\n\t\t\thandleAs: \"text\",\n\t\t\ttimeout: args.timeout,\n\t\t\twithCredentials: args.withCredentials,\n\t\t\tioArgs: ioArgs\n\t\t};\n\n\t\tif(typeof args.headers !== 'undefined'){\n\t\t\toptions.headers = args.headers;\n\t\t}\n\t\tif(typeof args.contentType !== 'undefined'){\n\t\t\tif(!options.headers){\n\t\t\t\toptions.headers = {};\n\t\t\t}\n\t\t\toptions.headers['Content-Type'] = args.contentType;\n\t\t}\n\t\tif(typeof ioArgs.query !== 'undefined'){\n\t\t\toptions.data = ioArgs.query;\n\t\t}\n\t\tif(typeof args.sync !== 'undefined'){\n\t\t\toptions.sync = args.sync;\n\t\t}\n\n\t\tdojo._ioNotifyStart(dfd);\n\t\ttry{\n\t\t\trDfd = _xhr(ioArgs.url, options, true);\n\t\t}catch(e){\n\t\t\t// If XHR creation fails, dojo/request/xhr throws\n\t\t\t// When this happens, cancel the deferred\n\t\t\tdfd.cancel();\n\t\t\treturn dfd;\n\t\t}\n\n\t\t// sync ioArgs\n\t\tdfd.ioArgs.xhr = rDfd.response.xhr;\n\n\t\trDfd.then(function(){\n\t\t\tdfd.resolve(dfd);\n\t\t}).otherwise(function(error){\n\t\t\tioArgs.error = error;\n\t\t\tif(error.response){\n\t\t\t\terror.status = error.response.status;\n\t\t\t\terror.responseText = error.response.text;\n\t\t\t\terror.xhr = error.response.xhr;\n\t\t\t}\n\t\t\tdfd.reject(error);\n\t\t});\n\t\treturn dfd; // dojo/_base/Deferred\n\t};\n\n\tdojo.xhrGet = function(/*dojo.__XhrArgs*/ args){\n\t\t// summary:\n\t\t//\t\tSends an HTTP GET request to the server.\n\t\treturn dojo.xhr(\"GET\", args); // dojo/_base/Deferred\n\t};\n\n\tdojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){\n\t\t// summary:\n\t\t//\t\tSends an HTTP POST request to the server. In addition to the properties\n\t\t//\t\tlisted for the dojo.__XhrArgs type, the following property is allowed:\n\t\t// postData:\n\t\t//\t\tString. Send raw data in the body of the POST request.\n\t\treturn dojo.xhr(\"POST\", args, true); // dojo/_base/Deferred\n\t};\n\n\tdojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){\n\t\t// summary:\n\t\t//\t\tSends an HTTP PUT request to the server. In addition to the properties\n\t\t//\t\tlisted for the dojo.__XhrArgs type, the following property is allowed:\n\t\t// putData:\n\t\t//\t\tString. Send raw data in the body of the PUT request.\n\t\treturn dojo.xhr(\"PUT\", args, true); // dojo/_base/Deferred\n\t};\n\n\tdojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){\n\t\t// summary:\n\t\t//\t\tSends an HTTP DELETE request to the server.\n\t\treturn dojo.xhr(\"DELETE\", args); // dojo/_base/Deferred\n\t};\n\n\t/*\n\tdojo.wrapForm = function(formNode){\n\t\t// summary:\n\t\t//\t\tA replacement for FormBind, but not implemented yet.\n\n\t\t// FIXME: need to think harder about what extensions to this we might\n\t\t// want. What should we allow folks to do w/ this? What events to\n\t\t// set/send?\n\t\tthrow new Error(\"dojo.wrapForm not yet implemented\");\n\t}\n\t*/\n\n\tdojo._isDocumentOk = function(x){\n\t\treturn util.checkStatus(x.status);\n\t};\n\n\tdojo._getText = function(url){\n\t\tvar result;\n\t\tdojo.xhrGet({url:url, sync:true, load:function(text){\n\t\t\tresult = text;\n\t\t}});\n\t\treturn result;\n\t};\n\n\t// Add aliases for static functions to dojo.xhr since dojo.xhr is what's returned from this module\n\tlang.mixin(dojo.xhr, {\n\t\t_xhrObj: dojo._xhrObj,\n\t\tfieldToObject: domForm.fieldToObject,\n\t\tformToObject: domForm.toObject,\n\t\tobjectToQuery: ioq.objectToQuery,\n\t\tformToQuery: domForm.toQuery,\n\t\tformToJson: domForm.toJson,\n\t\tqueryToObject: ioq.queryToObject,\n\t\tcontentHandlers: handlers,\n\t\t_ioSetArgs: dojo._ioSetArgs,\n\t\t_ioCancelAll: dojo._ioCancelAll,\n\t\t_ioNotifyStart: dojo._ioNotifyStart,\n\t\t_ioWatch: dojo._ioWatch,\n\t\t_ioAddQueryToUrl: dojo._ioAddQueryToUrl,\n\t\t_isDocumentOk: dojo._isDocumentOk,\n\t\t_getText: dojo._getText,\n\t\tget: dojo.xhrGet,\n\t\tpost: dojo.xhrPost,\n\t\tput: dojo.xhrPut,\n\t\tdel: dojo.xhrDelete\t// because \"delete\" is a reserved word\n\t});\n\n\treturn dojo.xhr;\n});\n","define([], function(){\n\n\t// module:\n\t//\t\tdojo/aspect\n\n\t\"use strict\";\n\tvar undefined;\n\tfunction advise(dispatcher, type, advice, receiveArguments){\n\t\tvar previous = dispatcher[type];\n\t\tvar around = type == \"around\";\n\t\tvar signal;\n\t\tif(around){\n\t\t\tvar advised = advice(function(){\n\t\t\t\treturn previous.advice(this, arguments);\n\t\t\t});\n\t\t\tsignal = {\n\t\t\t\tremove: function(){\n\t\t\t\t\tif(advised){\n\t\t\t\t\t\tadvised = dispatcher = advice = null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tadvice: function(target, args){\n\t\t\t\t\treturn advised ?\n\t\t\t\t\t\tadvised.apply(target, args) : // called the advised function\n\t\t\t\t\t\tprevious.advice(target, args); // cancelled, skip to next one\n\t\t\t\t}\n\t\t\t};\n\t\t}else{\n\t\t\t// create the remove handler\n\t\t\tsignal = {\n\t\t\t\tremove: function(){\n\t\t\t\t\tif(signal.advice){\n\t\t\t\t\t\tvar previous = signal.previous;\n\t\t\t\t\t\tvar next = signal.next;\n\t\t\t\t\t\tif(!next && !previous){\n\t\t\t\t\t\t\tdelete dispatcher[type];\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tif(previous){\n\t\t\t\t\t\t\t\tprevious.next = next;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tdispatcher[type] = next;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(next){\n\t\t\t\t\t\t\t\tnext.previous = previous;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// remove the advice to signal that this signal has been removed\n\t\t\t\t\t\tdispatcher = advice = signal.advice = null;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tid: dispatcher.nextId++,\n\t\t\t\tadvice: advice,\n\t\t\t\treceiveArguments: receiveArguments\n\t\t\t};\n\t\t}\n\t\tif(previous && !around){\n\t\t\tif(type == \"after\"){\n\t\t\t\t// add the listener to the end of the list\n\t\t\t\t// note that we had to change this loop a little bit to workaround a bizarre IE10 JIT bug\n\t\t\t\twhile(previous.next && (previous = previous.next)){}\n\t\t\t\tprevious.next = signal;\n\t\t\t\tsignal.previous = previous;\n\t\t\t}else if(type == \"before\"){\n\t\t\t\t// add to beginning\n\t\t\t\tdispatcher[type] = signal;\n\t\t\t\tsignal.next = previous;\n\t\t\t\tprevious.previous = signal;\n\t\t\t}\n\t\t}else{\n\t\t\t// around or first one just replaces\n\t\t\tdispatcher[type] = signal;\n\t\t}\n\t\treturn signal;\n\t}\n\tfunction aspect(type){\n\t\treturn function(target, methodName, advice, receiveArguments){\n\t\t\tvar existing = target[methodName], dispatcher;\n\t\t\tif(!existing || existing.target != target){\n\t\t\t\t// no dispatcher in place\n\t\t\t\ttarget[methodName] = dispatcher = function(){\n\t\t\t\t\tvar executionId = dispatcher.nextId;\n\t\t\t\t\t// before advice\n\t\t\t\t\tvar args = arguments;\n\t\t\t\t\tvar before = dispatcher.before;\n\t\t\t\t\twhile(before){\n\t\t\t\t\t\tif(before.advice){\n\t\t\t\t\t\t\targs = before.advice.apply(this, args) || args;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbefore = before.next;\n\t\t\t\t\t}\n\t\t\t\t\t// around advice\n\t\t\t\t\tif(dispatcher.around){\n\t\t\t\t\t\tvar results = dispatcher.around.advice(this, args);\n\t\t\t\t\t}\n\t\t\t\t\t// after advice\n\t\t\t\t\tvar after = dispatcher.after;\n\t\t\t\t\twhile(after && after.id < executionId){\n\t\t\t\t\t\tif(after.advice){\n\t\t\t\t\t\t\tif(after.receiveArguments){\n\t\t\t\t\t\t\t\tvar newResults = after.advice.apply(this, args);\n\t\t\t\t\t\t\t\t// change the return value only if a new value was returned\n\t\t\t\t\t\t\t\tresults = newResults === undefined ? results : newResults;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tresults = after.advice.call(this, results, args);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tafter = after.next;\n\t\t\t\t\t}\n\t\t\t\t\treturn results;\n\t\t\t\t};\n\t\t\t\tif(existing){\n\t\t\t\t\tdispatcher.around = {advice: function(target, args){\n\t\t\t\t\t\treturn existing.apply(target, args);\n\t\t\t\t\t}};\n\t\t\t\t}\n\t\t\t\tdispatcher.target = target;\n\t\t\t\tdispatcher.nextId = dispatcher.nextId || 0;\n\t\t\t}\n\t\t\tvar results = advise((dispatcher || existing), type, advice, receiveArguments);\n\t\t\tadvice = null;\n\t\t\treturn results;\n\t\t};\n\t}\n\n\t// TODOC: after/before/around return object\n\n\tvar after = aspect(\"after\");\n\t/*=====\n\tafter = function(target, methodName, advice, receiveArguments){\n\t\t// summary:\n\t\t//\t\tThe \"after\" export of the aspect module is a function that can be used to attach\n\t\t//\t\t\"after\" advice to a method. This function will be executed after the original method\n\t\t//\t\tis executed. By default the function will be called with a single argument, the return\n\t\t//\t\tvalue of the original method, or the the return value of the last executed advice (if a previous one exists).\n\t\t//\t\tThe fourth (optional) argument can be set to true to so the function receives the original\n\t\t//\t\targuments (from when the original method was called) rather than the return value.\n\t\t//\t\tIf there are multiple \"after\" advisors, they are executed in the order they were registered.\n\t\t// target: Object\n\t\t//\t\tThis is the target object\n\t\t// methodName: String\n\t\t//\t\tThis is the name of the method to attach to.\n\t\t// advice: Function\n\t\t//\t\tThis is function to be called after the original method\n\t\t// receiveArguments: Boolean?\n\t\t//\t\tIf this is set to true, the advice function receives the original arguments (from when the original mehtod\n\t\t//\t\twas called) rather than the return value of the original/previous method.\n\t\t// returns:\n\t\t//\t\tA signal object that can be used to cancel the advice. If remove() is called on this signal object, it will\n\t\t//\t\tstop the advice function from being executed.\n\t};\n\t=====*/\n\n\tvar before = aspect(\"before\");\n\t/*=====\n\tbefore = function(target, methodName, advice){\n\t\t// summary:\n\t\t//\t\tThe \"before\" export of the aspect module is a function that can be used to attach\n\t\t//\t\t\"before\" advice to a method. This function will be executed before the original method\n\t\t//\t\tis executed. This function will be called with the arguments used to call the method.\n\t\t//\t\tThis function may optionally return an array as the new arguments to use to call\n\t\t//\t\tthe original method (or the previous, next-to-execute before advice, if one exists).\n\t\t//\t\tIf the before method doesn't return anything (returns undefined) the original arguments\n\t\t//\t\twill be preserved.\n\t\t//\t\tIf there are multiple \"before\" advisors, they are executed in the reverse order they were registered.\n\t\t// target: Object\n\t\t//\t\tThis is the target object\n\t\t// methodName: String\n\t\t//\t\tThis is the name of the method to attach to.\n\t\t// advice: Function\n\t\t//\t\tThis is function to be called before the original method\n\t};\n\t=====*/\n\n\tvar around = aspect(\"around\");\n\t/*=====\n\t around = function(target, methodName, advice){\n\t\t// summary:\n\t\t//\t\tThe \"around\" export of the aspect module is a function that can be used to attach\n\t\t//\t\t\"around\" advice to a method. The advisor function is immediately executed when\n\t\t//\t\tthe around() is called, is passed a single argument that is a function that can be\n\t\t//\t\tcalled to continue execution of the original method (or the next around advisor).\n\t\t//\t\tThe advisor function should return a function, and this function will be called whenever\n\t\t//\t\tthe method is called. It will be called with the arguments used to call the method.\n\t\t//\t\tWhatever this function returns will be returned as the result of the method call (unless after advise changes it).\n\t\t// example:\n\t\t//\t\tIf there are multiple \"around\" advisors, the most recent one is executed first,\n\t\t//\t\twhich can then delegate to the next one and so on. For example:\n\t\t//\t\t|\taround(obj, \"foo\", function(originalFoo){\n\t\t//\t\t|\t\treturn function(){\n\t\t//\t\t|\t\t\tvar start = new Date().getTime();\n\t\t//\t\t|\t\t\tvar results = originalFoo.apply(this, arguments); // call the original\n\t\t//\t\t|\t\t\tvar end = new Date().getTime();\n\t\t//\t\t|\t\t\tconsole.log(\"foo execution took \" + (end - start) + \" ms\");\n\t\t//\t\t|\t\t\treturn results;\n\t\t//\t\t|\t\t};\n\t\t//\t\t|\t});\n\t\t// target: Object\n\t\t//\t\tThis is the target object\n\t\t// methodName: String\n\t\t//\t\tThis is the name of the method to attach to.\n\t\t// advice: Function\n\t\t//\t\tThis is function to be called around the original method\n\t};\n\t=====*/\n\n\treturn {\n\t\t// summary:\n\t\t//\t\tprovides aspect oriented programming functionality, allowing for\n\t\t//\t\tone to add before, around, or after advice on existing methods.\n\t\t// example:\n\t\t//\t|\tdefine([\"dojo/aspect\"], function(aspect){\n\t\t//\t|\t\tvar signal = aspect.after(targetObject, \"methodName\", function(someArgument){\n\t\t//\t|\t\t\tthis will be called when targetObject.methodName() is called, after the original function is called\n\t\t//\t|\t\t});\n\t\t//\n\t\t// example:\n\t\t//\tThe returned signal object can be used to cancel the advice.\n\t\t//\t|\tsignal.remove(); // this will stop the advice from being executed anymore\n\t\t//\t|\taspect.before(targetObject, \"methodName\", function(someArgument){\n\t\t//\t|\t\t// this will be called when targetObject.methodName() is called, before the original function is called\n\t\t//\t|\t });\n\n\t\tbefore: before,\n\t\taround: around,\n\t\tafter: after\n\t};\n});\n","define([\"./_base/kernel\", \"./text\"], function(dojo){\n\t// module:\n\t//\t\tdojo/cache\n\n\t// dojo.cache is defined in dojo/text\n\treturn dojo.cache;\n});\n","define([\"exports\", \"./sniff\", \"./_base/lang\", \"./dom\", \"./dom-style\", \"./dom-prop\"],\n\t\tfunction(exports, has, lang, dom, style, prop){\n\t// module:\n\t//\t\tdojo/dom-attr\n\t// summary:\n\t//\t\tThis module defines the core dojo DOM attributes API.\n\n\t// TODOC: summary not showing up in output see https://github.com/csnover/js-doc-parse/issues/42\n\n\t// =============================\n\t// Element attribute Functions\n\t// =============================\n\n\t// This module will be obsolete soon. Use dojo/prop instead.\n\n\t// dojo/dom-attr.get() should conform to http://www.w3.org/TR/DOM-Level-2-Core/\n\n\t// attribute-related functions (to be obsolete soon)\n\tvar forcePropNames = {\n\t\t\tinnerHTML:\t1,\n\t\t\ttextContent:1,\n\t\t\tclassName:\t1,\n\t\t\thtmlFor:\thas(\"ie\") ? 1 : 0,\n\t\t\tvalue:\t\t1\n\t\t},\n\t\tattrNames = {\n\t\t\t// original attribute names\n\t\t\tclassname: \"class\",\n\t\t\thtmlfor: \"for\",\n\t\t\t// for IE\n\t\t\ttabindex: \"tabIndex\",\n\t\t\treadonly: \"readOnly\"\n\t\t};\n\n\tfunction _hasAttr(node, name){\n\t\tvar attr = node.getAttributeNode && node.getAttributeNode(name);\n\t\treturn !!attr && attr.specified; // Boolean\n\t}\n\t\n\t// There is a difference in the presence of certain properties and their default values\n\t// between browsers. For example, on IE \"disabled\" is present on all elements,\n\t// but it is value is \"false\"; \"tabIndex\" of <div> returns 0 by default on IE, yet other browsers\n\t// can return -1.\n\n\texports.has = function hasAttr(/*DOMNode|String*/ node, /*String*/ name){\n\t\t// summary:\n\t\t//\t\tReturns true if the requested attribute is specified on the\n\t\t//\t\tgiven element, and false otherwise.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to check\n\t\t// name: String\n\t\t//\t\tthe name of the attribute\n\t\t// returns: Boolean\n\t\t//\t\ttrue if the requested attribute is specified on the\n\t\t//\t\tgiven element, and false otherwise\n\n\t\tvar lc = name.toLowerCase();\n\t\treturn !!forcePropNames[prop.names[lc] || name] || _hasAttr(dom.byId(node), attrNames[lc] || name);\t// Boolean\n\t};\n\n\texports.get = function getAttr(/*DOMNode|String*/ node, /*String*/ name){\n\t\t// summary:\n\t\t//\t\tGets an attribute on an HTML element.\n\t\t// description:\n\t\t//\t\tHandles normalized getting of attributes on DOM Nodes.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to get the attribute on\n\t\t// name: String\n\t\t//\t\tthe name of the attribute to get.\n\t\t// returns:\n\t\t//\t\tthe value of the requested attribute or null if that attribute does not have a specified or\n\t\t//\t\tdefault value;\n\t\t//\n\t\t// example:\n\t\t//\t|\t// get the current value of the \"foo\" attribute on a node\n\t\t//\t|\trequire([\"dojo/dom-attr\", \"dojo/dom\"], function(domAttr, dom){\n\t\t//\t|\t\tdomAttr.get(dom.byId(\"nodeId\"), \"foo\");\n\t\t//\t|\t\t// or we can just pass the id:\n\t\t//\t|\t\tdomAttr.get(\"nodeId\", \"foo\");\n\t\t//\t|\t});\t\n\t\t//\t|\t\n\n\t\tnode = dom.byId(node);\n\t\tvar lc = name.toLowerCase(),\n\t\t\tpropName = prop.names[lc] || name,\n\t\t\tforceProp = forcePropNames[propName],\n\t\t\tvalue = node[propName];\t\t// should we access this attribute via a property or via getAttribute()?\n\n\t\tif(forceProp && typeof value != \"undefined\"){\n\t\t\t// node's property\n\t\t\treturn value;\t// Anything\n\t\t}\n\t\t\n\t\tif(propName == \"textContent\"){\n\t\t\treturn prop.get(node, propName);\n\t\t}\n\t\t\n\t\tif(propName != \"href\" && (typeof value == \"boolean\" || lang.isFunction(value))){\n\t\t\t// node's property\n\t\t\treturn value;\t// Anything\n\t\t}\n\t\t// node's attribute\n\t\t// we need _hasAttr() here to guard against IE returning a default value\n\t\tvar attrName = attrNames[lc] || name;\n\t\treturn _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything\n\t};\n\n\texports.set = function setAttr(/*DOMNode|String*/ node, /*String|Object*/ name, /*String?*/ value){\n\t\t// summary:\n\t\t//\t\tSets an attribute on an HTML element.\n\t\t// description:\n\t\t//\t\tHandles normalized setting of attributes on DOM Nodes.\n\t\t//\n\t\t//\t\tWhen passing functions as values, note that they will not be\n\t\t//\t\tdirectly assigned to slots on the node, but rather the default\n\t\t//\t\tbehavior will be removed and the new behavior will be added\n\t\t//\t\tusing `dojo.connect()`, meaning that event handler properties\n\t\t//\t\twill be normalized and that some caveats with regards to\n\t\t//\t\tnon-standard behaviors for onsubmit apply. Namely that you\n\t\t//\t\tshould cancel form submission using `dojo.stopEvent()` on the\n\t\t//\t\tpassed event object instead of returning a boolean value from\n\t\t//\t\tthe handler itself.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to set the attribute on\n\t\t// name: String|Object\n\t\t//\t\tthe name of the attribute to set, or a hash of key-value pairs to set.\n\t\t// value: String?\n\t\t//\t\tthe value to set for the attribute, if the name is a string.\n\t\t// returns:\n\t\t//\t\tthe DOM node\n\t\t//\n\t\t// example:\n\t\t//\t|\t// use attr() to set the tab index\n\t\t//\t|\trequire([\"dojo/dom-attr\"], function(domAttr){\n\t\t//\t|\t\tdomAttr.set(\"nodeId\", \"tabIndex\", 3);\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tSet multiple values at once, including event handlers:\n\t\t//\t|\trequire([\"dojo/dom-attr\"],\n\t\t//\t|\tfunction(domAttr){\n\t\t//\t|\t\tdomAttr.set(\"formId\", {\n\t\t//\t|\t\t\t\"foo\": \"bar\",\n\t\t//\t|\t\t\t\"tabIndex\": -1,\n\t\t//\t|\t\t\t\"method\": \"POST\"\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\n\t\tnode = dom.byId(node);\n\t\tif(arguments.length == 2){ // inline'd type check\n\t\t\t// the object form of setter: the 2nd argument is a dictionary\n\t\t\tfor(var x in name){\n\t\t\t\texports.set(node, x, name[x]);\n\t\t\t}\n\t\t\treturn node; // DomNode\n\t\t}\n\t\tvar lc = name.toLowerCase(),\n\t\t\tpropName = prop.names[lc] || name,\n\t\t\tforceProp = forcePropNames[propName];\n\t\tif(propName == \"style\" && typeof value != \"string\"){ // inline'd type check\n\t\t\t// special case: setting a style\n\t\t\tstyle.set(node, value);\n\t\t\treturn node; // DomNode\n\t\t}\n\t\tif(forceProp || typeof value == \"boolean\" || lang.isFunction(value)){\n\t\t\treturn prop.set(node, name, value);\n\t\t}\n\t\t// node's attribute\n\t\tnode.setAttribute(attrNames[lc] || name, value);\n\t\treturn node; // DomNode\n\t};\n\n\texports.remove = function removeAttr(/*DOMNode|String*/ node, /*String*/ name){\n\t\t// summary:\n\t\t//\t\tRemoves an attribute from an HTML element.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to remove the attribute from\n\t\t// name: String\n\t\t//\t\tthe name of the attribute to remove\n\n\t\tdom.byId(node).removeAttribute(attrNames[name.toLowerCase()] || name);\n\t};\n\n\texports.getNodeProp = function getNodeProp(/*DomNode|String*/ node, /*String*/ name){\n\t\t// summary:\n\t\t//\t\tReturns an effective value of a property or an attribute.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to remove the attribute from\n\t\t// name: String\n\t\t//\t\tthe name of the attribute\n\t\t// returns:\n\t\t//\t\tthe value of the attribute\n\n\t\tnode = dom.byId(node);\n\t\tvar lc = name.toLowerCase(), propName = prop.names[lc] || name;\n\t\tif((propName in node) && propName != \"href\"){\n\t\t\t// node's property\n\t\t\treturn node[propName];\t// Anything\n\t\t}\n\t\t// node's attribute\n\t\tvar attrName = attrNames[lc] || name;\n\t\treturn _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything\n\t};\n});\n","define([\"./_base/lang\", \"./_base/array\", \"./dom\"], function(lang, array, dom){\n\t// module:\n\t//\t\tdojo/dom-class\n\n\tvar className = \"className\";\n\n\t/* Part I of classList-based implementation is preserved here for posterity\n\tvar classList = \"classList\";\n\thas.add(\"dom-classList\", function(){\n\t\treturn classList in document.createElement(\"p\");\n\t});\n\t*/\n\n\t// =============================\n\t// (CSS) Class Functions\n\t// =============================\n\n\tvar cls, // exports object\n\t\tspaces = /\\s+/, a1 = [\"\"];\n\n\tfunction str2array(s){\n\t\tif(typeof s == \"string\" || s instanceof String){\n\t\t\tif(s && !spaces.test(s)){\n\t\t\t\ta1[0] = s;\n\t\t\t\treturn a1;\n\t\t\t}\n\t\t\tvar a = s.split(spaces);\n\t\t\tif(a.length && !a[0]){\n\t\t\t\ta.shift();\n\t\t\t}\n\t\t\tif(a.length && !a[a.length - 1]){\n\t\t\t\ta.pop();\n\t\t\t}\n\t\t\treturn a;\n\t\t}\n\t\t// assumed to be an array\n\t\tif(!s){\n\t\t\treturn [];\n\t\t}\n\t\treturn array.filter(s, function(x){ return x; });\n\t}\n\n\t/* Part II of classList-based implementation is preserved here for posterity\n\tif(has(\"dom-classList\")){\n\t\t// new classList version\n\t\tcls = {\n\t\t\tcontains: function containsClass(node, classStr){\n\t\t\t\tvar clslst = classStr && dom.byId(node)[classList];\n\t\t\t\treturn clslst && clslst.contains(classStr); // Boolean\n\t\t\t},\n\n\t\t\tadd: function addClass(node, classStr){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\tnode[classList].add(classStr[i]);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tremove: function removeClass(node, classStr){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tif(classStr === undefined){\n\t\t\t\t\tnode[className] = \"\";\n\t\t\t\t}else{\n\t\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\t\tnode[classList].remove(classStr[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\treplace: function replaceClass(node, addClassStr, removeClassStr){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tif(removeClassStr === undefined){\n\t\t\t\t\tnode[className] = \"\";\n\t\t\t\t}else{\n\t\t\t\t\tremoveClassStr = str2array(removeClassStr);\n\t\t\t\t\tfor(var i = 0, len = removeClassStr.length; i < len; ++i){\n\t\t\t\t\t\tnode[classList].remove(removeClassStr[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taddClassStr = str2array(addClassStr);\n\t\t\t\tfor(i = 0, len = addClassStr.length; i < len; ++i){\n\t\t\t\t\tnode[classList].add(addClassStr[i]);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ttoggle: function toggleClass(node, classStr, condition){\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tif(condition === undefined){\n\t\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\t\tnode[classList].toggle(classStr[i]);\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tcls[condition ? \"add\" : \"remove\"](node, classStr);\n\t\t\t\t}\n\t\t\t\treturn condition; // Boolean\n\t\t\t}\n\t\t}\n\t}\n\t*/\n\n\t// regular DOM version\n\tvar fakeNode = {}; // for effective replacement\n\tcls = {\n\t\t// summary:\n\t\t//\t\tThis module defines the core dojo DOM class API.\n\n\t\tcontains: function containsClass(/*DomNode|String*/ node, /*String*/ classStr){\n\t\t\t// summary:\n\t\t\t//\t\tReturns whether or not the specified classes are a portion of the\n\t\t\t//\t\tclass list currently applied to the node.\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to check the class for.\n\t\t\t// classStr: String\n\t\t\t//\t\tA string class name to look for.\n\t\t\t// example:\n\t\t\t//\t\tDo something if a node with id=\"someNode\" has class=\"aSillyClassName\" present\n\t\t\t//\t|\tif(domClass.contains(\"someNode\",\"aSillyClassName\")){ ... }\n\n\t\t\treturn ((\" \" + dom.byId(node)[className] + \" \").indexOf(\" \" + classStr + \" \") >= 0); // Boolean\n\t\t},\n\n\t\tadd: function addClass(/*DomNode|String*/ node, /*String|Array*/ classStr){\n\t\t\t// summary:\n\t\t\t//\t\tAdds the specified classes to the end of the class list on the\n\t\t\t//\t\tpassed node. Will not re-apply duplicate classes.\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to add a class string too\n\t\t\t//\n\t\t\t// classStr: String|Array\n\t\t\t//\t\tA String class name to add, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAdd a class to some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.add(\"someNode\", \"anewClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAdd two classes at once:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.add(\"someNode\", \"firstClass secondClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAdd two classes at once (using array):\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.add(\"someNode\", [\"firstClass\", \"secondClass\"]);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAvailable in `dojo/NodeList` for multiple additions\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\"ul > li\").addClass(\"firstLevel\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tclassStr = str2array(classStr);\n\t\t\tvar cls = node[className], oldLen;\n\t\t\tcls = cls ? \" \" + cls + \" \" : \" \";\n\t\t\toldLen = cls.length;\n\t\t\tfor(var i = 0, len = classStr.length, c; i < len; ++i){\n\t\t\t\tc = classStr[i];\n\t\t\t\tif(c && cls.indexOf(\" \" + c + \" \") < 0){\n\t\t\t\t\tcls += c + \" \";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(oldLen < cls.length){\n\t\t\t\tnode[className] = cls.substr(1, cls.length - 2);\n\t\t\t}\n\t\t},\n\n\t\tremove: function removeClass(/*DomNode|String*/ node, /*String|Array?*/ classStr){\n\t\t\t// summary:\n\t\t\t//\t\tRemoves the specified classes from node. No `contains()`\n\t\t\t//\t\tcheck is required.\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to remove the class from.\n\t\t\t//\n\t\t\t// classStr: String|Array\n\t\t\t//\t\tAn optional String class name to remove, or several space-separated\n\t\t\t//\t\tclass names, or an array of class names. If omitted, all class names\n\t\t\t//\t\twill be deleted.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove a class from some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\", \"firstClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove two classes from some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\", \"firstClass secondClass\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove two classes from some node (using array):\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\", [\"firstClass\", \"secondClass\"]);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tRemove all classes from some node:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.remove(\"someNode\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAvailable in `dojo/NodeList` for multiple removal\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\"ul > li\").removeClass(\"foo\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tvar cls;\n\t\t\tif(classStr !== undefined){\n\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\tcls = \" \" + node[className] + \" \";\n\t\t\t\tfor(var i = 0, len = classStr.length; i < len; ++i){\n\t\t\t\t\tcls = cls.replace(\" \" + classStr[i] + \" \", \" \");\n\t\t\t\t}\n\t\t\t\tcls = lang.trim(cls);\n\t\t\t}else{\n\t\t\t\tcls = \"\";\n\t\t\t}\n\t\t\tif(node[className] != cls){ node[className] = cls; }\n\t\t},\n\n\t\treplace: function replaceClass(/*DomNode|String*/ node, /*String|Array*/ addClassStr, /*String|Array?*/ removeClassStr){\n\t\t\t// summary:\n\t\t\t//\t\tReplaces one or more classes on a node if not present.\n\t\t\t//\t\tOperates more quickly than calling domClass.remove and domClass.add\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to remove the class from.\n\t\t\t//\n\t\t\t// addClassStr: String|Array\n\t\t\t//\t\tA String class name to add, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// removeClassStr: String|Array?\n\t\t\t//\t\tA String class name to remove, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.replace(\"someNode\", \"add1 add2\", \"remove1 remove2\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tReplace all classes with addMe\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.replace(\"someNode\", \"addMe\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tAvailable in `dojo/NodeList` for multiple toggles\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\".findMe\").replaceClass(\"addMe\", \"removeMe\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tfakeNode[className] = node[className];\n\t\t\tcls.remove(fakeNode, removeClassStr);\n\t\t\tcls.add(fakeNode, addClassStr);\n\t\t\tif(node[className] !== fakeNode[className]){\n\t\t\t\tnode[className] = fakeNode[className];\n\t\t\t}\n\t\t},\n\n\t\ttoggle: function toggleClass(/*DomNode|String*/ node, /*String|Array*/ classStr, /*Boolean?*/ condition){\n\t\t\t// summary:\n\t\t\t//\t\tAdds a class to node if not present, or removes if present.\n\t\t\t//\t\tPass a boolean condition if you want to explicitly add or remove.\n\t\t\t//\t\tReturns the condition that was specified directly or indirectly.\n\t\t\t//\n\t\t\t// node: String|DOMNode\n\t\t\t//\t\tString ID or DomNode reference to toggle a class string\n\t\t\t//\n\t\t\t// classStr: String|Array\n\t\t\t//\t\tA String class name to toggle, or several space-separated class names,\n\t\t\t//\t\tor an array of class names.\n\t\t\t//\n\t\t\t// condition:\n\t\t\t//\t\tIf passed, true means to add the class, false means to remove.\n\t\t\t//\t\tOtherwise domClass.contains(node, classStr) is used to detect the class presence.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.toggle(\"someNode\", \"hovered\");\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tForcefully add a class\n\t\t\t//\t|\trequire([\"dojo/dom-class\"], function(domClass){\n\t\t\t//\t|\t\tdomClass.toggle(\"someNode\", \"hovered\", true);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAvailable in `dojo/NodeList` for multiple toggles\n\t\t\t//\t|\trequire([\"dojo/query\"], function(query){\n\t\t\t//\t|\t\tquery(\".toggleMe\").toggleClass(\"toggleMe\");\n\t\t\t//\t|\t});\n\n\t\t\tnode = dom.byId(node);\n\t\t\tif(condition === undefined){\n\t\t\t\tclassStr = str2array(classStr);\n\t\t\t\tfor(var i = 0, len = classStr.length, c; i < len; ++i){\n\t\t\t\t\tc = classStr[i];\n\t\t\t\t\tcls[cls.contains(node, c) ? \"remove\" : \"add\"](node, c);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tcls[condition ? \"add\" : \"remove\"](node, classStr);\n\t\t\t}\n\t\t\treturn condition; // Boolean\n\t\t}\n\t};\n\n\treturn cls;\n});\n","define([\"exports\", \"./_base/kernel\", \"./sniff\", \"./_base/window\", \"./dom\", \"./dom-attr\"],\n\t\tfunction(exports, dojo, has, win, dom, attr){\n\t// module:\n\t//\t\tdojo/dom-construct\n\t// summary:\n\t//\t\tThis module defines the core dojo DOM construction API.\n\n\t// TODOC: summary not showing up in output, see https://github.com/csnover/js-doc-parse/issues/42\n\n\t// support stuff for toDom()\n\tvar tagWrap = {\n\t\t\toption: [\"select\"],\n\t\t\ttbody: [\"table\"],\n\t\t\tthead: [\"table\"],\n\t\t\ttfoot: [\"table\"],\n\t\t\ttr: [\"table\", \"tbody\"],\n\t\t\ttd: [\"table\", \"tbody\", \"tr\"],\n\t\t\tth: [\"table\", \"thead\", \"tr\"],\n\t\t\tlegend: [\"fieldset\"],\n\t\t\tcaption: [\"table\"],\n\t\t\tcolgroup: [\"table\"],\n\t\t\tcol: [\"table\", \"colgroup\"],\n\t\t\tli: [\"ul\"]\n\t\t},\n\t\treTag = /<\\s*([\\w\\:]+)/,\n\t\tmasterNode = {}, masterNum = 0,\n\t\tmasterName = \"__\" + dojo._scopeName + \"ToDomId\";\n\n\t// generate start/end tag strings to use\n\t// for the injection for each special tag wrap case.\n\tfor(var param in tagWrap){\n\t\tif(tagWrap.hasOwnProperty(param)){\n\t\t\tvar tw = tagWrap[param];\n\t\t\ttw.pre = param == \"option\" ? '<select multiple=\"multiple\">' : \"<\" + tw.join(\"><\") + \">\";\n\t\t\ttw.post = \"</\" + tw.reverse().join(\"></\") + \">\";\n\t\t\t// the last line is destructive: it reverses the array,\n\t\t\t// but we don't care at this point\n\t\t}\n\t}\n\n\tvar html5domfix;\n\tif(has(\"ie\") <= 8){\n\t\thtml5domfix = function(doc){\n\t\t\tdoc.__dojo_html5_tested = \"yes\";\n\t\t\tvar div = create('div', {innerHTML: \"<nav>a</nav>\", style: {visibility: \"hidden\"}}, doc.body);\n\t\t\tif(div.childNodes.length !== 1){\n\t\t\t\t('abbr article aside audio canvas details figcaption figure footer header ' +\n\t\t\t\t'hgroup mark meter nav output progress section summary time video').replace(\n\t\t\t\t\t/\\b\\w+\\b/g, function(n){\n\t\t\t\t\t\tdoc.createElement(n);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tdestroy(div);\n\t\t}\n\t}\n\n\tfunction _insertBefore(/*DomNode*/ node, /*DomNode*/ ref){\n\t\tvar parent = ref.parentNode;\n\t\tif(parent){\n\t\t\tparent.insertBefore(node, ref);\n\t\t}\n\t}\n\n\tfunction _insertAfter(/*DomNode*/ node, /*DomNode*/ ref){\n\t\t// summary:\n\t\t//\t\tTry to insert node after ref\n\t\tvar parent = ref.parentNode;\n\t\tif(parent){\n\t\t\tif(parent.lastChild == ref){\n\t\t\t\tparent.appendChild(node);\n\t\t\t}else{\n\t\t\t\tparent.insertBefore(node, ref.nextSibling);\n\t\t\t}\n\t\t}\n\t}\n\n\texports.toDom = function toDom(frag, doc){\n\t\t// summary:\n\t\t//\t\tinstantiates an HTML fragment returning the corresponding DOM.\n\t\t// frag: String\n\t\t//\t\tthe HTML fragment\n\t\t// doc: DocumentNode?\n\t\t//\t\toptional document to use when creating DOM nodes, defaults to\n\t\t//\t\tdojo/_base/window.doc if not specified.\n\t\t// returns:\n\t\t//\t\tDocument fragment, unless it's a single node in which case it returns the node itself\n\t\t// example:\n\t\t//\t\tCreate a table row:\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tvar tr = domConstruct.toDom(\"<tr><td>First!</td></tr>\");\n\t\t//\t|\t});\n\n\t\tdoc = doc || win.doc;\n\t\tvar masterId = doc[masterName];\n\t\tif(!masterId){\n\t\t\tdoc[masterName] = masterId = ++masterNum + \"\";\n\t\t\tmasterNode[masterId] = doc.createElement(\"div\");\n\t\t}\n\n\t\tif(has(\"ie\") <= 8){\n\t\t\tif(!doc.__dojo_html5_tested && doc.body){\n\t\t\t\thtml5domfix(doc);\n\t\t\t}\n\t\t}\n\n\t\t// make sure the frag is a string.\n\t\tfrag += \"\";\n\n\t\t// find the starting tag, and get node wrapper\n\t\tvar match = frag.match(reTag),\n\t\t\ttag = match ? match[1].toLowerCase() : \"\",\n\t\t\tmaster = masterNode[masterId],\n\t\t\twrap, i, fc, df;\n\t\tif(match && tagWrap[tag]){\n\t\t\twrap = tagWrap[tag];\n\t\t\tmaster.innerHTML = wrap.pre + frag + wrap.post;\n\t\t\tfor(i = wrap.length; i; --i){\n\t\t\t\tmaster = master.firstChild;\n\t\t\t}\n\t\t}else{\n\t\t\tmaster.innerHTML = frag;\n\t\t}\n\n\t\t// one node shortcut => return the node itself\n\t\tif(master.childNodes.length == 1){\n\t\t\treturn master.removeChild(master.firstChild); // DOMNode\n\t\t}\n\n\t\t// return multiple nodes as a document fragment\n\t\tdf = doc.createDocumentFragment();\n\t\twhile((fc = master.firstChild)){ // intentional assignment\n\t\t\tdf.appendChild(fc);\n\t\t}\n\t\treturn df; // DocumentFragment\n\t};\n\n\texports.place = function place(node, refNode, position){\n\t\t// summary:\n\t\t//\t\tAttempt to insert node into the DOM, choosing from various positioning options.\n\t\t//\t\tReturns the first argument resolved to a DOM node.\n\t\t// node: DOMNode|DocumentFragment|String\n\t\t//\t\tid or node reference, or HTML fragment starting with \"<\" to place relative to refNode\n\t\t// refNode: DOMNode|String\n\t\t//\t\tid or node reference to use as basis for placement\n\t\t// position: String|Number?\n\t\t//\t\tstring noting the position of node relative to refNode or a\n\t\t//\t\tnumber indicating the location in the childNodes collection of refNode.\n\t\t//\t\tAccepted string values are:\n\t\t//\n\t\t//\t\t- before\n\t\t//\t\t- after\n\t\t//\t\t- replace\n\t\t//\t\t- only\n\t\t//\t\t- first\n\t\t//\t\t- last\n\t\t//\n\t\t//\t\t\"first\" and \"last\" indicate positions as children of refNode, \"replace\" replaces refNode,\n\t\t//\t\t\"only\" replaces all children. position defaults to \"last\" if not specified\n\t\t// returns: DOMNode\n\t\t//\t\tReturned values is the first argument resolved to a DOM node.\n\t\t//\n\t\t//\t\t.place() is also a method of `dojo/NodeList`, allowing `dojo/query` node lookups.\n\t\t// example:\n\t\t//\t\tPlace a node by string id as the last child of another node by string id:\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tdomConstruct.place(\"someNode\", \"anotherNode\");\n\t\t//\t|\t});\n\t\t// example:\n\t\t//\t\tPlace a node by string id before another node by string id\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tdomConstruct.place(\"someNode\", \"anotherNode\", \"before\");\n\t\t//\t|\t});\n\t\t// example:\n\t\t//\t\tCreate a Node, and place it in the body element (last child):\n\t\t//\t|\trequire([\"dojo/dom-construct\", \"dojo/_base/window\"\n\t\t//\t|\t], function(domConstruct, win){\n\t\t//\t|\t\tdomConstruct.place(\"<div></div>\", win.body());\n\t\t//\t|\t});\n\t\t// example:\n\t\t//\t\tPut a new LI as the first child of a list by id:\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tdomConstruct.place(\"<li></li>\", \"someUl\", \"first\");\n\t\t//\t|\t});\n\n\t\trefNode = dom.byId(refNode);\n\t\tif(typeof node == \"string\"){ // inline'd type check\n\t\t\tnode = /^\\s*</.test(node) ? exports.toDom(node, refNode.ownerDocument) : dom.byId(node);\n\t\t}\n\t\tif(typeof position == \"number\"){ // inline'd type check\n\t\t\tvar cn = refNode.childNodes;\n\t\t\tif(!cn.length || cn.length <= position){\n\t\t\t\trefNode.appendChild(node);\n\t\t\t}else{\n\t\t\t\t_insertBefore(node, cn[position < 0 ? 0 : position]);\n\t\t\t}\n\t\t}else{\n\t\t\tswitch(position){\n\t\t\t\tcase \"before\":\n\t\t\t\t\t_insertBefore(node, refNode);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"after\":\n\t\t\t\t\t_insertAfter(node, refNode);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"replace\":\n\t\t\t\t\trefNode.parentNode.replaceChild(node, refNode);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"only\":\n\t\t\t\t\texports.empty(refNode);\n\t\t\t\t\trefNode.appendChild(node);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"first\":\n\t\t\t\t\tif(refNode.firstChild){\n\t\t\t\t\t\t_insertBefore(node, refNode.firstChild);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// else fallthrough...\n\t\t\t\tdefault: // aka: last\n\t\t\t\t\trefNode.appendChild(node);\n\t\t\t}\n\t\t}\n\t\treturn node; // DomNode\n\t};\n\n\tvar create = exports.create = function create(/*DOMNode|String*/ tag, /*Object*/ attrs, /*DOMNode|String?*/ refNode, /*String?*/ pos){\n\t\t// summary:\n\t\t//\t\tCreate an element, allowing for optional attribute decoration\n\t\t//\t\tand placement.\n\t\t// description:\n\t\t//\t\tA DOM Element creation function. A shorthand method for creating a node or\n\t\t//\t\ta fragment, and allowing for a convenient optional attribute setting step,\n\t\t//\t\tas well as an optional DOM placement reference.\n\t\t//\n\t\t//\t\tAttributes are set by passing the optional object through `dojo/dom-attr.set`.\n\t\t//\t\tSee `dojo/dom-attr.set` for noted caveats and nuances, and API if applicable.\n\t\t//\n\t\t//\t\tPlacement is done via `dojo/dom-construct.place`, assuming the new node to be\n\t\t//\t\tthe action node, passing along the optional reference node and position.\n\t\t// tag: DOMNode|String\n\t\t//\t\tA string of the element to create (eg: \"div\", \"a\", \"p\", \"li\", \"script\", \"br\"),\n\t\t//\t\tor an existing DOM node to process.\n\t\t// attrs: Object\n\t\t//\t\tAn object-hash of attributes to set on the newly created node.\n\t\t//\t\tCan be null, if you don't want to set any attributes/styles.\n\t\t//\t\tSee: `dojo/dom-attr.set` for a description of available attributes.\n\t\t// refNode: DOMNode|String?\n\t\t//\t\tOptional reference node. Used by `dojo/dom-construct.place` to place the newly created\n\t\t//\t\tnode somewhere in the dom relative to refNode. Can be a DomNode reference\n\t\t//\t\tor String ID of a node.\n\t\t// pos: String?\n\t\t//\t\tOptional positional reference. Defaults to \"last\" by way of `dojo/domConstruct.place`,\n\t\t//\t\tthough can be set to \"first\",\"after\",\"before\",\"last\", \"replace\" or \"only\"\n\t\t//\t\tto further control the placement of the new node relative to the refNode.\n\t\t//\t\t'refNode' is required if a 'pos' is specified.\n\t\t// example:\n\t\t//\t\tCreate a DIV:\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tvar n = domConstruct.create(\"div\");\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tCreate a DIV with content:\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tvar n = domConstruct.create(\"div\", { innerHTML:\"<p>hi</p>\" });\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tPlace a new DIV in the BODY, with no attributes set\n\t\t//\t|\trequire([\"dojo/dom-construct\", \"dojo/_base/window\"], function(domConstruct, win){\n\t\t//\t|\t\tvar n = domConstruct.create(\"div\", null, win.body());\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tCreate an UL, and populate it with LI's. Place the list as the first-child of a\n\t\t//\t\tnode with id=\"someId\":\n\t\t//\t|\trequire([\"dojo/dom-construct\", \"dojo/_base/array\"],\n\t\t//\t|\tfunction(domConstruct, arrayUtil){\n\t\t//\t|\t\tvar ul = domConstruct.create(\"ul\", null, \"someId\", \"first\");\n\t\t//\t|\t\tvar items = [\"one\", \"two\", \"three\", \"four\"];\n\t\t//\t|\t\tarrayUtil.forEach(items, function(data){\n\t\t//\t|\t\t\tdomConstruct.create(\"li\", { innerHTML: data }, ul);\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tCreate an anchor, with an href. Place in BODY:\n\t\t//\t|\trequire([\"dojo/dom-construct\", \"dojo/_base/window\"], function(domConstruct, win){\n\t\t//\t|\t\tdomConstruct.create(\"a\", { href:\"foo.html\", title:\"Goto FOO!\" }, win.body());\n\t\t//\t|\t});\n\n\t\tvar doc = win.doc;\n\t\tif(refNode){\n\t\t\trefNode = dom.byId(refNode);\n\t\t\tdoc = refNode.ownerDocument;\n\t\t}\n\t\tif(typeof tag == \"string\"){ // inline'd type check\n\t\t\ttag = doc.createElement(tag);\n\t\t}\n\t\tif(attrs){ attr.set(tag, attrs); }\n\t\tif(refNode){ exports.place(tag, refNode, pos); }\n\t\treturn tag; // DomNode\n\t};\n\n\tfunction _empty(/*DomNode*/ node){\n\t\t// TODO: remove this if() block in 2.0 when we no longer have to worry about IE memory leaks,\n\t\t// and then uncomment the emptyGrandchildren() test case from html.html.\n\t\t// Note that besides fixing #16957, using removeChild() is actually faster than setting node.innerHTML,\n\t\t// see http://jsperf.com/clear-dom-node.\n\t\tif(\"innerHTML\" in node){\n\t\t\ttry{\n\t\t\t\t// fast path\n\t\t\t\tnode.innerHTML = \"\";\n\t\t\t\treturn;\n\t\t\t}catch(e){\n\t\t\t\t// innerHTML is readOnly (e.g. TABLE (sub)elements in quirks mode)\n\t\t\t\t// Fall through (saves bytes)\n\t\t\t}\n\t\t}\n\n\t\t// SVG/strict elements don't support innerHTML\n\t\tfor(var c; c = node.lastChild;){ // intentional assignment\n\t\t\tnode.removeChild(c);\n\t\t}\n\t}\n\n\texports.empty = function empty(/*DOMNode|String*/ node){\n\t\t// summary:\n\t\t//\t\tsafely removes all children of the node.\n\t\t// node: DOMNode|String\n\t\t//\t\ta reference to a DOM node or an id.\n\t\t// example:\n\t\t//\t\tDestroy node's children byId:\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tdomConstruct.empty(\"someId\");\n\t\t//\t|\t});\n\n\t\t_empty(dom.byId(node));\n\t};\n\n\n\tfunction _destroy(/*DomNode*/ node, /*DomNode*/ parent){\n\t\t// in IE quirks, node.canHaveChildren can be false but firstChild can be non-null (OBJECT/APPLET)\n\t\tif(node.firstChild){\n\t\t\t_empty(node);\n\t\t}\n\t\tif(parent){\n\t\t\t// removeNode(false) doesn't leak in IE 6+, but removeChild() and removeNode(true) are known to leak under IE 8- while 9+ is TBD.\n\t\t\t// In IE quirks mode, PARAM nodes as children of OBJECT/APPLET nodes have a removeNode method that does nothing and\n\t\t\t// the parent node has canHaveChildren=false even though removeChild correctly removes the PARAM children.\n\t\t\t// In IE, SVG/strict nodes don't have a removeNode method nor a canHaveChildren boolean.\n\t\t\thas(\"ie\") && parent.canHaveChildren && \"removeNode\" in node ? node.removeNode(false) : parent.removeChild(node);\n\t\t}\n\t}\n\tvar destroy = exports.destroy = function destroy(/*DOMNode|String*/ node){\n\t\t// summary:\n\t\t//\t\tRemoves a node from its parent, clobbering it and all of its\n\t\t//\t\tchildren.\n\t\t//\n\t\t// description:\n\t\t//\t\tRemoves a node from its parent, clobbering it and all of its\n\t\t//\t\tchildren. Function only works with DomNodes, and returns nothing.\n\t\t//\n\t\t// node: DOMNode|String\n\t\t//\t\tA String ID or DomNode reference of the element to be destroyed\n\t\t//\n\t\t// example:\n\t\t//\t\tDestroy a node byId:\n\t\t//\t|\trequire([\"dojo/dom-construct\"], function(domConstruct){\n\t\t//\t|\t\tdomConstruct.destroy(\"someId\");\n\t\t//\t|\t});\n\n\t\tnode = dom.byId(node);\n\t\tif(!node){ return; }\n\t\t_destroy(node, node.parentNode);\n\t};\n});\n","define([\"./_base/lang\", \"./dom\", \"./io-query\", \"./json\"], function(lang, dom, ioq, json){\n\t// module:\n\t//\t\tdojo/dom-form\n\n function setValue(/*Object*/ obj, /*String*/ name, /*String*/ value){\n // summary:\n //\t\tFor the named property in object, set the value. If a value\n //\t\talready exists and it is a string, convert the value to be an\n //\t\tarray of values.\n\n // Skip it if there is no value\n if(value === null){\n return;\n }\n\n var val = obj[name];\n if(typeof val == \"string\"){ // inline'd type check\n obj[name] = [val, value];\n }else if(lang.isArray(val)){\n val.push(value);\n }else{\n obj[name] = value;\n }\n }\n\n\tvar exclude = \"file|submit|image|reset|button\";\n\n\tvar form = {\n\t\t// summary:\n\t\t//\t\tThis module defines form-processing functions.\n\n\t\tfieldToObject: function fieldToObject(/*DOMNode|String*/ inputNode){\n\t\t\t// summary:\n\t\t\t//\t\tSerialize a form field to a JavaScript object.\n\t\t\t// description:\n\t\t\t//\t\tReturns the value encoded in a form field as\n\t\t\t//\t\tas a string or an array of strings. Disabled form elements\n\t\t\t//\t\tand unchecked radio and checkboxes are skipped.\tMulti-select\n\t\t\t//\t\telements are returned as an array of string values.\n\t\t\t// inputNode: DOMNode|String\n\t\t\t// returns: Object\n\n\t\t\tvar ret = null;\n\t\t\tinputNode = dom.byId(inputNode);\n\t\t\tif(inputNode){\n\t\t\t\tvar _in = inputNode.name, type = (inputNode.type || \"\").toLowerCase();\n\t\t\t\tif(_in && type && !inputNode.disabled){\n\t\t\t\t\tif(type == \"radio\" || type == \"checkbox\"){\n\t\t\t\t\t\tif(inputNode.checked){\n\t\t\t\t\t\t\tret = inputNode.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(inputNode.multiple){\n\t\t\t\t\t\tret = [];\n\t\t\t\t\t\tvar nodes = [inputNode.firstChild];\n\t\t\t\t\t\twhile(nodes.length){\n\t\t\t\t\t\t\tfor(var node = nodes.pop(); node; node = node.nextSibling){\n\t\t\t\t\t\t\t\tif(node.nodeType == 1 && node.tagName.toLowerCase() == \"option\"){\n\t\t\t\t\t\t\t\t\tif(node.selected){\n\t\t\t\t\t\t\t\t\t\tret.push(node.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tif(node.nextSibling){\n\t\t\t\t\t\t\t\t\t\tnodes.push(node.nextSibling);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(node.firstChild){\n\t\t\t\t\t\t\t\t\t\tnodes.push(node.firstChild);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\tret = inputNode.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ret; // Object\n\t\t},\n\n\t\ttoObject: function formToObject(/*DOMNode|String*/ formNode){\n\t\t\t// summary:\n\t\t\t//\t\tSerialize a form node to a JavaScript object.\n\t\t\t// description:\n\t\t\t//\t\tReturns the values encoded in an HTML form as\n\t\t\t//\t\tstring properties in an object which it then returns. Disabled form\n\t\t\t//\t\telements, buttons, and other non-value form elements are skipped.\n\t\t\t//\t\tMulti-select elements are returned as an array of string values.\n\t\t\t// formNode: DOMNode|String\n\t\t\t// example:\n\t\t\t//\t\tThis form:\n\t\t\t//\t\t|\t<form id=\"test_form\">\n\t\t\t//\t\t|\t\t<input type=\"text\" name=\"blah\" value=\"blah\">\n\t\t\t//\t\t|\t\t<input type=\"text\" name=\"no_value\" value=\"blah\" disabled>\n\t\t\t//\t\t|\t\t<input type=\"button\" name=\"no_value2\" value=\"blah\">\n\t\t\t//\t\t|\t\t<select type=\"select\" multiple name=\"multi\" size=\"5\">\n\t\t\t//\t\t|\t\t\t<option value=\"blah\">blah</option>\n\t\t\t//\t\t|\t\t\t<option value=\"thud\" selected>thud</option>\n\t\t\t//\t\t|\t\t\t<option value=\"thonk\" selected>thonk</option>\n\t\t\t//\t\t|\t\t</select>\n\t\t\t//\t\t|\t</form>\n\t\t\t//\n\t\t\t//\t\tyields this object structure as the result of a call to\n\t\t\t//\t\tformToObject():\n\t\t\t//\n\t\t\t//\t\t|\t{\n\t\t\t//\t\t|\t\tblah: \"blah\",\n\t\t\t//\t\t|\t\tmulti: [\n\t\t\t//\t\t|\t\t\t\"thud\",\n\t\t\t//\t\t|\t\t\t\"thonk\"\n\t\t\t//\t\t|\t\t]\n\t\t\t//\t\t|\t};\n\n\t\t\tvar ret = {}, elems = dom.byId(formNode).elements;\n\t\t\tfor(var i = 0, l = elems.length; i < l; ++i){\n\t\t\t\tvar item = elems[i], _in = item.name, type = (item.type || \"\").toLowerCase();\n\t\t\t\tif(_in && type && exclude.indexOf(type) < 0 && !item.disabled){\n\t\t\t\t\tsetValue(ret, _in, form.fieldToObject(item));\n\t\t\t\t\tif(type == \"image\"){\n\t\t\t\t\t\tret[_in + \".x\"] = ret[_in + \".y\"] = ret[_in].x = ret[_in].y = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ret; // Object\n\t\t},\n\n\t\ttoQuery: function formToQuery(/*DOMNode|String*/ formNode){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a URL-encoded string representing the form passed as either a\n\t\t\t//\t\tnode or string ID identifying the form to serialize\n\t\t\t// formNode: DOMNode|String\n\t\t\t// returns: String\n\n\t\t\treturn ioq.objectToQuery(form.toObject(formNode)); // String\n\t\t},\n\n\t\ttoJson: function formToJson(/*DOMNode|String*/ formNode, /*Boolean?*/ prettyPrint){\n\t\t\t// summary:\n\t\t\t//\t\tCreate a serialized JSON string from a form node or string\n\t\t\t//\t\tID identifying the form to serialize\n\t\t\t// formNode: DOMNode|String\n\t\t\t// prettyPrint: Boolean?\n\t\t\t// returns: String\n\n\t\t\treturn json.stringify(form.toObject(formNode), null, prettyPrint ? 4 : 0); // String\n\t\t}\n\t};\n\n return form;\n});\n","define([\"./sniff\", \"./_base/window\",\"./dom\", \"./dom-style\"],\n\t\tfunction(has, win, dom, style){\n\t// module:\n\t//\t\tdojo/dom-geometry\n\n\t// the result object\n\tvar geom = {\n\t\t// summary:\n\t\t//\t\tThis module defines the core dojo DOM geometry API.\n\t};\n\n\t// Box functions will assume this model.\n\t// On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode.\n\t// Can be set to change behavior of box setters.\n\n\t// can be either:\n\t//\t\"border-box\"\n\t//\t\"content-box\" (default)\n\tgeom.boxModel = \"content-box\";\n\n\t// We punt per-node box mode testing completely.\n\t// If anybody cares, we can provide an additional (optional) unit\n\t// that overrides existing code to include per-node box sensitivity.\n\n\t// Opera documentation claims that Opera 9 uses border-box in BackCompat mode.\n\t// but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box.\n\t// IIRC, earlier versions of Opera did in fact use border-box.\n\t// Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault.\n\n\tif(has(\"ie\") /*|| has(\"opera\")*/){\n\t\t// client code may have to adjust if compatMode varies across iframes\n\t\tgeom.boxModel = document.compatMode == \"BackCompat\" ? \"border-box\" : \"content-box\";\n\t}\n\n\tgeom.getPadExtents = function getPadExtents(/*DomNode*/ node, /*Object*/ computedStyle){\n\t\t// summary:\n\t\t//\t\tReturns object with special values specifically useful for node\n\t\t//\t\tfitting.\n\t\t// description:\n\t\t//\t\tReturns an object with `w`, `h`, `l`, `t` properties:\n\t\t//\t|\t\tl/t/r/b = left/top/right/bottom padding (respectively)\n\t\t//\t|\t\tw = the total of the left and right padding\n\t\t//\t|\t\th = the total of the top and bottom padding\n\t\t//\t\tIf 'node' has position, l/t forms the origin for child nodes.\n\t\t//\t\tThe w/h are used for calculating boxes.\n\t\t//\t\tNormally application code will not need to invoke this\n\t\t//\t\tdirectly, and will use the ...box... functions instead.\n\t\t// node: DOMNode\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue,\n\t\t\tl = px(node, s.paddingLeft), t = px(node, s.paddingTop), r = px(node, s.paddingRight), b = px(node, s.paddingBottom);\n\t\treturn {l: l, t: t, r: r, b: b, w: l + r, h: t + b};\n\t};\n\n\tvar none = \"none\";\n\n\tgeom.getBorderExtents = function getBorderExtents(/*DomNode*/ node, /*Object*/ computedStyle){\n\t\t// summary:\n\t\t//\t\treturns an object with properties useful for noting the border\n\t\t//\t\tdimensions.\n\t\t// description:\n\t\t//\t\t- l/t/r/b = the sum of left/top/right/bottom border (respectively)\n\t\t//\t\t- w = the sum of the left and right border\n\t\t//\t\t- h = the sum of the top and bottom border\n\t\t//\n\t\t//\t\tThe w/h are used for calculating boxes.\n\t\t//\t\tNormally application code will not need to invoke this\n\t\t//\t\tdirectly, and will use the ...box... functions instead.\n\t\t// node: DOMNode\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar px = style.toPixelValue, s = computedStyle || style.getComputedStyle(node),\n\t\t\tl = s.borderLeftStyle != none ? px(node, s.borderLeftWidth) : 0,\n\t\t\tt = s.borderTopStyle != none ? px(node, s.borderTopWidth) : 0,\n\t\t\tr = s.borderRightStyle != none ? px(node, s.borderRightWidth) : 0,\n\t\t\tb = s.borderBottomStyle != none ? px(node, s.borderBottomWidth) : 0;\n\t\treturn {l: l, t: t, r: r, b: b, w: l + r, h: t + b};\n\t};\n\n\tgeom.getPadBorderExtents = function getPadBorderExtents(/*DomNode*/ node, /*Object*/ computedStyle){\n\t\t// summary:\n\t\t//\t\tReturns object with properties useful for box fitting with\n\t\t//\t\tregards to padding.\n\t\t// description:\n\t\t//\t\t- l/t/r/b = the sum of left/top/right/bottom padding and left/top/right/bottom border (respectively)\n\t\t//\t\t- w = the sum of the left and right padding and border\n\t\t//\t\t- h = the sum of the top and bottom padding and border\n\t\t//\n\t\t//\t\tThe w/h are used for calculating boxes.\n\t\t//\t\tNormally application code will not need to invoke this\n\t\t//\t\tdirectly, and will use the ...box... functions instead.\n\t\t// node: DOMNode\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar s = computedStyle || style.getComputedStyle(node),\n\t\t\tp = geom.getPadExtents(node, s),\n\t\t\tb = geom.getBorderExtents(node, s);\n\t\treturn {\n\t\t\tl: p.l + b.l,\n\t\t\tt: p.t + b.t,\n\t\t\tr: p.r + b.r,\n\t\t\tb: p.b + b.b,\n\t\t\tw: p.w + b.w,\n\t\t\th: p.h + b.h\n\t\t};\n\t};\n\n\tgeom.getMarginExtents = function getMarginExtents(node, computedStyle){\n\t\t// summary:\n\t\t//\t\treturns object with properties useful for box fitting with\n\t\t//\t\tregards to box margins (i.e., the outer-box).\n\t\t//\n\t\t//\t\t- l/t = marginLeft, marginTop, respectively\n\t\t//\t\t- w = total width, margin inclusive\n\t\t//\t\t- h = total height, margin inclusive\n\t\t//\n\t\t//\t\tThe w/h are used for calculating boxes.\n\t\t//\t\tNormally application code will not need to invoke this\n\t\t//\t\tdirectly, and will use the ...box... functions instead.\n\t\t// node: DOMNode\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue,\n\t\t\tl = px(node, s.marginLeft), t = px(node, s.marginTop), r = px(node, s.marginRight), b = px(node, s.marginBottom);\n\t\treturn {l: l, t: t, r: r, b: b, w: l + r, h: t + b};\n\t};\n\n\t// Box getters work in any box context because offsetWidth/clientWidth\n\t// are invariant wrt box context\n\t//\n\t// They do *not* work for display: inline objects that have padding styles\n\t// because the user agent ignores padding (it's bogus styling in any case)\n\t//\n\t// Be careful with IMGs because they are inline or block depending on\n\t// browser and browser mode.\n\n\t// Although it would be easier to read, there are not separate versions of\n\t// _getMarginBox for each browser because:\n\t// 1. the branching is not expensive\n\t// 2. factoring the shared code wastes cycles (function call overhead)\n\t// 3. duplicating the shared code wastes bytes\n\n\tgeom.getMarginBox = function getMarginBox(/*DomNode*/ node, /*Object*/ computedStyle){\n\t\t// summary:\n\t\t//\t\treturns an object that encodes the width, height, left and top\n\t\t//\t\tpositions of the node's margin box.\n\t\t// node: DOMNode\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar s = computedStyle || style.getComputedStyle(node), me = geom.getMarginExtents(node, s),\n\t\t\tl = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode, px = style.toPixelValue, pcs;\n\n\t\tif((has(\"ie\") == 8 && !has(\"quirks\"))){\n\t\t\t// IE 8 offsetLeft/Top includes the parent's border\n\t\t\tif(p){\n\t\t\t\tpcs = style.getComputedStyle(p);\n\t\t\t\tl -= pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0;\n\t\t\t\tt -= pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0;\n\t\t\t}\n\t\t}\n\t\treturn {l: l, t: t, w: node.offsetWidth + me.w, h: node.offsetHeight + me.h};\n\t};\n\n\tgeom.getContentBox = function getContentBox(node, computedStyle){\n\t\t// summary:\n\t\t//\t\tReturns an object that encodes the width, height, left and top\n\t\t//\t\tpositions of the node's content box, irrespective of the\n\t\t//\t\tcurrent box model.\n\t\t// node: DOMNode\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\t// clientWidth/Height are important since the automatically account for scrollbars\n\t\t// fallback to offsetWidth/Height for special cases (see #3378)\n\t\tnode = dom.byId(node);\n\t\tvar s = computedStyle || style.getComputedStyle(node), w = node.clientWidth, h,\n\t\t\tpe = geom.getPadExtents(node, s), be = geom.getBorderExtents(node, s), l = node.offsetLeft + pe.l + be.l,\n\t\t\tt = node.offsetTop + pe.t + be.t;\n\t\tif(!w){\n\t\t\tw = node.offsetWidth - be.w;\n\t\t\th = node.offsetHeight - be.h;\n\t\t}else{\n\t\t\th = node.clientHeight;\n\t\t}\n\n\t\tif((has(\"ie\") == 8 && !has(\"quirks\"))){\n\t\t\t// IE 8 offsetLeft/Top includes the parent's border\n\t\t\tvar p = node.parentNode, px = style.toPixelValue, pcs;\n\t\t\tif(p){\n\t\t\t\tpcs = style.getComputedStyle(p);\n\t\t\t\tl -= pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0;\n\t\t\t\tt -= pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0;\n\t\t\t}\n\t\t}\n\n\t\treturn {l: l, t: t, w: w - pe.w, h: h - pe.h};\n\t};\n\n\t// Box setters depend on box context because interpretation of width/height styles\n\t// vary wrt box context.\n\t//\n\t// The value of boxModel is used to determine box context.\n\t// boxModel can be set directly to change behavior.\n\t//\n\t// Beware of display: inline objects that have padding styles\n\t// because the user agent ignores padding (it's a bogus setup anyway)\n\t//\n\t// Be careful with IMGs because they are inline or block depending on\n\t// browser and browser mode.\n\t//\n\t// Elements other than DIV may have special quirks, like built-in\n\t// margins or padding, or values not detectable via computedStyle.\n\t// In particular, margins on TABLE do not seems to appear\n\t// at all in computedStyle on Mozilla.\n\n\tfunction setBox(/*DomNode*/ node, /*Number?*/ l, /*Number?*/ t, /*Number?*/ w, /*Number?*/ h, /*String?*/ u){\n\t\t// summary:\n\t\t//\t\tsets width/height/left/top in the current (native) box-model\n\t\t//\t\tdimensions. Uses the unit passed in u.\n\t\t// node:\n\t\t//\t\tDOM Node reference. Id string not supported for performance\n\t\t//\t\treasons.\n\t\t// l:\n\t\t//\t\tleft offset from parent.\n\t\t// t:\n\t\t//\t\ttop offset from parent.\n\t\t// w:\n\t\t//\t\twidth in current box model.\n\t\t// h:\n\t\t//\t\twidth in current box model.\n\t\t// u:\n\t\t//\t\tunit measure to use for other measures. Defaults to \"px\".\n\t\tu = u || \"px\";\n\t\tvar s = node.style;\n\t\tif(!isNaN(l)){\n\t\t\ts.left = l + u;\n\t\t}\n\t\tif(!isNaN(t)){\n\t\t\ts.top = t + u;\n\t\t}\n\t\tif(w >= 0){\n\t\t\ts.width = w + u;\n\t\t}\n\t\tif(h >= 0){\n\t\t\ts.height = h + u;\n\t\t}\n\t}\n\n\tfunction isButtonTag(/*DomNode*/ node){\n\t\t// summary:\n\t\t//\t\tTrue if the node is BUTTON or INPUT.type=\"button\".\n\t\treturn node.tagName.toLowerCase() == \"button\" ||\n\t\t\tnode.tagName.toLowerCase() == \"input\" && (node.getAttribute(\"type\") || \"\").toLowerCase() == \"button\"; // boolean\n\t}\n\n\tfunction usesBorderBox(/*DomNode*/ node){\n\t\t// summary:\n\t\t//\t\tTrue if the node uses border-box layout.\n\n\t\t// We could test the computed style of node to see if a particular box\n\t\t// has been specified, but there are details and we choose not to bother.\n\n\t\t// TABLE and BUTTON (and INPUT type=button) are always border-box by default.\n\t\t// If you have assigned a different box to either one via CSS then\n\t\t// box functions will break.\n\n\t\treturn geom.boxModel == \"border-box\" || node.tagName.toLowerCase() == \"table\" || isButtonTag(node); // boolean\n\t}\n\n\tfunction getBoundingClientRect(/*DomNode*/ node) {\n\t\t// summary:\n\t\t//\t\tGets the bounding client rectangle for a dom node.\n\t\t// node: DOMNode\n\n\t\t// This will return the result of node.getBoundingClientRect if node is in the dom, and\n\t\t// {x:0, y:0, width:0, height:0, top:0, right:0, bottom:0, left:0} if it throws an error or the node is not on the dom\n\t\t// This will handle when IE throws an error or Edge returns an empty object when node is not on the dom\n\n\t\tvar retEmpty = { x: 0, y: 0, width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0 },\n\t\t\tret;\n\n\t\ttry {\n\t\t\tret = node.getBoundingClientRect();\n\t\t} catch (e) {\n\t\t\t// IE throws an Unspecified Error if the node is not in the dom. Handle this by returning an object with 0 values\n\t\t\treturn retEmpty;\n\t\t}\n\n\t\t// Edge returns an empty object if the node is not in the dom. Handle this by returning an object with 0 values\n\t\tif (typeof ret.left === \"undefined\") { return retEmpty; }\n\n\t\treturn ret;\n\t}\n\n\tgeom.setContentSize = function setContentSize(/*DomNode*/ node, /*Object*/ box, /*Object*/ computedStyle){\n\t\t// summary:\n\t\t//\t\tSets the size of the node's contents, irrespective of margins,\n\t\t//\t\tpadding, or borders.\n\t\t// node: DOMNode\n\t\t// box: Object\n\t\t//\t\thash with optional \"w\", and \"h\" properties for \"width\", and \"height\"\n\t\t//\t\trespectively. All specified properties should have numeric values in whole pixels.\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar w = box.w, h = box.h;\n\t\tif(usesBorderBox(node)){\n\t\t\tvar pb = geom.getPadBorderExtents(node, computedStyle);\n\t\t\tif(w >= 0){\n\t\t\t\tw += pb.w;\n\t\t\t}\n\t\t\tif(h >= 0){\n\t\t\t\th += pb.h;\n\t\t\t}\n\t\t}\n\t\tsetBox(node, NaN, NaN, w, h);\n\t};\n\n\tvar nilExtents = {l: 0, t: 0, w: 0, h: 0};\n\n\tgeom.setMarginBox = function setMarginBox(/*DomNode*/ node, /*Object*/ box, /*Object*/ computedStyle){\n\t\t// summary:\n\t\t//\t\tsets the size of the node's margin box and placement\n\t\t//\t\t(left/top), irrespective of box model. Think of it as a\n\t\t//\t\tpassthrough to setBox that handles box-model vagaries for\n\t\t//\t\tyou.\n\t\t// node: DOMNode\n\t\t// box: Object\n\t\t//\t\thash with optional \"l\", \"t\", \"w\", and \"h\" properties for \"left\", \"right\", \"width\", and \"height\"\n\t\t//\t\trespectively. All specified properties should have numeric values in whole pixels.\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar s = computedStyle || style.getComputedStyle(node), w = box.w, h = box.h,\n\t\t// Some elements have special padding, margin, and box-model settings.\n\t\t// To use box functions you may need to set padding, margin explicitly.\n\t\t// Controlling box-model is harder, in a pinch you might set dojo/dom-geometry.boxModel.\n\t\t\tpb = usesBorderBox(node) ? nilExtents : geom.getPadBorderExtents(node, s),\n\t\t\tmb = geom.getMarginExtents(node, s);\n\t\tif(has(\"webkit\")){\n\t\t\t// on Safari (3.1.2), button nodes with no explicit size have a default margin\n\t\t\t// setting an explicit size eliminates the margin.\n\t\t\t// We have to swizzle the width to get correct margin reading.\n\t\t\tif(isButtonTag(node)){\n\t\t\t\tvar ns = node.style;\n\t\t\t\tif(w >= 0 && !ns.width){\n\t\t\t\t\tns.width = \"4px\";\n\t\t\t\t}\n\t\t\t\tif(h >= 0 && !ns.height){\n\t\t\t\t\tns.height = \"4px\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(w >= 0){\n\t\t\tw = Math.max(w - pb.w - mb.w, 0);\n\t\t}\n\t\tif(h >= 0){\n\t\t\th = Math.max(h - pb.h - mb.h, 0);\n\t\t}\n\t\tsetBox(node, box.l, box.t, w, h);\n\t};\n\n\t// =============================\n\t// Positioning\n\t// =============================\n\n\tgeom.isBodyLtr = function isBodyLtr(/*Document?*/ doc){\n\t\t// summary:\n\t\t//\t\tReturns true if the current language is left-to-right, and false otherwise.\n\t\t// doc: Document?\n\t\t//\t\tOptional document to query. If unspecified, use win.doc.\n\t\t// returns: Boolean\n\n\t\tdoc = doc || win.doc;\n\t\treturn (win.body(doc).dir || doc.documentElement.dir || \"ltr\").toLowerCase() == \"ltr\"; // Boolean\n\t};\n\n\tgeom.docScroll = function docScroll(/*Document?*/ doc){\n\t\t// summary:\n\t\t//\t\tReturns an object with {node, x, y} with corresponding offsets.\n\t\t// doc: Document?\n\t\t//\t\tOptional document to query. If unspecified, use win.doc.\n\t\t// returns: Object\n\n\t\tdoc = doc || win.doc;\n\t\tvar node = doc.parentWindow || doc.defaultView; // use UI window, not dojo.global window. TODO: use dojo/window::get() except for circular dependency problem\n\t\treturn \"pageXOffset\" in node ? {x: node.pageXOffset, y: node.pageYOffset } :\n\t\t\t(node = has(\"quirks\") ? win.body(doc) : doc.documentElement) &&\n\t\t\t\t{x: geom.fixIeBiDiScrollLeft(node.scrollLeft || 0, doc), y: node.scrollTop || 0 };\n\t};\n\n\tgeom.getIeDocumentElementOffset = function(/*Document?*/ doc){\n\t\t// summary:\n\t\t//\t\tDeprecated method previously used for IE6-IE7. Now, just returns `{x:0, y:0}`.\n\t\treturn {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t};\n\n\tgeom.fixIeBiDiScrollLeft = function fixIeBiDiScrollLeft(/*Integer*/ scrollLeft, /*Document?*/ doc){\n\t\t// summary:\n\t\t//\t\tIn RTL direction, scrollLeft should be a negative value, but IE\n\t\t//\t\treturns a positive one. All codes using documentElement.scrollLeft\n\t\t//\t\tmust call this function to fix this error, otherwise the position\n\t\t//\t\twill offset to right when there is a horizontal scrollbar.\n\t\t// scrollLeft: Number\n\t\t// doc: Document?\n\t\t//\t\tOptional document to query. If unspecified, use win.doc.\n\t\t// returns: Number\n\n\t\t// In RTL direction, scrollLeft should be a negative value, but IE\n\t\t// returns a positive one. All codes using documentElement.scrollLeft\n\t\t// must call this function to fix this error, otherwise the position\n\t\t// will offset to right when there is a horizontal scrollbar.\n\n\t\tdoc = doc || win.doc;\n\t\tvar ie = has(\"ie\");\n\t\tif(ie && !geom.isBodyLtr(doc)){\n\t\t\tvar qk = has(\"quirks\"),\n\t\t\t\tde = qk ? win.body(doc) : doc.documentElement,\n\t\t\t\tpwin = win.global;\t// TODO: use winUtils.get(doc) after resolving circular dependency b/w dom-geometry.js and dojo/window.js\n\t\t\tif(ie == 6 && !qk && pwin.frameElement && de.scrollHeight > de.clientHeight){\n\t\t\t\tscrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels\n\t\t\t}\n\t\t\treturn (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer\n\t\t}\n\t\treturn scrollLeft; // Integer\n\t};\n\n\tgeom.position = function(/*DomNode*/ node, /*Boolean?*/ includeScroll){\n\t\t// summary:\n\t\t//\t\tGets the position and size of the passed element relative to\n\t\t//\t\tthe viewport (if includeScroll==false), or relative to the\n\t\t//\t\tdocument root (if includeScroll==true).\n\t\t//\n\t\t// description:\n\t\t//\t\tReturns an object of the form:\n\t\t//\t\t`{ x: 100, y: 300, w: 20, h: 15 }`.\n\t\t//\t\tIf includeScroll==true, the x and y values will include any\n\t\t//\t\tdocument offsets that may affect the position relative to the\n\t\t//\t\tviewport.\n\t\t//\t\tUses the border-box model (inclusive of border and padding but\n\t\t//\t\tnot margin). Does not act as a setter.\n\t\t// node: DOMNode|String\n\t\t// includeScroll: Boolean?\n\t\t// returns: Object\n\n\t\tnode = dom.byId(node);\n\t\tvar\tdb = win.body(node.ownerDocument),\n\t\t\tret= getBoundingClientRect(node);\n\t\tret = {x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top};\n\n\t\tif(has(\"ie\") < 9){\n\t\t\t// fixes the position in IE, quirks mode\n\t\t\tret.x -= (has(\"quirks\") ? db.clientLeft + db.offsetLeft : 0);\n\t\t\tret.y -= (has(\"quirks\") ? db.clientTop + db.offsetTop : 0);\n\t\t}\n\n\t\t// account for document scrolling\n\t\t// if offsetParent is used, ret value already includes scroll position\n\t\t// so we may have to actually remove that value if !includeScroll\n\t\tif(includeScroll){\n\t\t\tvar scroll = geom.docScroll(node.ownerDocument);\n\t\t\tret.x += scroll.x;\n\t\t\tret.y += scroll.y;\n\t\t}\n\n\t\treturn ret; // Object\n\t};\n\n\t// random \"private\" functions wildly used throughout the toolkit\n\n\tgeom.getMarginSize = function getMarginSize(/*DomNode*/ node, /*Object*/ computedStyle){\n\t\t// summary:\n\t\t//\t\treturns an object that encodes the width and height of\n\t\t//\t\tthe node's margin box\n\t\t// node: DOMNode|String\n\t\t// computedStyle: Object?\n\t\t//\t\tThis parameter accepts computed styles object.\n\t\t//\t\tIf this parameter is omitted, the functions will call\n\t\t//\t\tdojo/dom-style.getComputedStyle to get one. It is a better way, calling\n\t\t//\t\tdojo/dom-style.getComputedStyle once, and then pass the reference to this\n\t\t//\t\tcomputedStyle parameter. Wherever possible, reuse the returned\n\t\t//\t\tobject of dojo/dom-style.getComputedStyle().\n\n\t\tnode = dom.byId(node);\n\t\tvar me = geom.getMarginExtents(node, computedStyle || style.getComputedStyle(node));\n\t\tvar size = getBoundingClientRect(node);\n\t\treturn {\n\t\t\tw: (size.right - size.left) + me.w,\n\t\t\th: (size.bottom - size.top) + me.h\n\t\t};\n\t};\n\n\tgeom.normalizeEvent = function(event){\n\t\t// summary:\n\t\t//\t\tNormalizes the geometry of a DOM event, normalizing the pageX, pageY,\n\t\t//\t\toffsetX, offsetY, layerX, and layerX properties\n\t\t// event: Object\n\t\tif(!(\"layerX\" in event)){\n\t\t\tevent.layerX = event.offsetX;\n\t\t\tevent.layerY = event.offsetY;\n\t\t}\n\n\t\tif(!(\"pageX\" in event)){\n\t\t\t// FIXME: scroll position query is duped from dojo/_base/html to\n\t\t\t// avoid dependency on that entire module. Now that HTML is in\n\t\t\t// Base, we should convert back to something similar there.\n\t\t\tvar se = event.target;\n\t\t\tvar doc = (se && se.ownerDocument) || document;\n\t\t\t// DO NOT replace the following to use dojo/_base/window.body(), in IE, document.documentElement should be used\n\t\t\t// here rather than document.body\n\t\t\tvar docBody = has(\"quirks\") ? doc.body : doc.documentElement;\n\t\t\tevent.pageX = event.clientX + geom.fixIeBiDiScrollLeft(docBody.scrollLeft || 0, doc);\n\t\t\tevent.pageY = event.clientY + (docBody.scrollTop || 0);\n\t\t}\n\t};\n\n\t// TODO: evaluate separate getters/setters for position and sizes?\n\n\treturn geom;\n});\n","define([\"exports\", \"./_base/kernel\", \"./sniff\", \"./_base/lang\", \"./dom\", \"./dom-style\", \"./dom-construct\", \"./_base/connect\"],\n\t\tfunction(exports, dojo, has, lang, dom, style, ctr, conn){\n\t// module:\n\t//\t\tdojo/dom-prop\n\t// summary:\n\t//\t\tThis module defines the core dojo DOM properties API.\n\n\t// TODOC: summary not showing up in output, see https://github.com/csnover/js-doc-parse/issues/42\n\n\t// =============================\n\t// Element properties Functions\n\t// =============================\n\n\t// helper to connect events\n\tvar _evtHdlrMap = {}, _ctr = 1, _attrId = dojo._scopeName + \"attrid\";\n\thas.add('dom-textContent', function (global, doc, element) { return 'textContent' in element; });\n\n\texports.names = {\n\t\t// properties renamed to avoid clashes with reserved words\n\t\t\"class\": \"className\",\n\t\t\"for\": \"htmlFor\",\n\t\t// properties written as camelCase\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\tcolspan: \"colSpan\",\n\t\tframeborder: \"frameBorder\",\n\t\trowspan: \"rowSpan\",\n\t\ttextcontent: \"textContent\",\n\t\tvaluetype: \"valueType\"\n\t};\n\t\n\tfunction getText(/*DOMNode*/node){\n\t\t// summary:\n\t\t//\t\trecursion method for get('textContent') to use. Gets text value for a node.\n\t\t// description:\n\t\t//\t\tJuse uses nodedValue so things like <br/> tags do not end up in\n\t\t//\t\tthe text as any sort of line return.\n\t\tvar text = \"\", ch = node.childNodes;\n\t\tfor(var i = 0, n; n = ch[i]; i++){\n\t\t\t//Skip comments.\n\t\t\tif(n.nodeType != 8){\n\t\t\t\tif(n.nodeType == 1){\n\t\t\t\t\ttext += getText(n);\n\t\t\t\t}else{\n\t\t\t\t\ttext += n.nodeValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn text;\n\t}\n\n\texports.get = function getProp(/*DOMNode|String*/ node, /*String*/ name){\n\t\t// summary:\n\t\t//\t\tGets a property on an HTML element.\n\t\t// description:\n\t\t//\t\tHandles normalized getting of properties on DOM nodes.\n\t\t//\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to get the property on\n\t\t// name: String\n\t\t//\t\tthe name of the property to get.\n\t\t// returns:\n\t\t//\t\tthe value of the requested property or its default value\n\t\t//\n\t\t// example:\n\t\t//\t|\t// get the current value of the \"foo\" property on a node\n\t\t//\t|\trequire([\"dojo/dom-prop\", \"dojo/dom\"], function(domProp, dom){\n\t\t//\t|\t\tdomProp.get(dom.byId(\"nodeId\"), \"foo\");\n\t\t//\t|\t\t// or we can just pass the id:\n\t\t//\t|\t\tdomProp.get(\"nodeId\", \"foo\");\n\t\t//\t|\t});\n\n\t\tnode = dom.byId(node);\n\t\tvar lc = name.toLowerCase(), propName = exports.names[lc] || name;\n\t\t\n\t\tif(propName == \"textContent\" && !has(\"dom-textContent\")){\n\t\t\treturn getText(node);\n\t\t}\n\t\t\n\t\treturn node[propName];\t// Anything\n\t};\n\n\texports.set = function setProp(/*DOMNode|String*/ node, /*String|Object*/ name, /*String?*/ value){\n\t\t// summary:\n\t\t//\t\tSets a property on an HTML element.\n\t\t// description:\n\t\t//\t\tHandles normalized setting of properties on DOM nodes.\n\t\t//\n\t\t//\t\tWhen passing functions as values, note that they will not be\n\t\t//\t\tdirectly assigned to slots on the node, but rather the default\n\t\t//\t\tbehavior will be removed and the new behavior will be added\n\t\t//\t\tusing `dojo.connect()`, meaning that event handler properties\n\t\t//\t\twill be normalized and that some caveats with regards to\n\t\t//\t\tnon-standard behaviors for onsubmit apply. Namely that you\n\t\t//\t\tshould cancel form submission using `dojo.stopEvent()` on the\n\t\t//\t\tpassed event object instead of returning a boolean value from\n\t\t//\t\tthe handler itself.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to the element to set the property on\n\t\t// name: String|Object\n\t\t//\t\tthe name of the property to set, or a hash object to set\n\t\t//\t\tmultiple properties at once.\n\t\t// value: String?\n\t\t//\t\tThe value to set for the property\n\t\t// returns:\n\t\t//\t\tthe DOM node\n\t\t//\n\t\t// example:\n\t\t//\t|\t// use prop() to set the tab index\n\t\t//\t|\trequire([\"dojo/dom-prop\"], function(domProp){\n\t\t//\t|\t\tdomProp.set(\"nodeId\", \"tabIndex\", 3);\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tSet multiple values at once, including event handlers:\n\t\t//\t|\trequire([\"dojo/dom-prop\"], function(domProp){\n\t\t//\t|\t\tdomProp.set(\"formId\", {\n\t\t//\t|\t\t\t\"foo\": \"bar\",\n\t\t//\t|\t\t\t\"tabIndex\": -1,\n\t\t//\t|\t\t\t\"method\": \"POST\",\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\n\t\tnode = dom.byId(node);\n\t\tvar l = arguments.length;\n\t\tif(l == 2 && typeof name != \"string\"){ // inline'd type check\n\t\t\t// the object form of setter: the 2nd argument is a dictionary\n\t\t\tfor(var x in name){\n\t\t\t\texports.set(node, x, name[x]);\n\t\t\t}\n\t\t\treturn node; // DomNode\n\t\t}\n\t\tvar lc = name.toLowerCase(), propName = exports.names[lc] || name;\n\t\tif(propName == \"style\" && typeof value != \"string\"){ // inline'd type check\n\t\t\t// special case: setting a style\n\t\t\tstyle.set(node, value);\n\t\t\treturn node; // DomNode\n\t\t}\n\t\tif(propName == \"innerHTML\"){\n\t\t\t// special case: assigning HTML\n\t\t\t// the hash lists elements with read-only innerHTML on IE\n\t\t\tif(has(\"ie\") && node.tagName.toLowerCase() in {col: 1, colgroup: 1,\n\t\t\t\t\t\ttable: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1}){\n\t\t\t\tctr.empty(node);\n\t\t\t\tnode.appendChild(ctr.toDom(value, node.ownerDocument));\n\t\t\t}else{\n\t\t\t\tnode[propName] = value;\n\t\t\t}\n\t\t\treturn node; // DomNode\n\t\t}\n\t\tif(propName == \"textContent\" && !has(\"dom-textContent\")) {\n\t\t\tctr.empty(node);\n\t\t\tnode.appendChild(node.ownerDocument.createTextNode(value));\n\t\t\treturn node;\n\t\t}\n\t\tif(lang.isFunction(value)){\n\t\t\t// special case: assigning an event handler\n\t\t\t// clobber if we can\n\t\t\tvar attrId = node[_attrId];\n\t\t\tif(!attrId){\n\t\t\t\tattrId = _ctr++;\n\t\t\t\tnode[_attrId] = attrId;\n\t\t\t}\n\t\t\tif(!_evtHdlrMap[attrId]){\n\t\t\t\t_evtHdlrMap[attrId] = {};\n\t\t\t}\n\t\t\tvar h = _evtHdlrMap[attrId][propName];\n\t\t\tif(h){\n\t\t\t\t//h.remove();\n\t\t\t\tconn.disconnect(h);\n\t\t\t}else{\n\t\t\t\ttry{\n\t\t\t\t\tdelete node[propName];\n\t\t\t\t}catch(e){}\n\t\t\t}\n\t\t\t// ensure that event objects are normalized, etc.\n\t\t\tif(value){\n\t\t\t\t//_evtHdlrMap[attrId][propName] = on(node, propName, value);\n\t\t\t\t_evtHdlrMap[attrId][propName] = conn.connect(node, propName, value);\n\t\t\t}else{\n\t\t\t\tnode[propName] = null;\n\t\t\t}\n\t\t\treturn node; // DomNode\n\t\t}\n\t\tnode[propName] = value;\n\t\treturn node;\t// DomNode\n\t};\n});\n","define([\"./sniff\", \"./dom\", \"./_base/window\"], function(has, dom, win){\n\t// module:\n\t//\t\tdojo/dom-style\n\n\t// =============================\n\t// Style Functions\n\t// =============================\n\n\t// getComputedStyle drives most of the style code.\n\t// Wherever possible, reuse the returned object.\n\t//\n\t// API functions below that need to access computed styles accept an\n\t// optional computedStyle parameter.\n\t// If this parameter is omitted, the functions will call getComputedStyle themselves.\n\t// This way, calling code can access computedStyle once, and then pass the reference to\n\t// multiple API functions.\n\n\t// Although we normally eschew argument validation at this\n\t// level, here we test argument 'node' for (duck)type,\n\t// by testing nodeType, ecause 'document' is the 'parentNode' of 'body'\n\t// it is frequently sent to this function even\n\t// though it is not Element.\n\tvar getComputedStyle, style = {\n\t\t// summary:\n\t\t//\t\tThis module defines the core dojo DOM style API.\n\t};\n\tif(has(\"webkit\")){\n\t\tgetComputedStyle = function(/*DomNode*/ node){\n\t\t\tvar s;\n\t\t\tif(node.nodeType == 1){\n\t\t\t\tvar dv = node.ownerDocument.defaultView;\n\t\t\t\ts = dv.getComputedStyle(node, null);\n\t\t\t\tif(!s && node.style){\n\t\t\t\t\tnode.style.display = \"\";\n\t\t\t\t\ts = dv.getComputedStyle(node, null);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn s || {};\n\t\t};\n\t}else if(has(\"ie\") && (has(\"ie\") < 9 || has(\"quirks\"))){\n\t\tgetComputedStyle = function(node){\n\t\t\t// IE (as of 7) doesn't expose Element like sane browsers\n\t\t\t// currentStyle can be null on IE8!\n\t\t\treturn node.nodeType == 1 /* ELEMENT_NODE*/ && node.currentStyle ? node.currentStyle : {};\n\t\t};\n\t}else{\n\t\tgetComputedStyle = function(node){\n\t\t\tif(node.nodeType === 1 /* ELEMENT_NODE*/){\n\t\t\t\tvar dv = node.ownerDocument.defaultView,\n\t\t\t\t\tw = dv.opener ? dv : win.global.window;\n\t\t\t\treturn w.getComputedStyle(node, null);\n\t\t\t}\n\t\t\treturn {};\n\t\t};\n\t}\n\tstyle.getComputedStyle = getComputedStyle;\n\t/*=====\n\tstyle.getComputedStyle = function(node){\n\t\t// summary:\n\t\t//\t\tReturns a \"computed style\" object.\n\t\t//\n\t\t// description:\n\t\t//\t\tGets a \"computed style\" object which can be used to gather\n\t\t//\t\tinformation about the current state of the rendered node.\n\t\t//\n\t\t//\t\tNote that this may behave differently on different browsers.\n\t\t//\t\tValues may have different formats and value encodings across\n\t\t//\t\tbrowsers.\n\t\t//\n\t\t//\t\tNote also that this method is expensive. Wherever possible,\n\t\t//\t\treuse the returned object.\n\t\t//\n\t\t//\t\tUse the dojo/dom-style.get() method for more consistent (pixelized)\n\t\t//\t\treturn values.\n\t\t//\n\t\t// node: DOMNode\n\t\t//\t\tA reference to a DOM node. Does NOT support taking an\n\t\t//\t\tID string for speed reasons.\n\t\t// example:\n\t\t//\t|\trequire([\"dojo/dom-style\", \"dojo/dom\"], function(domStyle, dom){\n\t\t//\t|\t\tdomStyle.getComputedStyle(dom.byId('foo')).borderWidth;\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tReusing the returned object, avoiding multiple lookups:\n\t\t//\t|\trequire([\"dojo/dom-style\", \"dojo/dom\"], function(domStyle, dom){\n\t\t//\t|\t\tvar cs = domStyle.getComputedStyle(dom.byId(\"someNode\"));\n\t\t//\t|\t\tvar w = cs.width, h = cs.height;\n\t\t//\t|\t});\n\t\treturn; // CSS2Properties\n\t};\n\t=====*/\n\n\tvar toPixel;\n\tif(!has(\"ie\")){\n\t\ttoPixel = function(element, value){\n\t\t\t// style values can be floats, client code may want\n\t\t\t// to round for integer pixels.\n\t\t\treturn parseFloat(value) || 0;\n\t\t};\n\t}else{\n\t\ttoPixel = function(element, avalue){\n\t\t\tif(!avalue){ return 0; }\n\t\t\t// on IE7, medium is usually 4 pixels\n\t\t\tif(avalue == \"medium\"){ return 4; }\n\t\t\t// style values can be floats, client code may\n\t\t\t// want to round this value for integer pixels.\n\t\t\tif(avalue.slice && avalue.slice(-2) == 'px'){ return parseFloat(avalue); }\n\t\t\tvar s = element.style, rs = element.runtimeStyle, cs = element.currentStyle,\n\t\t\t\tsLeft = s.left, rsLeft = rs.left;\n\t\t\trs.left = cs.left;\n\t\t\ttry{\n\t\t\t\t// 'avalue' may be incompatible with style.left, which can cause IE to throw\n\t\t\t\t// this has been observed for border widths using \"thin\", \"medium\", \"thick\" constants\n\t\t\t\t// those particular constants could be trapped by a lookup\n\t\t\t\t// but perhaps there are more\n\t\t\t\ts.left = avalue;\n\t\t\t\tavalue = s.pixelLeft;\n\t\t\t}catch(e){\n\t\t\t\tavalue = 0;\n\t\t\t}\n\t\t\ts.left = sLeft;\n\t\t\trs.left = rsLeft;\n\t\t\treturn avalue;\n\t\t};\n\t}\n\tstyle.toPixelValue = toPixel;\n\t/*=====\n\tstyle.toPixelValue = function(node, value){\n\t\t// summary:\n\t\t//\t\tconverts style value to pixels on IE or return a numeric value.\n\t\t// node: DOMNode\n\t\t// value: String\n\t\t// returns: Number\n\t};\n\t=====*/\n\n\t// FIXME: there opacity quirks on FF that we haven't ported over. Hrm.\n\n\tvar astr = \"DXImageTransform.Microsoft.Alpha\";\n\tvar af = function(n, f){\n\t\ttry{\n\t\t\treturn n.filters.item(astr);\n\t\t}catch(e){\n\t\t\treturn f ? {} : null;\n\t\t}\n\t};\n\n\tvar _getOpacity =\n\t\thas(\"ie\") < 9 || (has(\"ie\") < 10 && has(\"quirks\")) ? function(node){\n\t\t\ttry{\n\t\t\t\treturn af(node).Opacity / 100; // Number\n\t\t\t}catch(e){\n\t\t\t\treturn 1; // Number\n\t\t\t}\n\t\t} :\n\t\tfunction(node){\n\t\t\treturn getComputedStyle(node).opacity;\n\t\t};\n\n\tvar _setOpacity =\n\t\thas(\"ie\") < 9 || (has(\"ie\") < 10 && has(\"quirks\")) ? function(/*DomNode*/ node, /*Number*/ opacity){\n\t\t\tif(opacity === \"\"){ opacity = 1; }\n\t\t\tvar ov = opacity * 100, fullyOpaque = opacity === 1;\n\n\t\t\t// on IE7 Alpha(Filter opacity=100) makes text look fuzzy so disable it altogether (bug #2661),\n\t\t\t// but still update the opacity value so we can get a correct reading if it is read later:\n\t\t\t// af(node, 1).Enabled = !fullyOpaque;\n\n\t\t\tif(fullyOpaque){\n\t\t\t\tnode.style.zoom = \"\";\n\t\t\t\tif(af(node)){\n\t\t\t\t\tnode.style.filter = node.style.filter.replace(\n\t\t\t\t\t\tnew RegExp(\"\\\\s*progid:\" + astr + \"\\\\([^\\\\)]+?\\\\)\", \"i\"), \"\");\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tnode.style.zoom = 1;\n\t\t\t\tif(af(node)){\n\t\t\t\t\taf(node, 1).Opacity = ov;\n\t\t\t\t}else{\n\t\t\t\t\tnode.style.filter += \" progid:\" + astr + \"(Opacity=\" + ov + \")\";\n\t\t\t\t}\n\t\t\t\taf(node, 1).Enabled = true;\n\t\t\t}\n\n\t\t\tif(node.tagName.toLowerCase() == \"tr\"){\n\t\t\t\tfor(var td = node.firstChild; td; td = td.nextSibling){\n\t\t\t\t\tif(td.tagName.toLowerCase() == \"td\"){\n\t\t\t\t\t\t_setOpacity(td, opacity);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn opacity;\n\t\t} :\n\t\tfunction(node, opacity){\n\t\t\treturn node.style.opacity = opacity;\n\t\t};\n\n\tvar _pixelNamesCache = {\n\t\tleft: true, top: true\n\t};\n\tvar _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border\n\tfunction _toStyleValue(node, type, value){\n\t\t//TODO: should we really be doing string case conversion here? Should we cache it? Need to profile!\n\t\ttype = type.toLowerCase();\n\n\t\t// Adjustments for IE and Edge\n\t\tif(value == \"auto\"){\n\t\t\tif(type == \"height\"){ return node.offsetHeight; }\n\t\t\tif(type == \"width\"){ return node.offsetWidth; }\n\t\t}\n\t\tif(type == \"fontweight\"){\n\t\t\tswitch(value){\n\t\t\t\tcase 700: return \"bold\";\n\t\t\t\tcase 400:\n\t\t\t\tdefault: return \"normal\";\n\t\t\t}\n\t\t}\n\n\t\tif(!(type in _pixelNamesCache)){\n\t\t\t_pixelNamesCache[type] = _pixelRegExp.test(type);\n\t\t}\n\t\treturn _pixelNamesCache[type] ? toPixel(node, value) : value;\n\t}\n\n\tvar _floatAliases = {cssFloat: 1, styleFloat: 1, \"float\": 1};\n\n\t// public API\n\n\tstyle.get = function getStyle(/*DOMNode|String*/ node, /*String?*/ name){\n\t\t// summary:\n\t\t//\t\tAccesses styles on a node.\n\t\t// description:\n\t\t//\t\tGetting the style value uses the computed style for the node, so the value\n\t\t//\t\twill be a calculated value, not just the immediate node.style value.\n\t\t//\t\tAlso when getting values, use specific style names,\n\t\t//\t\tlike \"borderBottomWidth\" instead of \"border\" since compound values like\n\t\t//\t\t\"border\" are not necessarily reflected as expected.\n\t\t//\t\tIf you want to get node dimensions, use `dojo/dom-geometry.getMarginBox()`,\n\t\t//\t\t`dojo/dom-geometry.getContentBox()` or `dojo/dom-geometry.getPosition()`.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to node to get style for\n\t\t// name: String?\n\t\t//\t\tthe style property to get\n\t\t// example:\n\t\t//\t\tPassing only an ID or node returns the computed style object of\n\t\t//\t\tthe node:\n\t\t//\t|\trequire([\"dojo/dom-style\", \"dojo/dom\"], function(domStyle, dom){\n\t\t//\t|\t\tdomStyle.get(\"thinger\");\n\t\t//\t|\t});\n\t\t// example:\n\t\t//\t\tPassing a node and a style property returns the current\n\t\t//\t\tnormalized, computed value for that property:\n\t\t//\t|\trequire([\"dojo/dom-style\", \"dojo/dom\"], function(domStyle, dom){\n\t\t//\t|\t\tdomStyle.get(\"thinger\", \"opacity\"); // 1 by default\n\t\t//\t|\t});\n\n\t\tvar n = dom.byId(node), l = arguments.length, op = (name == \"opacity\");\n\t\tif(l == 2 && op){\n\t\t\treturn _getOpacity(n);\n\t\t}\n\t\tname = _floatAliases[name] ? \"cssFloat\" in n.style ? \"cssFloat\" : \"styleFloat\" : name;\n\t\tvar s = style.getComputedStyle(n);\n\t\treturn (l == 1) ? s : _toStyleValue(n, name, s[name] || n.style[name]); /* CSS2Properties||String||Number */\n\t};\n\n\tstyle.set = function setStyle(/*DOMNode|String*/ node, /*String|Object*/ name, /*String?*/ value){\n\t\t// summary:\n\t\t//\t\tSets styles on a node.\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to node to set style for\n\t\t// name: String|Object\n\t\t//\t\tthe style property to set in DOM-accessor format\n\t\t//\t\t(\"borderWidth\", not \"border-width\") or an object with key/value\n\t\t//\t\tpairs suitable for setting each property.\n\t\t// value: String?\n\t\t//\t\tIf passed, sets value on the node for style, handling\n\t\t//\t\tcross-browser concerns. When setting a pixel value,\n\t\t//\t\tbe sure to include \"px\" in the value. For instance, top: \"200px\".\n\t\t//\t\tOtherwise, in some cases, some browsers will not apply the style.\n\t\t//\n\t\t// example:\n\t\t//\t\tPassing a node, a style property, and a value changes the\n\t\t//\t\tcurrent display of the node and returns the new computed value\n\t\t//\t|\trequire([\"dojo/dom-style\"], function(domStyle){\n\t\t//\t|\t\tdomStyle.set(\"thinger\", \"opacity\", 0.5); // == 0.5\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tPassing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:\n\t\t//\t|\trequire([\"dojo/dom-style\"], function(domStyle){\n\t\t//\t|\t\tdomStyle.set(\"thinger\", {\n\t\t//\t|\t\t\t\"opacity\": 0.5,\n\t\t//\t|\t\t\t\"border\": \"3px solid black\",\n\t\t//\t|\t\t\t\"height\": \"300px\"\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tWhen the CSS style property is hyphenated, the JavaScript property is camelCased.\n\t\t//\t\tfont-size becomes fontSize, and so on.\n\t\t//\t|\trequire([\"dojo/dom-style\", \"dojo/dom\"], function(domStyle, dom){\n\t\t//\t|\t\tdomStyle.set(\"thinger\",{\n\t\t//\t|\t\t\tfontSize:\"14pt\",\n\t\t//\t|\t\t\tletterSpacing:\"1.2em\"\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tdojo/NodeList implements .style() using the same syntax, omitting the \"node\" parameter, calling\n\t\t//\t\tdojo/dom-style.get() on every element of the list. See: `dojo/query` and `dojo/NodeList`\n\t\t//\t|\trequire([\"dojo/dom-style\", \"dojo/query\", \"dojo/NodeList-dom\"],\n\t\t//\t|\tfunction(domStyle, query){\n\t\t//\t|\t\tquery(\".someClassName\").style(\"visibility\",\"hidden\");\n\t\t//\t|\t\t// or\n\t\t//\t|\t\tquery(\"#baz > div\").style({\n\t\t//\t|\t\t\topacity:0.75,\n\t\t//\t|\t\t\tfontSize:\"13pt\"\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\n\t\tvar n = dom.byId(node), l = arguments.length, op = (name == \"opacity\");\n\t\tname = _floatAliases[name] ? \"cssFloat\" in n.style ? \"cssFloat\" : \"styleFloat\" : name;\n\t\tif(l == 3){\n\t\t\treturn op ? _setOpacity(n, value) : n.style[name] = value; // Number\n\t\t}\n\t\tfor(var x in name){\n\t\t\tstyle.set(node, x, name[x]);\n\t\t}\n\t\treturn style.getComputedStyle(n);\n\t};\n\n\treturn style;\n});\n","define([\"./sniff\", \"./_base/window\", \"./_base/kernel\"],\n\t\tfunction(has, win, kernel){\n\t// module:\n\t//\t\tdojo/dom\n\n\t// FIXME: need to add unit tests for all the semi-public methods\n\n\tif(has(\"ie\") <= 7){\n\t\ttry{\n\t\t\tdocument.execCommand(\"BackgroundImageCache\", false, true);\n\t\t}catch(e){\n\t\t\t// sane browsers don't have cache \"issues\"\n\t\t}\n\t}\n\n\t// =============================\n\t// DOM Functions\n\t// =============================\n\n\t// the result object\n\tvar dom = {\n\t\t// summary:\n\t\t//\t\tThis module defines the core dojo DOM API.\n\t};\n\n\tif(has(\"ie\")){\n\t\tdom.byId = function(id, doc){\n\t\t\tif(typeof id != \"string\"){\n\t\t\t\treturn id || null;\n\t\t\t}\n\t\t\tvar _d = doc || win.doc, te = id && _d.getElementById(id);\n\t\t\t// attributes.id.value is better than just id in case the\n\t\t\t// user has a name=id inside a form\n\t\t\tif(te && (te.attributes.id.value == id || te.id == id)){\n\t\t\t\treturn te;\n\t\t\t}else{\n\t\t\t\tvar eles = _d.all[id];\n\t\t\t\tif(!eles || eles.nodeName){\n\t\t\t\t\teles = [eles];\n\t\t\t\t}\n\t\t\t\t// if more than 1, choose first with the correct id\n\t\t\t\tvar i = 0;\n\t\t\t\twhile((te = eles[i++])){\n\t\t\t\t\tif((te.attributes && te.attributes.id && te.attributes.id.value == id) || te.id == id){\n\t\t\t\t\t\treturn te;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t}else{\n\t\tdom.byId = function(id, doc){\n\t\t\t// inline'd type check.\n\t\t\t// be sure to return null per documentation, to match IE branch.\n\t\t\treturn ((typeof id == \"string\") ? (doc || win.doc).getElementById(id) : id) || null; // DOMNode\n\t\t};\n\t}\n\t/*=====\n\t dom.byId = function(id, doc){\n\t\t// summary:\n\t\t//\t\tReturns DOM node with matching `id` attribute or falsy value (ex: null or undefined)\n\t\t//\t\tif not found. If `id` is a DomNode, this function is a no-op.\n\t\t//\n\t\t// id: String|DOMNode\n\t\t//\t\tA string to match an HTML id attribute or a reference to a DOM Node\n\t\t//\n\t\t// doc: Document?\n\t\t//\t\tDocument to work in. Defaults to the current value of\n\t\t//\t\tdojo/_base/window.doc. Can be used to retrieve\n\t\t//\t\tnode references from other documents.\n\t\t//\n\t\t// example:\n\t\t//\t\tLook up a node by ID:\n\t\t//\t|\trequire([\"dojo/dom\"], function(dom){\n\t\t//\t|\t\tvar n = dom.byId(\"foo\");\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tCheck if a node exists, and use it.\n\t\t//\t|\trequire([\"dojo/dom\"], function(dom){\n\t\t//\t|\t\tvar n = dom.byId(\"bar\");\n\t\t//\t|\t\tif(n){ doStuff() ... }\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\t\tAllow string or DomNode references to be passed to a custom function:\n\t\t//\t|\trequire([\"dojo/dom\"], function(dom){\n\t\t//\t|\t\tvar foo = function(nodeOrId){\n\t\t//\t|\t\t\tnodeOrId = dom.byId(nodeOrId);\n\t\t//\t|\t\t\t// ... more stuff\n\t\t//\t|\t\t}\n\t\t//\t|\t});\n\t };\n\t =====*/\n\n\t// Test for DOMNode.contains() method, available everywhere except FF8-\n\t// and IE8-, where it's available in general, but not on document itself,\n\t// and also problems when either ancestor or node are text nodes.\n\n\tvar doc = kernel.global[\"document\"] || null;\n\thas.add(\"dom-contains\", !!(doc && doc.contains));\n\tdom.isDescendant = has(\"dom-contains\") ?\n\t\t// FF9+, IE9+, webkit, opera, iOS, Android, Edge, etc.\n\t\tfunction(/*DOMNode|String*/ node, /*DOMNode|String*/ ancestor){\n\t\t\treturn !!( (ancestor = dom.byId(ancestor)) && ancestor.contains(dom.byId(node)) );\n\t\t} :\n\t\tfunction(/*DOMNode|String*/ node, /*DOMNode|String*/ ancestor){\n\t\t\t// summary:\n\t\t\t//\t\tReturns true if node is a descendant of ancestor\n\t\t\t// node: DOMNode|String\n\t\t\t//\t\tstring id or node reference to test\n\t\t\t// ancestor: DOMNode|String\n\t\t\t//\t\tstring id or node reference of potential parent to test against\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tTest is node id=\"bar\" is a descendant of node id=\"foo\"\n\t\t\t//\t|\trequire([\"dojo/dom\"], function(dom){\n\t\t\t//\t|\t\tif(dom.isDescendant(\"bar\", \"foo\")){ ... }\n\t\t\t//\t|\t});\n\n\t\t\ttry{\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tancestor = dom.byId(ancestor);\n\t\t\t\twhile(node){\n\t\t\t\t\tif(node == ancestor){\n\t\t\t\t\t\treturn true; // Boolean\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.parentNode;\n\t\t\t\t}\n\t\t\t}catch(e){ /* squelch, return false */ }\n\t\t\treturn false; // Boolean\n\t\t};\n\n\t// TODO: do we need setSelectable in the base?\n\n\t// Add feature test for user-select CSS property\n\t// (currently known to work in all but IE < 10 and Opera)\n\t// TODO: The user-select CSS property as of May 2014 is no longer part of\n\t// any CSS specification. In IE, -ms-user-select does not do the same thing\n\t// as the unselectable attribute on elements; namely, dijit Editor buttons\n\t// do not properly prevent the content of the editable content frame from\n\t// unblurring. As a result, the -ms- prefixed version is omitted here.\n\thas.add(\"css-user-select\", function(global, doc, element){\n\t\t// Avoid exception when dom.js is loaded in non-browser environments\n\t\tif(!element){ return false; }\n\n\t\tvar style = element.style;\n\t\tvar prefixes = [\"Khtml\", \"O\", \"Moz\", \"Webkit\"],\n\t\t\ti = prefixes.length,\n\t\t\tname = \"userSelect\",\n\t\t\tprefix;\n\n\t\t// Iterate prefixes from most to least likely\n\t\tdo{\n\t\t\tif(typeof style[name] !== \"undefined\"){\n\t\t\t\t// Supported; return property name\n\t\t\t\treturn name;\n\t\t\t}\n\t\t}while(i-- && (name = prefixes[i] + \"UserSelect\"));\n\n\t\t// Not supported if we didn't return before now\n\t\treturn false;\n\t});\n\n\t/*=====\n\tdom.setSelectable = function(node, selectable){\n\t\t// summary:\n\t\t//\t\tEnable or disable selection on a node\n\t\t// node: DOMNode|String\n\t\t//\t\tid or reference to node\n\t\t// selectable: Boolean\n\t\t//\t\tstate to put the node in. false indicates unselectable, true\n\t\t//\t\tallows selection.\n\t\t// example:\n\t\t//\t\tMake the node id=\"bar\" unselectable\n\t\t//\t|\trequire([\"dojo/dom\"], function(dom){\n\t\t//\t|\t\tdom.setSelectable(\"bar\");\n\t\t//\t|\t});\n\t\t// example:\n\t\t//\t\tMake the node id=\"bar\" selectable\n\t\t//\t|\trequire([\"dojo/dom\"], function(dom){\n\t\t//\t|\t\tdom.setSelectable(\"bar\", true);\n\t\t//\t|\t});\n\t};\n\t=====*/\n\n\tvar cssUserSelect = has(\"css-user-select\");\n\tdom.setSelectable = cssUserSelect ? function(node, selectable){\n\t\t// css-user-select returns a (possibly vendor-prefixed) CSS property name\n\t\tdom.byId(node).style[cssUserSelect] = selectable ? \"\" : \"none\";\n\t} : function(node, selectable){\n\t\tnode = dom.byId(node);\n\n\t\t// (IE < 10 / Opera) Fall back to setting/removing the\n\t\t// unselectable attribute on the element and all its children\n\t\tvar nodes = node.getElementsByTagName(\"*\"),\n\t\t\ti = nodes.length;\n\n\t\tif(selectable){\n\t\t\tnode.removeAttribute(\"unselectable\");\n\t\t\twhile(i--){\n\t\t\t\tnodes[i].removeAttribute(\"unselectable\");\n\t\t\t}\n\t\t}else{\n\t\t\tnode.setAttribute(\"unselectable\", \"on\");\n\t\t\twhile(i--){\n\t\t\t\tnodes[i].setAttribute(\"unselectable\", \"on\");\n\t\t\t}\n\t\t}\n\t};\n\n\treturn dom;\n});\n","define(['./global', './has'], function(global, has){\n\tvar doc = document,\n\t\treadyStates = { 'loaded': 1, 'complete': 1 },\n\t\tfixReadyState = typeof doc.readyState != \"string\",\n\t\tready = !!readyStates[doc.readyState],\n\t\treadyQ = [],\n\t\trecursiveGuard;\n\n\tfunction domReady(callback){\n\t\t// summary:\n\t\t//\t\tPlugin to delay require()/define() callback from firing until the DOM has finished loading.\n\t\treadyQ.push(callback);\n\t\tif(ready){ processQ(); }\n\t}\n\tdomReady.load = function(id, req, load){\n\t\tdomReady(load);\n\t};\n\n\t// Export queue so that ready() can check if it's empty or not.\n\tdomReady._Q = readyQ;\n\tdomReady._onQEmpty = function(){\n\t\t// summary:\n\t\t//\t\tPrivate method overridden by dojo/ready, to notify when everything in the\n\t\t//\t\tdomReady queue has been processed. Do not use directly.\n\t\t//\t\tWill be removed in 2.0, along with domReady._Q.\n\t};\n\n\t// For FF <= 3.5\n\tif(fixReadyState){ doc.readyState = \"loading\"; }\n\n\tfunction processQ(){\n\t\t// Calls all functions in the queue in order, unless processQ() is already running, in which case just return\n\n\t\tif(recursiveGuard){ return; }\n\t\trecursiveGuard = true;\n\n\t\twhile(readyQ.length){\n\t\t\ttry{\n\t\t\t\t(readyQ.shift())(doc);\n\t\t\t}catch(err){\n\t\t\t\tconsole.error(err, \"in domReady callback\", err.stack);\n\t\t\t}\n\t\t}\n\n\t\trecursiveGuard = false;\n\n\t\t// Notification for dojo/ready. Remove for 2.0.\n\t\t// Note that this could add more tasks to the ready queue.\n\t\tdomReady._onQEmpty();\n\t}\n\n\tif(!ready){\n\t\tvar tests = [],\n\t\t\tdetectReady = function(evt){\n\t\t\t\tevt = evt || global.event;\n\t\t\t\tif(ready || (evt.type == \"readystatechange\" && !readyStates[doc.readyState])){ return; }\n\n\t\t\t\t// For FF <= 3.5\n\t\t\t\tif(fixReadyState){ doc.readyState = \"complete\"; }\n\n\t\t\t\tready = 1;\n\t\t\t\tprocessQ();\n\t\t\t},\n\t\t\ton = function(node, event){\n\t\t\t\tnode.addEventListener(event, detectReady, false);\n\t\t\t\treadyQ.push(function(){ node.removeEventListener(event, detectReady, false); });\n\t\t\t};\n\n\t\tif(!has(\"dom-addeventlistener\")){\n\t\t\ton = function(node, event){\n\t\t\t\tevent = \"on\" + event;\n\t\t\t\tnode.attachEvent(event, detectReady);\n\t\t\t\treadyQ.push(function(){ node.detachEvent(event, detectReady); });\n\t\t\t};\n\n\t\t\tvar div = doc.createElement(\"div\");\n\t\t\ttry{\n\t\t\t\tif(div.doScroll && global.frameElement === null){\n\t\t\t\t\t// the doScroll test is only useful if we're in the top-most frame\n\t\t\t\t\ttests.push(function(){\n\t\t\t\t\t\t// Derived with permission from Diego Perini's IEContentLoaded\n\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tdiv.doScroll(\"left\");\n\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t}catch(e){}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}catch(e){}\n\t\t}\n\n\t\ton(doc, \"DOMContentLoaded\");\n\t\ton(global, \"load\");\n\n\t\tif(\"onreadystatechange\" in doc){\n\t\t\ton(doc, \"readystatechange\");\n\t\t}else if(!fixReadyState){\n\t\t\t// if the ready state property exists and there's\n\t\t\t// no readystatechange event, poll for the state\n\t\t\t// to change\n\t\t\ttests.push(function(){\n\t\t\t\treturn readyStates[doc.readyState];\n\t\t\t});\n\t\t}\n\n\t\tif(tests.length){\n\t\t\tvar poller = function(){\n\t\t\t\tif(ready){ return; }\n\t\t\t\tvar i = tests.length;\n\t\t\t\twhile(i--){\n\t\t\t\t\tif(tests[i]()){\n\t\t\t\t\t\tdetectReady(\"poller\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetTimeout(poller, 30);\n\t\t\t};\n\t\t\tpoller();\n\t\t}\n\t}\n\n\treturn domReady;\n});\n","define([\"./create\"], function(create){\n\t// module:\n\t//\t\tdojo/errors/CancelError\n\n\t/*=====\n\treturn function(){\n\t\t// summary:\n\t\t//\t\tDefault error if a promise is canceled without a reason.\n\t};\n\t=====*/\n\n\treturn create(\"CancelError\", null, null, { dojoType: \"cancel\", log: false });\n});\n","define(['./create'], function(create){\n\t// module:\n\t//\t\tdojo/errors/RequestError\n\n\t/*=====\n\t return function(){\n\t\t // summary:\n\t\t //\t\tTODOC\n\t };\n\t =====*/\n\n\treturn create(\"RequestError\", function(message, response){\n\t\tthis.response = response;\n\t});\n});\n","define(['./create', './RequestError'], function(create, RequestError){\n\t// module:\n\t//\t\tdojo/errors/RequestTimeoutError\n\n\t/*=====\n\t return function(){\n\t\t // summary:\n\t\t //\t\tTODOC\n\t };\n\t =====*/\n\n\treturn create(\"RequestTimeoutError\", null, RequestError, {\n\t\tdojoType: \"timeout\"\n\t});\n});\n","define([\"../_base/lang\"], function(lang){\n\treturn function(name, ctor, base, props){\n\t\tbase = base || Error;\n\n\t\tvar ErrorCtor = function(message){\n\t\t\tif(base === Error){\n\t\t\t\tif(Error.captureStackTrace){\n\t\t\t\t\tError.captureStackTrace(this, ErrorCtor);\n\t\t\t\t}\n\n\t\t\t\t// Error.call() operates on the returned error\n\t\t\t\t// object rather than operating on |this|\n\t\t\t\tvar err = Error.call(this, message),\n\t\t\t\t\tprop;\n\n\t\t\t\t// Copy own properties from err to |this|\n\t\t\t\tfor(prop in err){\n\t\t\t\t\tif(err.hasOwnProperty(prop)){\n\t\t\t\t\t\tthis[prop] = err[prop];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// messsage is non-enumerable in ES5\n\t\t\t\tthis.message = message;\n\t\t\t\t// stack is non-enumerable in at least Firefox\n\t\t\t\tthis.stack = err.stack;\n\t\t\t}else{\n\t\t\t\tbase.apply(this, arguments);\n\t\t\t}\n\t\t\tif(ctor){\n\t\t\t\tctor.apply(this, arguments);\n\t\t\t}\n\t\t};\n\n\t\tErrorCtor.prototype = lang.delegate(base.prototype, props);\n\t\tErrorCtor.prototype.name = name;\n\t\tErrorCtor.prototype.constructor = ErrorCtor;\n\n\t\treturn ErrorCtor;\n\t};\n});\n","define(function(){\n if (typeof global !== 'undefined' && typeof global !== 'function') {\n // global spec defines a reference to the global object called 'global'\n // https://github.com/tc39/proposal-global\n // `global` is also defined in NodeJS\n return global;\n }\n else if (typeof window !== 'undefined') {\n // window is defined in browsers\n return window;\n }\n else if (typeof self !== 'undefined') {\n // self is defined in WebWorkers\n return self;\n }\n return this;\n});\n","define([\"./global\", \"require\", \"module\"], function(global, require, module){\n\t// module:\n\t//\t\tdojo/has\n\t// summary:\n\t//\t\tDefines the has.js API and several feature tests used by dojo.\n\t// description:\n\t//\t\tThis module defines the has API as described by the project has.js with the following additional features:\n\t//\n\t//\t\t- the has test cache is exposed at has.cache.\n\t//\t\t- the method has.add includes a forth parameter that controls whether or not existing tests are replaced\n\t//\t\t- the loader's has cache may be optionally copied into this module's has cahce.\n\t//\n\t//\t\tThis module adopted from https://github.com/phiggins42/has.js; thanks has.js team!\n\n\t// try to pull the has implementation from the loader; both the dojo loader and bdLoad provide one\n\t// if using a foreign loader, then the has cache may be initialized via the config object for this module\n\t// WARNING: if a foreign loader defines require.has to be something other than the has.js API, then this implementation fail\n\tvar has = require.has || function(){};\n\tif(!has(\"dojo-has-api\")){\n\t\tvar\n\t\t\tisBrowser =\n\t\t\t\t// the most fundamental decision: are we in the browser?\n\t\t\t\ttypeof window != \"undefined\" &&\n\t\t\t\ttypeof location != \"undefined\" &&\n\t\t\t\ttypeof document != \"undefined\" &&\n\t\t\t\twindow.location == location && window.document == document,\n\n\t\t\t// has API variables\n\t\t\tdoc = isBrowser && document,\n\t\t\telement = doc && doc.createElement(\"DiV\"),\n\t\t\tcache = (module.config && module.config()) || {};\n\n\t\thas = function(name){\n\t\t\t// summary:\n\t\t\t//\t\tReturn the current value of the named feature.\n\t\t\t//\n\t\t\t// name: String|Integer\n\t\t\t//\t\tThe name (if a string) or identifier (if an integer) of the feature to test.\n\t\t\t//\n\t\t\t// description:\n\t\t\t//\t\tReturns the value of the feature named by name. The feature must have been\n\t\t\t//\t\tpreviously added to the cache by has.add.\n\n\t\t\treturn typeof cache[name] == \"function\" ? (cache[name] = cache[name](global, doc, element)) : cache[name]; // Boolean\n\t\t};\n\n\t\thas.cache = cache;\n\n\t\thas.add = function(name, test, now, force){\n\t\t\t// summary:\n\t\t\t//\t \tRegister a new feature test for some named feature.\n\t\t\t// name: String|Integer\n\t\t\t//\t \tThe name (if a string) or identifier (if an integer) of the feature to test.\n\t\t\t// test: Function\n\t\t\t//\t\t A test function to register. If a function, queued for testing until actually\n\t\t\t//\t\t needed. The test function should return a boolean indicating\n\t\t\t//\t \tthe presence of a feature or bug.\n\t\t\t// now: Boolean?\n\t\t\t//\t\t Optional. Omit if `test` is not a function. Provides a way to immediately\n\t\t\t//\t\t run the test and cache the result.\n\t\t\t// force: Boolean?\n\t\t\t//\t \tOptional. If the test already exists and force is truthy, then the existing\n\t\t\t//\t \ttest will be replaced; otherwise, add does not replace an existing test (that\n\t\t\t//\t \tis, by default, the first test advice wins).\n\t\t\t// example:\n\t\t\t//\t\tA redundant test, testFn with immediate execution:\n\t\t\t//\t|\thas.add(\"javascript\", function(){ return true; }, true);\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tAgain with the redundantness. You can do this in your tests, but we should\n\t\t\t//\t\tnot be doing this in any internal has.js tests\n\t\t\t//\t|\thas.add(\"javascript\", true);\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tThree things are passed to the testFunction. `global`, `document`, and a generic element\n\t\t\t//\t\tfrom which to work your test should the need arise.\n\t\t\t//\t|\thas.add(\"bug-byid\", function(g, d, el){\n\t\t\t//\t|\t\t// g\t== global, typically window, yadda yadda\n\t\t\t//\t|\t\t// d\t== document object\n\t\t\t//\t|\t\t// el == the generic element. a `has` element.\n\t\t\t//\t|\t\treturn false; // fake test, byid-when-form-has-name-matching-an-id is slightly longer\n\t\t\t//\t|\t});\n\n\t\t\t(typeof cache[name]==\"undefined\" || force) && (cache[name]= test);\n\t\t\treturn now && has(name);\n\t\t};\n\n\t\t// since we're operating under a loader that doesn't provide a has API, we must explicitly initialize\n\t\t// has as it would have otherwise been initialized by the dojo loader; use has.add to the builder\n\t\t// can optimize these away iff desired\n\t\thas.add(\"host-browser\", isBrowser);\n\t\thas.add(\"host-node\", (typeof process == \"object\" && process.versions && process.versions.node && process.versions.v8));\n\t\thas.add(\"host-rhino\", (typeof load == \"function\" && (typeof Packages == \"function\" || typeof Packages == \"object\")));\n\t\thas.add(\"dom\", isBrowser);\n\t\thas.add(\"dojo-dom-ready-api\", 1);\n\t\thas.add(\"dojo-sniff\", 1);\n\t}\n\n\tif(has(\"host-browser\")){\n\t\t// Common application level tests\n\t\thas.add(\"dom-addeventlistener\", !!document.addEventListener);\n\n\t\t// Do the device and browser have touch capability?\n\t\thas.add(\"touch\", \"ontouchstart\" in document\n\t\t\t|| (\"onpointerdown\" in document && navigator.maxTouchPoints > 0)\n\t\t\t|| window.navigator.msMaxTouchPoints);\n\n\t\t// Touch events support\n\t\thas.add(\"touch-events\", \"ontouchstart\" in document);\n\n\t\t// Test if pointer events are supported and enabled, with either standard names (\"pointerdown\" etc.) or\n\t\t// IE specific names (\"MSPointerDown\" etc.). Tests are designed to work on embedded C# WebBrowser Controls\n\t\t// in addition to IE, Edge, and future versions of Firefox and Chrome.\n\t\t// Note that on IE11, has(\"pointer-events\") and has(\"MSPointer\") are both true.\n\t\thas.add(\"pointer-events\", \"pointerEnabled\" in window.navigator ?\n\t\t\t\twindow.navigator.pointerEnabled : \"PointerEvent\" in window);\n\t\thas.add(\"MSPointer\", window.navigator.msPointerEnabled);\n\t\t// The \"pointermove\"\" event is only continuously emitted in a touch environment if\n\t\t// the target node's \"touch-action\"\" CSS property is set to \"none\"\n\t\t// https://www.w3.org/TR/pointerevents/#the-touch-action-css-property\n\t\thas.add(\"touch-action\", has(\"touch\") && has(\"pointer-events\"));\n\n\t\t// I don't know if any of these tests are really correct, just a rough guess\n\t\thas.add(\"device-width\", screen.availWidth || innerWidth);\n\n\t\t// Tests for DOMNode.attributes[] behavior:\n\t\t//\t - dom-attributes-explicit - attributes[] only lists explicitly user specified attributes\n\t\t//\t - dom-attributes-specified-flag (IE8) - need to check attr.specified flag to skip attributes user didn't specify\n\t\t//\t - Otherwise, in IE6-7. attributes[] will list hundreds of values, so need to do outerHTML to get attrs instead.\n\t\tvar form = document.createElement(\"form\");\n\t\thas.add(\"dom-attributes-explicit\", form.attributes.length == 0); // W3C\n\t\thas.add(\"dom-attributes-specified-flag\", form.attributes.length > 0 && form.attributes.length < 40);\t// IE8\n\t}\n\n\thas.clearElement = function(element){\n\t\t// summary:\n\t\t//\t Deletes the contents of the element passed to test functions.\n\t\telement.innerHTML= \"\";\n\t\treturn element;\n\t};\n\n\thas.normalize = function(id, toAbsMid){\n\t\t// summary:\n\t\t//\t Resolves id into a module id based on possibly-nested tenary expression that branches on has feature test value(s).\n\t\t//\n\t\t// toAbsMid: Function\n\t\t//\t Resolves a relative module id into an absolute module id\n\t\tvar\n\t\t\ttokens = id.match(/[\\?:]|[^:\\?]*/g), i = 0,\n\t\t\tget = function(skip){\n\t\t\t\tvar term = tokens[i++];\n\t\t\t\tif(term == \":\"){\n\t\t\t\t\t// empty string module name, resolves to 0\n\t\t\t\t\treturn 0;\n\t\t\t\t}else{\n\t\t\t\t\t// postfixed with a ? means it is a feature to branch on, the term is the name of the feature\n\t\t\t\t\tif(tokens[i++] == \"?\"){\n\t\t\t\t\t\tif(!skip && has(term)){\n\t\t\t\t\t\t\t// matched the feature, get the first value from the options\n\t\t\t\t\t\t\treturn get();\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// did not match, get the second value, passing over the first\n\t\t\t\t\t\t\tget(true);\n\t\t\t\t\t\t\treturn get(skip);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// a module\n\t\t\t\t\treturn term || 0;\n\t\t\t\t}\n\t\t\t};\n\t\tid = get();\n\t\treturn id && toAbsMid(id);\n\t};\n\n\thas.load = function(id, parentRequire, loaded){\n\t\t// summary:\n\t\t//\t\tConditional loading of AMD modules based on a has feature test value.\n\t\t// id: String\n\t\t//\t\tGives the resolved module id to load.\n\t\t// parentRequire: Function\n\t\t//\t\tThe loader require function with respect to the module that contained the plugin resource in it's\n\t\t//\t\tdependency list.\n\t\t// loaded: Function\n\t\t//\t Callback to loader that consumes result of plugin demand.\n\n\t\tif(id){\n\t\t\tparentRequire([id], loaded);\n\t\t}else{\n\t\t\tloaded();\n\t\t}\n\t};\n\n\treturn has;\n});\n","define([\n\t\"require\",\t\t\t// require, require.toUrl\n\t\"./_base/config\", // config.blankGif\n\t\"./dom-class\", // domClass.add\n\t\"./dom-style\", // domStyle.getComputedStyle\n\t\"./has\",\n\t\"./domReady\",\n\t\"./_base/window\" // win.body\n], function(require, config, domClass, domStyle, has, domReady, win){\n\n\t// module:\n\t//\t\tdojo/hccss\n\n\t/*=====\n\treturn function(){\n\t\t// summary:\n\t\t//\t\tTest if computer is in high contrast mode (i.e. if browser is not displaying background images).\n\t\t//\t\tDefines `has(\"highcontrast\")` and sets `dj_a11y` CSS class on `<body>` if machine is in high contrast mode.\n\t\t//\t\tReturns `has()` method;\n\t};\n\t=====*/\n\n\t// Has() test for when background images aren't displayed. Don't call has(\"highcontrast\") before dojo/domReady!.\n\thas.add(\"highcontrast\", function(){\n\t\t// note: if multiple documents, doesn't matter which one we use\n\t\tvar div = win.doc.createElement(\"div\");\n\t\ttry{\n\t\t\tdiv.style.cssText = \"border: 1px solid; border-color:red green; position: absolute; height: 5px; top: -999px;\" +\n\t\t\t\t\"background-image: url(\\\"\" + (config.blankGif || require.toUrl(\"./resources/blank.gif\")) + \"\\\");\";\n\t\t\twin.body().appendChild(div);\n\n\t\t\tvar cs = domStyle.getComputedStyle(div),\n\t\t\t\tbkImg = cs.backgroundImage;\n\t\t\treturn cs.borderTopColor == cs.borderRightColor ||\n\t\t\t\t(bkImg && (bkImg == \"none\" || bkImg == \"url(invalid-url:)\" ));\n\t\t}catch(e){\n\t\t\tconsole.warn(\"hccss: exception detecting high-contrast mode, document is likely hidden: \" + e.toString());\n\t\t\treturn false;\n\t\t}finally{\n\t\t\tif(has(\"ie\") <= 8){\n\t\t\t\tdiv.outerHTML = \"\";\t\t// prevent mixed-content warning, see http://support.microsoft.com/kb/925014\n\t\t\t}else{\n\t\t\t\twin.body().removeChild(div);\n\t\t\t}\n\t\t}\n\t});\n\n\tdomReady(function(){\n\t\tif(has(\"highcontrast\")){\n\t\t\tdomClass.add(win.body(), \"dj_a11y\");\n\t\t}\n\t});\n\n\treturn has;\n});\n","define([\"./_base/kernel\", \"require\", \"./has\", \"./_base/array\", \"./_base/config\", \"./_base/lang\", \"./has!host-browser?./_base/xhr\", \"./json\", \"module\"],\n\tfunction(dojo, require, has, array, config, lang, xhr, json, module){\n\n\t// module:\n\t//\t\tdojo/i18n\n\n\thas.add(\"dojo-preload-i18n-Api\",\n\t\t// if true, define the preload localizations machinery\n\t\t1\n\t);\n\n\thas.add(\"dojo-v1x-i18n-Api\",\n\t\t// if true, define the v1.x i18n functions\n\t\t1\n\t);\n\n\tvar\n\t\tthisModule = dojo.i18n =\n\t\t\t{\n\t\t\t\t// summary:\n\t\t\t\t//\t\tThis module implements the dojo/i18n! plugin and the v1.6- i18n API\n\t\t\t\t// description:\n\t\t\t\t//\t\tWe choose to include our own plugin to leverage functionality already contained in dojo\n\t\t\t\t//\t\tand thereby reduce the size of the plugin compared to various loader implementations. Also, this\n\t\t\t\t//\t\tallows foreign AMD loaders to be used without their plugins.\n\t\t\t},\n\n\t\tnlsRe =\n\t\t\t// regexp for reconstructing the master bundle name from parts of the regexp match\n\t\t\t// nlsRe.exec(\"foo/bar/baz/nls/en-ca/foo\") gives:\n\t\t\t// [\"foo/bar/baz/nls/en-ca/foo\", \"foo/bar/baz/nls/\", \"/\", \"/\", \"en-ca\", \"foo\"]\n\t\t\t// nlsRe.exec(\"foo/bar/baz/nls/foo\") gives:\n\t\t\t// [\"foo/bar/baz/nls/foo\", \"foo/bar/baz/nls/\", \"/\", \"/\", \"foo\", \"\"]\n\t\t\t// so, if match[5] is blank, it means this is the top bundle definition.\n\t\t\t// courtesy of http://requirejs.org\n\t\t\t/(^.*(^|\\/)nls)(\\/|$)([^\\/]*)\\/?([^\\/]*)/,\n\n\t\tgetAvailableLocales = function(\n\t\t\troot,\n\t\t\tlocale,\n\t\t\tbundlePath,\n\t\t\tbundleName\n\t\t){\n\t\t\t// summary:\n\t\t\t//\t\treturn a vector of module ids containing all available locales with respect to the target locale\n\t\t\t//\t\tFor example, assuming:\n\t\t\t//\n\t\t\t//\t\t- the root bundle indicates specific bundles for \"fr\" and \"fr-ca\",\n\t\t\t//\t\t- bundlePath is \"myPackage/nls\"\n\t\t\t//\t\t- bundleName is \"myBundle\"\n\t\t\t//\n\t\t\t//\t\tThen a locale argument of \"fr-ca\" would return\n\t\t\t//\n\t\t\t//\t\t\t[\"myPackage/nls/myBundle\", \"myPackage/nls/fr/myBundle\", \"myPackage/nls/fr-ca/myBundle\"]\n\t\t\t//\n\t\t\t//\t\tNotice that bundles are returned least-specific to most-specific, starting with the root.\n\t\t\t//\n\t\t\t//\t\tIf root===false indicates we're working with a pre-AMD i18n bundle that doesn't tell about the available locales;\n\t\t\t//\t\ttherefore, assume everything is available and get 404 errors that indicate a particular localization is not available\n\n\t\t\tfor(var result = [bundlePath + bundleName], localeParts = locale.split(\"-\"), current = \"\", i = 0; i<localeParts.length; i++){\n\t\t\t\tcurrent += (current ? \"-\" : \"\") + localeParts[i];\n\t\t\t\tif(!root || root[current]){\n\t\t\t\t\tresult.push(bundlePath + current + \"/\" + bundleName);\n\t\t\t\t\tresult.specificity = current;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\tcache = {},\n\n\t\tgetBundleName = function(moduleName, bundleName, locale){\n\t\t\tlocale = locale ? locale.toLowerCase() : dojo.locale;\n\t\t\tmoduleName = moduleName.replace(/\\./g, \"/\");\n\t\t\tbundleName = bundleName.replace(/\\./g, \"/\");\n\t\t\treturn (/root/i.test(locale)) ?\n\t\t\t\t(moduleName + \"/nls/\" + bundleName) :\n\t\t\t\t(moduleName + \"/nls/\" + locale + \"/\" + bundleName);\n\t\t},\n\n\t\tgetL10nName = dojo.getL10nName = function(moduleName, bundleName, locale){\n\t\t\treturn moduleName = module.id + \"!\" + getBundleName(moduleName, bundleName, locale);\n\t\t},\n\n\t\tdoLoad = function(require, bundlePathAndName, bundlePath, bundleName, locale, load){\n\t\t\t// summary:\n\t\t\t//\t\tget the root bundle which instructs which other bundles are required to construct the localized bundle\n\t\t\trequire([bundlePathAndName], function(root){\n\t\t\t\tvar current = lang.clone(root.root || root.ROOT),// 1.6 built bundle defined ROOT\n\t\t\t\t\tavailableLocales = getAvailableLocales(!root._v1x && root, locale, bundlePath, bundleName);\n\t\t\t\trequire(availableLocales, function(){\n\t\t\t\t\tfor (var i = 1; i<availableLocales.length; i++){\n\t\t\t\t\t\tcurrent = lang.mixin(lang.clone(current), arguments[i]);\n\t\t\t\t\t}\n\t\t\t\t\t// target may not have been resolve (e.g., maybe only \"fr\" exists when \"fr-ca\" was requested)\n\t\t\t\t\tvar target = bundlePathAndName + \"/\" + locale;\n\t\t\t\t\tcache[target] = current;\n\t\t\t\t\tcurrent.$locale = availableLocales.specificity;\n\t\t\t\t\tload();\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\tnormalize = function(id, toAbsMid){\n\t\t\t// summary:\n\t\t\t//\t\tid may be relative.\n\t\t\t//\t\tpreload has form `*preload*<path>/nls/<module>*<flattened locales>` and\n\t\t\t//\t\ttherefore never looks like a relative\n\t\t\treturn /^\\./.test(id) ? toAbsMid(id) : id;\n\t\t},\n\n\t\tgetLocalesToLoad = function(targetLocale){\n\t\t\tvar list = config.extraLocale || [];\n\t\t\tlist = lang.isArray(list) ? list : [list];\n\t\t\tlist.push(targetLocale);\n\t\t\treturn list;\n\t\t},\n\n\t\tload = function(id, require, load){\n\t\t\t// summary:\n\t\t\t//\t\tid is in one of the following formats\n\t\t\t//\n\t\t\t//\t\t1. <path>/nls/<bundle>\n\t\t\t//\t\t\t=> load the bundle, localized to config.locale; load all bundles localized to\n\t\t\t//\t\t\tconfig.extraLocale (if any); return the loaded bundle localized to config.locale.\n\t\t\t//\n\t\t\t//\t\t2. <path>/nls/<locale>/<bundle>\n\t\t\t//\t\t\t=> load then return the bundle localized to <locale>\n\t\t\t//\n\t\t\t//\t\t3. *preload*<path>/nls/<module>*<JSON array of available locales>\n\t\t\t//\t\t\t=> for config.locale and all config.extraLocale, load all bundles found\n\t\t\t//\t\t\tin the best-matching bundle rollup. A value of 1 is returned, which\n\t\t\t//\t\t\tis meaningless other than to say the plugin is executing the requested\n\t\t\t//\t\t\tpreloads\n\t\t\t//\n\t\t\t//\t\tIn cases 1 and 2, <path> is always normalized to an absolute module id upon entry; see\n\t\t\t//\t\tnormalize. In case 3, it <path> is assumed to be absolute; this is arranged by the builder.\n\t\t\t//\n\t\t\t//\t\tTo load a bundle means to insert the bundle into the plugin's cache and publish the bundle\n\t\t\t//\t\tvalue to the loader. Given <path>, <bundle>, and a particular <locale>, the cache key\n\t\t\t//\n\t\t\t//\t\t\t<path>/nls/<bundle>/<locale>\n\t\t\t//\n\t\t\t//\t\twill hold the value. Similarly, then plugin will publish this value to the loader by\n\t\t\t//\n\t\t\t//\t\t\tdefine(\"<path>/nls/<bundle>/<locale>\", <bundle-value>);\n\t\t\t//\n\t\t\t//\t\tGiven this algorithm, other machinery can provide fast load paths be preplacing\n\t\t\t//\t\tvalues in the plugin's cache, which is public. When a load is demanded the\n\t\t\t//\t\tcache is inspected before starting any loading. Explicitly placing values in the plugin\n\t\t\t//\t\tcache is an advanced/experimental feature that should not be needed; use at your own risk.\n\t\t\t//\n\t\t\t//\t\tFor the normal AMD algorithm, the root bundle is loaded first, which instructs the\n\t\t\t//\t\tplugin what additional localized bundles are required for a particular locale. These\n\t\t\t//\t\tadditional locales are loaded and a mix of the root and each progressively-specific\n\t\t\t//\t\tlocale is returned. For example:\n\t\t\t//\n\t\t\t//\t\t1. The client demands \"dojo/i18n!some/path/nls/someBundle\n\t\t\t//\n\t\t\t//\t\t2. The loader demands load(some/path/nls/someBundle)\n\t\t\t//\n\t\t\t//\t\t3. This plugin require's \"some/path/nls/someBundle\", which is the root bundle.\n\t\t\t//\n\t\t\t//\t\t4. Assuming config.locale is \"ab-cd-ef\" and the root bundle indicates that localizations\n\t\t\t//\t\tare available for \"ab\" and \"ab-cd-ef\" (note the missing \"ab-cd\", then the plugin\n\t\t\t//\t\trequires \"some/path/nls/ab/someBundle\" and \"some/path/nls/ab-cd-ef/someBundle\"\n\t\t\t//\n\t\t\t//\t\t5. Upon receiving all required bundles, the plugin constructs the value of the bundle\n\t\t\t//\t\tab-cd-ef as...\n\t\t\t//\n\t\t\t//\t\t\t\tmixin(mixin(mixin({}, require(\"some/path/nls/someBundle\"),\n\t\t\t//\t\t \t\t\trequire(\"some/path/nls/ab/someBundle\")),\n\t\t\t//\t\t\t\t\trequire(\"some/path/nls/ab-cd-ef/someBundle\"));\n\t\t\t//\n\t\t\t//\t\tThis value is inserted into the cache and published to the loader at the\n\t\t\t//\t\tkey/module-id some/path/nls/someBundle/ab-cd-ef.\n\t\t\t//\n\t\t\t//\t\tThe special preload signature (case 3) instructs the plugin to stop servicing all normal requests\n\t\t\t//\t\t(further preload requests will be serviced) until all ongoing preloading has completed.\n\t\t\t//\n\t\t\t//\t\tThe preload signature instructs the plugin that a special rollup module is available that contains\n\t\t\t//\t\tone or more flattened, localized bundles. The JSON array of available locales indicates which locales\n\t\t\t//\t\tare available. Here is an example:\n\t\t\t//\n\t\t\t//\t\t\t*preload*some/path/nls/someModule*[\"root\", \"ab\", \"ab-cd-ef\"]\n\t\t\t//\n\t\t\t//\t\tThis indicates the following rollup modules are available:\n\t\t\t//\n\t\t\t//\t\t\tsome/path/nls/someModule_ROOT\n\t\t\t//\t\t\tsome/path/nls/someModule_ab\n\t\t\t//\t\t\tsome/path/nls/someModule_ab-cd-ef\n\t\t\t//\n\t\t\t//\t\tEach of these modules is a normal AMD module that contains one or more flattened bundles in a hash.\n\t\t\t//\t\tFor example, assume someModule contained the bundles some/bundle/path/someBundle and\n\t\t\t//\t\tsome/bundle/path/someOtherBundle, then some/path/nls/someModule_ab would be expressed as follows:\n\t\t\t//\n\t\t\t//\t\t\tdefine({\n\t\t\t//\t\t\t\tsome/bundle/path/someBundle:<value of someBundle, flattened with respect to locale ab>,\n\t\t\t//\t\t\t\tsome/bundle/path/someOtherBundle:<value of someOtherBundle, flattened with respect to locale ab>,\n\t\t\t//\t\t\t});\n\t\t\t//\n\t\t\t//\t\tE.g., given this design, preloading for locale==\"ab\" can execute the following algorithm:\n\t\t\t//\n\t\t\t//\t\t\trequire([\"some/path/nls/someModule_ab\"], function(rollup){\n\t\t\t//\t\t\t\tfor(var p in rollup){\n\t\t\t//\t\t\t\t\tvar id = p + \"/ab\",\n\t\t\t//\t\t\t\t\tcache[id] = rollup[p];\n\t\t\t//\t\t\t\t\tdefine(id, rollup[p]);\n\t\t\t//\t\t\t\t}\n\t\t\t//\t\t\t});\n\t\t\t//\n\t\t\t//\t\tSimilarly, if \"ab-cd\" is requested, the algorithm can determine that \"ab\" is the best available and\n\t\t\t//\t\tload accordingly.\n\t\t\t//\n\t\t\t//\t\tThe builder will write such rollups for every layer if a non-empty localeList profile property is\n\t\t\t//\t\tprovided. Further, the builder will include the following cache entry in the cache associated with\n\t\t\t//\t\tany layer.\n\t\t\t//\n\t\t\t//\t\t\t\"*now\":function(r){r(['dojo/i18n!*preload*<path>/nls/<module>*<JSON array of available locales>']);}\n\t\t\t//\n\t\t\t//\t\tThe *now special cache module instructs the loader to apply the provided function to context-require\n\t\t\t//\t\twith respect to the particular layer being defined. This causes the plugin to hold all normal service\n\t\t\t//\t\trequests until all preloading is complete.\n\t\t\t//\n\t\t\t//\t\tNotice that this algorithm is rarely better than the standard AMD load algorithm. Consider the normal case\n\t\t\t//\t\twhere the target locale has a single segment and a layer depends on a single bundle:\n\t\t\t//\n\t\t\t//\t\tWithout Preloads:\n\t\t\t//\n\t\t\t//\t\t1. Layer loads root bundle.\n\t\t\t//\t\t2. bundle is demanded; plugin loads single localized bundle.\n\t\t\t//\n\t\t\t//\t\tWith Preloads:\n\t\t\t//\n\t\t\t//\t\t1. Layer causes preloading of target bundle.\n\t\t\t//\t\t2. bundle is demanded; service is delayed until preloading complete; bundle is returned.\n\t\t\t//\n\t\t\t//\t\tIn each case a single transaction is required to load the target bundle. In cases where multiple bundles\n\t\t\t//\t\tare required and/or the locale has multiple segments, preloads still requires a single transaction whereas\n\t\t\t//\t\tthe normal path requires an additional transaction for each additional bundle/locale-segment. However all\n\t\t\t//\t\tof these additional transactions can be done concurrently. Owing to this analysis, the entire preloading\n\t\t\t//\t\talgorithm can be discard during a build by setting the has feature dojo-preload-i18n-Api to false.\n\n\t\t\tvar match = nlsRe.exec(id),\n\t\t\t\tbundlePath = match[1] + \"/\",\n\t\t\t\tbundleName = match[5] || match[4],\n\t\t\t\tbundlePathAndName = bundlePath + bundleName,\n\t\t\t\tlocaleSpecified = (match[5] && match[4]),\n\t\t\t\ttargetLocale =\tlocaleSpecified || dojo.locale || \"\",\n\t\t\t\tloadTarget = bundlePathAndName + \"/\" + targetLocale,\n\t\t\t\tloadList = localeSpecified ? [targetLocale] : getLocalesToLoad(targetLocale),\n\t\t\t\tremaining = loadList.length,\n\t\t\t\tfinish = function(){\n\t\t\t\t\tif(!--remaining){\n\t\t\t\t\t\tload(lang.delegate(cache[loadTarget]));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsplit = id.split(\"*\"),\n\t\t\t\tpreloadDemand = split[1] == \"preload\";\n\n\t\t\tif(has(\"dojo-preload-i18n-Api\")){\n\t\t\t\tif(preloadDemand){\n\t\t\t\t\tif(!cache[id]){\n\t\t\t\t\t\t// use cache[id] to prevent multiple preloads of the same preload; this shouldn't happen, but\n\t\t\t\t\t\t// who knows what over-aggressive human optimizers may attempt\n\t\t\t\t\t\tcache[id] = 1;\n\t\t\t\t\t\tpreloadL10n(split[2], json.parse(split[3]), 1, require);\n\t\t\t\t\t}\n\t\t\t\t\t// don't stall the loader!\n\t\t\t\t\tload(1);\n\t\t\t\t}\n\t\t\t\tif(preloadDemand || (waitForPreloads(id, require, load) && !cache[loadTarget])){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (preloadDemand) {\n\t\t\t\t// If a build is created with nls resources and 'dojo-preload-i18n-Api' has not been set to false,\n\t\t\t\t// the built file will include a preload in the cache (which looks about like so:)\n\t\t\t\t// '*now':function(r){r(['dojo/i18n!*preload*dojo/nls/dojo*[\"ar\",\"ca\",\"cs\",\"da\",\"de\",\"el\",\"en-gb\",\"en-us\",\"es-es\",\"fi-fi\",\"fr-fr\",\"he-il\",\"hu\",\"it-it\",\"ja-jp\",\"ko-kr\",\"nl-nl\",\"nb\",\"pl\",\"pt-br\",\"pt-pt\",\"ru\",\"sk\",\"sl\",\"sv\",\"th\",\"tr\",\"zh-tw\",\"zh-cn\",\"ROOT\"]']);}\n\t\t\t\t// If the consumer of the build sets 'dojo-preload-i18n-Api' to false in the Dojo config, the cached\n\t\t\t\t// preload will not be parsed and will result in an attempt to call 'require' passing it the unparsed\n\t\t\t\t// preload, which is not a valid module id.\n\t\t\t\t// In this case we should skip this request.\n\t\t\t\tload(1);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tarray.forEach(loadList, function(locale){\n\t\t\t\tvar target = bundlePathAndName + \"/\" + locale;\n\t\t\t\tif(has(\"dojo-preload-i18n-Api\")){\n\t\t\t\t\tcheckForLegacyModules(target);\n\t\t\t\t}\n\t\t\t\tif(!cache[target]){\n\t\t\t\t\tdoLoad(require, bundlePathAndName, bundlePath, bundleName, locale, finish);\n\t\t\t\t}else{\n\t\t\t\t\tfinish();\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\tif(has(\"dojo-preload-i18n-Api\") || has(\"dojo-v1x-i18n-Api\")){\n\t\tvar normalizeLocale = thisModule.normalizeLocale = function(locale){\n\t\t\t\tvar result = locale ? locale.toLowerCase() : dojo.locale;\n\t\t\t\treturn result == \"root\" ? \"ROOT\" : result;\n\t\t\t},\n\n\t\t\tisXd = function(mid, contextRequire){\n\t\t\t\treturn (has(\"dojo-sync-loader\") && has(\"dojo-v1x-i18n-Api\")) ?\n\t\t\t\t\tcontextRequire.isXdUrl(require.toUrl(mid + \".js\")) :\n\t\t\t\t\ttrue;\n\t\t\t},\n\n\t\t\tpreloading = 0,\n\n\t\t\tpreloadWaitQueue = [],\n\n\t\t\tpreloadL10n = thisModule._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated, /*boolean?*/ guaranteedAmdFormat, /*function?*/ contextRequire){\n\t\t\t\t// summary:\n\t\t\t\t//\t\tLoad available flattened resource bundles associated with a particular module for dojo/locale and all dojo/config.extraLocale (if any)\n\t\t\t\t// description:\n\t\t\t\t//\t\tOnly called by built layer files. The entire locale hierarchy is loaded. For example,\n\t\t\t\t//\t\tif locale==\"ab-cd\", then ROOT, \"ab\", and \"ab-cd\" are loaded. This is different than v1.6-\n\t\t\t\t//\t\tin that the v1.6- would only load ab-cd...which was *always* flattened.\n\t\t\t\t//\n\t\t\t\t//\t\tIf guaranteedAmdFormat is true, then the module can be loaded with require thereby circumventing the detection algorithm\n\t\t\t\t//\t\tand the extra possible extra transaction.\n\n\t\t\t\t// If this function is called from legacy code, then guaranteedAmdFormat and contextRequire will be undefined. Since the function\n\t\t\t\t// needs a require in order to resolve module ids, fall back to the context-require associated with this dojo/i18n module, which\n\t\t\t\t// itself may have been mapped.\n\t\t\t\tcontextRequire = contextRequire || require;\n\n\t\t\t\tfunction doRequire(mid, callback){\n\t\t\t\t\tif(isXd(mid, contextRequire) || guaranteedAmdFormat){\n\t\t\t\t\t\tcontextRequire([mid], callback);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsyncRequire([mid], callback, contextRequire);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction forEachLocale(locale, func){\n\t\t\t\t\t// given locale= \"ab-cd-ef\", calls func on \"ab-cd-ef\", \"ab-cd\", \"ab\", \"ROOT\"; stops calling the first time func returns truthy\n\t\t\t\t\tvar parts = locale.split(\"-\");\n\t\t\t\t\twhile(parts.length){\n\t\t\t\t\t\tif(func(parts.join(\"-\"))){\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparts.pop();\n\t\t\t\t\t}\n\t\t\t\t\tfunc(\"ROOT\");\n\t\t\t\t}\n\n\t\t\t\t\tfunction preloadingAddLock(){\n\t\t\t\t\t\tpreloading++;\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction preloadingRelLock(){\n\t\t\t\t\t\t--preloading;\n\t\t\t\t\t\twhile(!preloading && preloadWaitQueue.length){\n\t\t\t\t\t\t\tload.apply(null, preloadWaitQueue.shift());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction cacheId(path, name, loc, require){\n\t\t\t\t\t\t// path is assumed to have a trailing \"/\"\n\t\t\t\t\t\treturn require.toAbsMid(path + name + \"/\" + loc)\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction preload(locale){\n\t\t\t\t\t\tlocale = normalizeLocale(locale);\n\t\t\t\t\t\tforEachLocale(locale, function(loc){\n\t\t\t\t\t\t\tif(array.indexOf(localesGenerated, loc) >= 0){\n\t\t\t\t\t\t\t\tvar mid = bundlePrefix.replace(/\\./g, \"/\") + \"_\" + loc;\n\t\t\t\t\t\t\t\tpreloadingAddLock();\n\t\t\t\t\t\t\t\tdoRequire(mid, function(rollup){\n\t\t\t\t\t\t\t\t\tfor(var p in rollup){\n\t\t\t\t\t\t\t\t\t\tvar bundle = rollup[p],\n\t\t\t\t\t\t\t\t\t\t\tmatch = p.match(/(.+)\\/([^\\/]+)$/),\n\t\t\t\t\t\t\t\t\t\t\tbundleName, bundlePath;\n\n\t\t\t\t\t\t\t\t\t\t\t// If there is no match, the bundle is not a regular bundle from an AMD layer.\n\t\t\t\t\t\t\t\t\t\t\tif (!match){continue;}\n\n\t\t\t\t\t\t\t\t\t\t\tbundleName = match[2];\n\t\t\t\t\t\t\t\t\t\t\tbundlePath = match[1] + \"/\";\n\n\t\t\t\t\t\t\t\t\t\t// backcompat\n\t\t\t\t\t\t\t\t\t\tif(!bundle._localized){continue;}\n\n\t\t\t\t\t\t\t\t\t\tvar localized;\n\t\t\t\t\t\t\t\t\t\tif(loc === \"ROOT\"){\n\t\t\t\t\t\t\t\t\t\t\tvar root = localized = bundle._localized;\n\t\t\t\t\t\t\t\t\t\t\tdelete bundle._localized;\n\t\t\t\t\t\t\t\t\t\t\troot.root = bundle;\n\t\t\t\t\t\t\t\t\t\t\tcache[require.toAbsMid(p)] = root;\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\tlocalized = bundle._localized;\n\t\t\t\t\t\t\t\t\t\t\tcache[cacheId(bundlePath, bundleName, loc, require)] = bundle;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif(loc !== locale){\n\t\t\t\t\t\t\t\t\t\t\t// capture some locale variables\n\t\t\t\t\t\t\t\t\t\t\tvar improveBundle = function improveBundle(bundlePath, bundleName, bundle, localized){\n\t\t\t\t\t\t\t\t\t\t\t\t// locale was not flattened and we've fallen back to a less-specific locale that was flattened\n\t\t\t\t\t\t\t\t\t\t\t\t// for example, we had a flattened 'fr', a 'fr-ca' is available for at least this bundle, and\n\t\t\t\t\t\t\t\t\t\t\t\t// locale==='fr-ca'; therefore, we must improve the bundle as retrieved from the rollup by\n\t\t\t\t\t\t\t\t\t\t\t\t// manually loading the fr-ca version of the bundle and mixing this into the already-retrieved 'fr'\n\t\t\t\t\t\t\t\t\t\t\t\t// version of the bundle.\n\t\t\t\t\t\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t\t\t\t\t\t// Remember, different bundles may have different sets of locales available.\n\t\t\t\t\t\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t\t\t\t\t\t// we are really falling back on the regular algorithm here, but--hopefully--starting with most\n\t\t\t\t\t\t\t\t\t\t\t\t// of the required bundles already on board as given by the rollup and we need to \"manually\" load\n\t\t\t\t\t\t\t\t\t\t\t\t// only one locale from a few bundles...or even better...we won't find anything better to load.\n\t\t\t\t\t\t\t\t\t\t\t\t// This algorithm ensures there is nothing better to load even when we can only load a less-specific rollup.\n\t\t\t\t\t\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t\t\t\t\t\t// note: this feature is only available in async mode\n\n\t\t\t\t\t\t\t\t\t\t\t\t// inspect the loaded bundle that came from the rollup to see if something better is available\n\t\t\t\t\t\t\t\t\t\t\t\t// for any bundle in a rollup, more-specific available locales are given at localized.\n\t\t\t\t\t\t\t\t\t\t\t\tvar requiredBundles = [],\n\t\t\t\t\t\t\t\t\t\t\t\t\tcacheIds = [];\n\t\t\t\t\t\t\t\t\t\t\t\tforEachLocale(locale, function(loc){\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(localized[loc]){\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequiredBundles.push(require.toAbsMid(bundlePath + loc + \"/\" + bundleName));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcacheIds.push(cacheId(bundlePath, bundleName, loc, require));\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tif(requiredBundles.length){\n\t\t\t\t\t\t\t\t\t\t\t\t\tpreloadingAddLock();\n\t\t\t\t\t\t\t\t\t\t\t\t\tcontextRequire(requiredBundles, function(){\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// requiredBundles was constructed by forEachLocale so it contains locales from\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// less specific to most specific.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// the loop starts with the most specific locale, the last one.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfor(var i = requiredBundles.length - 1; i >= 0 ; i--){\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbundle = lang.mixin(lang.clone(bundle), arguments[i]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcache[cacheIds[i]] = bundle;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// this is the best possible (maybe a perfect match, maybe not), accept it\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcache[cacheId(bundlePath, bundleName, locale, require)] = lang.clone(bundle);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpreloadingRelLock();\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\t\t// this is the best possible (definitely not a perfect match), accept it\n\t\t\t\t\t\t\t\t\t\t\t\t\tcache[cacheId(bundlePath, bundleName, locale, require)] = bundle;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\timproveBundle(bundlePath, bundleName, bundle, localized);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tpreloadingRelLock();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\tpreload();\n\t\t\t\tarray.forEach(dojo.config.extraLocale, preload);\n\t\t\t},\n\n\t\t\twaitForPreloads = function(id, require, load){\n\t\t\t\tif(preloading){\n\t\t\t\t\tpreloadWaitQueue.push([id, require, load]);\n\t\t\t\t}\n\t\t\t\treturn preloading;\n\t\t\t},\n\n\t\t\tcheckForLegacyModules = function()\n\t\t\t\t{};\n\t}\n\n\tif(has(\"dojo-v1x-i18n-Api\")){\n\t\t// this code path assumes the dojo loader and won't work with a standard AMD loader\n\t\tvar amdValue = {},\n\t\t\tl10nCache = {},\n\t\t\tevalBundle,\n\n\t\t\tsyncRequire = function(deps, callback, require){\n\t\t\t\tvar results = [];\n\t\t\t\tarray.forEach(deps, function(mid){\n\t\t\t\t\tvar url = require.toUrl(mid + \".js\");\n\n\t\t\t\t\tfunction load(text){\n\t\t\t\t\t\tif (!evalBundle) {\n\t\t\t\t\t\t\t// use the function ctor to keep the minifiers away (also come close to global scope, but this is secondary)\n\t\t\t\t\t\t\tevalBundle = new Function(\n\t\t\t\t\t\t\t\t\"__bundle\",\t\t\t\t // the bundle to evalutate\n\t\t\t\t\t\t\t\t\"__checkForLegacyModules\", // a function that checks if __bundle defined __mid in the global space\n\t\t\t\t\t\t\t\t\"__mid\",\t\t\t\t // the mid that __bundle is intended to define\n\t\t\t\t\t\t\t\t\"__amdValue\",\n\n\t\t\t\t\t\t\t\t// returns one of:\n\t\t\t\t\t\t\t\t//\t\t1 => the bundle was an AMD bundle\n\t\t\t\t\t\t\t\t//\t\ta legacy bundle object that is the value of __mid\n\t\t\t\t\t\t\t\t//\t\tinstance of Error => could not figure out how to evaluate bundle\n\n\t\t\t\t\t\t\t\t// used to detect when __bundle calls define\n\t\t\t\t\t\t\t\t\"var define = function(mid, factory){define.called = 1; __amdValue.result = factory || mid;},\"\n\t\t\t\t\t\t\t\t+ \"\t require = function(){define.called = 1;};\"\n\n\t\t\t\t\t\t\t\t+ \"try{\"\n\t\t\t\t\t\t\t\t+\t\t\"define.called = 0;\"\n\t\t\t\t\t\t\t\t+\t\t\"eval(__bundle);\"\n\t\t\t\t\t\t\t\t+\t\t\"if(define.called==1)\"\n\t\t\t\t\t\t\t\t\t\t\t// bundle called define; therefore signal it's an AMD bundle\n\t\t\t\t\t\t\t\t+\t\t\t\"return __amdValue;\"\n\n\t\t\t\t\t\t\t\t+\t\t\"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))\"\n\t\t\t\t\t\t\t\t\t\t\t// bundle was probably a v1.6- built NLS flattened NLS bundle that defined __mid in the global space\n\t\t\t\t\t\t\t\t+\t\t\t\"return __checkForLegacyModules;\"\n\n\t\t\t\t\t\t\t\t+ \"}catch(e){}\"\n\t\t\t\t\t\t\t\t// evaulating the bundle was *neither* an AMD *nor* a legacy flattened bundle\n\t\t\t\t\t\t\t\t// either way, re-eval *after* surrounding with parentheses\n\n\t\t\t\t\t\t\t\t+ \"try{\"\n\t\t\t\t\t\t\t\t+\t\t\"return eval('('+__bundle+')');\"\n\t\t\t\t\t\t\t\t+ \"}catch(e){\"\n\t\t\t\t\t\t\t\t+\t\t\"return e;\"\n\t\t\t\t\t\t\t\t+ \"}\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar result = evalBundle(text, checkForLegacyModules, mid, amdValue);\n\t\t\t\t\t\tif(result===amdValue){\n\t\t\t\t\t\t\t// the bundle was an AMD module; re-inject it through the normal AMD path\n\t\t\t\t\t\t\t// we gotta do this since it could be an anonymous module and simply evaluating\n\t\t\t\t\t\t\t// the text here won't provide the loader with the context to know what\n\t\t\t\t\t\t\t// module is being defined()'d. With browser caching, this should be free; further\n\t\t\t\t\t\t\t// this entire code path can be circumvented by using the AMD format to begin with\n\t\t\t\t\t\t\tresults.push(cache[url] = amdValue.result);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tif(result instanceof Error){\n\t\t\t\t\t\t\t\tconsole.error(\"failed to evaluate i18n bundle; url=\" + url, result);\n\t\t\t\t\t\t\t\tresult = {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// nls/<locale>/<bundle-name> indicates not the root.\n\t\t\t\t\t\t\tresults.push(cache[url] = (/nls\\/[^\\/]+\\/[^\\/]+$/.test(url) ? result : {root:result, _v1x:1}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(cache[url]){\n\t\t\t\t\t\tresults.push(cache[url]);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tvar bundle = require.syncLoadNls(mid);\n\t\t\t\t\t\t// need to check for legacy module here because there might be a legacy module for a\n\t\t\t\t\t\t// less specific locale (which was not looked up during the first checkForLegacyModules\n\t\t\t\t\t\t// call in load()).\n\t\t\t\t\t\t// Also need to reverse the locale and the module name in the mid because syncRequire\n\t\t\t\t\t\t// deps parameters uses the AMD style package/nls/locale/module while legacy code uses\n\t\t\t\t\t\t// package/nls/module/locale.\n\t\t\t\t\t\tif(!bundle){\n\t\t\t\t\t\t\tbundle = checkForLegacyModules(mid.replace(/nls\\/([^\\/]*)\\/([^\\/]*)$/, \"nls/$2/$1\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(bundle){\n\t\t\t\t\t\t\tresults.push(bundle);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tif(!xhr){\n\t\t\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\t\t\trequire.getText(url, true, load);\n\t\t\t\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t\t\t\tresults.push(cache[url] = {});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\txhr.get({\n\t\t\t\t\t\t\t\t\turl:url,\n\t\t\t\t\t\t\t\t\tsync:true,\n\t\t\t\t\t\t\t\t\tload:load,\n\t\t\t\t\t\t\t\t\terror:function(){\n\t\t\t\t\t\t\t\t\t\tresults.push(cache[url] = {});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcallback && callback.apply(null, results);\n\t\t\t};\n\n\t\tcheckForLegacyModules = function(target){\n\t\t\t// legacy code may have already loaded [e.g] the raw bundle x/y/z at x.y.z; when true, push into the cache\n\t\t\tfor(var result, names = target.split(\"/\"), object = dojo.global[names[0]], i = 1; object && i<names.length-1; object = object[names[i++]]){}\n\t\t\tif(object){\n\t\t\t\tresult = object[names[i]];\n\t\t\t\tif(!result){\n\t\t\t\t\t// fallback for incorrect bundle build of 1.6\n\t\t\t\t\tresult = object[names[i].replace(/-/g,\"_\")];\n\t\t\t\t}\n\t\t\t\tif(result){\n\t\t\t\t\tcache[target] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\n\t\tthisModule.getLocalization = function(moduleName, bundleName, locale){\n\t\t\tvar result,\n\t\t\t\tl10nName = getBundleName(moduleName, bundleName, locale);\n\n\t\t\tif (l10nCache[l10nName]) {\n\t\t\t\treturn l10nCache[l10nName];\n\t\t\t}\n\n\t\t\tload(\n\t\t\t\tl10nName,\n\n\t\t\t\t// isXd() and syncRequire() need a context-require in order to resolve the mid with respect to a reference module.\n\t\t\t\t// Since this legacy function does not have the concept of a reference module, resolve with respect to this\n\t\t\t\t// dojo/i18n module, which, itself may have been mapped.\n\t\t\t\t(!isXd(l10nName, require) ? function(deps, callback){ syncRequire(deps, callback, require); } : require),\n\n\t\t\t\tfunction(result_){\n\t\t\t\t\tl10nCache[l10nName] = result_;\n\t\t\t\t\tresult = result_;\n\t\t\t\t}\n\t\t\t);\n\t\t\treturn result;\n\t\t};\n\t}\n\telse {\n\t\tthisModule.getLocalization = function(moduleName, bundleName, locale){\n\t\t\tvar key = moduleName.replace(/\\./g, '/') + '/nls/' + bundleName + '/' + (locale || config.locale);\n\t\t\treturn this.cache[key];\n\t\t};\n\t}\n\n\treturn lang.mixin(thisModule, {\n\t\tdynamic:true,\n\t\tnormalize:normalize,\n\t\tload:load,\n\t\tcache:cache,\n\t\tgetL10nName: getL10nName\n\t});\n});\n","define([\"./_base/lang\"], function(lang){\n\n\t// module:\n\t//\t\tdojo/io-query\n\n\tvar backstop = {};\n\n\treturn {\n\t\t// summary:\n\t\t//\t\tThis module defines query string processing functions.\n\n\t\tobjectToQuery: function objectToQuery(/*Object*/ map){\n\t\t\t// summary:\n\t\t\t//\t\ttakes a name/value mapping object and returns a string representing\n\t\t\t//\t\ta URL-encoded version of that object.\n\t\t\t// example:\n\t\t\t//\t\tthis object:\n\t\t\t//\n\t\t\t//\t|\t{\n\t\t\t//\t|\t\tblah: \"blah\",\n\t\t\t//\t|\t\tmulti: [\n\t\t\t//\t|\t\t\t\"thud\",\n\t\t\t//\t|\t\t\t\"thonk\"\n\t\t\t//\t|\t\t]\n\t\t\t//\t|\t};\n\t\t\t//\n\t\t\t//\t\tyields the following query string:\n\t\t\t//\n\t\t\t//\t|\t\"blah=blah&multi=thud&multi=thonk\"\n\n\t\t\t// FIXME: need to implement encodeAscii!!\n\t\t\tvar enc = encodeURIComponent, pairs = [];\n\t\t\tfor(var name in map){\n\t\t\t\tvar value = map[name];\n\t\t\t\tif(value != backstop[name]){\n\t\t\t\t\tvar assign = enc(name) + \"=\";\n\t\t\t\t\tif(lang.isArray(value)){\n\t\t\t\t\t\tfor(var i = 0, l = value.length; i < l; ++i){\n\t\t\t\t\t\t\tpairs.push(assign + enc(value[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\tpairs.push(assign + enc(value));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pairs.join(\"&\"); // String\n\t\t},\n\n\t\tqueryToObject: function queryToObject(/*String*/ str){\n\t\t\t// summary:\n\t\t\t//\t\tCreate an object representing a de-serialized query section of a\n\t\t\t//\t\tURL. Query keys with multiple values are returned in an array.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tThis string:\n\t\t\t//\n\t\t\t//\t|\t\t\"foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&\"\n\t\t\t//\n\t\t\t//\t\tresults in this object structure:\n\t\t\t//\n\t\t\t//\t|\t\t{\n\t\t\t//\t|\t\t\tfoo: [ \"bar\", \"baz\" ],\n\t\t\t//\t|\t\t\tthinger: \" spaces =blah\",\n\t\t\t//\t|\t\t\tzonk: \"blarg\"\n\t\t\t//\t|\t\t}\n\t\t\t//\n\t\t\t//\t\tNote that spaces and other urlencoded entities are correctly\n\t\t\t//\t\thandled.\n\n \tvar dec = decodeURIComponent, qp = str.split(\"&\"), ret = {}, name, val;\n\t\t\tfor(var i = 0, l = qp.length, item; i < l; ++i){\n\t\t\t\titem = qp[i];\n\t\t\t\tif(item.length){\n\t\t\t\t\tvar s = item.indexOf(\"=\");\n\t\t\t\t\tif(s < 0){\n\t\t\t\t\t\tname = dec(item);\n\t\t\t\t\t\tval = \"\";\n\t\t\t\t\t}else{\n\t\t\t\t\t\tname = dec(item.slice(0, s));\n\t\t\t\t\t\tval = dec(item.slice(s + 1));\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof ret[name] == \"string\"){ // inline'd type check\n\t\t\t\t\t\tret[name] = [ret[name]];\n\t\t\t\t\t}\n\n\t\t\t\t\tif(lang.isArray(ret[name])){\n\t\t\t\t\t\tret[name].push(val);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tret[name] = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ret; // Object\n\t\t}\n\t};\n});","define([\"./has\"], function(has){\n\t\"use strict\";\n\tvar hasJSON = typeof JSON != \"undefined\";\n\thas.add(\"json-parse\", hasJSON); // all the parsers work fine\n\t\t// Firefox 3.5/Gecko 1.9 fails to use replacer in stringify properly https://bugzilla.mozilla.org/show_bug.cgi?id=509184\n\thas.add(\"json-stringify\", hasJSON && JSON.stringify({a:0}, function(k,v){return v||1;}) == '{\"a\":1}');\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tFunctions to parse and serialize JSON\n\n\t\tparse: function(str, strict){\n\t\t\t// summary:\n\t\t\t//\t\tParses a [JSON](http://json.org) string to return a JavaScript object.\n\t\t\t// description:\n\t\t\t//\t\tThis function follows [native JSON API](https://developer.mozilla.org/en/JSON)\n\t\t\t//\t\tThrows for invalid JSON strings. This delegates to eval() if native JSON\n\t\t\t//\t\tsupport is not available. By default this will evaluate any valid JS expression.\n\t\t\t//\t\tWith the strict parameter set to true, the parser will ensure that only\n\t\t\t//\t\tvalid JSON strings are parsed (otherwise throwing an error). Without the strict\n\t\t\t//\t\tparameter, the content passed to this method must come\n\t\t\t//\t\tfrom a trusted source.\n\t\t\t// str:\n\t\t\t//\t\ta string literal of a JSON item, for instance:\n\t\t\t//\t\t`'{ \"foo\": [ \"bar\", 1, { \"baz\": \"thud\" } ] }'`\n\t\t\t// strict:\n\t\t\t//\t\tWhen set to true, this will ensure that only valid, secure JSON is ever parsed.\n\t\t\t//\t\tMake sure this is set to true for untrusted content. Note that on browsers/engines\n\t\t\t//\t\twithout native JSON support, setting this to true will run slower.\n\t\t},\n\t\tstringify: function(value, replacer, spacer){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a [JSON](http://json.org) serialization of an object.\n\t\t\t// description:\n\t\t\t//\t\tReturns a [JSON](http://json.org) serialization of an object.\n\t\t\t//\t\tThis function follows [native JSON API](https://developer.mozilla.org/en/JSON)\n\t\t\t//\t\tNote that this doesn't check for infinite recursion, so don't do that!\n\t\t\t// value:\n\t\t\t//\t\tA value to be serialized.\n\t\t\t// replacer:\n\t\t\t//\t\tA replacer function that is called for each value and can return a replacement\n\t\t\t// spacer:\n\t\t\t//\t\tA spacer string to be used for pretty printing of JSON\n\t\t\t// example:\n\t\t\t//\t\tsimple serialization of a trivial object\n\t\t\t//\t|\tdefine([\"dojo/json\"], function(JSON){\n\t\t\t// \t|\t\tvar jsonStr = JSON.stringify({ howdy: \"stranger!\", isStrange: true });\n\t\t\t//\t|\t\tdoh.is('{\"howdy\":\"stranger!\",\"isStrange\":true}', jsonStr);\n\t\t}\n\t};\n\t=====*/\n\n\tif(has(\"json-stringify\")){\n\t\treturn JSON;\n\t}else{\n\t\tvar escapeString = function(/*String*/str){\n\t\t\t// summary:\n\t\t\t//\t\tAdds escape sequences for non-visual characters, double quote and\n\t\t\t//\t\tbackslash and surrounds with double quotes to form a valid string\n\t\t\t//\t\tliteral.\n\t\t\treturn ('\"' + str.replace(/([\"\\\\])/g, '\\\\$1') + '\"').\n\t\t\t\treplace(/[\\f]/g, \"\\\\f\").replace(/[\\b]/g, \"\\\\b\").replace(/[\\n]/g, \"\\\\n\").\n\t\t\t\treplace(/[\\t]/g, \"\\\\t\").replace(/[\\r]/g, \"\\\\r\"); // string\n\t\t};\n\t\treturn {\n\t\t\tparse: has(\"json-parse\") ? JSON.parse : function(str, strict){\n\t\t\t\tif(strict && !/^([\\s\\[\\{]*(?:\"(?:\\\\.|[^\"])*\"|-?\\d[\\d\\.]*(?:[Ee][+-]?\\d+)?|null|true|false|)[\\s\\]\\}]*(?:,|:|$))+$/.test(str)){\n\t\t\t\t\tthrow new SyntaxError(\"Invalid characters in JSON\");\n\t\t\t\t}\n\t\t\t\treturn eval('(' + str + ')');\n\t\t\t},\n\t\t\tstringify: function(value, replacer, spacer){\n\t\t\t\tvar undef;\n\t\t\t\tif(typeof replacer == \"string\"){\n\t\t\t\t\tspacer = replacer;\n\t\t\t\t\treplacer = null;\n\t\t\t\t}\n\t\t\t\tfunction stringify(it, indent, key){\n\t\t\t\t\tif(replacer){\n\t\t\t\t\t\tit = replacer(key, it);\n\t\t\t\t\t}\n\t\t\t\t\tvar val, objtype = typeof it;\n\t\t\t\t\tif(objtype == \"number\"){\n\t\t\t\t\t\treturn isFinite(it) ? it + \"\" : \"null\";\n\t\t\t\t\t}\n\t\t\t\t\tif(objtype == \"boolean\"){\n\t\t\t\t\t\treturn it + \"\";\n\t\t\t\t\t}\n\t\t\t\t\tif(it === null){\n\t\t\t\t\t\treturn \"null\";\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof it == \"string\"){\n\t\t\t\t\t\treturn escapeString(it);\n\t\t\t\t\t}\n\t\t\t\t\tif(objtype == \"function\" || objtype == \"undefined\"){\n\t\t\t\t\t\treturn undef; // undefined\n\t\t\t\t\t}\n\t\t\t\t\t// short-circuit for objects that support \"json\" serialization\n\t\t\t\t\t// if they return \"self\" then just pass-through...\n\t\t\t\t\tif(typeof it.toJSON == \"function\"){\n\t\t\t\t\t\treturn stringify(it.toJSON(key), indent, key);\n\t\t\t\t\t}\n\t\t\t\t\tif(it instanceof Date){\n\t\t\t\t\t\treturn '\"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z\"'.replace(/\\{(\\w+)(\\+)?\\}/g, function(t, prop, plus){\n\t\t\t\t\t\t\tvar num = it[\"getUTC\" + prop]() + (plus ? 1 : 0);\n\t\t\t\t\t\t\treturn num < 10 ? \"0\" + num : num;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif(it.valueOf() !== it){\n\t\t\t\t\t\t// primitive wrapper, try again unwrapped:\n\t\t\t\t\t\treturn stringify(it.valueOf(), indent, key);\n\t\t\t\t\t}\n\t\t\t\t\tvar nextIndent= spacer ? (indent + spacer) : \"\";\n\t\t\t\t\t/* we used to test for DOM nodes and throw, but FF serializes them as {}, so cross-browser consistency is probably not efficiently attainable */ \n\t\t\t\t\n\t\t\t\t\tvar sep = spacer ? \" \" : \"\";\n\t\t\t\t\tvar newLine = spacer ? \"\\n\" : \"\";\n\t\t\t\t\n\t\t\t\t\t// array\n\t\t\t\t\tif(it instanceof Array){\n\t\t\t\t\t\tvar itl = it.length, res = [];\n\t\t\t\t\t\tfor(key = 0; key < itl; key++){\n\t\t\t\t\t\t\tvar obj = it[key];\n\t\t\t\t\t\t\tval = stringify(obj, nextIndent, key);\n\t\t\t\t\t\t\tif(typeof val != \"string\"){\n\t\t\t\t\t\t\t\tval = \"null\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tres.push(newLine + nextIndent + val);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn \"[\" + res.join(\",\") + newLine + indent + \"]\";\n\t\t\t\t\t}\n\t\t\t\t\t// generic object code path\n\t\t\t\t\tvar output = [];\n\t\t\t\t\tfor(key in it){\n\t\t\t\t\t\tvar keyStr;\n\t\t\t\t\t\tif(it.hasOwnProperty(key)){\n\t\t\t\t\t\t\tif(typeof key == \"number\"){\n\t\t\t\t\t\t\t\tkeyStr = '\"' + key + '\"';\n\t\t\t\t\t\t\t}else if(typeof key == \"string\"){\n\t\t\t\t\t\t\t\tkeyStr = escapeString(key);\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t// skip non-string or number keys\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tval = stringify(it[key], nextIndent, key);\n\t\t\t\t\t\t\tif(typeof val != \"string\"){\n\t\t\t\t\t\t\t\t// skip non-serializable values\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// At this point, the most non-IE browsers don't get in this branch \n\t\t\t\t\t\t\t// (they have native JSON), so push is definitely the way to\n\t\t\t\t\t\t\toutput.push(newLine + nextIndent + keyStr + \":\" + sep + val);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn \"{\" + output.join(\",\") + newLine + indent + \"}\"; // String\n\t\t\t\t}\n\t\t\t\treturn stringify(value, \"\", \"\");\n\t\t\t}\n\t\t};\n\t}\n});\n","define([\"./_base/kernel\", \"./sniff\"], function(dojo, has){\n\n\t// module:\n\t//\t\tdojo/keys\n\n\treturn dojo.keys = {\n\t\t// summary:\n\t\t//\t\tDefinitions for common key values. Client code should test keyCode against these named constants,\n\t\t//\t\tas the actual codes can vary by browser.\n\n\t\tBACKSPACE: 8,\n\t\tTAB: 9,\n\t\tCLEAR: 12,\n\t\tENTER: 13,\n\t\tSHIFT: 16,\n\t\tCTRL: 17,\n\t\tALT: 18,\n\t\tMETA: has(\"webkit\") ? 91 : 224,\t\t// the apple key on macs\n\t\tPAUSE: 19,\n\t\tCAPS_LOCK: 20,\n\t\tESCAPE: 27,\n\t\tSPACE: 32,\n\t\tPAGE_UP: 33,\n\t\tPAGE_DOWN: 34,\n\t\tEND: 35,\n\t\tHOME: 36,\n\t\tLEFT_ARROW: 37,\n\t\tUP_ARROW: 38,\n\t\tRIGHT_ARROW: 39,\n\t\tDOWN_ARROW: 40,\n\t\tINSERT: 45,\n\t\tDELETE: 46,\n\t\tHELP: 47,\n\t\tLEFT_WINDOW: 91,\n\t\tRIGHT_WINDOW: 92,\n\t\tSELECT: 93,\n\t\tNUMPAD_0: 96,\n\t\tNUMPAD_1: 97,\n\t\tNUMPAD_2: 98,\n\t\tNUMPAD_3: 99,\n\t\tNUMPAD_4: 100,\n\t\tNUMPAD_5: 101,\n\t\tNUMPAD_6: 102,\n\t\tNUMPAD_7: 103,\n\t\tNUMPAD_8: 104,\n\t\tNUMPAD_9: 105,\n\t\tNUMPAD_MULTIPLY: 106,\n\t\tNUMPAD_PLUS: 107,\n\t\tNUMPAD_ENTER: 108,\n\t\tNUMPAD_MINUS: 109,\n\t\tNUMPAD_PERIOD: 110,\n\t\tNUMPAD_DIVIDE: 111,\n\t\tF1: 112,\n\t\tF2: 113,\n\t\tF3: 114,\n\t\tF4: 115,\n\t\tF5: 116,\n\t\tF6: 117,\n\t\tF7: 118,\n\t\tF8: 119,\n\t\tF9: 120,\n\t\tF10: 121,\n\t\tF11: 122,\n\t\tF12: 123,\n\t\tF13: 124,\n\t\tF14: 125,\n\t\tF15: 126,\n\t\tNUM_LOCK: 144,\n\t\tSCROLL_LOCK: 145,\n\t\tUP_DPAD: 175,\n\t\tDOWN_DPAD: 176,\n\t\tLEFT_DPAD: 177,\n\t\tRIGHT_DPAD: 178,\n\t\t// virtual key mapping\n\t\tcopyKey: has(\"mac\") && !has(\"air\") ? (has(\"safari\") ? 91 : 224 ) : 17\n\t};\n});\n","define([\"./_base/kernel\", \"./on\", \"./has\", \"./dom\", \"./_base/window\"], function(dojo, on, has, dom, win){\n\n\t// module:\n\t//\t\tdojo/mouse\n\n has.add(\"dom-quirks\", win.doc && win.doc.compatMode == \"BackCompat\");\n\thas.add(\"events-mouseenter\", win.doc && \"onmouseenter\" in win.doc.createElement(\"div\"));\n\thas.add(\"events-mousewheel\", win.doc && 'onmousewheel' in win.doc);\n\n\tvar mouseButtons;\n\tif((has(\"dom-quirks\") && has(\"ie\")) || !has(\"dom-addeventlistener\")){\n\t\tmouseButtons = {\n\t\t\tLEFT: 1,\n\t\t\tMIDDLE: 4,\n\t\t\tRIGHT: 2,\n\t\t\t// helper functions\n\t\t\tisButton: function(e, button){ return e.button & button; },\n\t\t\tisLeft: function(e){ return e.button & 1; },\n\t\t\tisMiddle: function(e){ return e.button & 4; },\n\t\t\tisRight: function(e){ return e.button & 2; }\n\t\t};\n\t}else{\n\t\tmouseButtons = {\n\t\t\tLEFT: 0,\n\t\t\tMIDDLE: 1,\n\t\t\tRIGHT: 2,\n\t\t\t// helper functions\n\t\t\tisButton: function(e, button){ return e.button == button; },\n\t\t\tisLeft: function(e){ return e.button == 0; },\n\t\t\tisMiddle: function(e){ return e.button == 1; },\n\t\t\tisRight: function(e){ return e.button == 2; }\n\t\t};\n\t}\n\tdojo.mouseButtons = mouseButtons;\n\n/*=====\n\tdojo.mouseButtons = {\n\t\t// LEFT: Number\n\t\t//\t\tNumeric value of the left mouse button for the platform.\n\t\tLEFT: 0,\n\t\t// MIDDLE: Number\n\t\t//\t\tNumeric value of the middle mouse button for the platform.\n\t\tMIDDLE: 1,\n\t\t// RIGHT: Number\n\t\t//\t\tNumeric value of the right mouse button for the platform.\n\t\tRIGHT: 2,\n\n\t\tisButton: function(e, button){\n\t\t\t// summary:\n\t\t\t//\t\tChecks an event object for a pressed button\n\t\t\t// e: Event\n\t\t\t//\t\tEvent object to examine\n\t\t\t// button: Number\n\t\t\t//\t\tThe button value (example: dojo.mouseButton.LEFT)\n\t\t\treturn e.button == button; // Boolean\n\t\t},\n\t\tisLeft: function(e){\n\t\t\t// summary:\n\t\t\t//\t\tChecks an event object for the pressed left button\n\t\t\t// e: Event\n\t\t\t//\t\tEvent object to examine\n\t\t\treturn e.button == 0; // Boolean\n\t\t},\n\t\tisMiddle: function(e){\n\t\t\t// summary:\n\t\t\t//\t\tChecks an event object for the pressed middle button\n\t\t\t// e: Event\n\t\t\t//\t\tEvent object to examine\n\t\t\treturn e.button == 1; // Boolean\n\t\t},\n\t\tisRight: function(e){\n\t\t\t// summary:\n\t\t\t//\t\tChecks an event object for the pressed right button\n\t\t\t// e: Event\n\t\t\t//\t\tEvent object to examine\n\t\t\treturn e.button == 2; // Boolean\n\t\t}\n\t};\n=====*/\n\n\tfunction eventHandler(type, selectHandler){\n\t\t// emulation of mouseenter/leave with mouseover/out using descendant checking\n\t\tvar handler = function(node, listener){\n\t\t\treturn on(node, type, function(evt){\n\t\t\t\tif(selectHandler){\n\t\t\t\t\treturn selectHandler(evt, listener);\n\t\t\t\t}\n\t\t\t\tif(!dom.isDescendant(evt.relatedTarget, node)){\n\t\t\t\t\treturn listener.call(this, evt);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\thandler.bubble = function(select){\n\t\t\treturn eventHandler(type, function(evt, listener){\n\t\t\t\t// using a selector, use the select function to determine if the mouse moved inside the selector and was previously outside the selector\n\t\t\t\tvar target = select(evt.target);\n\t\t\t\tvar relatedTarget = evt.relatedTarget;\n\t\t\t\tif(target && (target != (relatedTarget && relatedTarget.nodeType == 1 && select(relatedTarget)))){\n\t\t\t\t\treturn listener.call(target, evt);\n\t\t\t\t} \n\t\t\t});\n\t\t};\n\t\treturn handler;\n\t}\n\tvar wheel;\n\tif(has(\"events-mousewheel\")){\n\t\twheel = 'mousewheel';\n\t}else{ //firefox\n\t\twheel = function(node, listener){\n\t\t\treturn on(node, 'DOMMouseScroll', function(evt){\n\t\t\t\tevt.wheelDelta = -evt.detail;\n\t\t\t\tlistener.call(this, evt);\n\t\t\t});\n\t\t};\n\t}\n\treturn {\n\t\t// summary:\n\t\t//\t\tThis module provide mouse event handling utility functions and exports\n\t\t//\t\tmouseenter and mouseleave event emulation.\n\t\t// example:\n\t\t//\t\tTo use these events, you register a mouseenter like this:\n\t\t//\t\t|\tdefine([\"dojo/on\", \"dojo/mouse\"], function(on, mouse){\n\t\t//\t\t|\t\ton(targetNode, mouse.enter, function(event){\n\t\t//\t\t|\t\t\tdojo.addClass(targetNode, \"highlighted\");\n\t\t//\t\t|\t\t});\n\t\t//\t\t|\t\ton(targetNode, mouse.leave, function(event){\n\t\t//\t\t|\t\t\tdojo.removeClass(targetNode, \"highlighted\");\n\t\t//\t\t|\t\t});\n\n\t\t_eventHandler: eventHandler,\t\t// for dojo/touch\n\n\t\t// enter: Synthetic Event\n\t\t//\t\tThis is an extension event for the mouseenter that IE provides, emulating the\n\t\t//\t\tbehavior on other browsers.\n\t\tenter: eventHandler(\"mouseover\"),\n\n\t\t// leave: Synthetic Event\n\t\t//\t\tThis is an extension event for the mouseleave that IE provides, emulating the\n\t\t//\t\tbehavior on other browsers.\n\t\tleave: eventHandler(\"mouseout\"),\n\n\t\t// wheel: Normalized Mouse Wheel Event\n\t\t//\t\tThis is an extension event for the mousewheel that non-Mozilla browsers provide,\n\t\t//\t\temulating the behavior on Mozilla based browsers.\n\t\twheel: wheel,\n\n\t\tisLeft: mouseButtons.isLeft,\n\t\t/*=====\n\t\tisLeft: function(){\n\t\t\t// summary:\n\t\t\t//\t\tTest an event object (from a mousedown event) to see if the left button was pressed.\n\t\t},\n\t\t=====*/\n\n\t\tisMiddle: mouseButtons.isMiddle,\n\t\t/*=====\n\t\t isMiddle: function(){\n\t\t\t // summary:\n\t\t\t //\t\tTest an event object (from a mousedown event) to see if the middle button was pressed.\n\t\t },\n\t\t =====*/\n\n\t\tisRight: mouseButtons.isRight\n\t\t/*=====\n\t\t , isRight: function(){\n\t\t\t // summary:\n\t\t\t //\t\tTest an event object (from a mousedown event) to see if the right button was pressed.\n\t\t }\n\t\t =====*/\n\t};\n});\n","define([\"./has!dom-addeventlistener?:./aspect\", \"./_base/kernel\", \"./sniff\"], function(aspect, dojo, has){\n\n\t\"use strict\";\n\tif(has(\"dom\")){ // check to make sure we are in a browser, this module should work anywhere\n\t\tvar major = window.ScriptEngineMajorVersion;\n\t\thas.add(\"jscript\", major && (major() + ScriptEngineMinorVersion() / 10));\n\t\thas.add(\"event-orientationchange\", has(\"touch\") && !has(\"android\")); // TODO: how do we detect this?\n\t\thas.add(\"event-stopimmediatepropagation\", window.Event && !!window.Event.prototype && !!window.Event.prototype.stopImmediatePropagation);\n\t\thas.add(\"event-focusin\", function(global, doc, element){\n\t\t\treturn 'onfocusin' in element;\n\t\t});\n\n\t\tif(has(\"touch\")){\n\t\t\thas.add(\"touch-can-modify-event-delegate\", function(){\n\t\t\t\t// This feature test checks whether deleting a property of an event delegate works\n\t\t\t\t// for a touch-enabled device. If it works, event delegation can be used as fallback\n\t\t\t\t// for browsers such as Safari in older iOS where deleting properties of the original\n\t\t\t\t// event does not work.\n\t\t\t\tvar EventDelegate = function(){};\n\t\t\t\tEventDelegate.prototype =\n\t\t\t\t\tdocument.createEvent(\"MouseEvents\"); // original event\n\t\t\t\t// Attempt to modify a property of an event delegate and check if\n\t\t\t\t// it succeeds. Depending on browsers and on whether dojo/on's\n\t\t\t\t// strict mode is stripped in a Dojo build, there are 3 known behaviors:\n\t\t\t\t// it may either succeed, or raise an error, or fail to set the property\n\t\t\t\t// without raising an error.\n\t\t\t\ttry{\n\t\t\t\t\tvar eventDelegate = new EventDelegate;\n\t\t\t\t\teventDelegate.target = null;\n\t\t\t\t\treturn eventDelegate.target === null;\n\t\t\t\t}catch(e){\n\t\t\t\t\treturn false; // cannot use event delegation\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tvar on = function(target, type, listener, dontFix){\n\t\t// summary:\n\t\t//\t\tA function that provides core event listening functionality. With this function\n\t\t//\t\tyou can provide a target, event type, and listener to be notified of\n\t\t//\t\tfuture matching events that are fired.\n\t\t// target: Element|Object\n\t\t//\t\tThis is the target object or DOM element that to receive events from\n\t\t// type: String|Function\n\t\t//\t\tThis is the name of the event to listen for or an extension event type.\n\t\t// listener: Function\n\t\t//\t\tThis is the function that should be called when the event fires.\n\t\t// returns: Object\n\t\t//\t\tAn object with a remove() method that can be used to stop listening for this\n\t\t//\t\tevent.\n\t\t// description:\n\t\t//\t\tTo listen for \"click\" events on a button node, we can do:\n\t\t//\t\t|\tdefine([\"dojo/on\"], function(on){\n\t\t//\t\t|\t\ton(button, \"click\", clickHandler);\n\t\t//\t\t|\t\t...\n\t\t//\t\tEvented JavaScript objects can also have their own events.\n\t\t//\t\t|\tvar obj = new Evented;\n\t\t//\t\t|\ton(obj, \"foo\", fooHandler);\n\t\t//\t\tAnd then we could publish a \"foo\" event:\n\t\t//\t\t|\ton.emit(obj, \"foo\", {key: \"value\"});\n\t\t//\t\tWe can use extension events as well. For example, you could listen for a tap gesture:\n\t\t//\t\t|\tdefine([\"dojo/on\", \"dojo/gesture/tap\", function(on, tap){\n\t\t//\t\t|\t\ton(button, tap, tapHandler);\n\t\t//\t\t|\t\t...\n\t\t//\t\twhich would trigger fooHandler. Note that for a simple object this is equivalent to calling:\n\t\t//\t\t|\tobj.onfoo({key:\"value\"});\n\t\t//\t\tIf you use on.emit on a DOM node, it will use native event dispatching when possible.\n\n\t\tif(typeof target.on == \"function\" && typeof type != \"function\" && !target.nodeType){\n\t\t\t// delegate to the target's on() method, so it can handle it's own listening if it wants (unless it\n\t\t\t// is DOM node and we may be dealing with jQuery or Prototype's incompatible addition to the\n\t\t\t// Element prototype\n\t\t\treturn target.on(type, listener);\n\t\t}\n\t\t// delegate to main listener code\n\t\treturn on.parse(target, type, listener, addListener, dontFix, this);\n\t};\n\ton.pausable = function(target, type, listener, dontFix){\n\t\t// summary:\n\t\t//\t\tThis function acts the same as on(), but with pausable functionality. The\n\t\t//\t\treturned signal object has pause() and resume() functions. Calling the\n\t\t//\t\tpause() method will cause the listener to not be called for future events. Calling the\n\t\t//\t\tresume() method will cause the listener to again be called for future events.\n\t\tvar paused;\n\t\tvar signal = on(target, type, function(){\n\t\t\tif(!paused){\n\t\t\t\treturn listener.apply(this, arguments);\n\t\t\t}\n\t\t}, dontFix);\n\t\tsignal.pause = function(){\n\t\t\tpaused = true;\n\t\t};\n\t\tsignal.resume = function(){\n\t\t\tpaused = false;\n\t\t};\n\t\treturn signal;\n\t};\n\ton.once = function(target, type, listener, dontFix){\n\t\t// summary:\n\t\t//\t\tThis function acts the same as on(), but will only call the listener once. The\n\t\t//\t\tlistener will be called for the first\n\t\t//\t\tevent that takes place and then listener will automatically be removed.\n\t\tvar signal = on(target, type, function(){\n\t\t\t// remove this listener\n\t\t\tsignal.remove();\n\t\t\t// proceed to call the listener\n\t\t\treturn listener.apply(this, arguments);\n\t\t});\n\t\treturn signal;\n\t};\n\ton.parse = function(target, type, listener, addListener, dontFix, matchesTarget){\n\t\tvar events;\n\t\tif(type.call){\n\t\t\t// event handler function\n\t\t\t// on(node, touch.press, touchListener);\n\t\t\treturn type.call(matchesTarget, target, listener);\n\t\t}\n\n\t\tif(type instanceof Array){\n\t\t\t// allow an array of event names (or event handler functions)\n\t\t\tevents = type;\n\t\t}else if(type.indexOf(\",\") > -1){\n\t\t\t// we allow comma delimited event names, so you can register for multiple events at once\n\t\t\tevents = type.split(/\\s*,\\s*/);\n\t\t}\n\t\tif(events){\n\t\t\tvar handles = [];\n\t\t\tvar i = 0;\n\t\t\tvar eventName;\n\t\t\twhile(eventName = events[i++]){ // intentional assignment\n\t\t\t\thandles.push(on.parse(target, eventName, listener, addListener, dontFix, matchesTarget));\n\t\t\t}\n\t\t\thandles.remove = function(){\n\t\t\t\tfor(var i = 0; i < handles.length; i++){\n\t\t\t\t\thandles[i].remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn handles;\n\t\t}\n\t\treturn addListener(target, type, listener, dontFix, matchesTarget);\n\t};\n\tvar touchEvents = /^touch/;\n\tfunction addListener(target, type, listener, dontFix, matchesTarget){\n\t\t// event delegation:\n\t\tvar selector = type.match(/(.*):(.*)/);\n\t\t// if we have a selector:event, the last one is interpreted as an event, and we use event delegation\n\t\tif(selector){\n\t\t\ttype = selector[2];\n\t\t\tselector = selector[1];\n\t\t\t// create the extension event for selectors and directly call it\n\t\t\treturn on.selector(selector, type).call(matchesTarget, target, listener);\n\t\t}\n\t\t// test to see if it a touch event right now, so we don't have to do it every time it fires\n\t\tif(has(\"touch\")){\n\t\t\tif(touchEvents.test(type)){\n\t\t\t\t// touch event, fix it\n\t\t\t\tlistener = fixTouchListener(listener);\n\t\t\t}\n\t\t\tif(!has(\"event-orientationchange\") && (type == \"orientationchange\")){\n\t\t\t\t//\"orientationchange\" not supported <= Android 2.1,\n\t\t\t\t//but works through \"resize\" on window\n\t\t\t\ttype = \"resize\";\n\t\t\t\ttarget = window;\n\t\t\t\tlistener = fixTouchListener(listener);\n\t\t\t}\n\t\t}\n\t\tif(addStopImmediate){\n\t\t\t// add stopImmediatePropagation if it doesn't exist\n\t\t\tlistener = addStopImmediate(listener);\n\t\t}\n\t\t// normal path, the target is |this|\n\t\tif(target.addEventListener){\n\t\t\t// the target has addEventListener, which should be used if available (might or might not be a node, non-nodes can implement this method as well)\n\t\t\t// check for capture conversions\n\t\t\tvar capture = type in captures,\n\t\t\t\tadjustedType = capture ? captures[type] : type;\n\t\t\ttarget.addEventListener(adjustedType, listener, capture);\n\t\t\t// create and return the signal\n\t\t\treturn {\n\t\t\t\tremove: function(){\n\t\t\t\t\ttarget.removeEventListener(adjustedType, listener, capture);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\ttype = \"on\" + type;\n\t\tif(fixAttach && target.attachEvent){\n\t\t\treturn fixAttach(target, type, listener);\n\t\t}\n\t\tthrow new Error(\"Target must be an event emitter\");\n\t}\n\ton.matches = function(node, selector, context, children, matchesTarget) {\n\t\t// summary:\n\t\t//\t\tCheck if a node match the current selector within the constraint of a context\n\t\t// node: DOMNode\n\t\t//\t\tThe node that originate the event\n\t\t// selector: String\n\t\t//\t\tThe selector to check against\n\t\t// context: DOMNode\n\t\t//\t\tThe context to search in.\n\t\t// children: Boolean\n\t\t//\t\tIndicates if children elements of the selector should be allowed. This defaults to\n\t\t//\t\ttrue\n\t\t// matchesTarget: Object|dojo/query?\n\t\t//\t\tAn object with a property \"matches\" as a function. Default is dojo/query.\n\t\t//\t\tMatching DOMNodes will be done against this function\n\t\t//\t\tThe function must return a Boolean.\n\t\t//\t\tIt will have 3 arguments: \"node\", \"selector\" and \"context\"\n\t\t//\t\tTrue is expected if \"node\" is matching the current \"selector\" in the passed \"context\"\n\t\t// returns: DOMNode?\n\t\t//\t\tThe matching node, if any. Else you get false\n\n\t\t// see if we have a valid matchesTarget or default to dojo/query\n\t\tmatchesTarget = matchesTarget && (typeof matchesTarget.matches == \"function\") ? matchesTarget : dojo.query;\n\t\tchildren = children !== false;\n\t\t// there is a selector, so make sure it matches\n\t\tif(node.nodeType != 1){\n\t\t\t// text node will fail in native match selector\n\t\t\tnode = node.parentNode;\n\t\t}\n\t\twhile(!matchesTarget.matches(node, selector, context)){\n\t\t\tif(node == context || children === false || !(node = node.parentNode) || node.nodeType != 1){ // intentional assignment\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn node;\n\t};\n\ton.selector = function(selector, eventType, children){\n\t\t// summary:\n\t\t//\t\tCreates a new extension event with event delegation. This is based on\n\t\t//\t\tthe provided event type (can be extension event) that\n\t\t//\t\tonly calls the listener when the CSS selector matches the target of the event.\n\t\t//\n\t\t//\t\tThe application must require() an appropriate level of dojo/query to handle the selector.\n\t\t// selector:\n\t\t//\t\tThe CSS selector to use for filter events and determine the |this| of the event listener.\n\t\t// eventType:\n\t\t//\t\tThe event to listen for\n\t\t// children:\n\t\t//\t\tIndicates if children elements of the selector should be allowed. This defaults to\n\t\t//\t\ttrue\n\t\t// example:\n\t\t// |\trequire([\"dojo/on\", \"dojo/mouse\", \"dojo/query!css2\"], function(on, mouse){\n\t\t// |\t\ton(node, on.selector(\".my-class\", mouse.enter), handlerForMyHover);\n\t\treturn function(target, listener){\n\t\t\t// if the selector is function, use it to select the node, otherwise use the matches method\n\t\t\tvar matchesTarget = typeof selector == \"function\" ? {matches: selector} : this,\n\t\t\t\tbubble = eventType.bubble;\n\t\t\tfunction select(eventTarget){\n\t\t\t\treturn on.matches(eventTarget, selector, target, children, matchesTarget);\n\t\t\t}\n\t\t\tif(bubble){\n\t\t\t\t// the event type doesn't naturally bubble, but has a bubbling form, use that, and give it the selector so it can perform the select itself\n\t\t\t\treturn on(target, bubble(select), listener);\n\t\t\t}\n\t\t\t// standard event delegation\n\t\t\treturn on(target, eventType, function(event){\n\t\t\t\t// call select to see if we match\n\t\t\t\tvar eventTarget = select(event.target);\n\t\t\t\t// if it matches we call the listener\n\t\t\t\tif (eventTarget) {\n\t\t\t\t\t// We save the matching target into the event, so it can be accessed even when hitching (see #18355)\n\t\t\t\t\tevent.selectorTarget = eventTarget;\n\t\t\t\t\treturn listener.call(eventTarget, event);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t};\n\n\tfunction syntheticPreventDefault(){\n\t\tthis.cancelable = false;\n\t\tthis.defaultPrevented = true;\n\t}\n\tfunction syntheticStopPropagation(){\n\t\tthis.bubbles = false;\n\t}\n\tvar slice = [].slice,\n\t\tsyntheticDispatch = on.emit = function(target, type, event){\n\t\t// summary:\n\t\t//\t\tFires an event on the target object.\n\t\t// target:\n\t\t//\t\tThe target object to fire the event on. This can be a DOM element or a plain\n\t\t//\t\tJS object. If the target is a DOM element, native event emitting mechanisms\n\t\t//\t\tare used when possible.\n\t\t// type:\n\t\t//\t\tThe event type name. You can emulate standard native events like \"click\" and\n\t\t//\t\t\"mouseover\" or create custom events like \"open\" or \"finish\".\n\t\t// event:\n\t\t//\t\tAn object that provides the properties for the event. See https://developer.mozilla.org/en/DOM/event.initEvent\n\t\t//\t\tfor some of the properties. These properties are copied to the event object.\n\t\t//\t\tOf particular importance are the cancelable and bubbles properties. The\n\t\t//\t\tcancelable property indicates whether or not the event has a default action\n\t\t//\t\tthat can be cancelled. The event is cancelled by calling preventDefault() on\n\t\t//\t\tthe event object. The bubbles property indicates whether or not the\n\t\t//\t\tevent will bubble up the DOM tree. If bubbles is true, the event will be called\n\t\t//\t\ton the target and then each parent successively until the top of the tree\n\t\t//\t\tis reached or stopPropagation() is called. Both bubbles and cancelable\n\t\t//\t\tdefault to false.\n\t\t// returns:\n\t\t//\t\tIf the event is cancelable and the event is not cancelled,\n\t\t//\t\temit will return true. If the event is cancelable and the event is cancelled,\n\t\t//\t\temit will return false.\n\t\t// details:\n\t\t//\t\tNote that this is designed to emit events for listeners registered through\n\t\t//\t\tdojo/on. It should actually work with any event listener except those\n\t\t//\t\tadded through IE's attachEvent (IE8 and below's non-W3C event emitting\n\t\t//\t\tdoesn't support custom event types). It should work with all events registered\n\t\t//\t\tthrough dojo/on. Also note that the emit method does do any default\n\t\t//\t\taction, it only returns a value to indicate if the default action should take\n\t\t//\t\tplace. For example, emitting a keypress event would not cause a character\n\t\t//\t\tto appear in a textbox.\n\t\t// example:\n\t\t//\t\tTo fire our own click event\n\t\t//\t|\trequire([\"dojo/on\", \"dojo/dom\"\n\t\t//\t|\t], function(on, dom){\n\t\t//\t|\t\ton.emit(dom.byId(\"button\"), \"click\", {\n\t\t//\t|\t\t\tcancelable: true,\n\t\t//\t|\t\t\tbubbles: true,\n\t\t//\t|\t\t\tscreenX: 33,\n\t\t//\t|\t\t\tscreenY: 44\n\t\t//\t|\t\t});\n\t\t//\t\tWe can also fire our own custom events:\n\t\t//\t|\t\ton.emit(dom.byId(\"slider\"), \"slide\", {\n\t\t//\t|\t\t\tcancelable: true,\n\t\t//\t|\t\t\tbubbles: true,\n\t\t//\t|\t\t\tdirection: \"left-to-right\"\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\tvar args = slice.call(arguments, 2);\n\t\tvar method = \"on\" + type;\n\t\tif(\"parentNode\" in target){\n\t\t\t// node (or node-like), create event controller methods\n\t\t\tvar newEvent = args[0] = {};\n\t\t\tfor(var i in event){\n\t\t\t\tnewEvent[i] = event[i];\n\t\t\t}\n\t\t\tnewEvent.preventDefault = syntheticPreventDefault;\n\t\t\tnewEvent.stopPropagation = syntheticStopPropagation;\n\t\t\tnewEvent.target = target;\n\t\t\tnewEvent.type = type;\n\t\t\tevent = newEvent;\n\t\t}\n\t\tdo{\n\t\t\t// call any node which has a handler (note that ideally we would try/catch to simulate normal event propagation but that causes too much pain for debugging)\n\t\t\ttarget[method] && target[method].apply(target, args);\n\t\t\t// and then continue up the parent node chain if it is still bubbling (if started as bubbles and stopPropagation hasn't been called)\n\t\t}while(event && event.bubbles && (target = target.parentNode));\n\t\treturn event && event.cancelable && event; // if it is still true (was cancelable and was cancelled), return the event to indicate default action should happen\n\t};\n\tvar captures = has(\"event-focusin\") ? {} : {focusin: \"focus\", focusout: \"blur\"};\n\tif(!has(\"event-stopimmediatepropagation\")){\n\t\tvar stopImmediatePropagation =function(){\n\t\t\tthis.immediatelyStopped = true;\n\t\t\tthis.modified = true; // mark it as modified so the event will be cached in IE\n\t\t};\n\t\tvar addStopImmediate = function(listener){\n\t\t\treturn function(event){\n\t\t\t\tif(!event.immediatelyStopped){// check to make sure it hasn't been stopped immediately\n\t\t\t\t\tevent.stopImmediatePropagation = stopImmediatePropagation;\n\t\t\t\t\treturn listener.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\t}\n\tif(has(\"dom-addeventlistener\")){\n\t\t// emitter that works with native event handling\n\t\ton.emit = function(target, type, event){\n\t\t\tif(target.dispatchEvent && document.createEvent){\n\t\t\t\t// use the native event emitting mechanism if it is available on the target object\n\t\t\t\t// create a generic event\n\t\t\t\t// we could create branch into the different types of event constructors, but\n\t\t\t\t// that would be a lot of extra code, with little benefit that I can see, seems\n\t\t\t\t// best to use the generic constructor and copy properties over, making it\n\t\t\t\t// easy to have events look like the ones created with specific initializers\n\t\t\t\tvar ownerDocument = target.ownerDocument || document;\n\t\t\t\tvar nativeEvent = ownerDocument.createEvent(\"HTMLEvents\");\n\t\t\t\tnativeEvent.initEvent(type, !!event.bubbles, !!event.cancelable);\n\t\t\t\t// and copy all our properties over\n\t\t\t\tfor(var i in event){\n\t\t\t\t\tif(!(i in nativeEvent)){\n\t\t\t\t\t\tnativeEvent[i] = event[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn target.dispatchEvent(nativeEvent) && nativeEvent;\n\t\t\t}\n\t\t\treturn syntheticDispatch.apply(on, arguments); // emit for a non-node\n\t\t};\n\t}else{\n\t\t// no addEventListener, basically old IE event normalization\n\t\ton._fixEvent = function(evt, sender){\n\t\t\t// summary:\n\t\t\t//\t\tnormalizes properties on the event object including event\n\t\t\t//\t\tbubbling methods, keystroke normalization, and x/y positions\n\t\t\t// evt:\n\t\t\t//\t\tnative event object\n\t\t\t// sender:\n\t\t\t//\t\tnode to treat as \"currentTarget\"\n\t\t\tif(!evt){\n\t\t\t\tvar w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;\n\t\t\t\tevt = w.event;\n\t\t\t}\n\t\t\tif(!evt){return evt;}\n\t\t\ttry{\n\t\t\t\tif(lastEvent && evt.type == lastEvent.type && evt.srcElement == lastEvent.target){\n\t\t\t\t\t// should be same event, reuse event object (so it can be augmented);\n\t\t\t\t\t// accessing evt.srcElement rather than evt.target since evt.target not set on IE until fixup below\n\t\t\t\t\tevt = lastEvent;\n\t\t\t\t}\n\t\t\t}catch(e){\n\t\t\t\t// will occur on IE on lastEvent.type reference if lastEvent points to a previous event that already\n\t\t\t\t// finished bubbling, but the setTimeout() to clear lastEvent hasn't fired yet\n\t\t\t}\n\t\t\tif(!evt.target){ // check to see if it has been fixed yet\n\t\t\t\tevt.target = evt.srcElement;\n\t\t\t\tevt.currentTarget = (sender || evt.srcElement);\n\t\t\t\tif(evt.type == \"mouseover\"){\n\t\t\t\t\tevt.relatedTarget = evt.fromElement;\n\t\t\t\t}\n\t\t\t\tif(evt.type == \"mouseout\"){\n\t\t\t\t\tevt.relatedTarget = evt.toElement;\n\t\t\t\t}\n\t\t\t\tif(!evt.stopPropagation){\n\t\t\t\t\tevt.stopPropagation = stopPropagation;\n\t\t\t\t\tevt.preventDefault = preventDefault;\n\t\t\t\t}\n\t\t\t\tswitch(evt.type){\n\t\t\t\t\tcase \"keypress\":\n\t\t\t\t\t\tvar c = (\"charCode\" in evt ? evt.charCode : evt.keyCode);\n\t\t\t\t\t\tif (c==10){\n\t\t\t\t\t\t\t// CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla\n\t\t\t\t\t\t\tc=0;\n\t\t\t\t\t\t\tevt.keyCode = 13;\n\t\t\t\t\t\t}else if(c==13||c==27){\n\t\t\t\t\t\t\tc=0; // Mozilla considers ENTER and ESC non-printable\n\t\t\t\t\t\t}else if(c==3){\n\t\t\t\t\t\t\tc=99; // Mozilla maps CTRL-BREAK to CTRL-c\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Mozilla sets keyCode to 0 when there is a charCode\n\t\t\t\t\t\t// but that stops the event on IE.\n\t\t\t\t\t\tevt.charCode = c;\n\t\t\t\t\t\t_setKeyChar(evt);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn evt;\n\t\t};\n\t\tvar lastEvent, IESignal = function(handle){\n\t\t\tthis.handle = handle;\n\t\t};\n\t\tIESignal.prototype.remove = function(){\n\t\t\tdelete _dojoIEListeners_[this.handle];\n\t\t};\n\t\tvar fixListener = function(listener){\n\t\t\t// this is a minimal function for closing on the previous listener with as few as variables as possible\n\t\t\treturn function(evt){\n\t\t\t\tevt = on._fixEvent(evt, this);\n\t\t\t\tvar result = listener.call(this, evt);\n\t\t\t\tif(evt.modified){\n\t\t\t\t\t// cache the last event and reuse it if we can\n\t\t\t\t\tif(!lastEvent){\n\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\tlastEvent = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tlastEvent = evt;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t};\n\t\t};\n\t\tvar fixAttach = function(target, type, listener){\n\t\t\tlistener = fixListener(listener);\n\t\t\tif(((target.ownerDocument ? target.ownerDocument.parentWindow : target.parentWindow || target.window || window) != top ||\n\t\t\t\t\t\thas(\"jscript\") < 5.8) &&\n\t\t\t\t\t!has(\"config-_allow_leaks\")){\n\t\t\t\t// IE will leak memory on certain handlers in frames (IE8 and earlier) and in unattached DOM nodes for JScript 5.7 and below.\n\t\t\t\t// Here we use global redirection to solve the memory leaks\n\t\t\t\tif(typeof _dojoIEListeners_ == \"undefined\"){\n\t\t\t\t\t_dojoIEListeners_ = [];\n\t\t\t\t}\n\t\t\t\tvar emitter = target[type];\n\t\t\t\tif(!emitter || !emitter.listeners){\n\t\t\t\t\tvar oldListener = emitter;\n\t\t\t\t\temitter = Function('event', 'var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}');\n\t\t\t\t\temitter.listeners = [];\n\t\t\t\t\ttarget[type] = emitter;\n\t\t\t\t\temitter.global = this;\n\t\t\t\t\tif(oldListener){\n\t\t\t\t\t\temitter.listeners.push(_dojoIEListeners_.push(oldListener) - 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar handle;\n\t\t\t\temitter.listeners.push(handle = (emitter.global._dojoIEListeners_.push(listener) - 1));\n\t\t\t\treturn new IESignal(handle);\n\t\t\t}\n\t\t\treturn aspect.after(target, type, listener, true);\n\t\t};\n\n\t\tvar _setKeyChar = function(evt){\n\t\t\tevt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';\n\t\t\tevt.charOrCode = evt.keyChar || evt.keyCode;\t// TODO: remove for 2.0\n\t\t};\n\t\t// Called in Event scope\n\t\tvar stopPropagation = function(){\n\t\t\tthis.cancelBubble = true;\n\t\t};\n\t\tvar preventDefault = on._preventDefault = function(){\n\t\t\t// Setting keyCode to 0 is the only way to prevent certain keypresses (namely\n\t\t\t// ctrl-combinations that correspond to menu accelerator keys).\n\t\t\t// Otoh, it prevents upstream listeners from getting this information\n\t\t\t// Try to split the difference here by clobbering keyCode only for ctrl\n\t\t\t// combinations. If you still need to access the key upstream, bubbledKeyCode is\n\t\t\t// provided as a workaround.\n\t\t\tthis.bubbledKeyCode = this.keyCode;\n\t\t\tif(this.ctrlKey){\n\t\t\t\ttry{\n\t\t\t\t\t// squelch errors when keyCode is read-only\n\t\t\t\t\t// (e.g. if keyCode is ctrl or shift)\n\t\t\t\t\tthis.keyCode = 0;\n\t\t\t\t}catch(e){\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.defaultPrevented = true;\n\t\t\tthis.returnValue = false;\n\t\t\tthis.modified = true; // mark it as modified (for defaultPrevented flag) so the event will be cached in IE\n\t\t};\n\t}\n\tif(has(\"touch\")){\n\t\tvar EventDelegate = function(){};\n\t\tvar windowOrientation = window.orientation;\n\t\tvar fixTouchListener = function(listener){\n\t\t\treturn function(originalEvent){\n\t\t\t\t//Event normalization(for ontouchxxx and resize):\n\t\t\t\t//1.incorrect e.pageX|pageY in iOS\n\t\t\t\t//2.there are no \"e.rotation\", \"e.scale\" and \"onorientationchange\" in Android\n\t\t\t\t//3.More TBD e.g. force | screenX | screenX | clientX | clientY | radiusX | radiusY\n\n\t\t\t\t// see if it has already been corrected\n\t\t\t\tvar event = originalEvent.corrected;\n\t\t\t\tif(!event){\n\t\t\t\t\tvar type = originalEvent.type;\n\t\t\t\t\ttry{\n\t\t\t\t\t\tdelete originalEvent.type; // on some JS engines (android), deleting properties makes them mutable\n\t\t\t\t\t}catch(e){}\n\t\t\t\t\tif(originalEvent.type){\n\t\t\t\t\t\t// Deleting the property of the original event did not work (this is the case of\n\t\t\t\t\t\t// browsers such as older Safari iOS), hence fallback:\n\t\t\t\t\t\tif(has(\"touch-can-modify-event-delegate\")){\n\t\t\t\t\t\t\t// If deleting properties of delegated event works, use event delegation:\n\t\t\t\t\t\t\tEventDelegate.prototype = originalEvent;\n\t\t\t\t\t\t\tevent = new EventDelegate;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// Otherwise last fallback: other browsers, such as mobile Firefox, do not like\n\t\t\t\t\t\t\t// delegated properties, so we have to copy\n\t\t\t\t\t\t\tevent = {};\n\t\t\t\t\t\t\tfor(var name in originalEvent){\n\t\t\t\t\t\t\t\tevent[name] = originalEvent[name];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// have to delegate methods to make them work\n\t\t\t\t\t\tevent.preventDefault = function(){\n\t\t\t\t\t\t\toriginalEvent.preventDefault();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tevent.stopPropagation = function(){\n\t\t\t\t\t\t\toriginalEvent.stopPropagation();\n\t\t\t\t\t\t};\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// deletion worked, use property as is\n\t\t\t\t\t\tevent = originalEvent;\n\t\t\t\t\t\tevent.type = type;\n\t\t\t\t\t}\n\t\t\t\t\toriginalEvent.corrected = event;\n\t\t\t\t\tif(type == 'resize'){\n\t\t\t\t\t\tif(windowOrientation == window.orientation){\n\t\t\t\t\t\t\treturn null;//double tap causes an unexpected 'resize' in Android\n\t\t\t\t\t\t}\n\t\t\t\t\t\twindowOrientation = window.orientation;\n\t\t\t\t\t\tevent.type = \"orientationchange\";\n\t\t\t\t\t\treturn listener.call(this, event);\n\t\t\t\t\t}\n\t\t\t\t\t// We use the original event and augment, rather than doing an expensive mixin operation\n\t\t\t\t\tif(!(\"rotation\" in event)){ // test to see if it has rotation\n\t\t\t\t\t\tevent.rotation = 0;\n\t\t\t\t\t\tevent.scale = 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (window.TouchEvent && originalEvent instanceof TouchEvent) {\n\t\t\t\t\t\t// use event.changedTouches[0].pageX|pageY|screenX|screenY|clientX|clientY|target\n\t\t\t\t\t\tvar firstChangeTouch = event.changedTouches[0];\n\t\t\t\t\t\tfor(var i in firstChangeTouch){ // use for-in, we don't need to have dependency on dojo/_base/lang here\n\t\t\t\t\t\t\tdelete event[i]; // delete it first to make it mutable\n\t\t\t\t\t\t\tevent[i] = firstChangeTouch[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn listener.call(this, event);\n\t\t\t};\n\t\t};\n\t}\n\treturn on;\n});\n","define([\n\t\"../_base/lang\"\n], function(lang){\n\t\"use strict\";\n\n\t// module:\n\t//\t\tdojo/promise/Promise\n\n\tfunction throwAbstract(){\n\t\tthrow new TypeError(\"abstract\");\n\t}\n\n\treturn lang.extend(function Promise(){\n\t\t// summary:\n\t\t//\t\tThe public interface to a deferred.\n\t\t// description:\n\t\t//\t\tThe public interface to a deferred. All promises in Dojo are\n\t\t//\t\tinstances of this class.\n\t}, {\n\t\tthen: function(callback, errback, progback){\n\t\t\t// summary:\n\t\t\t//\t\tAdd new callbacks to the promise.\n\t\t\t// description:\n\t\t\t//\t\tAdd new callbacks to the deferred. Callbacks can be added\n\t\t\t//\t\tbefore or after the deferred is fulfilled.\n\t\t\t// callback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise is resolved.\n\t\t\t//\t\tReceives the resolution value.\n\t\t\t// errback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise is rejected.\n\t\t\t//\t\tReceives the rejection error.\n\t\t\t// progback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise emits a progress\n\t\t\t//\t\tupdate. Receives the progress update.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns a new promise for the result of the callback(s).\n\t\t\t//\t\tThis can be used for chaining many asynchronous operations.\n\n\t\t\tthrowAbstract();\n\t\t},\n\n\t\tcancel: function(reason, strict){\n\t\t\t// summary:\n\t\t\t//\t\tInform the deferred it may cancel its asynchronous operation.\n\t\t\t// description:\n\t\t\t//\t\tInform the deferred it may cancel its asynchronous operation.\n\t\t\t//\t\tThe deferred's (optional) canceler is invoked and the\n\t\t\t//\t\tdeferred will be left in a rejected state. Can affect other\n\t\t\t//\t\tpromises that originate with the same deferred.\n\t\t\t// reason: any\n\t\t\t//\t\tA message that may be sent to the deferred's canceler,\n\t\t\t//\t\texplaining why it's being canceled.\n\t\t\t// strict: Boolean?\n\t\t\t//\t\tIf strict, will throw an error if the deferred has already\n\t\t\t//\t\tbeen fulfilled and consequently cannot be canceled.\n\t\t\t// returns: any\n\t\t\t//\t\tReturns the rejection reason if the deferred was canceled\n\t\t\t//\t\tnormally.\n\n\t\t\tthrowAbstract();\n\t\t},\n\n\t\tisResolved: function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the promise has been resolved.\n\t\t\t// returns: Boolean\n\n\t\t\tthrowAbstract();\n\t\t},\n\n\t\tisRejected: function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the promise has been rejected.\n\t\t\t// returns: Boolean\n\n\t\t\tthrowAbstract();\n\t\t},\n\n\t\tisFulfilled: function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the promise has been resolved or rejected.\n\t\t\t// returns: Boolean\n\n\t\t\tthrowAbstract();\n\t\t},\n\n\t\tisCanceled: function(){\n\t\t\t// summary:\n\t\t\t//\t\tChecks whether the promise has been canceled.\n\t\t\t// returns: Boolean\n\n\t\t\tthrowAbstract();\n\t\t},\n\n\t\t\"finally\": function(callback) {\n\t\t\t// summary:\n\t\t\t//\t\tAdd a callback to the promise that will fire whether it\n\t\t\t//\t\tresolves or rejects.\n\t\t\t// description:\n\t\t\t//\t\tConforms to ES2018's `Promise.prototype.finally`.\n\t\t\t//\t\tAdd a callback to the promise that will fire whether it\n\t\t\t//\t\tresolves or rejects. No value is passed to the callback.\n\t\t\t//\t\tReturns a promise that reflects the state of the original promise,\n\t\t\t//\t\twith two exceptions:\n\t\t\t//\t\t- If the callback return a promise, the outer promise will wait\n\t\t\t//\t\tuntil the returned promise is resolved, then it will resolve\n\t\t\t//\t\twith the original value.\n\t\t\t//\t\t- If the callback throws an exception or returns a promise that\n\t\t\t//\t\tis rejected (or rejects later), the outer promise will reject\n\t\t\t//\t\twith the inner promise's rejection reason.\n\t\t\t// callback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise is resolved\n\t\t\t//\t\tor rejected. Doesn't receive any value.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns a new promise that reflects the state of the original promise,\n\t\t\t//\t\twith two small exceptions (see description).\n\t\t\t//\n\n\t\t\treturn this.then(function (value){\n\t\t\t\tvar valueOrPromise = callback();\n\t\t\t\tif (valueOrPromise && typeof valueOrPromise.then === \"function\"){\n\t\t\t\t\treturn valueOrPromise.then(function (){\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}, function(reason) {\n\t\t\t\tvar valueOrPromise = callback();\n\t\t\t\tif (valueOrPromise && typeof valueOrPromise.then === \"function\"){\n\t\t\t\t\treturn valueOrPromise.then(function (){\n\t\t\t\t\t\tthrow reason;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow reason;\n\t\t\t});\n\t\t},\n\n\t\talways: function(callbackOrErrback){\n\t\t\t// summary:\n\t\t\t//\t\tAdd a callback to be invoked when the promise is resolved\n\t\t\t//\t\tor rejected.\n\t\t\t// callbackOrErrback: Function?\n\t\t\t//\t\tA function that is used both as a callback and errback.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns a new promise for the result of the callback/errback.\n\n\t\t\treturn this.then(callbackOrErrback, callbackOrErrback);\n\t\t},\n\n\t\t\"catch\": function(errback){\n\t\t // summary:\n\t\t //\t\tAdd new errbacks to the promise. Follows ECMA specification naming.\n\t\t // errback: Function?\n\t\t //\t\tCallback to be invoked when the promise is rejected.\n\t\t // returns: dojo/promise/Promise\n\t\t //\t\tReturns a new promise for the result of the errback.\n\n\t\t return this.then(null, errback);\n\t\t},\n\n\t\totherwise: function(errback){\n\t\t\t// summary:\n\t\t\t//\t\tAdd new errbacks to the promise.\n\t\t\t// errback: Function?\n\t\t\t//\t\tCallback to be invoked when the promise is rejected.\n\t\t\t// returns: dojo/promise/Promise\n\t\t\t//\t\tReturns a new promise for the result of the errback.\n\n\t\t\treturn this.then(null, errback);\n\t\t},\n\n\t\ttrace: function(){\n\t\t\treturn this;\n\t\t},\n\n\t\ttraceRejected: function(){\n\t\t\treturn this;\n\t\t},\n\n\t\ttoString: function(){\n\t\t\t// returns: string\n\t\t\t//\t\tReturns `[object Promise]`.\n\n\t\t\treturn \"[object Promise]\";\n\t\t}\n\t});\n});\n","define([\n\t\"./tracer\",\n\t\"../has\",\n\t\"../_base/lang\",\n\t\"../_base/array\"\n], function(tracer, has, lang, arrayUtil){\n\thas.add(\"config-useDeferredInstrumentation\", \"report-unhandled-rejections\");\n\n\tfunction logError(error, rejection, deferred){\n\t\tif(error && error.log === false){\n\t\t\treturn;\n\t\t}\n\t\tvar stack = \"\";\n\t\tif(error && error.stack){\n\t\t\tstack += error.stack;\n\t\t}\n\t\tif(rejection && rejection.stack){\n\t\t\tstack += \"\\n ----------------------------------------\\n rejected\" + rejection.stack.split(\"\\n\").slice(1).join(\"\\n\").replace(/^\\s+/, \" \");\n\t\t}\n\t\tif(deferred && deferred.stack){\n\t\t\tstack += \"\\n ----------------------------------------\\n\" + deferred.stack;\n\t\t}\n\t\tconsole.error(error, stack);\n\t}\n\n\tfunction reportRejections(error, handled, rejection, deferred){\n\t\tif(!handled){\n\t\t\tlogError(error, rejection, deferred);\n\t\t}\n\t}\n\n\tvar errors = [];\n\tvar activeTimeout = false;\n\tvar unhandledWait = 1000;\n\tfunction trackUnhandledRejections(error, handled, rejection, deferred){\n\t\t// try to find the existing tracking object\n\t\tif(!arrayUtil.some(errors, function(obj){\n\t\t\tif(obj.error === error){\n\t\t\t\t// found the tracking object for this error\n\t\t\t\tif(handled){\n\t\t\t\t\t// if handled, update the state\n\t\t\t\t\tobj.handled = true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t})){\n\t\t\t// no tracking object has been setup, create one\n\t\t\terrors.push({\n\t\t\t\terror: error,\n\t\t\t\trejection: rejection,\n\t\t\t\thandled: handled,\n\t\t\t\tdeferred: deferred,\n\t\t\t\ttimestamp: new Date().getTime()\n\t\t\t});\n\t\t}\n\n\t\tif(!activeTimeout){\n\t\t\tactiveTimeout = setTimeout(logRejected, unhandledWait);\n\t\t}\n\t}\n\n\tfunction logRejected(){\n\t\tvar now = new Date().getTime();\n\t\tvar reportBefore = now - unhandledWait;\n\t\terrors = arrayUtil.filter(errors, function(obj){\n\t\t\t// only report the error if we have waited long enough and\n\t\t\t// it hasn't been handled\n\t\t\tif(obj.timestamp < reportBefore){\n\t\t\t\tif(!obj.handled){\n\t\t\t\t\tlogError(obj.error, obj.rejection, obj.deferred);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif(errors.length){\n\t\t\tactiveTimeout = setTimeout(logRejected, errors[0].timestamp + unhandledWait - now);\n\t\t}else{\n\t\t\tactiveTimeout = false;\n\t\t}\n\t}\n\n\treturn function(Deferred){\n\t\t// summary:\n\t\t//\t\tInitialize instrumentation for the Deferred class.\n\t\t// description:\n\t\t//\t\tInitialize instrumentation for the Deferred class.\n\t\t//\t\tDone automatically by `dojo/Deferred` if the\n\t\t//\t\t`deferredInstrumentation` and `useDeferredInstrumentation`\n\t\t//\t\tconfig options are set.\n\t\t//\n\t\t//\t\tSets up `dojo/promise/tracer` to log to the console.\n\t\t//\n\t\t//\t\tSets up instrumentation of rejected deferreds so unhandled\n\t\t//\t\terrors are logged to the console.\n\n\t\tvar usage = has(\"config-useDeferredInstrumentation\");\n\t\tif(usage){\n\t\t\ttracer.on(\"resolved\", lang.hitch(console, \"log\", \"resolved\"));\n\t\t\ttracer.on(\"rejected\", lang.hitch(console, \"log\", \"rejected\"));\n\t\t\ttracer.on(\"progress\", lang.hitch(console, \"log\", \"progress\"));\n\n\t\t\tvar args = [];\n\t\t\tif(typeof usage === \"string\"){\n\t\t\t\targs = usage.split(\",\");\n\t\t\t\tusage = args.shift();\n\t\t\t}\n\t\t\tif(usage === \"report-rejections\"){\n\t\t\t\tDeferred.instrumentRejected = reportRejections;\n\t\t\t}else if(usage === \"report-unhandled-rejections\" || usage === true || usage === 1){\n\t\t\t\tDeferred.instrumentRejected = trackUnhandledRejections;\n\t\t\t\tunhandledWait = parseInt(args[0], 10) || unhandledWait;\n\t\t\t}else{\n\t\t\t\tthrow new Error(\"Unsupported instrumentation usage <\" + usage + \">\");\n\t\t\t}\n\t\t}\n\t};\n});\n","define([\n\t\"../_base/lang\",\n\t\"./Promise\",\n\t\"../Evented\"\n], function(lang, Promise, Evented){\n\t\"use strict\";\n\n\t// module:\n\t//\t\tdojo/promise/tracer\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tTrace promise fulfillment.\n\t\t// description:\n\t\t//\t\tTrace promise fulfillment. Calling `.trace()` or `.traceError()` on a\n\t\t//\t\tpromise enables tracing. Will emit `resolved`, `rejected` or `progress`\n\t\t//\t\tevents.\n\n\t\ton: function(type, listener){\n\t\t\t// summary:\n\t\t\t//\t\tSubscribe to traces.\n\t\t\t// description:\n\t\t\t//\t\tSee `dojo/Evented#on()`.\n\t\t\t// type: String\n\t\t\t//\t\t`resolved`, `rejected`, or `progress`\n\t\t\t// listener: Function\n\t\t\t//\t\tThe listener is passed the traced value and any arguments\n\t\t\t//\t\tthat were used with the `.trace()` call.\n\t\t}\n\t};\n\t=====*/\n\n\tvar evented = new Evented;\n\tvar emit = evented.emit;\n\tevented.emit = null;\n\t// Emit events asynchronously since they should not change the promise state.\n\tfunction emitAsync(args){\n\t\tsetTimeout(function(){\n\t\t\temit.apply(evented, args);\n\t\t}, 0);\n\t}\n\n\tPromise.prototype.trace = function(){\n\t\t// summary:\n\t\t//\t\tTrace the promise.\n\t\t// description:\n\t\t//\t\tTracing allows you to transparently log progress,\n\t\t//\t\tresolution and rejection of promises, without affecting the\n\t\t//\t\tpromise itself. Any arguments passed to `trace()` are\n\t\t//\t\temitted in trace events. See `dojo/promise/tracer` on how\n\t\t//\t\tto handle traces.\n\t\t// returns: dojo/promise/Promise\n\t\t//\t\tThe promise instance `trace()` is called on.\n\n\t\tvar args = lang._toArray(arguments);\n\t\tthis.then(\n\t\t\tfunction(value){ emitAsync([\"resolved\", value].concat(args)); },\n\t\t\tfunction(error){ emitAsync([\"rejected\", error].concat(args)); },\n\t\t\tfunction(update){ emitAsync([\"progress\", update].concat(args)); }\n\t\t);\n\t\treturn this;\n\t};\n\n\tPromise.prototype.traceRejected = function(){\n\t\t// summary:\n\t\t//\t\tTrace rejection of the promise.\n\t\t// description:\n\t\t//\t\tTracing allows you to transparently log progress,\n\t\t//\t\tresolution and rejection of promises, without affecting the\n\t\t//\t\tpromise itself. Any arguments passed to `trace()` are\n\t\t//\t\temitted in trace events. See `dojo/promise/tracer` on how\n\t\t//\t\tto handle traces.\n\t\t// returns: dojo/promise/Promise\n\t\t//\t\tThe promise instance `traceRejected()` is called on.\n\n\t\tvar args = lang._toArray(arguments);\n\t\tthis.otherwise(function(error){\n\t\t\temitAsync([\"rejected\", error].concat(args));\n\t\t});\n\t\treturn this;\n\t};\n\n\treturn evented;\n});\n","define([\"./_base/kernel\", \"./has\", \"./dom\", \"./on\", \"./_base/array\", \"./_base/lang\", \"./selector/_loader\", \"./selector/_loader!default\"],\n\tfunction(dojo, has, dom, on, array, lang, loader, defaultEngine){\n\n\t\"use strict\";\n\n\thas.add(\"array-extensible\", function(){\n\t\t// test to see if we can extend an array (not supported in old IE)\n\t\treturn lang.delegate([], {length: 1}).length == 1 && !has(\"bug-for-in-skips-shadowed\");\n\t});\n\t\n\tvar ap = Array.prototype, aps = ap.slice, apc = ap.concat, forEach = array.forEach;\n\n\tvar tnl = function(/*Array*/ a, /*dojo/NodeList?*/ parent, /*Function?*/ NodeListCtor){\n\t\t// summary:\n\t\t//\t\tdecorate an array to make it look like a `dojo/NodeList`.\n\t\t// a:\n\t\t//\t\tArray of nodes to decorate.\n\t\t// parent:\n\t\t//\t\tAn optional parent NodeList that generated the current\n\t\t//\t\tlist of nodes. Used to call _stash() so the parent NodeList\n\t\t//\t\tcan be accessed via end() later.\n\t\t// NodeListCtor:\n\t\t//\t\tAn optional constructor function to use for any\n\t\t//\t\tnew NodeList calls. This allows a certain chain of\n\t\t//\t\tNodeList calls to use a different object than dojo/NodeList.\n\t\tvar nodeList = new (NodeListCtor || this._NodeListCtor || nl)(a);\n\t\treturn parent ? nodeList._stash(parent) : nodeList;\n\t};\n\n\tvar loopBody = function(f, a, o){\n\t\ta = [0].concat(aps.call(a, 0));\n\t\to = o || dojo.global;\n\t\treturn function(node){\n\t\t\ta[0] = node;\n\t\t\treturn f.apply(o, a);\n\t\t};\n\t};\n\n\t// adapters\n\n\tvar adaptAsForEach = function(f, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the forEach-type\n\t\t//\t\tactions. The initial object is returned from the specialized\n\t\t//\t\tfunction.\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// o: Object?\n\t\t//\t\tan optional context for f\n\t\treturn function(){\n\t\t\tthis.forEach(loopBody(f, arguments, o));\n\t\t\treturn this;\t// Object\n\t\t};\n\t};\n\n\tvar adaptAsMap = function(f, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the map-type\n\t\t//\t\tactions. The return is a new array of values, as via `dojo/_base/array.map`\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// o: Object?\n\t\t//\t\tan optional context for f\n\t\treturn function(){\n\t\t\treturn this.map(loopBody(f, arguments, o));\n\t\t};\n\t};\n\n\tvar adaptAsFilter = function(f, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the filter-type actions\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// o: Object?\n\t\t//\t\tan optional context for f\n\t\treturn function(){\n\t\t\treturn this.filter(loopBody(f, arguments, o));\n\t\t};\n\t};\n\n\tvar adaptWithCondition = function(f, g, o){\n\t\t// summary:\n\t\t//\t\tadapts a single node function to be used in the map-type\n\t\t//\t\tactions, behaves like forEach() or map() depending on arguments\n\t\t// f: Function\n\t\t//\t\ta function to adapt\n\t\t// g: Function\n\t\t//\t\ta condition function, if true runs as map(), otherwise runs as forEach()\n\t\t// o: Object?\n\t\t//\t\tan optional context for f and g\n\t\treturn function(){\n\t\t\tvar a = arguments, body = loopBody(f, a, o);\n\t\t\tif(g.call(o || dojo.global, a)){\n\t\t\t\treturn this.map(body);\t// self\n\t\t\t}\n\t\t\tthis.forEach(body);\n\t\t\treturn this;\t// self\n\t\t};\n\t};\n\n\tvar NodeList = function(array){\n\t\t// summary:\n\t\t//\t\tArray-like object which adds syntactic\n\t\t//\t\tsugar for chaining, common iteration operations, animation, and\n\t\t//\t\tnode manipulation. NodeLists are most often returned as the\n\t\t//\t\tresult of dojo/query() calls.\n\t\t// description:\n\t\t//\t\tNodeList instances provide many utilities that reflect\n\t\t//\t\tcore Dojo APIs for Array iteration and manipulation, DOM\n\t\t//\t\tmanipulation, and event handling. Instead of needing to dig up\n\t\t//\t\tfunctions in the dojo package, NodeLists generally make the\n\t\t//\t\tfull power of Dojo available for DOM manipulation tasks in a\n\t\t//\t\tsimple, chainable way.\n\t\t// example:\n\t\t//\t\tcreate a node list from a node\n\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/dom\"\n\t\t//\t\t|\t], function(query, dom){\n\t\t//\t\t|\t\tquery.NodeList(dom.byId(\"foo\"));\n\t\t//\t\t|\t});\n\t\t// example:\n\t\t//\t\tget a NodeList from a CSS query and iterate on it\n\t\t//\t\t|\trequire([\"dojo/on\", \"dojo/dom\"\n\t\t//\t\t|\t], function(on, dom){\n\t\t//\t\t|\t\tvar l = query(\".thinger\");\n\t\t//\t\t|\t\tl.forEach(function(node, index, nodeList){\n\t\t//\t\t|\t\t\tconsole.log(index, node.innerHTML);\n\t\t//\t\t|\t\t});\n\t\t//\t\t|\t});\n\t\t// example:\n\t\t//\t\tuse native and Dojo-provided array methods to manipulate a\n\t\t//\t\tNodeList without needing to use dojo.* functions explicitly:\n\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/dom-construct\", \"dojo/dom\"\n\t\t//\t\t|\t], function(query, domConstruct, dom){\n\t\t//\t\t|\t\tvar l = query(\".thinger\");\n\t\t//\t\t|\t\t// since NodeLists are real arrays, they have a length\n\t\t//\t\t|\t\t// property that is both readable and writable and\n\t\t//\t\t|\t\t// push/pop/shift/unshift methods\n\t\t//\t\t|\t\tconsole.log(l.length);\n\t\t//\t\t|\t\tl.push(domConstruct.create(\"span\"));\n\t\t//\t\t|\n\t\t//\t\t|\t\t// dojo's normalized array methods work too:\n\t\t//\t\t|\t\tconsole.log( l.indexOf(dom.byId(\"foo\")) );\n\t\t//\t\t|\t\t// ...including the special \"function as string\" shorthand\n\t\t//\t\t|\t\tconsole.log( l.every(\"item.nodeType == 1\") );\n\t\t//\t\t|\n\t\t//\t\t|\t\t// NodeLists can be [..] indexed, or you can use the at()\n\t\t//\t\t|\t\t// function to get specific items wrapped in a new NodeList:\n\t\t//\t\t|\t\tvar node = l[3]; // the 4th element\n\t\t//\t\t|\t\tvar newList = l.at(1, 3); // the 2nd and 4th elements\n\t\t//\t\t|\t});\n\t\t// example:\n\t\t//\t\tchainability is a key advantage of NodeLists:\n\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t//\t\t|\t], function(query){\n\t\t//\t\t|\t\tquery(\".thinger\")\n\t\t//\t\t|\t\t\t.onclick(function(e){ /* ... */ })\n\t\t//\t\t|\t\t\t.at(1, 3, 8) // get a subset\n\t\t//\t\t|\t\t\t\t.style(\"padding\", \"5px\")\n\t\t//\t\t|\t\t\t\t.forEach(console.log);\n\t\t//\t\t|\t});\n\n\t\tvar isNew = this instanceof nl && has(\"array-extensible\");\n\t\tif(typeof array == \"number\"){\n\t\t\tarray = Array(array);\n\t\t}\n\t\tvar nodeArray = (array && \"length\" in array) ? array : arguments;\n\t\tif(isNew || !nodeArray.sort){\n\t\t\t// make sure it's a real array before we pass it on to be wrapped \n\t\t\tvar target = isNew ? this : [],\n\t\t\t\tl = target.length = nodeArray.length;\n\t\t\tfor(var i = 0; i < l; i++){\n\t\t\t\ttarget[i] = nodeArray[i];\n\t\t\t}\n\t\t\tif(isNew){\n\t\t\t\t// called with new operator, this means we are going to use this instance and push\n\t\t\t\t// the nodes on to it. This is usually much faster since the NodeList properties\n\t\t\t\t//\tdon't need to be copied (unless the list of nodes is extremely large).\n\t\t\t\treturn target;\n\t\t\t}\n\t\t\tnodeArray = target;\n\t\t}\n\t\t// called without new operator, use a real array and copy prototype properties,\n\t\t// this is slower and exists for back-compat. Should be removed in 2.0.\n\t\tlang._mixin(nodeArray, nlp);\n\t\tnodeArray._NodeListCtor = function(array){\n\t\t\t// call without new operator to preserve back-compat behavior\n\t\t\treturn nl(array);\n\t\t};\n\t\treturn nodeArray;\n\t};\n\t\n\tvar nl = NodeList, nlp = nl.prototype = \n\t\thas(\"array-extensible\") ? [] : {};// extend an array if it is extensible\n\n\t// expose adapters and the wrapper as private functions\n\n\tnl._wrap = nlp._wrap = tnl;\n\tnl._adaptAsMap = adaptAsMap;\n\tnl._adaptAsForEach = adaptAsForEach;\n\tnl._adaptAsFilter = adaptAsFilter;\n\tnl._adaptWithCondition = adaptWithCondition;\n\n\t// mass assignment\n\n\t// add array redirectors\n\tforEach([\"slice\", \"splice\"], function(name){\n\t\tvar f = ap[name];\n\t\t//Use a copy of the this array via this.slice() to allow .end() to work right in the splice case.\n\t\t// CANNOT apply ._stash()/end() to splice since it currently modifies\n\t\t// the existing this array -- it would break backward compatibility if we copy the array before\n\t\t// the splice so that we can use .end(). So only doing the stash option to this._wrap for slice.\n\t\tnlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == \"slice\" ? this : null); };\n\t});\n\t// concat should be here but some browsers with native NodeList have problems with it\n\n\t// add array.js redirectors\n\tforEach([\"indexOf\", \"lastIndexOf\", \"every\", \"some\"], function(name){\n\t\tvar f = array[name];\n\t\tnlp[name] = function(){ return f.apply(dojo, [this].concat(aps.call(arguments, 0))); };\n\t});\n\n\tlang.extend(NodeList, {\n\t\t// copy the constructors\n\t\tconstructor: nl,\n\t\t_NodeListCtor: nl,\n\t\ttoString: function(){\n\t\t\t// Array.prototype.toString can't be applied to objects, so we use join\n\t\t\treturn this.join(\",\");\n\t\t},\n\t\t_stash: function(parent){\n\t\t\t// summary:\n\t\t\t//\t\tprivate function to hold to a parent NodeList. end() to return the parent NodeList.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\tHow to make a `dojo/NodeList` method that only returns the third node in\n\t\t\t//\t\tthe dojo/NodeList but allows access to the original NodeList by using this._stash:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/_base/lang\", \"dojo/NodeList\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query, lang){\n\t\t\t//\t|\t\tlang.extend(NodeList, {\n\t\t\t//\t|\t\t\tthird: function(){\n\t\t\t//\t|\t\t\t\tvar newNodeList = NodeList(this[2]);\n\t\t\t//\t|\t\t\t\treturn newNodeList._stash(this);\n\t\t\t//\t|\t\t\t}\n\t\t\t//\t|\t\t});\n\t\t\t//\t|\t\t// then see how _stash applies a sub-list, to be .end()'ed out of\n\t\t\t//\t|\t\tquery(\".foo\")\n\t\t\t//\t|\t\t\t.third()\n\t\t\t//\t|\t\t\t\t.addClass(\"thirdFoo\")\n\t\t\t//\t|\t\t\t.end()\n\t\t\t//\t|\t\t\t// access to the orig .foo list\n\t\t\t//\t|\t\t\t.removeClass(\"foo\")\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\tthis._parent = parent;\n\t\t\treturn this; // dojo/NodeList\n\t\t},\n\n\t\ton: function(eventName, listener){\n\t\t\t// summary:\n\t\t\t//\t\tListen for events on the nodes in the NodeList. Basic usage is:\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\t\t|\trequire([\"dojo/query\"\n\t\t\t//\t\t|\t], function(query){\n\t\t\t//\t\t|\t\tquery(\".my-class\").on(\"click\", listener);\n\t\t\t//\t\t\tThis supports event delegation by using selectors as the first argument with the event names as\n\t\t\t//\t\t\tpseudo selectors. For example:\n\t\t\t//\t\t| \t\tquery(\"#my-list\").on(\"li:click\", listener);\n\t\t\t//\t\t\tThis will listen for click events within `<li>` elements that are inside the `#my-list` element.\n\t\t\t//\t\t\tBecause on supports CSS selector syntax, we can use comma-delimited events as well:\n\t\t\t//\t\t| \t\tquery(\"#my-list\").on(\"li button:mouseover, li:click\", listener);\n\t\t\t//\t\t|\t});\n\t\t\tvar handles = this.map(function(node){\n\t\t\t\treturn on(node, eventName, listener); // TODO: apply to the NodeList so the same selector engine is used for matches\n\t\t\t});\n\t\t\thandles.remove = function(){\n\t\t\t\tfor(var i = 0; i < handles.length; i++){\n\t\t\t\t\thandles[i].remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn handles;\n\t\t},\n\n\t\tend: function(){\n\t\t\t// summary:\n\t\t\t//\t\tEnds use of the current `NodeList` by returning the previous NodeList\n\t\t\t//\t\tthat generated the current NodeList.\n\t\t\t// description:\n\t\t\t//\t\tReturns the `NodeList` that generated the current `NodeList`. If there\n\t\t\t//\t\tis no parent NodeList, an empty NodeList is returned.\n\t\t\t// example:\n\t\t\t//\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"a\")\n\t\t\t//\t|\t\t\t.filter(\".disabled\")\n\t\t\t//\t|\t\t\t\t// operate on the anchors that only have a disabled class\n\t\t\t//\t|\t\t\t\t.style(\"color\", \"grey\")\n\t\t\t//\t|\t\t\t.end()\n\t\t\t//\t|\t\t\t// jump back to the list of anchors\n\t\t\t//\t|\t\t\t.style(...)\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\tif(this._parent){\n\t\t\t\treturn this._parent;\n\t\t\t}else{\n\t\t\t\t//Just return empty list.\n\t\t\t\treturn new this._NodeListCtor(0);\n\t\t\t}\n\t\t},\n\n\t\t// http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods\n\n\t\t// FIXME: handle return values for #3244\n\t\t//\t\thttp://trac.dojotoolkit.org/ticket/3244\n\n\t\t// FIXME:\n\t\t//\t\tneed to wrap or implement:\n\t\t//\t\t\tjoin (perhaps w/ innerHTML/outerHTML overload for toString() of items?)\n\t\t//\t\t\treduce\n\t\t//\t\t\treduceRight\n\n\t\t/*=====\n\t\tslice: function(begin, end){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList, maintaining this one in place\n\t\t\t// description:\n\t\t\t//\t\tThis method behaves exactly like the Array.slice method\n\t\t\t//\t\twith the caveat that it returns a `dojo/NodeList` and not a\n\t\t\t//\t\traw Array. For more details, see Mozilla's [slice\n\t\t\t//\t\tdocumentation](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice)\n\t\t\t// begin: Integer\n\t\t\t//\t\tCan be a positive or negative integer, with positive\n\t\t\t//\t\tintegers noting the offset to begin at, and negative\n\t\t\t//\t\tintegers denoting an offset from the end (i.e., to the left\n\t\t\t//\t\tof the end)\n\t\t\t// end: Integer?\n\t\t\t//\t\tOptional parameter to describe what position relative to\n\t\t\t//\t\tthe NodeList's zero index to end the slice at. Like begin,\n\t\t\t//\t\tcan be positive or negative.\n\t\t\treturn this._wrap(a.slice.apply(this, arguments));\n\t\t},\n\n\t\tsplice: function(index, howmany, item){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList, manipulating this NodeList based on\n\t\t\t//\t\tthe arguments passed, potentially splicing in new elements\n\t\t\t//\t\tat an offset, optionally deleting elements\n\t\t\t// description:\n\t\t\t//\t\tThis method behaves exactly like the Array.splice method\n\t\t\t//\t\twith the caveat that it returns a `dojo/NodeList` and not a\n\t\t\t//\t\traw Array. For more details, see Mozilla's [splice\n\t\t\t//\t\tdocumentation](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice)\n\t\t\t//\t\tFor backwards compatibility, calling .end() on the spliced NodeList\n\t\t\t//\t\tdoes not return the original NodeList -- splice alters the NodeList in place.\n\t\t\t// index: Integer\n\t\t\t//\t\tbegin can be a positive or negative integer, with positive\n\t\t\t//\t\tintegers noting the offset to begin at, and negative\n\t\t\t//\t\tintegers denoting an offset from the end (i.e., to the left\n\t\t\t//\t\tof the end)\n\t\t\t// howmany: Integer?\n\t\t\t//\t\tOptional parameter to describe what position relative to\n\t\t\t//\t\tthe NodeList's zero index to end the slice at. Like begin,\n\t\t\t//\t\tcan be positive or negative.\n\t\t\t// item: Object...?\n\t\t\t//\t\tAny number of optional parameters may be passed in to be\n\t\t\t//\t\tspliced into the NodeList\n\t\t\treturn this._wrap(a.splice.apply(this, arguments));\t// dojo/NodeList\n\t\t},\n\n\t\tindexOf: function(value, fromIndex){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.indexOf()`. The primary difference is that the acted-on\n\t\t\t//\t\tarray is implicitly this NodeList\n\t\t\t// value: Object\n\t\t\t//\t\tThe value to search for.\n\t\t\t// fromIndex: Integer?\n\t\t\t//\t\tThe location to start searching from. Optional. Defaults to 0.\n\t\t\t// description:\n\t\t\t//\t\tFor more details on the behavior of indexOf, see Mozilla's\n\t\t\t//\t\t[indexOf\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf)\n\t\t\t// returns:\n\t\t\t//\t\tPositive Integer or 0 for a match, -1 of not found.\n\t\t\treturn d.indexOf(this, value, fromIndex); // Integer\n\t\t},\n\n\t\tlastIndexOf: function(value, fromIndex){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.lastIndexOf()`. The primary difference is that the\n\t\t\t//\t\tacted-on array is implicitly this NodeList\n\t\t\t// description:\n\t\t\t//\t\tFor more details on the behavior of lastIndexOf, see\n\t\t\t//\t\tMozilla's [lastIndexOf\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf)\n\t\t\t// value: Object\n\t\t\t//\t\tThe value to search for.\n\t\t\t// fromIndex: Integer?\n\t\t\t//\t\tThe location to start searching from. Optional. Defaults to 0.\n\t\t\t// returns:\n\t\t\t//\t\tPositive Integer or 0 for a match, -1 of not found.\n\t\t\treturn d.lastIndexOf(this, value, fromIndex); // Integer\n\t\t},\n\n\t\tevery: function(callback, thisObject){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.every()` and the [Array.every\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every).\n\t\t\t//\t\tTakes the same structure of arguments and returns as\n\t\t\t//\t\tdojo/_base/array.every() with the caveat that the passed array is\n\t\t\t//\t\timplicitly this NodeList\n\t\t\t// callback: Function\n\t\t\t//\t\tthe callback\n\t\t\t// thisObject: Object?\n\t\t\t//\t\tthe context\n\t\t\treturn d.every(this, callback, thisObject); // Boolean\n\t\t},\n\n\t\tsome: function(callback, thisObject){\n\t\t\t// summary:\n\t\t\t//\t\tTakes the same structure of arguments and returns as\n\t\t\t//\t\t`dojo/_base/array.some()` with the caveat that the passed array is\n\t\t\t//\t\timplicitly this NodeList. See `dojo/_base/array.some()` and Mozilla's\n\t\t\t//\t\t[Array.some\n\t\t\t//\t\tdocumentation](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some).\n\t\t\t// callback: Function\n\t\t\t//\t\tthe callback\n\t\t\t// thisObject: Object?\n\t\t\t//\t\tthe context\n\t\t\treturn d.some(this, callback, thisObject); // Boolean\n\t\t},\n\t\t=====*/\n\n\t\tconcat: function(item){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList comprised of items in this NodeList\n\t\t\t//\t\tas well as items passed in as parameters\n\t\t\t// description:\n\t\t\t//\t\tThis method behaves exactly like the Array.concat method\n\t\t\t//\t\twith the caveat that it returns a `NodeList` and not a\n\t\t\t//\t\traw Array. For more details, see the [Array.concat\n\t\t\t//\t\tdocs](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/concat)\n\t\t\t// item: Object?\n\t\t\t//\t\tAny number of optional parameters may be passed in to be\n\t\t\t//\t\tspliced into the NodeList\n\n\t\t\t//return this._wrap(apc.apply(this, arguments));\n\t\t\t// the line above won't work for the native NodeList, or for Dojo NodeLists either :-(\n\n\t\t\t// implementation notes:\n\t\t\t// Array.concat() doesn't recognize native NodeLists or Dojo NodeLists\n\t\t\t// as arrays, and so does not inline them into a unioned array, but\n\t\t\t// appends them as single entities. Both the original NodeList and the\n\t\t\t// items passed in as parameters must be converted to raw Arrays\n\t\t\t// and then the concatenation result may be re-_wrap()ed as a Dojo NodeList.\n\n\t\t\tvar t = aps.call(this, 0),\n\t\t\t\tm = array.map(arguments, function(a){\n\t\t\t\t\treturn aps.call(a, 0);\n\t\t\t\t});\n\t\t\treturn this._wrap(apc.apply(t, m), this);\t// dojo/NodeList\n\t\t},\n\n\t\tmap: function(/*Function*/ func, /*Function?*/ obj){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.map()`. The primary difference is that the acted-on\n\t\t\t//\t\tarray is implicitly this NodeList and the return is a\n\t\t\t//\t\tNodeList (a subclass of Array)\n\t\t\treturn this._wrap(array.map(this, func, obj), this); // dojo/NodeList\n\t\t},\n\n\t\tforEach: function(callback, thisObj){\n\t\t\t// summary:\n\t\t\t//\t\tsee `dojo/_base/array.forEach()`. The primary difference is that the acted-on\n\t\t\t//\t\tarray is implicitly this NodeList. If you want the option to break out\n\t\t\t//\t\tof the forEach loop, use every() or some() instead.\n\t\t\tforEach(this, callback, thisObj);\n\t\t\t// non-standard return to allow easier chaining\n\t\t\treturn this; // dojo/NodeList\n\t\t},\n\t\tfilter: function(/*String|Function*/ filter){\n\t\t\t// summary:\n\t\t\t//\t\t\"masks\" the built-in javascript filter() method (supported\n\t\t\t//\t\tin Dojo via `dojo/_base/array.filter`) to support passing a simple\n\t\t\t//\t\tstring filter in addition to supporting filtering function\n\t\t\t//\t\tobjects.\n\t\t\t// filter:\n\t\t\t//\t\tIf a string, a CSS rule like \".thinger\" or \"div > span\".\n\t\t\t// example:\n\t\t\t//\t\t\"regular\" JS filter syntax as exposed in `dojo/_base/array.filter`:\n\t\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t\t|\t], function(query){\n\t\t\t//\t\t|\t\tquery(\"*\").filter(function(item){\n\t\t\t//\t\t|\t\t\t// highlight every paragraph\n\t\t\t//\t\t|\t\t\treturn (item.nodeName == \"p\");\n\t\t\t//\t\t|\t\t}).style(\"backgroundColor\", \"yellow\");\n\t\t\t//\t\t|\t});\n\t\t\t// example:\n\t\t\t//\t\tthe same filtering using a CSS selector\n\t\t\t//\t\t|\trequire([\"dojo/query\", \"dojo/NodeList-dom\"\n\t\t\t//\t\t|\t], function(query){\n\t\t\t//\t\t|\t\tquery(\"*\").filter(\"p\").styles(\"backgroundColor\", \"yellow\");\n\t\t\t//\t\t|\t});\n\n\t\t\tvar a = arguments, items = this, start = 0;\n\t\t\tif(typeof filter == \"string\"){ // inline'd type check\n\t\t\t\titems = query._filterResult(this, a[0]);\n\t\t\t\tif(a.length == 1){\n\t\t\t\t\t// if we only got a string query, pass back the filtered results\n\t\t\t\t\treturn items._stash(this); // dojo/NodeList\n\t\t\t\t}\n\t\t\t\t// if we got a callback, run it over the filtered items\n\t\t\t\tstart = 1;\n\t\t\t}\n\t\t\treturn this._wrap(array.filter(items, a[start], a[start + 1]), this);\t// dojo/NodeList\n\t\t},\n\t\tinstantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){\n\t\t\t// summary:\n\t\t\t//\t\tCreate a new instance of a specified class, using the\n\t\t\t//\t\tspecified properties and each node in the NodeList as a\n\t\t\t//\t\tsrcNodeRef.\n\t\t\t// example:\n\t\t\t//\t\tGrabs all buttons in the page and converts them to dijit/form/Button's.\n\t\t\t//\t|\tvar buttons = query(\"button\").instantiate(Button, {showLabel: true});\n\t\t\tvar c = lang.isFunction(declaredClass) ? declaredClass : lang.getObject(declaredClass);\n\t\t\tproperties = properties || {};\n\t\t\treturn this.forEach(function(node){\n\t\t\t\tnew c(properties, node);\n\t\t\t});\t// dojo/NodeList\n\t\t},\n\t\tat: function(/*===== index =====*/){\n\t\t\t// summary:\n\t\t\t//\t\tReturns a new NodeList comprised of items in this NodeList\n\t\t\t//\t\tat the given index or indices.\n\t\t\t//\n\t\t\t// index: Integer...\n\t\t\t//\t\tOne or more 0-based indices of items in the current\n\t\t\t//\t\tNodeList. A negative index will start at the end of the\n\t\t\t//\t\tlist and go backwards.\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tShorten the list to the first, second, and third elements\n\t\t\t//\t|\trequire([\"dojo/query\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"a\").at(0, 1, 2).forEach(fn);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tRetrieve the first and last elements of a unordered list:\n\t\t\t//\t|\trequire([\"dojo/query\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"ul > li\").at(0, -1).forEach(cb);\n\t\t\t//\t|\t});\n\t\t\t//\n\t\t\t// example:\n\t\t\t//\tDo something for the first element only, but end() out back to\n\t\t\t//\tthe original list and continue chaining:\n\t\t\t//\t|\trequire([\"dojo/query\"\n\t\t\t//\t|\t], function(query){\n\t\t\t//\t|\t\tquery(\"a\").at(0).onclick(fn).end().forEach(function(n){\n\t\t\t//\t|\t\t\tconsole.log(n); // all anchors on the page.\n\t\t\t//\t|\t})\n\t\t\t//\t|\t});\n\n\t\t\tvar t = new this._NodeListCtor(0);\n\t\t\tforEach(arguments, function(i){\n\t\t\t\tif(i < 0){ i = this.length + i; }\n\t\t\t\tif(this[i]){ t.push(this[i]); }\n\t\t\t}, this);\n\t\t\treturn t._stash(this); // dojo/NodeList\n\t\t}\n\t});\n\n\tfunction queryForEngine(engine, NodeList){\n\t\tvar query = function(/*String*/ query, /*String|DOMNode?*/ root){\n\t\t\t// summary:\n\t\t\t//\t\tReturns nodes which match the given CSS selector, searching the\n\t\t\t//\t\tentire document by default but optionally taking a node to scope\n\t\t\t//\t\tthe search by. Returns an instance of NodeList.\n\t\t\tif(typeof root == \"string\"){\n\t\t\t\troot = dom.byId(root);\n\t\t\t\tif(!root){\n\t\t\t\t\treturn new NodeList([]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar results = typeof query == \"string\" ? engine(query, root) : query ? (query.end && query.on) ? query : [query] : [];\n\t\t\tif(results.end && results.on){\n\t\t\t\t// already wrapped\n\t\t\t\treturn results;\n\t\t\t}\n\t\t\treturn new NodeList(results);\n\t\t};\n\t\tquery.matches = engine.match || function(node, selector, root){\n\t\t\t// summary:\n\t\t\t//\t\tTest to see if a node matches a selector\n\t\t\treturn query.filter([node], selector, root).length > 0;\n\t\t};\n\t\t// the engine provides a filtering function, use it to for matching\n\t\tquery.filter = engine.filter || function(nodes, selector, root){\n\t\t\t// summary:\n\t\t\t//\t\tFilters an array of nodes. Note that this does not guarantee to return a NodeList, just an array.\n\t\t\treturn query(selector, root).filter(function(node){\n\t\t\t\treturn array.indexOf(nodes, node) > -1;\n\t\t\t});\n\t\t};\n\t\tif(typeof engine != \"function\"){\n\t\t\tvar search = engine.search;\n\t\t\tengine = function(selector, root){\n\t\t\t\t// Slick does it backwards (or everyone else does it backwards, probably the latter)\n\t\t\t\treturn search(root || document, selector);\n\t\t\t};\n\t\t}\n\t\treturn query;\n\t}\n\tvar query = queryForEngine(defaultEngine, NodeList);\n\t/*=====\n\tquery = function(selector, context){\n\t\t// summary:\n\t\t//\t\tThis modules provides DOM querying functionality. The module export is a function\n\t\t//\t\tthat can be used to query for DOM nodes by CSS selector and returns a NodeList\n\t\t//\t\trepresenting the matching nodes.\n\t\t// selector: String\n\t\t//\t\tA CSS selector to search for.\n\t\t// context: String|DomNode?\n\t\t//\t\tAn optional context to limit the searching scope. Only nodes under `context` will be\n\t\t//\t\tscanned.\n\t\t// example:\n\t\t//\t\tadd an onclick handler to every submit button in the document\n\t\t//\t\twhich causes the form to be sent via Ajax instead:\n\t\t//\t|\trequire([\"dojo/query\", \"dojo/request\", \"dojo/dom-form\", \"dojo/dom-construct\", \"dojo/dom-style\"\n\t\t//\t|\t], function(query, request, domForm, domConstruct, domStyle){\n\t\t//\t|\t\tquery(\"input[type='submit']\").on(\"click\", function(e){\n\t\t//\t|\t\t\te.preventDefault(); // prevent sending the form\n\t\t//\t|\t\t\tvar btn = e.target;\n\t\t//\t|\t\t\trequest.post(\"http://example.com/\", {\n\t\t//\t|\t\t\t\tdata: domForm.toObject(btn.form)\n\t\t//\t|\t\t\t}).then(function(response){\n\t\t//\t|\t\t\t\t// replace the form with the response\n\t\t//\t|\t\t\t\tdomConstruct.create(div, {innerHTML: response}, btn.form, \"after\");\n\t\t//\t|\t\t\t\tdomStyle.set(btn.form, \"display\", \"none\");\n\t\t//\t|\t\t\t});\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\n\t\t// description:\n\t\t//\t\tdojo/query is responsible for loading the appropriate query engine and wrapping\n\t\t//\t\tits results with a `NodeList`. You can use dojo/query with a specific selector engine\n\t\t//\t\tby using it as a plugin. For example, if you installed the sizzle package, you could\n\t\t//\t\tuse it as the selector engine with:\n\t\t//\t\t|\trequire([\"dojo/query!sizzle\"], function(query){\n\t\t//\t\t|\t\tquery(\"div\")...\n\t\t//\n\t\t//\t\tThe id after the ! can be a module id of the selector engine or one of the following values:\n\t\t//\n\t\t//\t\t- acme: This is the default engine used by Dojo base, and will ensure that the full\n\t\t//\t\tAcme engine is always loaded.\n\t\t//\n\t\t//\t\t- css2: If the browser has a native selector engine, this will be used, otherwise a\n\t\t//\t\tvery minimal lightweight selector engine will be loaded that can do simple CSS2 selectors\n\t\t//\t\t(by #id, .class, tag, and [name=value] attributes, with standard child or descendant (>)\n\t\t//\t\toperators) and nothing more.\n\t\t//\n\t\t//\t\t- css2.1: If the browser has a native selector engine, this will be used, otherwise the\n\t\t//\t\tfull Acme engine will be loaded.\n\t\t//\n\t\t//\t\t- css3: If the browser has a native selector engine with support for CSS3 pseudo\n\t\t//\t\tselectors (most modern browsers except IE8), this will be used, otherwise the\n\t\t//\t\tfull Acme engine will be loaded.\n\t\t//\n\t\t//\t\t- Or the module id of a selector engine can be used to explicitly choose the selector engine\n\t\t//\n\t\t//\t\tFor example, if you are using CSS3 pseudo selectors in module, you can specify that\n\t\t//\t\tyou will need support them with:\n\t\t//\t\t|\trequire([\"dojo/query!css3\"], function(query){\n\t\t//\t\t|\t\tquery('#t > h3:nth-child(odd)')...\n\t\t//\n\t\t//\t\tYou can also choose the selector engine/load configuration by setting the query-selector:\n\t\t//\t\tFor example:\n\t\t//\t\t|\t<script data-dojo-config=\"query-selector:'css3'\" src=\"dojo.js\"></script>\n\t\t//\n\t\treturn new NodeList(); // dojo/NodeList\n\t };\n\t =====*/\n\n\t// the query that is returned from this module is slightly different than dojo.query,\n\t// because dojo.query has to maintain backwards compatibility with returning a\n\t// true array which has performance problems. The query returned from the module\n\t// does not use true arrays, but rather inherits from Array, making it much faster to\n\t// instantiate.\n\tdojo.query = queryForEngine(defaultEngine, function(array){\n\t\t// call it without the new operator to invoke the back-compat behavior that returns a true array\n\t\treturn NodeList(array);\t// dojo/NodeList\n\t});\n\n\tquery.load = function(id, parentRequire, loaded){\n\t\t// summary:\n\t\t//\t\tcan be used as AMD plugin to conditionally load new query engine\n\t\t// example:\n\t\t//\t|\trequire([\"dojo/query!custom\"], function(qsa){\n\t\t//\t|\t\t// loaded selector/custom.js as engine\n\t\t//\t|\t\tqsa(\"#foobar\").forEach(...);\n\t\t//\t|\t});\n\t\tloader.load(id, parentRequire, function(engine){\n\t\t\tloaded(queryForEngine(engine, NodeList));\n\t\t});\n\t};\n\n\tdojo._filterQueryResult = query._filterResult = function(nodes, selector, root){\n\t\treturn new NodeList(query.filter(nodes, selector, root));\n\t};\n\tdojo.NodeList = query.NodeList = NodeList;\n\treturn query;\n});\n","define([\"./_base/kernel\", \"./has\", \"require\", \"./has!host-browser?./domReady\", \"./_base/lang\"], function(dojo, has, require, domReady, lang){\n\t// module:\n\t//\t\tdojo/ready\n\t// note:\n\t//\t\tThis module should be unnecessary in dojo 2.0\n\n\tvar\n\t\t// truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved\n\t\tisDomReady = 0,\n\n\t\t// The queue of functions waiting to execute as soon as dojo.ready conditions satisfied\n\t\tloadQ = [],\n\n\t\t// prevent recursion in onLoad\n\t\tonLoadRecursiveGuard = 0,\n\n\t\thandleDomReady = function(){\n\t\t\tisDomReady = 1;\n\t\t\tdojo._postLoad = dojo.config.afterOnLoad = true;\n\t\t\tonEvent();\n\t\t},\n\n\t\tonEvent = function(){\n\t\t\t// Called when some state changes:\n\t\t\t//\t\t- dom ready\n\t\t\t//\t\t- dojo/domReady has finished processing everything in its queue\n\t\t\t//\t\t- task added to loadQ\n\t\t\t//\t\t- require() has finished loading all currently requested modules\n\t\t\t//\n\t\t\t// Run the functions queued with dojo.ready if appropriate.\n\n\n\t\t\t//guard against recursions into this function\n\t\t\tif(onLoadRecursiveGuard){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonLoadRecursiveGuard = 1;\n\n\t\t\t// Run tasks in queue if require() is finished loading modules, the dom is ready, and there are no\n\t\t\t// pending tasks registered via domReady().\n\t\t\t// The last step is necessary so that a user defined dojo.ready() callback is delayed until after the\n\t\t\t// domReady() calls inside of dojo.\t Failure can be seen on dijit/tests/robot/Dialog_ally.html on IE8\n\t\t\t// because the dijit/focus.js domReady() callback doesn't execute until after the test starts running.\n\t\t\twhile(isDomReady && (!domReady || domReady._Q.length == 0) && (require.idle ? require.idle() : true) && loadQ.length){\n\t\t\t\tvar f = loadQ.shift();\n\t\t\t\ttry{\n\t\t\t\t\tf();\n\t\t\t\t}catch(e){\n\t\t\t\t\t// force the dojo.js on(\"error\") handler do display the message\n\t\t\t\t\te.info = e.message;\n\t\t\t\t\tif(require.signal){\n\t\t\t\t\t\trequire.signal(\"error\", e);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonLoadRecursiveGuard = 0;\n\t\t};\n\n\t// Check if we should run the next queue operation whenever require() finishes loading modules or domReady\n\t// finishes processing it's queue.\n\trequire.on && require.on(\"idle\", onEvent);\n\tif(domReady){\n\t\tdomReady._onQEmpty = onEvent;\n\t}\n\n\tvar ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){\n\t\t// summary:\n\t\t//\t\tAdd a function to execute on DOM content loaded and all requested modules have arrived and been evaluated.\n\t\t//\t\tIn most cases, the `domReady` plug-in should suffice and this method should not be needed.\n\t\t//\n\t\t//\t\tWhen called in a non-browser environment, just checks that all requested modules have arrived and been\n\t\t//\t\tevaluated.\n\t\t// priority: Integer?\n\t\t//\t\tThe order in which to exec this callback relative to other callbacks, defaults to 1000\n\t\t// context: Object?|Function\n\t\t//\t\tThe context in which to run execute callback, or a callback if not using context\n\t\t// callback: Function?\n\t\t//\t\tThe function to execute.\n\t\t//\n\t\t// example:\n\t\t//\tSimple DOM and Modules ready syntax\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tready(function(){ alert(\"Dom ready!\"); });\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tUsing a priority\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tready(2, function(){ alert(\"low priority ready!\"); })\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tUsing context\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tready(foo, function(){\n\t\t//\t|\t\t\t// in here, this == foo\n\t\t//\t|\t\t});\n\t\t//\t|\t});\n\t\t//\n\t\t// example:\n\t\t//\tUsing dojo/hitch style args:\n\t\t//\t|\trequire([\"dojo/ready\"], function(ready){\n\t\t//\t|\t\tvar foo = { dojoReady: function(){ console.warn(this, \"dojo dom and modules ready.\"); } };\n\t\t//\t|\t\tready(foo, \"dojoReady\");\n\t\t//\t|\t});\n\n\t\tvar hitchArgs = lang._toArray(arguments);\n\t\tif(typeof priority != \"number\"){\n\t\t\tcallback = context;\n\t\t\tcontext = priority;\n\t\t\tpriority = 1000;\n\t\t}else{\n\t\t\thitchArgs.shift();\n\t\t}\n\t\tcallback = callback ?\n\t\t\tlang.hitch.apply(dojo, hitchArgs) :\n\t\t\tfunction(){\n\t\t\t\tcontext();\n\t\t\t};\n\t\tcallback.priority = priority;\n\t\tfor(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){}\n\t\tloadQ.splice(i, 0, callback);\n\t\tonEvent();\n\t};\n\n\thas.add(\"dojo-config-addOnLoad\", 1);\n\tif(has(\"dojo-config-addOnLoad\")){\n\t\tvar dca = dojo.config.addOnLoad;\n\t\tif(dca){\n\t\t\tready[(lang.isArray(dca) ? \"apply\" : \"call\")](dojo, dca);\n\t\t}\n\t}\n\n\tif(has(\"dojo-sync-loader\") && dojo.config.parseOnLoad && !dojo.isAsync){\n\t\tready(99, function(){\n\t\t\tif(!dojo.parser){\n\t\t\t\tdojo.deprecated(\"Add explicit require(['dojo/parser']);\", \"\", \"2.0\");\n\t\t\t\trequire([\"dojo/parser\"]);\n\t\t\t}\n\t\t});\n\t}\n\n\tif(domReady){\n\t\tdomReady(handleDomReady);\n\t}else{\n\t\thandleDomReady();\n\t}\n\n\treturn ready;\n});\n","define([\n\t'./request/default!'/*=====,\n\t'./_base/declare',\n\t'./promise/Promise' =====*/\n], function(request/*=====, declare, Promise =====*/){\n\t/*=====\n\trequest = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend a request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tThe URL to request.\n\t\t// options: dojo/request.__Options?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.__Promise = declare(Promise, {\n\t\t// response: dojo/promise/Promise\n\t\t//\t\tA promise resolving to an object representing\n\t\t//\t\tthe response from the server.\n\t});\n\trequest.__BaseOptions = declare(null, {\n\t\t// query: String|Object?\n\t\t//\t\tQuery parameters to append to the URL.\n\t\t// data: String|Object?\n\t\t//\t\tData to transfer. This is ignored for GET and DELETE\n\t\t//\t\trequests.\n\t\t// preventCache: Boolean?\n\t\t//\t\tWhether to append a cache-busting parameter to the URL.\n\t\t// timeout: Integer?\n\t\t//\t\tMilliseconds to wait for the response. If this time\n\t\t//\t\tpasses, the then the promise is rejected.\n\t\t// handleAs: String?\n\t\t//\t\tHow to handle the response from the server. Default is\n\t\t//\t\t'text'. Other values are 'json', 'javascript', and 'xml'.\n\t});\n\trequest.__MethodOptions = declare(null, {\n\t\t// method: String?\n\t\t//\t\tThe HTTP method to use to make the request. Must be\n\t\t//\t\tuppercase.\n\t});\n\trequest.__Options = declare([request.__BaseOptions, request.__MethodOptions]);\n\n\trequest.get = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP GET request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.post = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP POST request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.put = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP POST request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\trequest.del = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP DELETE request using the default transport for the current platform.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\t=====*/\n\treturn request;\n});\n","define([\n\t'../json',\n\t'../_base/kernel',\n\t'../_base/array',\n\t'../has',\n\t'../has!dom?../selector/_loader' // only included for has() qsa tests\n], function(JSON, kernel, array, has){\n\thas.add('activex', typeof ActiveXObject !== 'undefined');\n\thas.add('dom-parser', function(global){\n\t\treturn 'DOMParser' in global;\n\t});\n\n\tvar handleXML;\n\tif(has('activex')){\n\t\t// GUIDs obtained from http://msdn.microsoft.com/en-us/library/ms757837(VS.85).aspx\n\t\tvar dp = [\n\t\t\t'Msxml2.DOMDocument.6.0',\n\t\t\t'Msxml2.DOMDocument.4.0',\n\t\t\t'MSXML2.DOMDocument.3.0',\n\t\t\t'MSXML.DOMDocument' // 2.0\n\t\t];\n\t\tvar lastParser;\n\n\t\thandleXML = function(response){\n\t\t\tvar result = response.data;\n\t\t\tvar text = response.text;\n\n\t\t\tif(result && has('dom-qsa2.1') && !result.querySelectorAll && has('dom-parser')){\n\t\t\t\t// http://bugs.dojotoolkit.org/ticket/15631\n\t\t\t\t// IE9 supports a CSS3 querySelectorAll implementation, but the DOM implementation\n\t\t\t\t// returned by IE9 xhr.responseXML does not. Manually create the XML DOM to gain\n\t\t\t\t// the fuller-featured implementation and avoid bugs caused by the inconsistency\n\t\t\t\tresult = new DOMParser().parseFromString(text, 'application/xml');\n\t\t\t}\n\n\t\t\tfunction createDocument(p) {\n\t\t\t\t\ttry{\n\t\t\t\t\t\tvar dom = new ActiveXObject(p);\n\t\t\t\t\t\tdom.async = false;\n\t\t\t\t\t\tdom.loadXML(text);\n\t\t\t\t\t\tresult = dom;\n\t\t\t\t\t\tlastParser = p;\n\t\t\t\t\t}catch(e){ return false; }\n\t\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif(!result || !result.documentElement){\n\t\t\t\t// The creation of an ActiveX object is expensive, so we cache the\n\t\t\t\t// parser type to avoid trying all parser types each time we handle a\n\t\t\t\t// document. There is some concern that some parser types might fail\n\t\t\t\t// depending on the document being parsed. If parsing using the cached\n\t\t\t\t// parser type fails, we do the more expensive operation of finding one\n\t\t\t\t// that works for the given document.\n\t\t\t\t// https://bugs.dojotoolkit.org/ticket/15246\n\t\t\t\tif(!lastParser || !createDocument(lastParser)) {\n\t\t\t\t\tarray.some(dp, createDocument);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\t}\n\n\tvar handleNativeResponse = function(response) {\n\t\tif(!has('native-xhr2-blob') && response.options.handleAs === 'blob' && typeof Blob !== 'undefined'){\n\t\t\treturn new Blob([ response.xhr.response ], { type: response.xhr.getResponseHeader('Content-Type') });\n\t\t}\n\n\t\treturn response.xhr.response;\n\t}\n\n\tvar handlers = {\n\t\t'javascript': function(response){\n\t\t\treturn kernel.eval(response.text || '');\n\t\t},\n\t\t'json': function(response){\n\t\t\treturn JSON.parse(response.text || null);\n\t\t},\n\t\t'xml': handleXML,\n\t\t'blob': handleNativeResponse,\n\t\t'arraybuffer': handleNativeResponse,\n\t\t'document': handleNativeResponse\n\t};\n\n\tfunction handle(response){\n\t\tvar handler = handlers[response.options.handleAs];\n\n\t\tresponse.data = handler ? handler(response) : (response.data || response.text);\n\n\t\treturn response;\n\t}\n\n\thandle.register = function(name, handler){\n\t\thandlers[name] = handler;\n\t};\n\n\treturn handle;\n});\n","define([\n\t'exports',\n\t'../errors/RequestError',\n\t'../errors/CancelError',\n\t'../Deferred',\n\t'../io-query',\n\t'../_base/array',\n\t'../_base/lang',\n\t'../promise/Promise',\n\t'../has'\n], function(exports, RequestError, CancelError, Deferred, ioQuery, array, lang, Promise, has){\n\n\tfunction isArrayBuffer(value) {\n\t\treturn has('native-arraybuffer') && value instanceof ArrayBuffer\n\t}\n\n\tfunction isBlob(value) {\n\t\treturn has('native-blob') && value instanceof Blob\n\t}\n\t\n\tfunction isElement(value) {\n\t\tif(typeof Element !== 'undefined') { //all other\n\t\t\treturn value instanceof Element;\n\t\t}\n\n\t\t//IE<=7\n\t\treturn value.nodeType === 1;\n\t}\n\n\tfunction isFormData(value) {\n\t\treturn has('native-formdata') && value instanceof FormData;\n\t}\n\n\tfunction shouldDeepCopy(value) {\n\t\treturn value &&\n\t\t\ttypeof value === 'object' &&\n\t\t\t!isFormData(value) &&\n\t\t\t!isElement(value) &&\n\t\t\t!isBlob(value) &&\n\t\t\t!isArrayBuffer(value)\n\t}\n\n\texports.deepCopy = function(target, source) {\n\t\tfor (var name in source) {\n\t\t\tvar tval = target[name],\n \t\t\t sval = source[name];\n\t\t\tif (name !== '__proto__' && tval !== sval) {\n\t\t\t\tif (shouldDeepCopy(sval)) {\n\t\t\t\t\tif (Object.prototype.toString.call(sval) === '[object Date]') { // use this date test to handle crossing frame boundaries\n\t\t\t\t\t\ttarget[name] = new Date(sval);\n\t\t\t\t\t} else if (lang.isArray(sval)) {\n \t\t\t\t\t\t target[name] = exports.deepCopyArray(sval);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (tval && typeof tval === 'object') {\n\t\t\t\t\t\t\texports.deepCopy(tval, sval);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttarget[name] = exports.deepCopy({}, sval);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttarget[name] = sval;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t};\n\n\texports.deepCopyArray = function(source) {\n\t\tvar clonedArray = [];\n\t\tfor (var i = 0, l = source.length; i < l; i++) {\n\t\t\tvar svalItem = source[i];\n\t\t\tif (typeof svalItem === 'object') {\n\t\t\t\tclonedArray.push(exports.deepCopy({}, svalItem));\n\t\t\t} else {\n\t\t\t\tclonedArray.push(svalItem);\n\t\t\t}\n\t\t}\n\n\t\treturn clonedArray;\n\t};\n\n\texports.deepCreate = function deepCreate(source, properties){\n\t\tproperties = properties || {};\n\t\tvar target = lang.delegate(source),\n\t\t\tname, value;\n\n\t\tfor(name in source){\n\t\t\tvalue = source[name];\n\n\t\t\tif(value && typeof value === 'object'){\n\t\t\t\ttarget[name] = exports.deepCreate(value, properties[name]);\n\t\t\t}\n\t\t}\n\t\treturn exports.deepCopy(target, properties);\n\t};\n\n\tvar freeze = Object.freeze || function(obj){ return obj; };\n\tfunction okHandler(response){\n\t\treturn freeze(response);\n\t}\n\tfunction dataHandler (response) {\n\t\treturn response.data !== undefined ? response.data : response.text;\n\t}\n\n\texports.deferred = function deferred(response, cancel, isValid, isReady, handleResponse, last){\n\t\tvar def = new Deferred(function(reason){\n\t\t\tcancel && cancel(def, response);\n\n\t\t\tif(!reason || !(reason instanceof RequestError) && !(reason instanceof CancelError)){\n\t\t\t\treturn new CancelError('Request canceled', response);\n\t\t\t}\n\t\t\treturn reason;\n\t\t});\n\n\t\tdef.response = response;\n\t\tdef.isValid = isValid;\n\t\tdef.isReady = isReady;\n\t\tdef.handleResponse = handleResponse;\n\n\t\tfunction errHandler(error){\n\t\t\terror.response = response;\n\t\t\tthrow error;\n\t\t}\n\t\tvar responsePromise = def.then(okHandler).otherwise(errHandler);\n\n\t\tif(exports.notify){\n\t\t\tresponsePromise.then(\n\t\t\t\tlang.hitch(exports.notify, 'emit', 'load'),\n\t\t\t\tlang.hitch(exports.notify, 'emit', 'error')\n\t\t\t);\n\t\t}\n\n\t\tvar dataPromise = responsePromise.then(dataHandler);\n\n\t\t// http://bugs.dojotoolkit.org/ticket/16794\n\t\t// The following works around a leak in IE9 through the\n\t\t// prototype using lang.delegate on dataPromise and\n\t\t// assigning the result a property with a reference to\n\t\t// responsePromise.\n\t\tvar promise = new Promise();\n\t\tfor (var prop in dataPromise) {\n\t\t\tif (dataPromise.hasOwnProperty(prop)) {\n\t\t\t\tpromise[prop] = dataPromise[prop];\n\t\t\t}\n\t\t}\n\t\tpromise.response = responsePromise;\n\t\tfreeze(promise);\n\t\t// End leak fix\n\n\n\t\tif(last){\n\t\t\tdef.then(function(response){\n\t\t\t\tlast.call(def, response);\n\t\t\t}, function(error){\n\t\t\t\tlast.call(def, response, error);\n\t\t\t});\n\t\t}\n\n\t\tdef.promise = promise;\n\t\tdef.then = promise.then;\n\n\t\treturn def;\n\t};\n\n\texports.addCommonMethods = function addCommonMethods(provider, methods){\n\t\tarray.forEach(methods||['GET', 'POST', 'PUT', 'DELETE'], function(method){\n\t\t\tprovider[(method === 'DELETE' ? 'DEL' : method).toLowerCase()] = function(url, options){\n\t\t\t\toptions = lang.delegate(options||{});\n\t\t\t\toptions.method = method;\n\t\t\t\treturn provider(url, options);\n\t\t\t};\n\t\t});\n\t};\n\n\texports.parseArgs = function parseArgs(url, options, skipData){\n\t\tvar data = options.data,\n\t\t\tquery = options.query;\n\n\t\tif(data && !skipData){\n\t\t\tif(typeof data === 'object' && (!(has('native-xhr2')) || !(isArrayBuffer(data) || isBlob(data) ))){\n\t\t\t\toptions.data = ioQuery.objectToQuery(data);\n\t\t\t}\n\t\t}\n\n\t\tif(query){\n\t\t\tif(typeof query === 'object'){\n\t\t\t\tquery = ioQuery.objectToQuery(query);\n\t\t\t}\n\t\t\tif(options.preventCache){\n\t\t\t\tquery += (query ? '&' : '') + 'request.preventCache=' + (+(new Date));\n\t\t\t}\n\t\t}else if(options.preventCache){\n\t\t\tquery = 'request.preventCache=' + (+(new Date));\n\t\t}\n\n\t\tif(url && query){\n\t\t\turl += (~url.indexOf('?') ? '&' : '?') + query;\n\t\t}\n\n\t\treturn {\n\t\t\turl: url,\n\t\t\toptions: options,\n\t\t\tgetHeader: function(headerName){ return null; }\n\t\t};\n\t};\n\n\texports.checkStatus = function(stat){\n\t\tstat = stat || 0;\n\t\treturn (stat >= 200 && stat < 300) || // allow any 2XX response code\n\t\t\tstat === 304 || // or, get it out of the cache\n\t\t\tstat === 1223 || // or, Internet Explorer mangled the status code\n\t\t\t!stat; // or, we're Titanium/browser chrome/chrome extension requesting a local file\n\t};\n});\n","define([\n\t'./util',\n\t'../errors/RequestTimeoutError',\n\t'../errors/CancelError',\n\t'../_base/array',\n\t'../has!host-browser?../_base/window:',\n\t'../has!host-browser?dom-addeventlistener?:../on:'\n], function(util, RequestTimeoutError, CancelError, array, win, on){\n\t// avoid setting a timer per request. It degrades performance on IE\n\t// something fierece if we don't use unified loops.\n\tvar _inFlightIntvl = null,\n\t\t_inFlight = [];\n\n\tfunction watchInFlight(){\n\t\t// summary:\n\t\t//\t\tinternal method that checks each inflight XMLHttpRequest to see\n\t\t//\t\tif it has completed or if the timeout situation applies.\n\n\t\tvar now = +(new Date);\n\n\t\t// we need manual loop because we often modify _inFlight (and therefore 'i') while iterating\n\t\tfor(var i = 0, dfd; i < _inFlight.length && (dfd = _inFlight[i]); i++){\n\t\t\tvar response = dfd.response,\n\t\t\t\toptions = response.options;\n\t\t\tif((dfd.isCanceled && dfd.isCanceled()) || (dfd.isValid && !dfd.isValid(response))){\n\t\t\t\t_inFlight.splice(i--, 1);\n\t\t\t\twatch._onAction && watch._onAction();\n\t\t\t}else if(dfd.isReady && dfd.isReady(response)){\n\t\t\t\t_inFlight.splice(i--, 1);\n\t\t\t\tdfd.handleResponse(response);\n\t\t\t\twatch._onAction && watch._onAction();\n\t\t\t}else if(dfd.startTime){\n\t\t\t\t// did we timeout?\n\t\t\t\tif(dfd.startTime + (options.timeout || 0) < now){\n\t\t\t\t\t_inFlight.splice(i--, 1);\n\t\t\t\t\t// Cancel the request so the io module can do appropriate cleanup.\n\t\t\t\t\tdfd.cancel(new RequestTimeoutError('Timeout exceeded', response));\n\t\t\t\t\twatch._onAction && watch._onAction();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twatch._onInFlight && watch._onInFlight(dfd);\n\n\t\tif(!_inFlight.length){\n\t\t\tclearInterval(_inFlightIntvl);\n\t\t\t_inFlightIntvl = null;\n\t\t}\n\t}\n\n\tfunction watch(dfd){\n\t\t// summary:\n\t\t//\t\tWatches the io request represented by dfd to see if it completes.\n\t\t// dfd: Deferred\n\t\t//\t\tThe Deferred object to watch.\n\t\t// response: Object\n\t\t//\t\tThe object used as the value of the request promise.\n\t\t// validCheck: Function\n\t\t//\t\tFunction used to check if the IO request is still valid. Gets the dfd\n\t\t//\t\tobject as its only argument.\n\t\t// ioCheck: Function\n\t\t//\t\tFunction used to check if basic IO call worked. Gets the dfd\n\t\t//\t\tobject as its only argument.\n\t\t// resHandle: Function\n\t\t//\t\tFunction used to process response. Gets the dfd\n\t\t//\t\tobject as its only argument.\n\t\tif(dfd.response.options.timeout){\n\t\t\tdfd.startTime = +(new Date);\n\t\t}\n\n\t\tif(dfd.isFulfilled()){\n\t\t\t// bail out if the deferred is already fulfilled\n\t\t\treturn;\n\t\t}\n\n\t\t_inFlight.push(dfd);\n\t\tif(!_inFlightIntvl){\n\t\t\t_inFlightIntvl = setInterval(watchInFlight, 50);\n\t\t}\n\n\t\t// handle sync requests separately from async:\n\t\t// http://bugs.dojotoolkit.org/ticket/8467\n\t\tif(dfd.response.options.sync){\n\t\t\twatchInFlight();\n\t\t}\n\t}\n\n\twatch.cancelAll = function cancelAll(){\n\t\t// summary:\n\t\t//\t\tCancels all pending IO requests, regardless of IO type\n\t\ttry{\n\t\t\tarray.forEach(_inFlight, function(dfd){\n\t\t\t\ttry{\n\t\t\t\t\tdfd.cancel(new CancelError('All requests canceled.'));\n\t\t\t\t}catch(e){}\n\t\t\t});\n\t\t}catch(e){}\n\t};\n\n\tif(win && on && win.doc.attachEvent){\n\t\t// Automatically call cancel all io calls on unload in IE\n\t\t// http://bugs.dojotoolkit.org/ticket/2357\n\t\ton(win.global, 'unload', function(){\n\t\t\twatch.cancelAll();\n\t\t});\n\t}\n\n\treturn watch;\n});\n","define([\n\t'../errors/RequestError',\n\t'./watch',\n\t'./handlers',\n\t'./util',\n\t'../has'/*=====,\n\t'../request',\n\t'../_base/declare' =====*/\n], function(RequestError, watch, handlers, util, has/*=====, request, declare =====*/){\n\thas.add('native-xhr', function(){\n\t\t// if true, the environment has a native XHR implementation\n\t\treturn typeof XMLHttpRequest !== 'undefined';\n\t});\n\thas.add('dojo-force-activex-xhr', function(){\n\t\treturn has('activex') && window.location.protocol === 'file:';\n\t});\n\n\thas.add('native-xhr2', function(){\n\t\tif(!has('native-xhr') || has('dojo-force-activex-xhr')){ return; }\n\t\tvar x = new XMLHttpRequest();\n\t\treturn typeof x['addEventListener'] !== 'undefined' &&\n\t\t\t(typeof opera === 'undefined' || typeof x['upload'] !== 'undefined');\n\t});\n\n\thas.add('native-formdata', function(){\n\t\t// if true, the environment has a native FormData implementation\n\t\treturn typeof FormData !== 'undefined';\n\t});\n\n\thas.add('native-blob', function(){\n\t\t// if true, the environment has a native Blob implementation\n\t\treturn typeof Blob !== 'undefined';\n\t});\n\n\thas.add('native-arraybuffer', function(){\n\t\t// if true, the environment has a native ArrayBuffer implementation\n\t\treturn typeof ArrayBuffer !== 'undefined';\n\t});\n\n\thas.add('native-response-type', function(){\n\t\treturn has('native-xhr') && typeof new XMLHttpRequest().responseType !== 'undefined';\n\t});\n\n\thas.add('native-xhr2-blob', function(){\n\t\tif(!has('native-response-type')){ return; }\n\t\tvar x = new XMLHttpRequest();\n\t\t// The URL used here does not have to be reachable as the XHR's `send` method is never called.\n\t\t// It does need to be parsable/resolvable in all cases, so it should be an absolute URL.\n\t\t// XMLHttpRequest within a Worker created from a Blob does not support relative URL paths.\n\t\tx.open('GET', 'https://dojotoolkit.org/', true);\n\t\tx.responseType = 'blob';\n\t\t// will not be set if unsupported\n\t\tvar responseType = x.responseType;\n\t\tx.abort();\n\t\treturn responseType === 'blob';\n\t});\n\n\t// Google Chrome doesn't support \"json\" response type\n\t// up to version 30, so it's intentionally not included here\n\tvar nativeResponseTypes = {\n\t\t'blob': has('native-xhr2-blob') ? 'blob' : 'arraybuffer',\n\t\t'document': 'document',\n\t\t'arraybuffer': 'arraybuffer'\n\t};\n\n\tfunction handleResponse(response, error){\n\t\tvar _xhr = response.xhr;\n\t\tresponse.status = response.xhr.status;\n\n\t\ttry {\n\t\t\t// Firefox throws an error when trying to access\n\t\t\t// xhr.responseText if response isn't text\n\t\t\tresponse.text = _xhr.responseText;\n\t\t} catch (e) {}\n\n\t\tif(response.options.handleAs === 'xml'){\n\t\t\tresponse.data = _xhr.responseXML;\n\t\t}\n\n\t\tvar handleError;\n\t\tif(error){\n\t\t\tthis.reject(error);\n\t\t}else{\n\t\t\ttry{\n\t\t\t\thandlers(response);\n\t\t\t}catch(e){\n\t\t\t\thandleError = e;\n\t\t\t}\n\t\t\tif(util.checkStatus(_xhr.status)){\n\t\t\t\tif(!handleError){\n\t\t\t\t\tthis.resolve(response);\n\t\t\t\t}else{\n\t\t\t\t\tthis.reject(handleError);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tif(!handleError){\n\t\t\t\t\terror = new RequestError('Unable to load ' + response.url + ' status: ' + _xhr.status, response);\n\t\t\t\t\tthis.reject(error);\n\t\t\t\t}else{\n\t\t\t\t\terror = new RequestError('Unable to load ' + response.url + ' status: ' + _xhr.status +\n\t\t\t\t\t\t' and an error in handleAs: transformation of response', response);\n\t\t\t\t\tthis.reject(error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvar isValid, isReady, addListeners, cancel;\n\tif(has('native-xhr2')){\n\t\t// Any platform with XHR2 will only use the watch mechanism for timeout.\n\n\t\tisValid = function(response){\n\t\t\t// summary:\n\t\t\t//\t\tCheck to see if the request should be taken out of the watch queue\n\t\t\treturn !this.isFulfilled();\n\t\t};\n\t\tcancel = function(dfd, response){\n\t\t\t// summary:\n\t\t\t//\t\tCanceler for deferred\n\t\t\tresponse.xhr.abort();\n\t\t};\n\t\taddListeners = function(_xhr, dfd, response, uploadProgress){\n\t\t\t// summary:\n\t\t\t//\t\tAdds event listeners to the XMLHttpRequest object\n\t\t\tfunction onLoad(evt){\n\t\t\t\tdfd.handleResponse(response);\n\t\t\t}\n\t\t\tfunction onError(evt){\n\t\t\t\tvar _xhr = evt.target;\n\t\t\t\tvar error = new RequestError('Unable to load ' + response.url + ' status: ' + _xhr.status, response);\n\t\t\t\tdfd.handleResponse(response, error);\n\t\t\t}\n\n\t\t\tfunction onProgress(transferType, evt){\n\t\t\t\tresponse.transferType = transferType;\n\t\t\t\tif(evt.lengthComputable){\n\t\t\t\t\tresponse.loaded = evt.loaded;\n\t\t\t\t\tresponse.total = evt.total;\n\t\t\t\t\tdfd.progress(response);\n\t\t\t\t} else if(response.xhr.readyState === 3){\n\t\t\t\t\tresponse.loaded = ('loaded' in evt) ? evt.loaded : evt.position;\n\t\t\t\t\tdfd.progress(response);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction onDownloadProgress(evt) {\n\t\t\t\treturn onProgress('download', evt);\n\t\t\t}\n\n\t\t\tfunction onUploadProgress(evt) {\n\t\t\t\treturn onProgress('upload', evt);\n\t\t\t}\n\n\t\t\t_xhr.addEventListener('load', onLoad, false);\n\t\t\t_xhr.addEventListener('error', onError, false);\n\t\t\t_xhr.addEventListener('progress', onDownloadProgress, false);\n\n\t\t\tif (uploadProgress && _xhr.upload) {\n\t\t\t\t_xhr.upload.addEventListener('progress', onUploadProgress, false);\n\t\t\t}\n\n\t\t\treturn function(){\n\t\t\t\t_xhr.removeEventListener('load', onLoad, false);\n\t\t\t\t_xhr.removeEventListener('error', onError, false);\n\t\t\t\t_xhr.removeEventListener('progress', onDownloadProgress, false);\n\t\t\t\t_xhr.upload.removeEventListener('progress', onUploadProgress, false);\n\t\t\t\t_xhr = null;\n\t\t\t};\n\t\t};\n\t}else{\n\t\tisValid = function(response){\n\t\t\treturn response.xhr.readyState; //boolean\n\t\t};\n\t\tisReady = function(response){\n\t\t\treturn 4 === response.xhr.readyState; //boolean\n\t\t};\n\t\tcancel = function(dfd, response){\n\t\t\t// summary:\n\t\t\t//\t\tcanceller function for util.deferred call.\n\t\t\tvar xhr = response.xhr;\n\t\t\tvar _at = typeof xhr.abort;\n\t\t\tif(_at === 'function' || _at === 'object' || _at === 'unknown'){\n\t\t\t\txhr.abort();\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction getHeader(headerName){\n\t\treturn this.xhr.getResponseHeader(headerName);\n\t}\n\n\tvar undefined,\n\t\tdefaultOptions = {\n\t\t\tdata: null,\n\t\t\tquery: null,\n\t\t\tsync: false,\n\t\t\tmethod: 'GET'\n\t\t};\n\tfunction xhr(url, options, returnDeferred){\n\t\tvar isFormData = has('native-formdata') && options && options.data && options.data instanceof FormData;\n\t\tvar response = util.parseArgs(\n\t\t\turl,\n\t\t\tutil.deepCreate(defaultOptions, options),\n\t\t\tisFormData\n\t\t);\n\t\turl = response.url;\n\t\toptions = response.options;\n\t\tvar hasNoData = !options.data && options.method !== 'POST' && options.method !== 'PUT';\n\n\t\tif(has('ie') <= 10){\n\t\t\t// older IE breaks point 9 in http://www.w3.org/TR/XMLHttpRequest/#the-open()-method and sends fragment, so strip it\n\t\t\turl = url.split('#')[0];\n\t\t}\n\n\t\tvar remover,\n\t\t\tlast = function(){\n\t\t\t\tremover && remover();\n\t\t\t};\n\n\t\t//Make the Deferred object for this xhr request.\n\t\tvar dfd = util.deferred(\n\t\t\tresponse,\n\t\t\tcancel,\n\t\t\tisValid,\n\t\t\tisReady,\n\t\t\thandleResponse,\n\t\t\tlast\n\t\t);\n\t\tvar _xhr = response.xhr = xhr._create();\n\n\t\tif(!_xhr){\n\t\t\t// If XHR factory somehow returns nothings,\n\t\t\t// cancel the deferred.\n\t\t\tdfd.cancel(new RequestError('XHR was not created'));\n\t\t\treturn returnDeferred ? dfd : dfd.promise;\n\t\t}\n\n\t\tresponse.getHeader = getHeader;\n\n\t\tif(addListeners){\n\t\t\tremover = addListeners(_xhr, dfd, response, options.uploadProgress);\n\t\t}\n\n\t\t// IE11 treats data: undefined different than other browsers\n\t\tvar data = typeof(options.data) === 'undefined' ? null : options.data,\n\t\t\tasync = !options.sync,\n\t\t\tmethod = options.method;\n\n\t\ttry{\n\t\t\t// IE6 won't let you call apply() on the native function.\n\t\t\t_xhr.open(method, url, async, options.user || undefined, options.password || undefined);\n\n\t\t\tif(options.withCredentials){\n\t\t\t\t_xhr.withCredentials = options.withCredentials;\n\t\t\t}\n\n\t\t\tif(has('native-response-type') && options.handleAs in nativeResponseTypes) {\n\t\t\t\t_xhr.responseType = nativeResponseTypes[options.handleAs];\n\t\t\t}\n\n\t\t\tvar headers = options.headers,\n\t\t\t\tcontentType = (isFormData || hasNoData) ? false : 'application/x-www-form-urlencoded';\n\t\t\tif(headers){\n\t\t\t\tfor(var hdr in headers){\n\t\t\t\t\tif(hdr.toLowerCase() === 'content-type'){\n\t\t\t\t\t\tcontentType = headers[hdr];\n\t\t\t\t\t}else if(headers[hdr]){\n\t\t\t\t\t\t//Only add header if it has a value. This allows for instance, skipping\n\t\t\t\t\t\t//insertion of X-Requested-With by specifying empty value.\n\t\t\t\t\t\t_xhr.setRequestHeader(hdr, headers[hdr]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(contentType && contentType !== false){\n\t\t\t\t_xhr.setRequestHeader('Content-Type', contentType);\n\t\t\t}\n\t\t\tif(!headers || !('X-Requested-With' in headers)){\n\t\t\t\t_xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\t\t}\n\n\t\t\tif(util.notify){\n\t\t\t\tutil.notify.emit('send', response, dfd.promise.cancel);\n\t\t\t}\n\t\t\t_xhr.send(data);\n\t\t}catch(e){\n\t\t\tdfd.reject(e);\n\t\t}\n\n\t\twatch(dfd);\n\t\t_xhr = null;\n\n\t\treturn returnDeferred ? dfd : dfd.promise;\n\t}\n\n\t/*=====\n\txhr = function(url, options){\n\t\t// summary:\n\t\t//\t\tSends a request using XMLHttpRequest with the given URL and options.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request/xhr.__Options?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\txhr.__BaseOptions = declare(request.__BaseOptions, {\n\t\t// sync: Boolean?\n\t\t//\t\tWhether to make a synchronous request or not. Default\n\t\t//\t\tis `false` (asynchronous).\n\t\t// data: String|Object|FormData?\n\t\t//\t\tData to transfer. This is ignored for GET and DELETE\n\t\t//\t\trequests.\n\t\t// headers: Object?\n\t\t//\t\tHeaders to use for the request.\n\t\t// user: String?\n\t\t//\t\tUsername to use during the request.\n\t\t// password: String?\n\t\t//\t\tPassword to use during the request.\n\t\t// withCredentials: Boolean?\n\t\t//\t\tFor cross-site requests, whether to send credentials\n\t\t//\t\tor not.\n\t\t// uploadProgress: Boolean?\n\t\t//\t\tUpload progress events cause preflighted requests. This\n\t\t//\t\toption enables upload progress event support but also\n\t\t//\t\tcauses all requests to be preflighted.\n\t});\n\txhr.__MethodOptions = declare(null, {\n\t\t// method: String?\n\t\t//\t\tThe HTTP method to use to make the request. Must be\n\t\t//\t\tuppercase. Default is `\"GET\"`.\n\t});\n\txhr.__Options = declare([xhr.__BaseOptions, xhr.__MethodOptions]);\n\n\txhr.get = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP GET request using XMLHttpRequest with the given URL and options.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request/xhr.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\txhr.post = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP POST request using XMLHttpRequest with the given URL and options.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request/xhr.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\txhr.put = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP PUT request using XMLHttpRequest with the given URL and options.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request/xhr.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\txhr.del = function(url, options){\n\t\t// summary:\n\t\t//\t\tSend an HTTP DELETE request using XMLHttpRequest with the given URL and options.\n\t\t// url: String\n\t\t//\t\tURL to request\n\t\t// options: dojo/request/xhr.__BaseOptions?\n\t\t//\t\tOptions for the request.\n\t\t// returns: dojo/request.__Promise\n\t};\n\t=====*/\n\txhr._create = function(){\n\t\t// summary:\n\t\t//\t\tdoes the work of portably generating a new XMLHTTPRequest object.\n\t\tthrow new Error('XMLHTTP not available');\n\t};\n\tif(has('native-xhr') && !has('dojo-force-activex-xhr')){\n\t\txhr._create = function(){\n\t\t\treturn new XMLHttpRequest();\n\t\t};\n\t}else if(has('activex')){\n\t\ttry{\n\t\t\tnew ActiveXObject('Msxml2.XMLHTTP');\n\t\t\txhr._create = function(){\n\t\t\t\treturn new ActiveXObject('Msxml2.XMLHTTP');\n\t\t\t};\n\t\t}catch(e){\n\t\t\ttry{\n\t\t\t\tnew ActiveXObject('Microsoft.XMLHTTP');\n\t\t\t\txhr._create = function(){\n\t\t\t\t\treturn new ActiveXObject('Microsoft.XMLHTTP');\n\t\t\t\t};\n\t\t\t}catch(e){}\n\t\t}\n\t}\n\n\tutil.addCommonMethods(xhr);\n\n\treturn xhr;\n});\n","define([\"../has\", \"require\"],\n\t\tfunction(has, require){\n\n\"use strict\";\nif (typeof document !== \"undefined\") {\n\tvar testDiv = document.createElement(\"div\");\n\thas.add(\"dom-qsa2.1\", !!testDiv.querySelectorAll);\n\thas.add(\"dom-qsa3\", function(){\n\t\t// test to see if we have a reasonable native selector engine available\n\t\ttry{\n\t\t\ttestDiv.innerHTML = \"<p class='TEST'></p>\"; // test kind of from sizzle\n\t\t\t// Safari can't handle uppercase or unicode characters when\n\t\t\t// in quirks mode, IE8 can't handle pseudos like :empty\n\t\t\treturn testDiv.querySelectorAll(\".TEST:empty\").length == 1;\n\t\t}catch(e){}\n\t});\n}\n\nvar fullEngine;\nvar acme = \"./acme\", lite = \"./lite\";\nreturn {\n\t// summary:\n\t//\t\tThis module handles loading the appropriate selector engine for the given browser\n\n\tload: function(id, parentRequire, loaded, config){\n\t\tif (config && config.isBuild) {\n\t\t\t//Indicate that the optimizer should not wait\n\t\t\t//for this resource any more and complete optimization.\n\t\t\t//This resource will be resolved dynamically during\n\t\t\t//run time in the web browser.\n\t\t\tloaded();\n\t\t\treturn;\n\t\t}\n\n\t\tvar req = require;\n\t\t// here we implement the default logic for choosing a selector engine\n\t\tid = id == \"default\" ? has(\"config-selectorEngine\") || \"css3\" : id;\n\t\tid = id == \"css2\" || id == \"lite\" ? lite :\n\t\t\t\tid == \"css2.1\" ? has(\"dom-qsa2.1\") ? lite : acme :\n\t\t\t\tid == \"css3\" ? has(\"dom-qsa3\") ? lite : acme :\n\t\t\t\tid == \"acme\" ? acme : (req = parentRequire) && id;\n\t\tif(id.charAt(id.length-1) == '?'){\n\t\t\tid = id.substring(0,id.length - 1);\n\t\t\tvar optionalLoad = true;\n\t\t}\n\t\t// the query engine is optional, only load it if a native one is not available or existing one has not been loaded\n\t\tif(optionalLoad && (has(\"dom-compliant-qsa\") || fullEngine)){\n\t\t\treturn loaded(fullEngine);\n\t\t}\n\t\t// load the referenced selector engine\n\t\treq([id], function(engine){\n\t\t\tif(id != \"./lite\"){\n\t\t\t\tfullEngine = engine;\n\t\t\t}\n\t\t\tloaded(engine);\n\t\t});\n\t}\n};\n});\n","define([\"../has\", \"../_base/kernel\"], function(has, dojo){\n\"use strict\";\n\nvar testDiv = document.createElement(\"div\");\nvar matchesSelector = testDiv.matches || testDiv.webkitMatchesSelector || testDiv.mozMatchesSelector || testDiv.msMatchesSelector || testDiv.oMatchesSelector;\nvar querySelectorAll = testDiv.querySelectorAll;\nvar unionSplit = /([^\\s,](?:\"(?:\\\\.|[^\"])+\"|'(?:\\\\.|[^'])+'|[^,])*)/g;\nhas.add(\"dom-matches-selector\", !!matchesSelector);\nhas.add(\"dom-qsa\", !!querySelectorAll); \n\n// this is a simple query engine. It has handles basic selectors, and for simple\n// common selectors is extremely fast\nvar liteEngine = function(selector, root){\n\t// summary:\n\t//\t\tA small lightweight query selector engine that implements CSS2.1 selectors\n\t//\t\tminus pseudo-classes and the sibling combinator, plus CSS3 attribute selectors\n\n\tif(combine && selector.indexOf(',') > -1){\n\t\treturn combine(selector, root);\n\t}\n\t// use the root's ownerDocument if provided, otherwise try to use dojo.doc. Note \n\t// that we don't use dojo/_base/window's doc to reduce dependencies, and \n\t// fallback to plain document if dojo.doc hasn't been defined (by dojo/_base/window).\n\t// presumably we will have a better way to do this in 2.0 \n\tvar doc = root ? root.ownerDocument || root : dojo.doc || document, \n\t\tmatch = (querySelectorAll ? \n\t\t\t/^([\\w]*)#([\\w\\-]+$)|^(\\.)([\\w\\-\\*]+$)|^(\\w+$)/ : // this one only matches on simple queries where we can beat qSA with specific methods\n\t\t\t/^([\\w]*)#([\\w\\-]+)(?:\\s+(.*))?$|(?:^|(>|.+\\s+))([\\w\\-\\*]+)(\\S*$)/) // this one matches parts of the query that we can use to speed up manual filtering\n\t\t\t.exec(selector);\n\troot = root || doc;\n\tif(match){\n\t\tvar isInsideDomTree = has('ie') === 8 && has('quirks')?\n\t\t\troot.nodeType === doc.nodeType:\n\t\t\troot.parentNode !== null && root.nodeType !== 9 && root.parentNode === doc;\n\n\t\t// fast path regardless of whether or not querySelectorAll exists\n\t\tif(match[2] && isInsideDomTree){\n\t\t\t// an #id\n\t\t\t// use dojo.byId if available as it fixes the id retrieval in IE, note that we can't use the dojo namespace in 2.0, but if there is a conditional module use, we will use that\n\t\t\tvar found = dojo.byId ? dojo.byId(match[2], doc) : doc.getElementById(match[2]);\n\t\t\tif(!found || (match[1] && match[1] != found.tagName.toLowerCase())){\n\t\t\t\t// if there is a tag qualifer and it doesn't match, no matches\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tif(root != doc){\n\t\t\t\t// there is a root element, make sure we are a child of it\n\t\t\t\tvar parent = found;\n\t\t\t\twhile(parent != root){\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t\tif(!parent){\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn match[3] ?\n\t\t\t\t\tliteEngine(match[3], found) \n\t\t\t\t\t: [found];\n\t\t}\n\t\tif(match[3] && root.getElementsByClassName){\n\t\t\t// a .class\n\t\t\treturn root.getElementsByClassName(match[4]);\n\t\t}\n\t\tvar found;\n\t\tif(match[5]){\n\t\t\t// a tag\n\t\t\tfound = root.getElementsByTagName(match[5]);\n\t\t\tif(match[4] || match[6]){\n\t\t\t\tselector = (match[4] || \"\") + match[6];\n\t\t\t}else{\n\t\t\t\t// that was the entirety of the query, return results\n\t\t\t\treturn found;\n\t\t\t}\n\t\t}\n\t}\n\tif(querySelectorAll){\n\t\t// qSA works strangely on Element-rooted queries\n\t\t// We can work around this by specifying an extra ID on the root\n\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t// IE 8 doesn't work on object elements\n\t\tif (root.nodeType === 1 && root.nodeName.toLowerCase() !== \"object\"){\t\t\t\t\n\t\t\treturn useRoot(root, selector, root.querySelectorAll);\n\t\t}else{\n\t\t\t// we can use the native qSA\n\t\t\treturn root.querySelectorAll(selector);\n\t\t}\n\t}else if(!found){\n\t\t// search all children and then filter\n\t\tfound = root.getElementsByTagName(\"*\");\n\t}\n\t// now we filter the nodes that were found using the matchesSelector\n\tvar results = [];\n\tfor(var i = 0, l = found.length; i < l; i++){\n\t\tvar node = found[i];\n\t\tif(node.nodeType == 1 && jsMatchesSelector(node, selector, root)){\n\t\t\t// keep the nodes that match the selector\n\t\t\tresults.push(node);\n\t\t}\n\t}\n\treturn results;\n};\nvar useRoot = function(context, query, method){\n\t// this function creates a temporary id so we can do rooted qSA queries, this is taken from sizzle\n\tvar oldContext = context,\n\t\told = context.getAttribute(\"id\"),\n\t\tnid = old || \"__dojo__\",\n\t\thasParent = context.parentNode,\n\t\trelativeHierarchySelector = /^\\s*[+~]/.test(query);\n\n\tif(relativeHierarchySelector && !hasParent){\n\t\treturn [];\n\t}\n\tif(!old){\n\t\tcontext.setAttribute(\"id\", nid);\n\t}else{\n\t\tnid = nid.replace(/'/g, \"\\\\$&\");\n\t}\n\tif(relativeHierarchySelector && hasParent){\n\t\tcontext = context.parentNode;\n\t}\n\tvar selectors = query.match(unionSplit);\n\tfor(var i = 0; i < selectors.length; i++){\n\t\tselectors[i] = \"[id='\" + nid + \"'] \" + selectors[i];\n\t}\n\tquery = selectors.join(\",\");\n\n\ttry{\n\t\treturn method.call(context, query);\n\t}finally{\n\t\tif(!old){\n\t\t\toldContext.removeAttribute(\"id\");\n\t\t}\n\t}\n};\n\nif(!has(\"dom-matches-selector\")){\n\tvar jsMatchesSelector = (function(){\n\t\t// a JS implementation of CSS selector matching, first we start with the various handlers\n\t\tvar caseFix = testDiv.tagName == \"div\" ? \"toLowerCase\" : \"toUpperCase\";\n\t\tvar selectorTypes = {\n\t\t\t\"\": function(tagName){\n\t\t\t\ttagName = tagName[caseFix]();\n\t\t\t\treturn function(node){\n\t\t\t\t\treturn node.tagName == tagName;\n\t\t\t\t};\n\t\t\t},\n\t\t\t\".\": function(className){\n\t\t\t\tvar classNameSpaced = ' ' + className + ' ';\n\t\t\t\treturn function(node){\n\t\t\t\t\treturn node.className.indexOf(className) > -1 && (' ' + node.className + ' ').indexOf(classNameSpaced) > -1;\n\t\t\t\t};\n\t\t\t},\n\t\t\t\"#\": function(id){\n\t\t\t\treturn function(node){\n\t\t\t\t\treturn node.id == id;\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tvar attrComparators = {\n\t\t\t\"^=\": function(attrValue, value){\n\t\t\t\treturn attrValue.indexOf(value) == 0;\n\t\t\t},\n\t\t\t\"*=\": function(attrValue, value){\n\t\t\t\treturn attrValue.indexOf(value) > -1;\n\t\t\t},\n\t\t\t\"$=\": function(attrValue, value){\n\t\t\t\treturn attrValue.substring(attrValue.length - value.length, attrValue.length) == value;\n\t\t\t},\n\t\t\t\"~=\": function(attrValue, value){\n\t\t\t\treturn (' ' + attrValue + ' ').indexOf(' ' + value + ' ') > -1;\n\t\t\t},\n\t\t\t\"|=\": function(attrValue, value){\n\t\t\t\treturn (attrValue + '-').indexOf(value + '-') == 0;\n\t\t\t},\n\t\t\t\"=\": function(attrValue, value){\n\t\t\t\treturn attrValue == value;\n\t\t\t},\n\t\t\t\"\": function(attrValue, value){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t\tfunction attr(name, value, type){\n\t\t\tvar firstChar = value.charAt(0);\n\t\t\tif(firstChar == '\"' || firstChar == \"'\"){\n\t\t\t\t// it is quoted, remove the quotes\n\t\t\t\tvalue = value.slice(1, -1);\n\t\t\t}\n\t\t\tvalue = value.replace(/\\\\/g,'');\n\t\t\tvar comparator = attrComparators[type || \"\"];\n\t\t\treturn function(node){\n\t\t\t\tvar attrValue = node.getAttribute(name);\n\t\t\t\treturn attrValue && comparator(attrValue, value);\n\t\t\t};\n\t\t}\n\t\tfunction ancestor(matcher){\n\t\t\treturn function(node, root){\n\t\t\t\twhile((node = node.parentNode) != root){\n\t\t\t\t\tif(matcher(node, root)){\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tfunction parent(matcher){\n\t\t\treturn function(node, root){\n\t\t\t\tnode = node.parentNode;\n\t\t\t\treturn matcher ? \n\t\t\t\t\tnode != root && matcher(node, root)\n\t\t\t\t\t: node == root;\n\t\t\t};\n\t\t}\n\t\tvar cache = {};\n\t\tfunction and(matcher, next){\n\t\t\treturn matcher ?\n\t\t\t\tfunction(node, root){\n\t\t\t\t\treturn next(node) && matcher(node, root);\n\t\t\t\t}\n\t\t\t\t: next;\n\t\t}\n\t\treturn function(node, selector, root){\n\t\t\t// this returns true or false based on if the node matches the selector (optionally within the given root)\n\t\t\tvar matcher = cache[selector]; // check to see if we have created a matcher function for the given selector\n\t\t\tif(!matcher){\n\t\t\t\t// create a matcher function for the given selector\n\t\t\t\t// parse the selectors\n\t\t\t\tif(selector.replace(/(?:\\s*([> ])\\s*)|(#|\\.)?((?:\\\\.|[\\w-])+)|\\[\\s*([\\w-]+)\\s*(.?=)?\\s*(\"(?:\\\\.|[^\"])+\"|'(?:\\\\.|[^'])+'|(?:\\\\.|[^\\]])*)\\s*\\]/g, function(t, combinator, type, value, attrName, attrType, attrValue){\n\t\t\t\t\tif(value){\n\t\t\t\t\t\tmatcher = and(matcher, selectorTypes[type || \"\"](value.replace(/\\\\/g, '')));\n\t\t\t\t\t}\n\t\t\t\t\telse if(combinator){\n\t\t\t\t\t\tmatcher = (combinator == \" \" ? ancestor : parent)(matcher);\n\t\t\t\t\t}\n\t\t\t\t\telse if(attrName){\n\t\t\t\t\t\tmatcher = and(matcher, attr(attrName, attrValue, attrType));\n\t\t\t\t\t}\n\t\t\t\t\treturn \"\";\n\t\t\t\t})){\n\t\t\t\t\tthrow new Error(\"Syntax error in query\");\n\t\t\t\t}\n\t\t\t\tif(!matcher){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcache[selector] = matcher;\n\t\t\t}\n\t\t\t// now run the matcher function on the node\n\t\t\treturn matcher(node, root);\n\t\t};\n\t})();\n}\nif(!has(\"dom-qsa\")){\n\tvar combine = function(selector, root){\n\t\t// combined queries\n\t\tvar selectors = selector.match(unionSplit);\n\t\tvar indexed = [];\n\t\t// add all results and keep unique ones, this only runs in IE, so we take advantage \n\t\t// of known IE features, particularly sourceIndex which is unique and allows us to \n\t\t// order the results \n\t\tfor(var i = 0; i < selectors.length; i++){\n\t\t\tselector = new String(selectors[i].replace(/\\s*$/,''));\n\t\t\tselector.indexOf = escape; // keep it from recursively entering combine\n\t\t\tvar results = liteEngine(selector, root);\n\t\t\tfor(var j = 0, l = results.length; j < l; j++){\n\t\t\t\tvar node = results[j];\n\t\t\t\tindexed[node.sourceIndex] = node;\n\t\t\t}\n\t\t}\n\t\t// now convert from a sparse array to a dense array\n\t\tvar totalResults = [];\n\t\tfor(i in indexed){\n\t\t\ttotalResults.push(indexed[i]);\n\t\t}\n\t\treturn totalResults;\n\t};\n}\n\nliteEngine.match = matchesSelector ? function(node, selector, root){\n\tif(root && root.nodeType != 9){\n\t\t// doesn't support three args, use rooted id trick\n\t\treturn useRoot(root, selector, function(query){\n\t\t\treturn matchesSelector.call(node, query);\n\t\t});\n\t}\n\t// we have a native matchesSelector, use that\n\treturn matchesSelector.call(node, selector);\n} : jsMatchesSelector; // otherwise use the JS matches impl\n\nreturn liteEngine;\n});\n","define([\"./has\"], function(has){\n\t// module:\n\t//\t\tdojo/sniff\n\n\t/*=====\n\treturn function(){\n\t\t// summary:\n\t\t//\t\tThis module sets has() flags based on the current browser.\n\t\t//\t\tIt returns the has() function.\n\t};\n\t=====*/\n\n\tif(has(\"host-browser\")){\n\t\tvar n = navigator,\n\t\t\tdua = n.userAgent,\n\t\t\tdav = n.appVersion,\n\t\t\ttv = parseFloat(dav);\n\t\thas.add(\"air\", dua.indexOf(\"AdobeAIR\") >= 0);\n\t\thas.add(\"wp\", parseFloat(dua.split(\"Windows Phone\")[1]) || undefined);\n\t\thas.add(\"msapp\", parseFloat(dua.split(\"MSAppHost/\")[1]) || undefined);\n\t\thas.add(\"khtml\", dav.indexOf(\"Konqueror\") >= 0 ? tv : undefined);\n\t\thas.add(\"edge\", parseFloat(dua.split(\"Edge/\")[1]) || undefined);\n\t\thas.add(\"opr\", parseFloat(dua.split(\"OPR/\")[1]) || undefined);\n\t\t// NOTE: https://dev.opera.com/blog/opera-user-agent-strings-opera-15-and-beyond/\n\t\thas.add(\"webkit\", !has(\"wp\") // NOTE: necessary since Windows Phone 8.1 Update 1, see #18540\n\t\t\t&& !has(\"edge\") && parseFloat(dua.split(\"WebKit/\")[1]) || undefined);\n\t\thas.add(\"chrome\", !has(\"edge\") && !has(\"opr\")\n\t\t\t\t&& parseFloat(dua.split(\"Chrome/\")[1]) || undefined);\n\t\thas.add(\"android\", !has(\"wp\") // NOTE: necessary since Windows Phone 8.1 Update 1, see #18528\n\t\t\t\t&& parseFloat(dua.split(\"Android \")[1]) || undefined);\n\t\thas.add(\"safari\", dav.indexOf(\"Safari\") >= 0\n\t\t\t\t&& !has(\"wp\") // NOTE: necessary since Windows Phone 8.1 Update 1, see #18540\n\t\t\t\t&& !has(\"chrome\") && !has(\"android\") && !has(\"edge\") && !has(\"opr\") ?\n\t\t\tparseFloat(dav.split(\"Version/\")[1]) : undefined);\n\t\thas.add(\"mac\", dav.indexOf(\"Macintosh\") >= 0);\n\t\thas.add(\"quirks\", document.compatMode == \"BackCompat\");\n\t\tif(!has(\"wp\") // NOTE: necessary since Windows Phone 8.1 Update 1, see #18528\n\t\t\t\t&& dua.match(/(iPhone|iPod|iPad)/)){\n\t\t\tvar p = RegExp.$1.replace(/P/, \"p\");\n\t\t\tvar v = dua.match(/OS ([\\d_]+)/) ? RegExp.$1 : \"1\";\n\t\t\tvar os = parseFloat(v.replace(/_/, \".\").replace(/_/g, \"\"));\n\t\t\thas.add(p, os);\t\t// \"iphone\", \"ipad\" or \"ipod\"\n\t\t\thas.add(\"ios\", os);\n\t\t}\n\t\thas.add(\"bb\", (dua.indexOf(\"BlackBerry\") >= 0 || dua.indexOf(\"BB10\") >= 0) && parseFloat(dua.split(\"Version/\")[1]) || undefined);\n\t\thas.add(\"trident\", parseFloat(dav.split(\"Trident/\")[1]) || undefined);\n\n\t\thas.add(\"svg\", typeof SVGAngle !== \"undefined\");\n\n\t\tif(!has(\"webkit\")){\n\t\t\t// Opera\n\t\t\tif(dua.indexOf(\"Opera\") >= 0){\n\t\t\t\t// see http://dev.opera.com/articles/view/opera-ua-string-changes and http://www.useragentstring.com/pages/Opera/\n\t\t\t\t// 9.8 has both styles; <9.8, 9.9 only old style\n\t\t\t\thas.add(\"opera\", tv >= 9.8 ? parseFloat(dua.split(\"Version/\")[1]) || tv : tv);\n\t\t\t}\n\n\t\t\t// Mozilla and firefox\n\t\t\tif(dua.indexOf(\"Gecko\") >= 0 && !has(\"wp\") // NOTE: necessary since Windows Phone 8.1 Update 1\n\t\t\t\t\t&& !has(\"khtml\") && !has(\"trident\") && !has(\"edge\")){\n\t\t\t\thas.add(\"mozilla\", tv);\n\t\t\t}\n\t\t\tif(has(\"mozilla\")){\n\t\t\t\t//We really need to get away from this. Consider a sane isGecko approach for the future.\n\t\t\t\thas.add(\"ff\", parseFloat(dua.split(\"Firefox/\")[1] || dua.split(\"Minefield/\")[1]) || undefined);\n\t\t\t}\n\n\t\t\t// IE\n\t\t\tif(document.all && !has(\"opera\")){\n\t\t\t\tvar isIE = parseFloat(dav.split(\"MSIE \")[1]) || undefined;\n\n\t\t\t\t//In cases where the page has an HTTP header or META tag with\n\t\t\t\t//X-UA-Compatible, then it is in emulation mode.\n\t\t\t\t//Make sure isIE reflects the desired version.\n\t\t\t\t//document.documentMode of 5 means quirks mode.\n\t\t\t\t//Only switch the value if documentMode's major version\n\t\t\t\t//is different from isIE's major version.\n\t\t\t\tvar mode = document.documentMode;\n\t\t\t\tif(mode && mode != 5 && Math.floor(isIE) != mode){\n\t\t\t\t\tisIE = mode;\n\t\t\t\t}\n\n\t\t\t\thas.add(\"ie\", isIE);\n\t\t\t}\n\n\t\t\t// Wii\n\t\t\thas.add(\"wii\", typeof opera != \"undefined\" && opera.wiiremote);\n\t\t}\n\t}\n\n\treturn has;\n});\n","define([\n\t\"./_base/kernel\",\t// kernel.global\n\t\"./_base/lang\"\n], function(kernel, lang){\n\n// module:\n//\t\tdojo/string\nvar ESCAPE_REGEXP = /[&<>'\"\\/]/g;\nvar ESCAPE_MAP = {\n\t'&': '&amp;',\n\t'<': '&lt;',\n\t'>': '&gt;',\n\t'\"': '&quot;',\n\t\"'\": '&#x27;',\n\t'/': '&#x2F;'\n};\nvar string = {\n\t// summary:\n\t//\t\tString utilities for Dojo\n};\nlang.setObject(\"dojo.string\", string);\n\nstring.escape = function(/*String*/str){\n\t// summary:\n\t//\t\tEfficiently escape a string for insertion into HTML (innerHTML or attributes), replacing &, <, >, \", ', and / characters.\n\t// str:\n\t//\t\tthe string to escape\n\tif(!str){ return \"\"; }\n\treturn str.replace(ESCAPE_REGEXP, function(c) {\n\t\treturn ESCAPE_MAP[c];\n\t});\n};\n\n// Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt#Polyfill\nstring.codePointAt = String.prototype.codePointAt ?\n\tfunction (str, position) {\n\t\treturn String.prototype.codePointAt.call(str, position);\n\t} :\n\tfunction(str, position) {\n\t\tif (str == null) {\n\t\t\tthrow new TypeError('codePointAt called on null or undefined');\n\t\t}\n\n\t\tvar size;\n\t\tvar first;\n\t\tvar second;\n\t\tvar index;\n\n\t\tstr = String(str);\n\t\tsize = str.length;\n\t\t// `ToInteger`\n\t\tindex = position ? Number(position) : 0;\n\n\t\tif (index != index) { // better `isNaN`\n\t\t\tindex = 0;\n\t\t}\n\n\t\t// Account for out-of-bounds indices:\n\t\tif (index < 0 || index >= size) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Get the first code unit\n\t\tfirst = str.charCodeAt(index);\n\n\t\t// check if it's the start of a surrogate pair\n\t\tif (first >= 0xD800 && first <= 0xDBFF && // high surrogate\n\t\t\tsize > index + 1 // there is a next code unit\n\t\t) {\n\t\t\tsecond = str.charCodeAt(index + 1);\n\t\t\tif (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate\n\t\t\t\t// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\t\t\t\treturn (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n\t\t\t}\n\t\t}\n\n\t\treturn first;\n\t};\n\n// Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint#Polyfill\nstring.fromCodePoint = String.fromCodePoint || function () {\n\tvar codeUnits = [];\n\tvar codeLen = 0;\n\tvar result = \"\";\n\tvar codePoint;\n\tvar index;\n\n\tfor (index = 0, len = arguments.length; index !== len; ++index) {\n\t\tcodePoint = +arguments[index];\n\t\t// correctly handles all cases including `NaN`, `-Infinity`, `+Infinity`\n\t\t// The surrounding `!(...)` is required to correctly handle `NaN` cases\n\t\t// The (codePoint>>>0) === codePoint clause handles decimals and negatives\n\t\tif (!(codePoint < 0x10FFFF && (codePoint>>>0) === codePoint)) {\n\t\t\tthrow RangeError(\"Invalid code point: \" + codePoint);\n\t\t}\n\n\t\tif (codePoint <= 0xFFFF) { // BMP code point\n\t\t\tcodeLen = codeUnits.push(codePoint);\n\t\t} else { // Astral code point; split in surrogate halves\n\t\t\t// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\t\t\tcodePoint -= 0x10000;\n\t\t\tcodeLen = codeUnits.push(\n\t\t\t\t(codePoint >> 10) + 0xD800, // highSurrogate\n\t\t\t\t(codePoint % 0x400) + 0xDC00 // lowSurrogate\n\t\t\t);\n\t\t}\n\n\t\tif (codeLen >= 0x3fff) {\n\t\t\tresult += String.fromCharCode.apply(null, codeUnits);\n\t\t\tcodeUnits.length = 0;\n\t\t}\n\t}\n\n\treturn result + String.fromCharCode.apply(null, codeUnits);\n};\n\nstring.rep = function(/*String*/str, /*Integer*/num){\n\t// summary:\n\t//\t\tEfficiently replicate a string `n` times.\n\t// str:\n\t//\t\tthe string to replicate\n\t// num:\n\t//\t\tnumber of times to replicate the string\n\n\tif(num <= 0 || !str){ return \"\"; }\n\n\tvar buf = [];\n\tfor(;;){\n\t\tif(num & 1){\n\t\t\tbuf.push(str);\n\t\t}\n\t\tif(!(num >>= 1)){ break; }\n\t\tstr += str;\n\t}\n\treturn buf.join(\"\");\t// String\n};\n\nstring.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){\n\t// summary:\n\t//\t\tPad a string to guarantee that it is at least `size` length by\n\t//\t\tfilling with the character `ch` at either the start or end of the\n\t//\t\tstring. Pads at the start, by default.\n\t// text:\n\t//\t\tthe string to pad\n\t// size:\n\t//\t\tlength to provide padding\n\t// ch:\n\t//\t\tcharacter to pad, defaults to '0'\n\t// end:\n\t//\t\tadds padding at the end if true, otherwise pads at start\n\t// example:\n\t//\t|\t// Fill the string to length 10 with \"+\" characters on the right. Yields \"Dojo++++++\".\n\t//\t|\tstring.pad(\"Dojo\", 10, \"+\", true);\n\n\tif(!ch){\n\t\tch = '0';\n\t}\n\tvar out = String(text),\n\t\tpad = string.rep(ch, Math.ceil((size - out.length) / ch.length));\n\treturn end ? out + pad : pad + out;\t// String\n};\n\nstring.substitute = function(\t/*String*/\t\ttemplate,\n\t\t\t\t\t\t\t\t\t/*Object|Array*/map,\n\t\t\t\t\t\t\t\t\t/*Function?*/\ttransform,\n\t\t\t\t\t\t\t\t\t/*Object?*/\t\tthisObject){\n\t// summary:\n\t//\t\tPerforms parameterized substitutions on a string. Throws an\n\t//\t\texception if any parameter is unmatched.\n\t// template:\n\t//\t\ta string with expressions in the form `${key}` to be replaced or\n\t//\t\t`${key:format}` which specifies a format function. keys are case-sensitive.\n\t//\t\tThe special sequence `${}` can be used escape `$`.\n\t// map:\n\t//\t\thash to search for substitutions\n\t// transform:\n\t//\t\ta function to process all parameters before substitution takes\n\t//\t\tplace, e.g. mylib.encodeXML\n\t// thisObject:\n\t//\t\twhere to look for optional format function; default to the global\n\t//\t\tnamespace\n\t// example:\n\t//\t\tSubstitutes two expressions in a string from an Array or Object\n\t//\t|\t// returns \"File 'foo.html' is not found in directory '/temp'.\"\n\t//\t|\t// by providing substitution data in an Array\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"File '${0}' is not found in directory '${1}'.\",\n\t//\t|\t\t[\"foo.html\",\"/temp\"]\n\t//\t|\t);\n\t//\t|\n\t//\t|\t// also returns \"File 'foo.html' is not found in directory '/temp'.\"\n\t//\t|\t// but provides substitution data in an Object structure. Dotted\n\t//\t|\t// notation may be used to traverse the structure.\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"File '${name}' is not found in directory '${info.dir}'.\",\n\t//\t|\t\t{ name: \"foo.html\", info: { dir: \"/temp\" } }\n\t//\t|\t);\n\t// example:\n\t//\t\tUse a transform function to modify the values:\n\t//\t|\t// returns \"file 'foo.html' is not found in directory '/temp'.\"\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"${0} is not found in ${1}.\",\n\t//\t|\t\t[\"foo.html\",\"/temp\"],\n\t//\t|\t\tfunction(str){\n\t//\t|\t\t\t// try to figure out the type\n\t//\t|\t\t\tvar prefix = (str.charAt(0) == \"/\") ? \"directory\": \"file\";\n\t//\t|\t\t\treturn prefix + \" '\" + str + \"'\";\n\t//\t|\t\t}\n\t//\t|\t);\n\t// example:\n\t//\t\tUse a formatter\n\t//\t|\t// returns \"thinger -- howdy\"\n\t//\t|\tstring.substitute(\n\t//\t|\t\t\"${0:postfix}\", [\"thinger\"], null, {\n\t//\t|\t\t\tpostfix: function(value, key){\n\t//\t|\t\t\t\treturn value + \" -- howdy\";\n\t//\t|\t\t\t}\n\t//\t|\t\t}\n\t//\t|\t);\n\n\tthisObject = thisObject || kernel.global;\n\ttransform = transform ?\n\t\tlang.hitch(thisObject, transform) : function(v){ return v; };\n\n\treturn template.replace(/\\$\\{([^\\s\\:\\}]*)(?:\\:([^\\s\\:\\}]+))?\\}/g,\n\t\tfunction(match, key, format){\n\t\t\tif (key == ''){\n\t\t\t\treturn '$';\n\t\t\t}\n\t\t\tvar value = lang.getObject(key, false, map);\n\t\t\tif(format){\n\t\t\t\tvalue = lang.getObject(format, false, thisObject).call(thisObject, value, key);\n\t\t\t}\n\t\t\tvar result = transform(value, key);\n\n\t\t\tif (typeof result === 'undefined') {\n\t\t\t\tthrow new Error('string.substitute could not find key \"' + key + '\" in template');\n\t\t\t}\n\n\t\t\treturn result.toString();\n\t\t}); // String\n};\n\nstring.trim = String.prototype.trim ?\n\tlang.trim : // aliasing to the native function\n\tfunction(str){\n\t\tstr = str.replace(/^\\s+/, '');\n\t\tfor(var i = str.length - 1; i >= 0; i--){\n\t\t\tif(/\\S/.test(str.charAt(i))){\n\t\t\t\tstr = str.substring(0, i + 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn str;\n\t};\n\n/*=====\n string.trim = function(str){\n\t // summary:\n\t //\t\tTrims whitespace from both sides of the string\n\t // str: String\n\t //\t\tString to be trimmed\n\t // returns: String\n\t //\t\tReturns the trimmed string\n\t // description:\n\t //\t\tThis version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).\n\t //\t\tThe short yet performant version of this function is dojo/_base/lang.trim(),\n\t //\t\twhich is part of Dojo base. Uses String.prototype.trim instead, if available.\n\t return \"\";\t// String\n };\n =====*/\n\n\treturn string;\n});\n","define([\"./_base/kernel\", \"require\", \"./has\", \"./has!host-browser?./request\"], function(dojo, require, has, request){\n\t// module:\n\t//\t\tdojo/text\n\n\tvar getText;\n\tif(has(\"host-browser\")){\n\t\tgetText= function(url, sync, load){\n\t\t\trequest(url, {sync:!!sync, headers: { 'X-Requested-With': null } }).then(load);\n\t\t};\n\t}else{\n\t\t// Path for node.js and rhino, to load from local file system.\n\t\t// TODO: use node.js native methods rather than depending on a require.getText() method to exist.\n\t\tif(require.getText){\n\t\t\tgetText= require.getText;\n\t\t}else{\n\t\t\tconsole.error(\"dojo/text plugin failed to load because loader does not support getText\");\n\t\t}\n\t}\n\n\tvar\n\t\ttheCache = {},\n\n\t\tstrip= function(text){\n\t\t\t//Strips <?xml ...?> declarations so that external SVG and XML\n\t\t\t//documents can be added to a document without worry. Also, if the string\n\t\t\t//is an HTML document, only the part inside the body tag is returned.\n\t\t\tif(text){\n\t\t\t\ttext= text.replace(/^\\s*<\\?xml(\\s)+version=[\\'\\\"](\\d)*.(\\d)*[\\'\\\"](\\s)*\\?>/im, \"\");\n\t\t\t\tvar matches= text.match(/<body[^>]*>\\s*([\\s\\S]+)\\s*<\\/body>/im);\n\t\t\t\tif(matches){\n\t\t\t\t\ttext= matches[1];\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\ttext = \"\";\n\t\t\t}\n\t\t\treturn text;\n\t\t},\n\n\t\tnotFound = {},\n\n\t\tpending = {};\n\n\tdojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){\n\t\t// summary:\n\t\t//\t\tA getter and setter for storing the string content associated with the\n\t\t//\t\tmodule and url arguments.\n\t\t// description:\n\t\t//\t\tIf module is a string that contains slashes, then it is interpretted as a fully\n\t\t//\t\tresolved path (typically a result returned by require.toUrl), and url should not be\n\t\t//\t\tprovided. This is the preferred signature. If module is a string that does not\n\t\t//\t\tcontain slashes, then url must also be provided and module and url are used to\n\t\t//\t\tcall `dojo.moduleUrl()` to generate a module URL. This signature is deprecated.\n\t\t//\t\tIf value is specified, the cache value for the moduleUrl will be set to\n\t\t//\t\tthat value. Otherwise, dojo.cache will fetch the moduleUrl and store it\n\t\t//\t\tin its internal cache and return that cached value for the URL. To clear\n\t\t//\t\ta cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the\n\t\t//\t\tthe URL contents, only modules on the same domain of the page can use this capability.\n\t\t//\t\tThe build system can inline the cache values though, to allow for xdomain hosting.\n\t\t// module: String||Object\n\t\t//\t\tIf a String with slashes, a fully resolved path; if a String without slashes, the\n\t\t//\t\tmodule name to use for the base part of the URL, similar to module argument\n\t\t//\t\tto `dojo.moduleUrl`. If an Object, something that has a .toString() method that\n\t\t//\t\tgenerates a valid path for the cache item. For example, a dojo._Url object.\n\t\t// url: String\n\t\t//\t\tThe rest of the path to append to the path derived from the module argument. If\n\t\t//\t\tmodule is an object, then this second argument should be the \"value\" argument instead.\n\t\t// value: String||Object?\n\t\t//\t\tIf a String, the value to use in the cache for the module/url combination.\n\t\t//\t\tIf an Object, it can have two properties: value and sanitize. The value property\n\t\t//\t\tshould be the value to use in the cache, and sanitize can be set to true or false,\n\t\t//\t\tto indicate if XML declarations should be removed from the value and if the HTML\n\t\t//\t\tinside a body tag in the value should be extracted as the real value. The value argument\n\t\t//\t\tor the value property on the value argument are usually only used by the build system\n\t\t//\t\tas it inlines cache content.\n\t\t// example:\n\t\t//\t\tTo ask dojo.cache to fetch content and store it in the cache (the dojo[\"cache\"] style\n\t\t//\t\tof call is used to avoid an issue with the build system erroneously trying to intern\n\t\t//\t\tthis example. To get the build system to intern your dojo.cache calls, use the\n\t\t//\t\t\"dojo.cache\" style of call):\n\t\t//\t\t| //If template.html contains \"<h1>Hello</h1>\" that will be\n\t\t//\t\t| //the value for the text variable.\n\t\t//\t\t| //Note: This is pre-AMD, deprecated syntax\n\t\t//\t\t| var text = dojo[\"cache\"](\"my.module\", \"template.html\");\n\t\t// example:\n\t\t//\t\tTo ask dojo.cache to fetch content and store it in the cache, and sanitize the input\n\t\t//\t\t (the dojo[\"cache\"] style of call is used to avoid an issue with the build system\n\t\t//\t\terroneously trying to intern this example. To get the build system to intern your\n\t\t//\t\tdojo.cache calls, use the \"dojo.cache\" style of call):\n\t\t//\t\t| //If template.html contains \"<html><body><h1>Hello</h1></body></html>\", the\n\t\t//\t\t| //text variable will contain just \"<h1>Hello</h1>\".\n\t\t//\t\t| //Note: This is pre-AMD, deprecated syntax\n\t\t//\t\t| var text = dojo[\"cache\"](\"my.module\", \"template.html\", {sanitize: true});\n\t\t// example:\n\t\t//\t\tSame example as previous, but demonstrates how an object can be passed in as\n\t\t//\t\tthe first argument, then the value argument can then be the second argument.\n\t\t//\t\t| //If template.html contains \"<html><body><h1>Hello</h1></body></html>\", the\n\t\t//\t\t| //text variable will contain just \"<h1>Hello</h1>\".\n\t\t//\t\t| //Note: This is pre-AMD, deprecated syntax\n\t\t//\t\t| var text = dojo[\"cache\"](new dojo._Url(\"my/module/template.html\"), {sanitize: true});\n\n\t\t//\t * (string string [value]) => (module, url, value)\n\t\t//\t * (object [value]) => (module, value), url defaults to \"\"\n\t\t//\n\t\t//\t * if module is an object, then it must be convertable to a string\n\t\t//\t * (module, url) module + (url ? (\"/\" + url) : \"\") must be a legal argument to require.toUrl\n\t\t//\t * value may be a string or an object; if an object then may have the properties \"value\" and/or \"sanitize\"\n\t\tvar key;\n\t\tif(typeof module==\"string\"){\n\t\t\tif(/\\//.test(module)){\n\t\t\t\t// module is a version 1.7+ resolved path\n\t\t\t\tkey = module;\n\t\t\t\tvalue = url;\n\t\t\t}else{\n\t\t\t\t// module is a version 1.6- argument to dojo.moduleUrl\n\t\t\t\tkey = require.toUrl(module.replace(/\\./g, \"/\") + (url ? (\"/\" + url) : \"\"));\n\t\t\t}\n\t\t}else{\n\t\t\tkey = module + \"\";\n\t\t\tvalue = url;\n\t\t}\n\t\tvar\n\t\t\tval = (value != undefined && typeof value != \"string\") ? value.value : value,\n\t\t\tsanitize = value && value.sanitize;\n\n\t\tif(typeof val == \"string\"){\n\t\t\t//We have a string, set cache value\n\t\t\ttheCache[key] = val;\n\t\t\treturn sanitize ? strip(val) : val;\n\t\t}else if(val === null){\n\t\t\t//Remove cached value\n\t\t\tdelete theCache[key];\n\t\t\treturn null;\n\t\t}else{\n\t\t\t//Allow cache values to be empty strings. If key property does\n\t\t\t//not exist, fetch it.\n\t\t\tif(!(key in theCache)){\n\t\t\t\tgetText(key, true, function(text){\n\t\t\t\t\ttheCache[key]= text;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn sanitize ? strip(theCache[key]) : theCache[key];\n\t\t}\n\t};\n\n\treturn {\n\t\t// summary:\n\t\t//\t\tThis module implements the dojo/text! plugin and the dojo.cache API.\n\t\t// description:\n\t\t//\t\tWe choose to include our own plugin to leverage functionality already contained in dojo\n\t\t//\t\tand thereby reduce the size of the plugin compared to various foreign loader implementations.\n\t\t//\t\tAlso, this allows foreign AMD loaders to be used without their plugins.\n\t\t//\n\t\t//\t\tCAUTION: this module is designed to optionally function synchronously to support the dojo v1.x synchronous\n\t\t//\t\tloader. This feature is outside the scope of the CommonJS plugins specification.\n\n\t\t// the dojo/text caches it's own resources because of dojo.cache\n\t\tdynamic: true,\n\n\t\tnormalize: function(id, toAbsMid){\n\t\t\t// id is something like (path may be relative):\n\t\t\t//\n\t\t\t//\t \"path/to/text.html\"\n\t\t\t//\t \"path/to/text.html!strip\"\n\t\t\tvar parts= id.split(\"!\"),\n\t\t\t\turl= parts[0];\n\t\t\treturn (/^\\./.test(url) ? toAbsMid(url) : url) + (parts[1] ? \"!\" + parts[1] : \"\");\n\t\t},\n\n\t\tload: function(id, require, load){\n\t\t\t// id: String\n\t\t\t//\t\tPath to the resource.\n\t\t\t// require: Function\n\t\t\t//\t\tObject that include the function toUrl with given id returns a valid URL from which to load the text.\n\t\t\t// load: Function\n\t\t\t//\t\tCallback function which will be called, when the loading finished.\n\n\t\t\t// id is something like (path is always absolute):\n\t\t\t//\n\t\t\t//\t \"path/to/text.html\"\n\t\t\t//\t \"path/to/text.html!strip\"\n\t\t\tvar\n\t\t\t\tparts= id.split(\"!\"),\n\t\t\t\tstripFlag= parts.length>1,\n\t\t\t\tabsMid= parts[0],\n\t\t\t\turl = require.toUrl(parts[0]),\n\t\t\t\trequireCacheUrl = \"url:\" + url,\n\t\t\t\ttext = notFound,\n\t\t\t\tfinish = function(text){\n\t\t\t\t\tload(stripFlag ? strip(text) : text);\n\t\t\t\t};\n\t\t\tif(absMid in theCache){\n\t\t\t\ttext = theCache[absMid];\n\t\t\t}else if(require.cache && requireCacheUrl in require.cache){\n\t\t\t\ttext = require.cache[requireCacheUrl];\n\t\t\t}else if(url in theCache){\n\t\t\t\ttext = theCache[url];\n\t\t\t}\n\t\t\tif(text===notFound){\n\t\t\t\tif(pending[url]){\n\t\t\t\t\tpending[url].push(finish);\n\t\t\t\t}else{\n\t\t\t\t\tvar pendingList = pending[url] = [finish];\n\t\t\t\t\tgetText(url, !require.async, function(text){\n\t\t\t\t\t\ttheCache[absMid]= theCache[url]= text;\n\t\t\t\t\t\tfor(var i = 0; i<pendingList.length;){\n\t\t\t\t\t\t\tpendingList[i++](text);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdelete pending[url];\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tfinish(text);\n\t\t\t}\n\t\t}\n\t};\n\n});\n\n","define([\"./Evented\"], function(Evented){\n\n\t// module:\n\t//\t\tdojo/topic\n\n\tvar hub = new Evented;\n\treturn {\n\t\t// summary:\n\t\t//\t\tPubsub hub.\n\t\t// example:\n\t\t//\t\t| \ttopic.subscribe(\"some/topic\", function(event){\n\t\t//\t\t|\t... do something with event\n\t\t//\t\t|\t});\n\t\t//\t\t|\ttopic.publish(\"some/topic\", {name:\"some event\", ...});\n\n\t\tpublish: function(topic, event){\n\t\t\t// summary:\n\t\t\t//\t\tPublishes a message to a topic on the pub/sub hub. All arguments after\n\t\t\t//\t\tthe first will be passed to the subscribers, so any number of arguments\n\t\t\t//\t\tcan be provided (not just event).\n\t\t\t// topic: String\n\t\t\t//\t\tThe name of the topic to publish to\n\t\t\t// event: Object\n\t\t\t//\t\tAn event to distribute to the topic listeners\n\t\t\treturn hub.emit.apply(hub, arguments);\n\t\t},\n\n\t\tsubscribe: function(topic, listener){\n\t\t\t// summary:\n\t\t\t//\t\tSubscribes to a topic on the pub/sub hub\n\t\t\t// topic: String\n\t\t\t//\t\tThe topic to subscribe to\n\t\t\t// listener: Function\n\t\t\t//\t\tA function to call when a message is published to the given topic\n\t\t\treturn hub.on.apply(hub, arguments);\n\t\t}\n\t};\n});\n","define([\"./_base/kernel\", \"./aspect\", \"./dom\", \"./dom-class\", \"./_base/lang\", \"./on\", \"./has\", \"./mouse\", \"./domReady\", \"./_base/window\"],\nfunction(dojo, aspect, dom, domClass, lang, on, has, mouse, domReady, win){\n\n\t// module:\n\t//\t\tdojo/touch\n\n\tvar ios4 = has(\"ios\") < 5;\n\n\t// Detect if platform supports Pointer Events, and if so, the names of the events (pointerdown vs. MSPointerDown).\n\tvar hasPointer = has(\"pointer-events\") || has(\"MSPointer\"),\n\t\tpointer = (function () {\n\t\t\tvar pointer = {};\n\t\t\tfor (var type in { down: 1, move: 1, up: 1, cancel: 1, over: 1, out: 1 }) {\n\t\t\t\tpointer[type] = has(\"MSPointer\") ?\n\t\t\t\t\t\"MSPointer\" + type.charAt(0).toUpperCase() + type.slice(1) :\n\t\t\t\t\t\"pointer\" + type;\n\t\t\t}\n\t\t\treturn pointer;\n\t\t})();\n\n\t// Detect if platform supports the webkit touchstart/touchend/... events\n\tvar hasTouch = has(\"touch-events\");\n\n\t// Click generation variables\n\tvar clicksInited, clickTracker, useTarget = false, clickTarget, clickX, clickY, clickDx, clickDy, clickTime;\n\n\t// Time of most recent touchstart, touchmove, or touchend event\n\tvar lastTouch;\n\n\tfunction dualEvent(mouseType, touchType, pointerType){\n\t\t// Returns synthetic event that listens for both the specified mouse event and specified touch event.\n\t\t// But ignore fake mouse events that were generated due to the user touching the screen.\n\t\tif(hasPointer && pointerType){\n\t\t\t// IE10+: MSPointer* events are designed to handle both mouse and touch in a uniform way,\n\t\t\t// so just use that regardless of hasTouch.\n\t\t\treturn function(node, listener){\n\t\t\t\treturn on(node, pointerType, listener);\n\t\t\t};\n\t\t}else if(hasTouch){\n\t\t\treturn function(node, listener){\n\t\t\t\tvar handle1 = on(node, touchType, function(evt){\n\t\t\t\t\t\tlistener.call(this, evt);\n\n\t\t\t\t\t\t// On slow mobile browsers (see https://bugs.dojotoolkit.org/ticket/17634),\n\t\t\t\t\t\t// a handler for a touch event may take >1s to run. That time shouldn't\n\t\t\t\t\t\t// be included in the calculation for lastTouch.\n\t\t\t\t\t\tlastTouch = (new Date()).getTime();\n\t\t\t\t\t}),\n\t\t\t\t\thandle2 = on(node, mouseType, function(evt){\n\t\t\t\t\t\tif(!lastTouch || (new Date()).getTime() > lastTouch + 1000){\n\t\t\t\t\t\t\tlistener.call(this, evt);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tremove: function(){\n\t\t\t\t\t\thandle1.remove();\n\t\t\t\t\t\thandle2.remove();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\t\t}else{\n\t\t\t// Avoid creating listeners for touch events on performance sensitive older browsers like IE6\n\t\t\treturn function(node, listener){\n\t\t\t\treturn on(node, mouseType, listener);\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction marked(/*DOMNode*/ node){\n\t\t// Search for node ancestor has been marked with the dojoClick property to indicate special processing.\n\t\t// Returns marked ancestor.\n\t\tdo{\n\t\t\tif(node.dojoClick !== undefined){ return node; }\n\t\t}while(node = node.parentNode);\n\t}\n\n\tfunction doClicks(e, moveType, endType){\n\t\t// summary:\n\t\t//\t\tSetup touch listeners to generate synthetic clicks immediately (rather than waiting for the browser\n\t\t//\t\tto generate clicks after the double-tap delay) and consistently (regardless of whether event.preventDefault()\n\t\t//\t\twas called in an event listener. Synthetic clicks are generated only if a node or one of its ancestors has\n\t\t//\t\tits dojoClick property set to truthy. If a node receives synthetic clicks because one of its ancestors has its\n\t\t// dojoClick property set to truthy, you can disable synthetic clicks on this node by setting its own dojoClick property\n\t\t// to falsy.\n\n\t\tif(mouse.isRight(e)){\n\t\t\treturn;\t\t// avoid spurious dojoclick event on IE10+; right click is just for context menu\n\t\t}\n\n\t\tvar markedNode = marked(e.target);\n\t\tclickTracker = !e.target.disabled && markedNode && markedNode.dojoClick; // click threshold = true, number, x/y object, or \"useTarget\"\n\t\tif(clickTracker){\n\t\t\tuseTarget = (clickTracker == \"useTarget\");\n\t\t\tclickTarget = (useTarget?markedNode:e.target);\n\t\t\tif(useTarget){\n\t\t\t\t// We expect a click, so prevent any other\n\t\t\t\t// default action on \"touchpress\"\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\tclickX = e.changedTouches ? e.changedTouches[0].pageX - win.global.pageXOffset : e.clientX;\n\t\t\tclickY = e.changedTouches ? e.changedTouches[0].pageY - win.global.pageYOffset : e.clientY;\n\t\t\tclickDx = (typeof clickTracker == \"object\" ? clickTracker.x : (typeof clickTracker == \"number\" ? clickTracker : 0)) || 4;\n\t\t\tclickDy = (typeof clickTracker == \"object\" ? clickTracker.y : (typeof clickTracker == \"number\" ? clickTracker : 0)) || 4;\n\n\t\t\t// add move/end handlers only the first time a node with dojoClick is seen,\n\t\t\t// so we don't add too much overhead when dojoClick is never set.\n\t\t\tif(!clicksInited){\n\t\t\t\tclicksInited = true;\n\n\t\t\t\tvar updateClickTracker = function updateClickTracker(e){\n\t\t\t\t\tif(useTarget){\n\t\t\t\t\t\tclickTracker = dom.isDescendant(\n\t\t\t\t\t\t\twin.doc.elementFromPoint(\n\t\t\t\t\t\t\t\t(e.changedTouches ? e.changedTouches[0].pageX - win.global.pageXOffset : e.clientX),\n\t\t\t\t\t\t\t\t(e.changedTouches ? e.changedTouches[0].pageY - win.global.pageYOffset : e.clientY)),\n\t\t\t\t\t\t\tclickTarget);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tclickTracker = clickTracker &&\n\t\t\t\t\t\t\t(e.changedTouches ? e.changedTouches[0].target : e.target) == clickTarget &&\n\t\t\t\t\t\t\tMath.abs((e.changedTouches ? e.changedTouches[0].pageX - win.global.pageXOffset : e.clientX) - clickX) <= clickDx &&\n\t\t\t\t\t\t\tMath.abs((e.changedTouches ? e.changedTouches[0].pageY - win.global.pageYOffset : e.clientY) - clickY) <= clickDy;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\twin.doc.addEventListener(moveType, function(e){\n\t\t\t\t\tif(mouse.isRight(e)){\n\t\t\t\t\t\treturn;\t\t// avoid spurious dojoclick event on IE10+; right click is just for context menu\n\t\t\t\t\t}\n\t\t\t\t\tupdateClickTracker(e);\n\t\t\t\t\tif(useTarget){\n\t\t\t\t\t\t// prevent native scroll event and ensure touchend is\n\t\t\t\t\t\t// fire after touch moves between press and release.\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\n\t\t\t\twin.doc.addEventListener(endType, function(e){\n\t\t\t\t\tif(mouse.isRight(e)){\n\t\t\t\t\t\treturn;\t\t// avoid spurious dojoclick event on IE10+; right click is just for context menu\n\t\t\t\t\t}\n\t\t\t\t\tupdateClickTracker(e);\n\t\t\t\t\tif(clickTracker){\n\t\t\t\t\t\tclickTime = (new Date()).getTime();\n\t\t\t\t\t\tvar target = (useTarget?clickTarget:e.target);\n\t\t\t\t\t\tif(target.tagName === \"LABEL\"){\n\t\t\t\t\t\t\t// when clicking on a label, forward click to its associated input if any\n\t\t\t\t\t\t\ttarget = dom.byId(target.getAttribute(\"for\")) || target;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//some attributes can be on the Touch object, not on the Event:\n\t\t\t\t\t\t//http://www.w3.org/TR/touch-events/#touch-interface\n\t\t\t\t\t\tvar src = (e.changedTouches) ? e.changedTouches[0] : e;\n\t\t\t\t\t\tvar createMouseEvent = function createMouseEvent(type){\n\t\t\t\t\t\t\t//create the synthetic event.\n\t\t\t\t\t\t\t//http://www.w3.org/TR/DOM-Level-3-Events/#widl-MouseEvent-initMouseEvent\n\t\t\t\t\t\t\tvar evt = document.createEvent(\"MouseEvents\");\n\t\t\t\t\t\t\tevt._dojo_click = true;\n\t\t\t\t\t\t\tevt.initMouseEvent(type,\n\t\t\t\t\t\t\t\ttrue, //bubbles\n\t\t\t\t\t\t\t\ttrue, //cancelable\n\t\t\t\t\t\t\t\te.view,\n\t\t\t\t\t\t\t\te.detail,\n\t\t\t\t\t\t\t\tsrc.screenX,\n\t\t\t\t\t\t\t\tsrc.screenY,\n\t\t\t\t\t\t\t\tsrc.clientX,\n\t\t\t\t\t\t\t\tsrc.clientY,\n\t\t\t\t\t\t\t\te.ctrlKey,\n\t\t\t\t\t\t\t\te.altKey,\n\t\t\t\t\t\t\t\te.shiftKey,\n\t\t\t\t\t\t\t\te.metaKey,\n\t\t\t\t\t\t\t\t0, //button\n\t\t\t\t\t\t\t\tnull //related target\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn evt;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tvar mouseDownEvt = createMouseEvent(\"mousedown\");\n\t\t\t\t\t\tvar mouseUpEvt = createMouseEvent(\"mouseup\");\n\t\t\t\t\t\tvar clickEvt = createMouseEvent(\"click\");\n\n\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\ton.emit(target, \"mousedown\", mouseDownEvt);\n\t\t\t\t\t\t\ton.emit(target, \"mouseup\", mouseUpEvt);\n\t\t\t\t\t\t\ton.emit(target, \"click\", clickEvt);\n\n\t\t\t\t\t\t\t// refresh clickTime in case app-defined click handler took a long time to run\n\t\t\t\t\t\t\tclickTime = (new Date()).getTime();\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\n\t\t\t\tvar stopNativeEvents = function stopNativeEvents(type){\n\t\t\t\t\twin.doc.addEventListener(type, function(e){\n\t\t\t\t\t\t// Stop native events when we emitted our own click event. Note that the native click may occur\n\t\t\t\t\t\t// on a different node than the synthetic click event was generated on. For example,\n\t\t\t\t\t\t// click on a menu item, causing the menu to disappear, and then (~300ms later) the browser\n\t\t\t\t\t\t// sends a click event to the node that was *underneath* the menu. So stop all native events\n\t\t\t\t\t\t// sent shortly after ours, similar to what is done in dualEvent.\n\t\t\t\t\t\t// The INPUT.dijitOffScreen test is for offscreen inputs used in dijit/form/Button, on which\n\t\t\t\t\t\t// we call click() explicitly, we don't want to stop this event.\n\t\t\t\t\t\tvar target = e.target;\n\t\t\t\t\t\tif(clickTracker && !e._dojo_click &&\n\t\t\t\t\t\t\t\t(new Date()).getTime() <= clickTime + 1000 &&\n\t\t\t\t\t\t\t\t!(target.tagName == \"INPUT\" && domClass.contains(target, \"dijitOffScreen\"))){\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\te.stopImmediatePropagation && e.stopImmediatePropagation();\n\t\t\t\t\t\t\tif(type == \"click\" &&\n\t\t\t\t\t\t\t\t(target.tagName != \"INPUT\" ||\n\t\t\t\t\t\t\t\t(target.type == \"radio\" &&\n\t\t\t\t\t\t\t\t\t// #18352 Do not preventDefault for radios that are not dijit or\n\t\t\t\t\t\t\t\t\t// dojox/mobile widgets.\n\t\t\t\t\t\t\t\t\t// (The CSS class dijitCheckBoxInput holds for both checkboxes and radio buttons.)\n\t\t\t\t\t\t\t\t\t(domClass.contains(target, \"dijitCheckBoxInput\") ||\n\t\t\t\t\t\t\t\t\t\tdomClass.contains(target, \"mblRadioButton\"))) ||\n\t\t\t\t\t\t\t\t(target.type == \"checkbox\" &&\n\t\t\t\t\t\t\t\t\t// #18352 Do not preventDefault for checkboxes that are not dijit or\n\t\t\t\t\t\t\t\t\t// dojox/mobile widgets.\n\t\t\t\t\t\t\t\t\t(domClass.contains(target, \"dijitCheckBoxInput\") ||\n\t\t\t\t\t\t\t\t\t\tdomClass.contains(target, \"mblCheckBox\")))) &&\n\t\t\t\t\t\t\t\ttarget.tagName != \"TEXTAREA\" && target.tagName != \"AUDIO\" && target.tagName != \"VIDEO\"){\n\t\t\t\t\t\t\t\t// preventDefault() breaks textual <input>s on android, keyboard doesn't popup,\n\t\t\t\t\t\t\t\t// but it is still needed for checkboxes and radio buttons, otherwise in some cases\n\t\t\t\t\t\t\t\t// the checked state becomes inconsistent with the widget's state\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, true);\n\t\t\t\t};\n\n\t\t\t\tstopNativeEvents(\"click\");\n\n\t\t\t\t// We also stop mousedown/up since these would be sent well after with our \"fast\" click (300ms),\n\t\t\t\t// which can confuse some dijit widgets.\n\t\t\t\tstopNativeEvents(\"mousedown\");\n\t\t\t\tstopNativeEvents(\"mouseup\");\n\t\t\t}\n\t\t}\n\t}\n\n\tvar hoveredNode;\n\n\tif(has(\"touch\")){\n\t\tif(hasPointer){\n\t\t\t// MSPointer (IE10+) already has support for over and out, so we just need to init click support\n\t\t\tdomReady(function(){\n\t\t\t\twin.doc.addEventListener(pointer.down, function(evt){\n\t\t\t\t\tdoClicks(evt, pointer.move, pointer.up);\n\t\t\t\t}, true);\n\t\t\t});\n\t\t}else{\n\t\t\tdomReady(function(){\n\t\t\t\t// Keep track of currently hovered node\n\t\t\t\thoveredNode = win.body();\t// currently hovered node\n\n\t\t\t\twin.doc.addEventListener(\"touchstart\", function(evt){\n\t\t\t\t\t\tlastTouch = (new Date()).getTime();\n\n\t\t\t\t\t// Precede touchstart event with touch.over event. DnD depends on this.\n\t\t\t\t\t// Use addEventListener(cb, true) to run cb before any touchstart handlers on node run,\n\t\t\t\t\t// and to ensure this code runs even if the listener on the node does event.stop().\n\t\t\t\t\tvar oldNode = hoveredNode;\n\t\t\t\t\thoveredNode = evt.target;\n\t\t\t\t\ton.emit(oldNode, \"dojotouchout\", {\n\t\t\t\t\t\trelatedTarget: hoveredNode,\n\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t});\n\t\t\t\t\ton.emit(hoveredNode, \"dojotouchover\", {\n\t\t\t\t\t\trelatedTarget: oldNode,\n\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t});\n\n\t\t\t\t\tdoClicks(evt, \"touchmove\", \"touchend\"); // init click generation\n\t\t\t\t}, true);\n\n\t\t\t\tfunction copyEventProps(evt){\n\t\t\t\t\t// Make copy of event object and also set bubbles:true. Used when calling on.emit().\n\t\t\t\t\tvar props = lang.delegate(evt, {\n\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t});\n\n\t\t\t\t\tif(has(\"ios\") >= 6){\n\t\t\t\t\t\t// On iOS6 \"touches\" became a non-enumerable property, which\n\t\t\t\t\t\t// is not hit by for...in. Ditto for the other properties below.\n\t\t\t\t\t\tprops.touches = evt.touches;\n\t\t\t\t\t\tprops.altKey = evt.altKey;\n\t\t\t\t\t\tprops.changedTouches = evt.changedTouches;\n\t\t\t\t\t\tprops.ctrlKey = evt.ctrlKey;\n\t\t\t\t\t\tprops.metaKey = evt.metaKey;\n\t\t\t\t\t\tprops.shiftKey = evt.shiftKey;\n\t\t\t\t\t\tprops.targetTouches = evt.targetTouches;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn props;\n\t\t\t\t}\n\n\t\t\t\ton(win.doc, \"touchmove\", function(evt){\n\t\t\t\t\tlastTouch = (new Date()).getTime();\n\n\t\t\t\t\tvar newNode = win.doc.elementFromPoint(\n\t\t\t\t\t\tevt.pageX - (ios4 ? 0 : win.global.pageXOffset), // iOS 4 expects page coords\n\t\t\t\t\t\tevt.pageY - (ios4 ? 0 : win.global.pageYOffset)\n\t\t\t\t\t);\n\n\t\t\t\t\tif(newNode){\n\t\t\t\t\t\t// Fire synthetic touchover and touchout events on nodes since the browser won't do it natively.\n\t\t\t\t\t\tif(hoveredNode !== newNode){\n\t\t\t\t\t\t\t// touch out on the old node\n\t\t\t\t\t\t\ton.emit(hoveredNode, \"dojotouchout\", {\n\t\t\t\t\t\t\t\trelatedTarget: newNode,\n\t\t\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// touchover on the new node\n\t\t\t\t\t\t\ton.emit(newNode, \"dojotouchover\", {\n\t\t\t\t\t\t\t\trelatedTarget: hoveredNode,\n\t\t\t\t\t\t\t\tbubbles: true\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\thoveredNode = newNode;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Unlike a listener on \"touchmove\", on(node, \"dojotouchmove\", listener) fires when the finger\n\t\t\t\t\t\t// drags over the specified node, regardless of which node the touch started on.\n\t\t\t\t\t\tif(!on.emit(newNode, \"dojotouchmove\", copyEventProps(evt))){\n\t\t\t\t\t\t\t// emit returns false when synthetic event \"dojotouchmove\" is cancelled, so we prevent the\n\t\t\t\t\t\t\t// default behavior of the underlying native event \"touchmove\".\n\t\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Fire a dojotouchend event on the node where the finger was before it was removed from the screen.\n\t\t\t\t// This is different than the native touchend, which fires on the node where the drag started.\n\t\t\t\ton(win.doc, \"touchend\", function(evt){\n\t\t\t\t\t\tlastTouch = (new Date()).getTime();\n\t\t\t\t\tvar node = win.doc.elementFromPoint(\n\t\t\t\t\t\tevt.pageX - (ios4 ? 0 : win.global.pageXOffset), // iOS 4 expects page coords\n\t\t\t\t\t\tevt.pageY - (ios4 ? 0 : win.global.pageYOffset)\n\t\t\t\t\t) || win.body(); // if out of the screen\n\n\t\t\t\t\ton.emit(node, \"dojotouchend\", copyEventProps(evt));\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t//device neutral events - touch.press|move|release|cancel/over/out\n\tvar touch = {\n\t\tpress: dualEvent(\"mousedown\", \"touchstart\", pointer.down),\n\t\tmove: dualEvent(\"mousemove\", \"dojotouchmove\", pointer.move),\n\t\trelease: dualEvent(\"mouseup\", \"dojotouchend\", pointer.up),\n\t\tcancel: dualEvent(mouse.leave, \"touchcancel\", hasPointer ? pointer.cancel : null),\n\t\tover: dualEvent(\"mouseover\", \"dojotouchover\", pointer.over),\n\t\tout: dualEvent(\"mouseout\", \"dojotouchout\", pointer.out),\n\t\tenter: mouse._eventHandler(dualEvent(\"mouseover\",\"dojotouchover\", pointer.over)),\n\t\tleave: mouse._eventHandler(dualEvent(\"mouseout\", \"dojotouchout\", pointer.out))\n\t};\n\n\t/*=====\n\ttouch = {\n\t\t// summary:\n\t\t//\t\tThis module provides unified touch event handlers by exporting\n\t\t//\t\tpress, move, release and cancel which can also run well on desktop.\n\t\t//\t\tBased on http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html\n\t\t// Also, if the dojoClick property is set to truthy on a DOM node, dojo/touch generates\n\t\t// click events immediately for this node and its descendants (except for descendants that\n\t\t// have a dojoClick property set to falsy), to avoid the delay before native browser click events,\n\t\t// and regardless of whether evt.preventDefault() was called in a touch.press event listener.\n\t\t//\n\t\t// example:\n\t\t//\t\tUsed with dojo/on\n\t\t//\t\t|\tdefine([\"dojo/on\", \"dojo/touch\"], function(on, touch){\n\t\t//\t\t|\t\ton(node, touch.press, function(e){});\n\t\t//\t\t|\t\ton(node, touch.move, function(e){});\n\t\t//\t\t|\t\ton(node, touch.release, function(e){});\n\t\t//\t\t|\t\ton(node, touch.cancel, function(e){});\n\t\t// example:\n\t\t//\t\tUsed with touch.* directly\n\t\t//\t\t|\ttouch.press(node, function(e){});\n\t\t//\t\t|\ttouch.move(node, function(e){});\n\t\t//\t\t|\ttouch.release(node, function(e){});\n\t\t//\t\t|\ttouch.cancel(node, function(e){});\n\t\t// example:\n\t\t//\t\tHave dojo/touch generate clicks without delay, with a default move threshold of 4 pixels\n\t\t//\t\t|\tnode.dojoClick = true;\n\t\t// example:\n\t\t//\t\tHave dojo/touch generate clicks without delay, with a move threshold of 10 pixels horizontally and vertically\n\t\t//\t\t|\tnode.dojoClick = 10;\n\t\t// example:\n\t\t//\t\tHave dojo/touch generate clicks without delay, with a move threshold of 50 pixels horizontally and 10 pixels vertically\n\t\t//\t\t|\tnode.dojoClick = {x:50, y:5};\n\t\t// example:\n\t\t//\t\tDisable clicks without delay generated by dojo/touch on a node that has an ancestor with property dojoClick set to truthy\n\t\t//\t\t| node.dojoClick = false;\n\n\t\tpress: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'touchstart'|'mousedown' for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tmove: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener that fires when the mouse cursor or a finger is dragged over the given node.\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\trelease: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to releasing the mouse button while the cursor is over the given node\n\t\t\t//\t\t(i.e. \"mouseup\") or for removing the finger from the screen while touching the given node.\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tcancel: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'touchcancel'|'mouseleave' for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tover: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'mouseover' or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tout: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to 'mouseout' or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tenter: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to mouse.enter or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t},\n\t\tleave: function(node, listener){\n\t\t\t// summary:\n\t\t\t//\t\tRegister a listener to mouse.leave or touch equivalent for the given node\n\t\t\t// node: Dom\n\t\t\t//\t\tTarget node to listen to\n\t\t\t// listener: Function\n\t\t\t//\t\tCallback function\n\t\t\t// returns:\n\t\t\t//\t\tA handle which will be used to remove the listener by handle.remove()\n\t\t}\n\t};\n\t=====*/\n\n\thas(\"extend-dojo\") && (dojo.touch = touch);\n\n\treturn touch;\n});\n","define([\"./dom-geometry\", \"./_base/lang\", \"./domReady\", \"./sniff\", \"./_base/window\"],\n\tfunction(geometry, lang, domReady, has, baseWindow){\n\n\t// module:\n\t//\t\tdojo/uacss\n\n\t/*=====\n\treturn {\n\t\t// summary:\n\t\t//\t\tApplies pre-set CSS classes to the top-level HTML node, based on:\n\t\t//\n\t\t//\t\t- browser (ex: dj_ie)\n\t\t//\t\t- browser version (ex: dj_ie6)\n\t\t//\t\t- box model (ex: dj_contentBox)\n\t\t//\t\t- text direction (ex: dijitRtl)\n\t\t//\n\t\t//\t\tIn addition, browser, browser version, and box model are\n\t\t//\t\tcombined with an RTL flag when browser text is RTL. ex: dj_ie-rtl.\n\t\t//\n\t\t//\t\tReturns the has() method.\n\t};\n\t=====*/\n\n\tvar\n\t\thtml = baseWindow.doc.documentElement,\n\t\tie = has(\"ie\"),\n\t\ttrident = has(\"trident\"),\n\t\topera = has(\"opera\"),\n\t\tmaj = Math.floor,\n\t\tff = has(\"ff\"),\n\t\tboxModel = geometry.boxModel.replace(/-/,''),\n\n\t\tclasses = {\n\t\t\t\"dj_quirks\": has(\"quirks\"),\n\n\t\t\t// NOTE: Opera not supported by dijit\n\t\t\t\"dj_opera\": opera,\n\n\t\t\t\"dj_khtml\": has(\"khtml\"),\n\n\t\t\t\"dj_webkit\": has(\"webkit\"),\n\t\t\t\"dj_safari\": has(\"safari\"),\n\t\t\t\"dj_chrome\": has(\"chrome\"),\n\t\t\t\"dj_edge\": has(\"edge\"),\n\n\t\t\t\"dj_gecko\": has(\"mozilla\"),\n\n\t\t\t\"dj_ios\": has(\"ios\"),\n\t\t\t\"dj_android\": has(\"android\")\n\t\t}; // no dojo unsupported browsers\n\n\tif(ie){\n\t\tclasses[\"dj_ie\"] = true;\n\t\tclasses[\"dj_ie\" + maj(ie)] = true;\n\t\tclasses[\"dj_iequirks\"] = has(\"quirks\");\n\t}\n\tif(trident){\n\t\tclasses[\"dj_trident\"] = true;\n\t\tclasses[\"dj_trident\" + maj(trident)] = true;\n\t}\n\tif(ff){\n\t\tclasses[\"dj_ff\" + maj(ff)] = true;\n\t}\n\n\tclasses[\"dj_\" + boxModel] = true;\n\n\t// apply browser, browser version, and box model class names\n\tvar classStr = \"\";\n\tfor(var clz in classes){\n\t\tif(classes[clz]){\n\t\t\tclassStr += clz + \" \";\n\t\t}\n\t}\n\thtml.className = lang.trim(html.className + \" \" + classStr);\n\n\t// If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension.\n\t// We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl).\n\tdomReady(function(){\n\t\tif(!geometry.isBodyLtr()){\n\t\t\tvar rtlClassStr = \"dj_rtl dijitRtl \" + classStr.replace(/ /g, \"-rtl \");\n\t\t\thtml.className = lang.trim(html.className + \" \" + rtlClassStr + \"dj_rtl dijitRtl \" + classStr.replace(/ /g, \"-rtl \"));\n\t\t}\n\t});\n\treturn has;\n});\n","define([\n\t\"./Deferred\",\n\t\"./promise/Promise\"\n], function(Deferred, Promise){\n\t\"use strict\";\n\n\t// module:\n\t//\t\tdojo/when\n\n\treturn function when(valueOrPromise, callback, errback, progback){\n\t\t// summary:\n\t\t//\t\tTransparently applies callbacks to values and/or promises.\n\t\t// description:\n\t\t//\t\tAccepts promises but also transparently handles non-promises. If no\n\t\t//\t\tcallbacks are provided returns a promise, regardless of the initial\n\t\t//\t\tvalue. Foreign promises are converted.\n\t\t//\n\t\t//\t\tIf callbacks are provided and the initial value is not a promise,\n\t\t//\t\tthe callback is executed immediately with no error handling. Returns\n\t\t//\t\ta promise if the initial value is a promise, or the result of the\n\t\t//\t\tcallback otherwise.\n\t\t// valueOrPromise:\n\t\t//\t\tEither a regular value or an object with a `then()` method that\n\t\t//\t\tfollows the Promises/A specification.\n\t\t// callback: Function?\n\t\t//\t\tCallback to be invoked when the promise is resolved, or a non-promise\n\t\t//\t\tis received.\n\t\t// errback: Function?\n\t\t//\t\tCallback to be invoked when the promise is rejected.\n\t\t// progback: Function?\n\t\t//\t\tCallback to be invoked when the promise emits a progress update.\n\t\t// returns: dojo/promise/Promise\n\t\t//\t\tPromise, or if a callback is provided, the result of the callback.\n\n\t\tvar receivedPromise = valueOrPromise && typeof valueOrPromise.then === \"function\";\n\t\tvar nativePromise = receivedPromise && valueOrPromise instanceof Promise;\n\n\t\tif(!receivedPromise){\n\t\t\tif(arguments.length > 1){\n\t\t\t\treturn callback ? callback(valueOrPromise) : valueOrPromise;\n\t\t\t}else{\n\t\t\t\treturn new Deferred().resolve(valueOrPromise);\n\t\t\t}\n\t\t}else if(!nativePromise){\n\t\t\tvar deferred = new Deferred(valueOrPromise.cancel);\n\t\t\tvalueOrPromise.then(deferred.resolve, deferred.reject, deferred.progress);\n\t\t\tvalueOrPromise = deferred.promise;\n\t\t}\n\n\t\tif(callback || errback || progback){\n\t\t\treturn valueOrPromise.then(callback, errback, progback);\n\t\t}\n\t\treturn valueOrPromise;\n\t};\n});\n","define([\"./_base/lang\", \"./sniff\", \"./_base/window\", \"./dom\", \"./dom-geometry\", \"./dom-style\", \"./dom-construct\"],\n\tfunction(lang, has, baseWindow, dom, geom, style, domConstruct){\n\n\t// feature detection\n\t/* not needed but included here for future reference\n\thas.add(\"rtl-innerVerticalScrollBar-on-left\", function(win, doc){\n\t\tvar\tbody = baseWindow.body(doc),\n\t\t\tscrollable = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'scroll', overflowX:'hidden', direction:'rtl', visibility:'hidden', position:'absolute', left:'0', width:'64px', height:'64px'}\n\t\t\t}, body, \"last\"),\n\t\t\tcenter = domConstruct.create('center', {\n\t\t\t\tstyle: {overflow:'hidden', direction:'ltr'}\n\t\t\t}, scrollable, \"last\"),\n\t\t\tinner = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'visible', display:'inline' }\n\t\t\t}, center, \"last\");\n\t\tinner.innerHTML=\"&nbsp;\";\n\t\tvar midPoint = Math.max(inner.offsetLeft, geom.position(inner).x);\n\t\tvar ret = midPoint >= 32;\n\t\tcenter.removeChild(inner);\n\t\tscrollable.removeChild(center);\n\t\tbody.removeChild(scrollable);\n\t\treturn ret;\n\t});\n\t*/\n\thas.add(\"rtl-adjust-position-for-verticalScrollBar\", function(win, doc){\n\t\tvar\tbody = baseWindow.body(doc),\n\t\t\tscrollable = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'scroll', overflowX:'visible', direction:'rtl', visibility:'hidden', position:'absolute', left:'0', top:'0', width:'64px', height:'64px'}\n\t\t\t}, body, \"last\"),\n\t\t\tdiv = domConstruct.create('div', {\n\t\t\t\tstyle: {overflow:'hidden', direction:'ltr'}\n\t\t\t}, scrollable, \"last\"),\n\t\t\tret = geom.position(div).x != 0;\n\t\tscrollable.removeChild(div);\n\t\tbody.removeChild(scrollable);\n\t\treturn ret;\n\t});\n\n\thas.add(\"position-fixed-support\", function(win, doc){\n\t\t// IE6, IE7+quirks, and some older mobile browsers don't support position:fixed\n\t\tvar\tbody = baseWindow.body(doc),\n\t\t\touter = domConstruct.create('span', {\n\t\t\t\tstyle: {visibility:'hidden', position:'fixed', left:'1px', top:'1px'}\n\t\t\t}, body, \"last\"),\n\t\t\tinner = domConstruct.create('span', {\n\t\t\t\tstyle: {position:'fixed', left:'0', top:'0'}\n\t\t\t}, outer, \"last\"),\n\t\t\tret = geom.position(inner).x != geom.position(outer).x;\n\t\touter.removeChild(inner);\n\t\tbody.removeChild(outer);\n\t\treturn ret;\n\t});\n\n\t// module:\n\t//\t\tdojo/window\n\n\tvar window = {\n\t\t// summary:\n\t\t//\t\tTODOC\n\n\t\tgetBox: function(/*Document?*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tReturns the dimensions and scroll position of the viewable area of a browser window\n\n\t\t\tdoc = doc || baseWindow.doc;\n\n\t\t\tvar\n\t\t\t\tscrollRoot = (doc.compatMode == 'BackCompat') ? baseWindow.body(doc) : doc.documentElement,\n\t\t\t\t// get scroll position\n\t\t\t\tscroll = geom.docScroll(doc), // scrollRoot.scrollTop/Left should work\n\t\t\t\tw, h;\n\n\t\t\tif(has(\"touch\")){ // if(scrollbars not supported)\n\t\t\t\tvar uiWindow = window.get(doc); // use UI window, not dojo.global window\n\t\t\t\t// on mobile, scrollRoot.clientHeight <= uiWindow.innerHeight <= scrollRoot.offsetHeight, return uiWindow.innerHeight\n\t\t\t\tw = uiWindow.innerWidth || scrollRoot.clientWidth; // || scrollRoot.clientXXX probably never evaluated\n\t\t\t\th = uiWindow.innerHeight || scrollRoot.clientHeight;\n\t\t\t}else{\n\t\t\t\t// on desktops, scrollRoot.clientHeight <= scrollRoot.offsetHeight <= uiWindow.innerHeight, return scrollRoot.clientHeight\n\t\t\t\t// uiWindow.innerWidth/Height includes the scrollbar and cannot be used\n\t\t\t\tw = scrollRoot.clientWidth;\n\t\t\t\th = scrollRoot.clientHeight;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tl: scroll.x,\n\t\t\t\tt: scroll.y,\n\t\t\t\tw: w,\n\t\t\t\th: h\n\t\t\t};\n\t\t},\n\n\t\tget: function(/*Document*/ doc){\n\t\t\t// summary:\n\t\t\t//\t\tGet window object associated with document doc.\n\t\t\t// doc:\n\t\t\t//\t\tThe document to get the associated window for.\n\n\t\t\t// In some IE versions (at least 6.0), document.parentWindow does not return a\n\t\t\t// reference to the real window object (maybe a copy), so we must fix it as well\n\t\t\t// We use IE specific execScript to attach the real window reference to\n\t\t\t// document._parentWindow for later use\n\t\t\tif(has(\"ie\") && window !== document.parentWindow){\n\t\t\t\t/*\n\t\t\t\tIn IE 6, only the variable \"window\" can be used to connect events (others\n\t\t\t\tmay be only copies).\n\t\t\t\t*/\n\t\t\t\tdoc.parentWindow.execScript(\"document._parentWindow = window;\", \"Javascript\");\n\t\t\t\t//to prevent memory leak, unset it after use\n\t\t\t\t//another possibility is to add an onUnload handler which seems overkill to me (liucougar)\n\t\t\t\tvar win = doc._parentWindow;\n\t\t\t\tdoc._parentWindow = null;\n\t\t\t\treturn win;\t//\tWindow\n\t\t\t}\n\n\t\t\treturn doc.parentWindow || doc.defaultView;\t//\tWindow\n\t\t},\n\n\t\tscrollIntoView: function(/*DomNode*/ node, /*Object?*/ pos){\n\t\t\t// summary:\n\t\t\t//\t\tScroll the passed node into view using minimal movement, if it is not already.\n\n\t\t\t// Don't rely on node.scrollIntoView working just because the function is there since\n\t\t\t// it forces the node to the page's bottom or top (and left or right in IE) without consideration for the minimal movement.\n\t\t\t// WebKit's node.scrollIntoViewIfNeeded doesn't work either for inner scrollbars in right-to-left mode\n\t\t\t// and when there's a fixed position scrollable element\n\n\t\t\ttry{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method\n\t\t\t\tnode = dom.byId(node);\n\t\t\t\tvar\tdoc = node.ownerDocument || baseWindow.doc,\t// TODO: why baseWindow.doc? Isn't node.ownerDocument always defined?\n\t\t\t\t\tbody = baseWindow.body(doc),\n\t\t\t\t\thtml = doc.documentElement || body.parentNode,\n\t\t\t\t\tisIE = has(\"ie\") || has(\"trident\"),\n\t\t\t\t\tisWK = has(\"webkit\");\n\t\t\t\t// if an untested browser, then use the native method\n\t\t\t\tif(node == body || node == html){ return; }\n\t\t\t\tif(!(has(\"mozilla\") || isIE || isWK || has(\"opera\") || has(\"trident\") || has(\"edge\"))\n\t\t\t\t\t\t&& (\"scrollIntoView\" in node)){\n\t\t\t\t\tnode.scrollIntoView(false); // short-circuit to native if possible\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar\tbackCompat = doc.compatMode == 'BackCompat',\n\t\t\t\t\trootWidth = Math.min(body.clientWidth || html.clientWidth, html.clientWidth || body.clientWidth),\n\t\t\t\t\trootHeight = Math.min(body.clientHeight || html.clientHeight, html.clientHeight || body.clientHeight),\n\t\t\t\t\tscrollRoot = (isWK || backCompat) ? body : html,\n\t\t\t\t\tnodePos = pos || geom.position(node),\n\t\t\t\t\tel = node.parentNode,\n\t\t\t\t\tisFixed = function(el){\n\t\t\t\t\t\treturn (isIE <= 6 || (isIE == 7 && backCompat))\n\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t: (has(\"position-fixed-support\") && (style.get(el, 'position').toLowerCase() == \"fixed\"));\n\t\t\t\t\t},\n\t\t\t\t\tself = this,\n\t\t\t\t\tscrollElementBy = function(el, x, y){\n\t\t\t\t\t\tif(el.tagName == \"BODY\" || el.tagName == \"HTML\"){\n\t\t\t\t\t\t\tself.get(el.ownerDocument).scrollBy(x, y);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tx && (el.scrollLeft += x);\n\t\t\t\t\t\t\ty && (el.scrollTop += y);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\tif(isFixed(node)){ return; } // nothing to do\n\t\t\t\twhile(el){\n\t\t\t\t\tif(el == body){ el = scrollRoot; }\n\t\t\t\t\tvar\telPos = geom.position(el),\n\t\t\t\t\t\tfixedPos = isFixed(el),\n\t\t\t\t\t\trtl = style.getComputedStyle(el).direction.toLowerCase() == \"rtl\";\n\n\t\t\t\t\tif(el == scrollRoot){\n\t\t\t\t\t\telPos.w = rootWidth; elPos.h = rootHeight;\n\t\t\t\t\t\tif(scrollRoot == html && (isIE || has(\"trident\")) && rtl){\n\t\t\t\t\t\t\telPos.x += scrollRoot.offsetWidth-elPos.w;// IE workaround where scrollbar causes negative x\n\t\t\t\t\t\t}\n\t\t\t\t\t\telPos.x = 0;\n\t\t\t\t\t\telPos.y = 0;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tvar pb = geom.getPadBorderExtents(el);\n\t\t\t\t\t\telPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;\n\t\t\t\t\t\tvar clientSize = el.clientWidth,\n\t\t\t\t\t\t\tscrollBarSize = elPos.w - clientSize;\n\t\t\t\t\t\tif(clientSize > 0 && scrollBarSize > 0){\n\t\t\t\t\t\t\tif(rtl && has(\"rtl-adjust-position-for-verticalScrollBar\")){\n\t\t\t\t\t\t\t\telPos.x += scrollBarSize;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telPos.w = clientSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclientSize = el.clientHeight;\n\t\t\t\t\t\tscrollBarSize = elPos.h - clientSize;\n\t\t\t\t\t\tif(clientSize > 0 && scrollBarSize > 0){\n\t\t\t\t\t\t\telPos.h = clientSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(fixedPos){ // bounded by viewport, not parents\n\t\t\t\t\t\tif(elPos.y < 0){\n\t\t\t\t\t\t\telPos.h += elPos.y; elPos.y = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(elPos.x < 0){\n\t\t\t\t\t\t\telPos.w += elPos.x; elPos.x = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(elPos.y + elPos.h > rootHeight){\n\t\t\t\t\t\t\telPos.h = rootHeight - elPos.y;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(elPos.x + elPos.w > rootWidth){\n\t\t\t\t\t\t\telPos.w = rootWidth - elPos.x;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// calculate overflow in all 4 directions\n\t\t\t\t\tvar\tl = nodePos.x - elPos.x, // beyond left: < 0\n//\t\t\t\t\t\tt = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0\n\t\t\t\t\t\tt = nodePos.y - elPos.y, // beyond top: < 0\n\t\t\t\t\t\tr = l + nodePos.w - elPos.w, // beyond right: > 0\n\t\t\t\t\t\tbot = t + nodePos.h - elPos.h; // beyond bottom: > 0\n\t\t\t\t\tvar s, old;\n\t\t\t\t\tif(r * l > 0 && (!!el.scrollLeft || el == scrollRoot || el.scrollWidth > el.offsetHeight)){\n\t\t\t\t\t\ts = Math[l < 0? \"max\" : \"min\"](l, r);\n\t\t\t\t\t\tif(rtl && ((isIE == 8 && !backCompat) || has(\"trident\") >= 5)){ s = -s; }\n\t\t\t\t\t\told = el.scrollLeft;\n\t\t\t\t\t\tscrollElementBy(el, s, 0);\n\t\t\t\t\t\ts = el.scrollLeft - old;\n\t\t\t\t\t\tnodePos.x -= s;\n\t\t\t\t\t}\n\t\t\t\t\tif(bot * t > 0 && (!!el.scrollTop || el == scrollRoot || el.scrollHeight > el.offsetHeight)){\n\t\t\t\t\t\ts = Math.ceil(Math[t < 0? \"max\" : \"min\"](t, bot));\n\t\t\t\t\t\told = el.scrollTop;\n\t\t\t\t\t\tscrollElementBy(el, 0, s);\n\t\t\t\t\t\ts = el.scrollTop - old;\n\t\t\t\t\t\tnodePos.y -= s;\n\t\t\t\t\t}\n\t\t\t\t\tel = (el != scrollRoot) && !fixedPos && el.parentNode;\n\t\t\t\t}\n\t\t\t}catch(error){\n\t\t\t\tconsole.error('scrollIntoView: ' + error);\n\t\t\t\tnode.scrollIntoView(false);\n\t\t\t}\n\t\t}\n\t};\n\n\thas(\"extend-dojo\") && lang.setObject(\"dojo.window\", window);\n\n\treturn window;\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BUILD_VERSION = exports.PKG_VERSION = exports.PKG_NAME = void 0;\nexports.PKG_NAME = \"@hpcc-js/dgrid-shim\";\nexports.PKG_VERSION = \"2.26.0\";\nexports.BUILD_VERSION = \"2.107.0\";\n//# sourceMappingURL=__package__.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pagination = exports.GridHelper = void 0;\nvar _StoreMixin = require(\"dgrid/_StoreMixin\");\nvar DGridPagination = require(\"dgrid/extensions/Pagination\");\nvar Tooltip = require(\"dijit/Tooltip\");\nvar declare = require(\"dojo/_base/declare\");\nvar query = require(\"dojo/_base/query\");\nvar domClass = require(\"dojo/dom-class\");\nexports.GridHelper = declare(null, {\n allowTextSelection: true,\n noDataMessage: \"<span class='dojoxGridNoData'>...empty...</span>\",\n loadingMessage: \"<span class='dojoxGridNoData'>loading...</span>\",\n postCreate: function postCreate(inherited) {\n this.inherited(postCreate, arguments);\n this.__hpcc_tooltip_header = new Tooltip({\n connectId: [this.id],\n selector: \".dgrid-resize-header-container\",\n showDelay: 400,\n getContent: function (node) {\n if (node.offsetWidth < node.scrollWidth - 4) {\n return node.innerHTML;\n }\n return \"\";\n }\n });\n this.__hpcc_tooltip_header.position = [\"above-centered\", \"below-centered\", \"before-centered\", \"after-centered\"];\n this.__hpcc_tooltip = new Tooltip({\n connectId: [this.id],\n selector: \"td\",\n showDelay: 400,\n getContent: function (node) {\n if (node.offsetWidth <= node.scrollWidth) {\n return node.innerHTML;\n }\n return \"\";\n }\n });\n this.__hpcc_tooltip.position = [\"above-centered\", \"below-centered\", \"before-centered\", \"after-centered\"];\n },\n refresh: function refresh(options) {\n this.inherited(refresh, arguments, [options || {\n keepScrollPosition: true,\n keepCurrentPage: true\n }]);\n },\n clearSelection: function clearSelection() {\n this.inherited(clearSelection, arguments);\n query(\"input[type=checkbox]\", this.domNode).forEach(function (node) {\n node.checked = false;\n node.indeterminate = false;\n });\n } /*,\n\n _onNotify(object, existingId) {\n this.inherited(arguments);\n if (this.onSelectedChangedCallback) {\n this.onSelectedChangedCallback();\n }\n },\n\n onSelectionChanged(callback) {\n this.onSelectedChangedCallback = callback;\n this.on(\"dgrid-select, dgrid-deselect, dgrid-refresh-complete\", function (event) {\n callback(event);\n });\n },\n\n setSelection(arrayOfIDs) {\n this.clearSelection();\n const context = this;\n arrayUtil.forEach(arrayOfIDs, function (item, idx) {\n if (idx === 0) {\n const row = context.row(item);\n if (row.element) {\n row.element.scrollIntoView();\n }\n }\n context.select(item);\n });\n },\n\n setSelected(items) {\n this.clearSelection();\n const context = this;\n arrayUtil.forEach(items, function (item, idx) {\n if (idx === 0) {\n const row = context.row(item);\n if (row.element) {\n row.element.scrollIntoView();\n }\n }\n context.select(context.store.getIdentity(item));\n });\n },\n\n getSelected(store) {\n if (!store) {\n store = this.store;\n }\n const retVal = [];\n for (const id in this.selection) {\n if (this.selection[id]) {\n const storeItem = store.get(id);\n if (storeItem && storeItem.StateID !== 999) {\n retVal.push(storeItem);\n }\n }\n }\n return retVal;\n }\n */\n});\n//defined as 9223372036854775807 in ESP, but TS complains of loss of precision\nvar UNKNOWN_NUM_ROWS = 9223372036854775000;\nexports.Pagination = declare([DGridPagination], {\n refresh: function (options) {\n var self = this;\n var page = options && options.keepCurrentPage ?\n Math.min(this._currentPage, Math.ceil(this._total / this.rowsPerPage)) || 1 : 1;\n _StoreMixin.prototype.refresh.apply(this, arguments);\n // Reset to first page and return promise from gotoPage\n return this.gotoPage(page).then(function (results) {\n self._emitRefreshComplete();\n return results;\n });\n },\n _updateNavigation: function (total) {\n var _a;\n this.inherited(arguments);\n if (total >= UNKNOWN_NUM_ROWS) {\n query(\".dgrid-page-link:last-child\", this.paginationNavigationNode).forEach(function (link) {\n domClass.toggle(link, \"dgrid-page-disabled\", true);\n if (!isNaN(parseInt(link.innerText, 10))) {\n link.innerText = \"???\";\n }\n link.tabIndex = -1;\n });\n var pageText = query(\".dgrid-status\", this.paginationNode)[0];\n pageText.innerText = (_a = pageText === null || pageText === void 0 ? void 0 : pageText.innerText) === null || _a === void 0 ? void 0 : _a.replace(/[0-9]{7,}/, \"unknown\");\n }\n }\n});\n//# sourceMappingURL=gridHelper.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PagingGrid = exports.Grid = exports.QueryResults = exports.Memory = exports.domConstruct = exports.Deferred = void 0;\nvar tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./__package__\"), exports);\n// dojo ---\n// import \"dojo/has!webpack?dojo-webpack-plugin/amd/dojoES6Promise\";\nvar declare = require(\"dojo/_base/declare\");\nvar _Deferred = require(\"dojo/Deferred\");\nvar _domConstruct = require(\"dojo/dom-construct\");\nexports.Deferred = _Deferred;\nexports.domConstruct = _domConstruct;\n// dstore ---\nvar _Memory = require(\"dojo-dstore/Memory\");\nvar _QueryResults = require(\"dojo-dstore/QueryResults\");\nexports.Memory = _Memory;\nexports.QueryResults = _QueryResults;\n// dgrid ---\nvar _Grid = require(\"dgrid/Grid\");\n// import * as List from \"dgrid/List\";\nvar OnDemandGrid = require(\"dgrid/OnDemandGrid\");\nvar Keyboard = require(\"dgrid/Keyboard\");\nvar Selection = require(\"dgrid/Selection\");\nvar ColumnResizer = require(\"dgrid/extensions/ColumnResizer\");\nvar CompoundColumns = require(\"dgrid/extensions/CompoundColumns\");\nvar nlsPagination = require(\"dgrid/extensions/nls/pagination\");\n// Other ---\nvar gridHelper_1 = require(\"./gridHelper\");\nexports.Grid = declare(\"Grid\", [OnDemandGrid, Keyboard, Selection, ColumnResizer, CompoundColumns, gridHelper_1.GridHelper]);\nexports.Grid.prototype.i18nPagination = nlsPagination.root;\nexports.PagingGrid = declare(\"PagingGrid\", [_Grid, gridHelper_1.Pagination, Keyboard, Selection, ColumnResizer, CompoundColumns, gridHelper_1.GridHelper]);\nexports.PagingGrid.prototype.i18nPagination = nlsPagination.root;\n//# sourceMappingURL=index.js.map","module.exports = function(userConfig, defaultConfig, global, window) { this.loaderVersion = \"1.17.3\"; (function(\n\tuserConfig,\n\tdefaultConfig\n){\n\t// summary:\n\t//\t\tThis is the \"source loader\" and is the entry point for Dojo during development. You may also load Dojo with\n\t//\t\tany AMD-compliant loader via the package main module dojo/main.\n\t// description:\n\t//\t\tThis is the \"source loader\" for Dojo. It provides an AMD-compliant loader that can be configured\n\t//\t\tto operate in either synchronous or asynchronous modes. After the loader is defined, dojo is loaded\n\t//\t\tIAW the package main module dojo/main. In the event you wish to use a foreign loader, you may load dojo as a package\n\t//\t\tvia the package main module dojo/main and this loader is not required; see dojo/package.json for details.\n\t//\n\t//\t\tIn order to keep compatibility with the v1.x line, this loader includes additional machinery that enables\n\t//\t\tthe dojo.provide, dojo.require et al API. This machinery is loaded by default, but may be dynamically removed\n\t//\t\tvia the has.js API and statically removed via the build system.\n\t//\n\t//\t\tThis loader includes sniffing machinery to determine the environment; the following environments are supported:\n\t//\n\t//\t\t- browser\n\t//\t\t- node.js\n\t//\t\t- rhino\n\t//\n\t//\t\tThis is the so-called \"source loader\". As such, it includes many optional features that may be discarded by\n\t//\t\tbuilding a customized version with the build system.\n\n\t// Design and Implementation Notes\n\t//\n\t// This is a dojo-specific adaption of bdLoad, donated to the dojo foundation by Altoviso LLC.\n\t//\n\t// This function defines an AMD-compliant (http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition)\n\t// loader that can be configured to operate in either synchronous or asynchronous modes.\n\t//\n\t// Since this machinery implements a loader, it does not have the luxury of using a load system and/or\n\t// leveraging a utility library. This results in an unpleasantly long file; here is a road map of the contents:\n\t//\n\t//\t 1. Small library for use implementing the loader.\n\t//\t 2. Define the has.js API; this is used throughout the loader to bracket features.\n\t//\t 3. Define the node.js and rhino sniffs and sniff.\n\t//\t 4. Define the loader's data.\n\t//\t 5. Define the configuration machinery.\n\t//\t 6. Define the script element sniffing machinery and sniff for configuration data.\n\t//\t 7. Configure the loader IAW the provided user, default, and sniffing data.\n\t//\t 8. Define the global require function.\n\t//\t 9. Define the module resolution machinery.\n\t//\t10. Define the module and plugin module definition machinery\n\t//\t11. Define the script injection machinery.\n\t//\t12. Define the window load detection.\n\t//\t13. Define the logging API.\n\t//\t14. Define the tracing API.\n\t//\t16. Define the AMD define function.\n\t//\t17. Define the dojo v1.x provide/require machinery--so called \"legacy\" modes.\n\t//\t18. Publish global variables.\n\t//\n\t// Language and Acronyms and Idioms\n\t//\n\t// moduleId: a CJS module identifier, (used for public APIs)\n\t// mid: moduleId (used internally)\n\t// packageId: a package identifier (used for public APIs)\n\t// pid: packageId (used internally); the implied system or default package has pid===\"\"\n\t// pack: package is used internally to reference a package object (since javascript has reserved words including \"package\")\n\t// prid: plugin resource identifier\n\t// The integer constant 1 is used in place of true and 0 in place of false.\n\t//\n\t// The \"foreign-loader\" has condition is defined if another loader is being used (e.g. webpack) and this code is only\n\t// needed for resolving module identifiers based on the config. In this case, only the functions require.toUrl and \n\t// require.toAbsMid are supported. The require and define functions are not supported.\n\n\t// define global\n\tvar globalObject = (function(){\n\t\tif (typeof global !== 'undefined' && typeof global !== 'function') {\n\t\t\t// global spec defines a reference to the global object called 'global'\n\t\t\t// https://github.com/tc39/proposal-global\n\t\t\t// `global` is also defined in NodeJS\n\t\t\treturn global;\n\t\t}\n\t\telse if (typeof window !== 'undefined') {\n\t\t\t// window is defined in browsers\n\t\t\treturn window;\n\t\t}\n\t\telse if (typeof self !== 'undefined') {\n\t\t\t// self is defined in WebWorkers\n\t\t\treturn self;\n\t\t}\n\t\treturn this;\n\t})();\n\n\t// define a minimal library to help build the loader\n\tvar noop = function(){\n\t\t},\n\n\t\tisEmpty = function(it){\n\t\t\tfor(var p in it){\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn 1;\n\t\t},\n\n\t\ttoString = {}.toString,\n\n\t\tisFunction = function(it){\n\t\t\treturn toString.call(it) == \"[object Function]\";\n\t\t},\n\n\t\tisString = function(it){\n\t\t\treturn toString.call(it) == \"[object String]\";\n\t\t},\n\n\t\tisArray = function(it){\n\t\t\treturn toString.call(it) == \"[object Array]\";\n\t\t},\n\n\t\tforEach = function(vector, callback){\n\t\t\tif(vector){\n\t\t\t\tfor(var i = 0; i < vector.length;){\n\t\t\t\t\tcallback(vector[i++]);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tmix = function(dest, src){\n\t\t\tfor(var p in src){\n\t\t\t\tdest[p] = src[p];\n\t\t\t}\n\t\t\treturn dest;\n\t\t},\n\n\t\tmakeError = function(error, info){\n\t\t\treturn mix(new Error(error), {src:\"dojoLoader\", info:info});\n\t\t},\n\n\t\tuidSeed = 1,\n\n\t\tuid = function(){\n\t\t\t// Returns a unique identifier (within the lifetime of the document) of the form /_d+/.\n\t\t\treturn \"_\" + uidSeed++;\n\t\t},\n\n\t\t// FIXME: how to doc window.require() api\n\n\t\t// this will be the global require function; define it immediately so we can start hanging things off of it\n\t\treq = function(\n\t\t\tconfig,\t\t //(object, optional) hash of configuration properties\n\t\t\tdependencies, //(array of commonjs.moduleId, optional) list of modules to be loaded before applying callback\n\t\t\tcallback\t //(function, optional) lambda expression to apply to module values implied by dependencies\n\t\t){\n\t\t\treturn contextRequire(config, dependencies, callback, 0, req);\n\t\t},\n\n\t\t// the loader uses the has.js API to control feature inclusion/exclusion; define then use throughout\n\t\tglobal = globalObject,\n\n\t\tdoc = global.document,\n\n\t\telement = doc && doc.createElement(\"DiV\"),\n\n\t\thas = req.has = function(name){\n\t\t\treturn isFunction(hasCache[name]) ? (hasCache[name] = hasCache[name](global, doc, element)) : hasCache[name];\n\t\t},\n\n\t\thasCache = has.cache = defaultConfig.hasCache;\n\n\tif (isFunction(userConfig)) {\n\t\tuserConfig = userConfig(globalObject);\n\t}\n\n\thas.add = function(name, test, now, force){\n\t\t(hasCache[name]===undefined || force) && (hasCache[name] = test);\n\t\treturn now && has(name);\n\t};\n\n\t 0 && has.add(\"host-node\", userConfig.has && \"host-node\" in userConfig.has ?\n\t\tuserConfig.has[\"host-node\"] :\n\t\t(typeof process == \"object\" && process.versions && process.versions.node && process.versions.v8));\n\tif( 0 ){\n\t\t// fixup the default config for node.js environment\n\t\trequire(\"./_base/configNode.js\").config(defaultConfig);\n\t\t// remember node's require (with respect to baseUrl==dojo's root)\n\t\tdefaultConfig.loaderPatch.nodeRequire = require;\n\t}\n\n\t 0 && has.add(\"host-rhino\", userConfig.has && \"host-rhino\" in userConfig.has ?\n\t\tuserConfig.has[\"host-rhino\"] :\n\t\t(typeof load == \"function\" && (typeof Packages == \"function\" || typeof Packages == \"object\")));\n\tif( 0 ){\n\t\t// owing to rhino's lame feature that hides the source of the script, give the user a way to specify the baseUrl...\n\t\tfor(var baseUrl = userConfig.baseUrl || \".\", arg, rhinoArgs = this.arguments, i = 0; i < rhinoArgs.length;){\n\t\t\targ = (rhinoArgs[i++] + \"\").split(\"=\");\n\t\t\tif(arg[0] == \"baseUrl\"){\n\t\t\t\tbaseUrl = arg[1];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tload(baseUrl + \"/_base/configRhino.js\");\n\t\trhinoDojoConfig(defaultConfig, baseUrl, rhinoArgs);\n\t}\n\n\t 0 && has.add(\"host-webworker\", ((typeof WorkerGlobalScope !== 'undefined') && (self instanceof WorkerGlobalScope)));\n\tif( 0 ){\n\t\tmix(defaultConfig.hasCache, {\n\t\t\t\"host-browser\": 0,\n\t\t\t\"dom\": 0,\n\t\t\t\"dojo-dom-ready-api\": 0,\n\t\t\t\"dojo-sniff\": 0,\n\t\t\t\"dojo-inject-api\": 1,\n\t\t\t\"host-webworker\": 1,\n\t\t\t\"dojo-guarantee-console\": 0 // console is immutable in FF30+, see https://bugs.dojotoolkit.org/ticket/18100\n\t\t});\n\n\t\tdefaultConfig.loaderPatch = {\n\t\t\tinjectUrl: function(url, callback){\n\t\t\t\t// TODO:\n\t\t\t\t//\t\tThis is not async, nor can it be in Webworkers. It could be made better by passing\n\t\t\t\t//\t\tthe entire require array into importScripts at. This way the scripts are loaded in\n\t\t\t\t//\t\tasync mode; even if the callbacks are ran in sync. It is not a major issue as webworkers\n\t\t\t\t//\t\ttend to be long running where initial startup is not a major factor.\n\n\t\t\t\ttry{\n\t\t\t\t\timportScripts(url);\n\t\t\t\t\tcallback();\n\t\t\t\t}catch(e){\n\t\t\t\t\tconsole.info(\"failed to load resource (\" + url + \")\");\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// userConfig has tests override defaultConfig has tests; do this after the environment detection because\n\t// the environment detection usually sets some has feature values in the hasCache.\n\tfor(var p in userConfig.has){\n\t\thas.add(p, userConfig.has[p], 0, 1);\n\t}\n\n\t//\n\t// define the loader data\n\t//\n\n\t// the loader will use these like symbols if the loader has the traceApi; otherwise\n\t// define magic numbers so that modules can be provided as part of defaultConfig\n\tvar requested = 1,\n\t\tarrived = 2,\n\t\tnonmodule = 3,\n\t\texecuting = 4,\n\t\texecuted = 5;\n\n\tif( 0 ){\n\t\t// these make debugging nice; but using strings for symbols is a gross rookie error; don't do it for production code\n\t\trequested = \"requested\";\n\t\tarrived = \"arrived\";\n\t\tnonmodule = \"not-a-module\";\n\t\texecuting = \"executing\";\n\t\texecuted = \"executed\";\n\t}\n\n\tvar legacyMode = 0,\n\t\tsync = \"sync\",\n\t\txd = \"xd\",\n\t\tsyncExecStack = [],\n\t\tdojoRequirePlugin = 0,\n\t\tcheckDojoRequirePlugin = noop,\n\t\ttransformToAmd = noop,\n\t\tgetXhr;\n\tif( 0 ){\n\t\treq.isXdUrl = noop;\n\n\t\treq.initSyncLoader = function(dojoRequirePlugin_, checkDojoRequirePlugin_, transformToAmd_){\n\t\t\t// the first dojo/_base/loader loaded gets to define these variables; they are designed to work\n\t\t\t// in the presence of zero to many mapped dojo/_base/loaders\n\t\t\tif(!dojoRequirePlugin){\n\t\t\t\tdojoRequirePlugin = dojoRequirePlugin_;\n\t\t\t\tcheckDojoRequirePlugin = checkDojoRequirePlugin_;\n\t\t\t\ttransformToAmd = transformToAmd_;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsync:sync,\n\t\t\t\trequested:requested,\n\t\t\t\tarrived:arrived,\n\t\t\t\tnonmodule:nonmodule,\n\t\t\t\texecuting:executing,\n\t\t\t\texecuted:executed,\n\t\t\t\tsyncExecStack:syncExecStack,\n\t\t\t\tmodules:modules,\n\t\t\t\texecQ:execQ,\n\t\t\t\tgetModule:getModule,\n\t\t\t\tinjectModule:injectModule,\n\t\t\t\tsetArrived:setArrived,\n\t\t\t\tsignal:signal,\n\t\t\t\tfinishExec:finishExec,\n\t\t\t\texecModule:execModule,\n\t\t\t\tdojoRequirePlugin:dojoRequirePlugin,\n\t\t\t\tgetLegacyMode:function(){return legacyMode;},\n\t\t\t\tguardCheckComplete:guardCheckComplete\n\t\t\t};\n\t\t};\n\n\t\tif( 0 || 0 ){\n\t\t\t// in legacy sync mode, the loader needs a minimal XHR library\n\n\t\t\tvar locationProtocol = location.protocol,\n\t\t\t\tlocationHost = location.host;\n\t\t\treq.isXdUrl = function(url){\n\t\t\t\tif(/^\\./.test(url)){\n\t\t\t\t\t// begins with a dot is always relative to page URL; therefore not xdomain\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif(/^\\/\\//.test(url)){\n\t\t\t\t\t// for v1.6- backcompat, url starting with // indicates xdomain\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// get protocol and host\n\t\t\t\t// \\/+ takes care of the typical file protocol that looks like file:///drive/path/to/file\n\t\t\t\t// locationHost is falsy if file protocol => if locationProtocol matches and is \"file:\", || will return false\n\t\t\t\tvar match = url.match(/^([^\\/\\:]+\\:)\\/+([^\\/]+)/);\n\t\t\t\treturn match && (match[1] != locationProtocol || (locationHost && match[2] != locationHost));\n\t\t\t};\n\n\n\t\t\t// note: to get the file:// protocol to work in FF, you must set security.fileuri.strict_origin_policy to false in about:config\n\t\t\t 1 || has.add(\"dojo-xhr-factory\", 1);\n\t\t\t 0 && has.add(\"dojo-force-activex-xhr\", 1 && !doc.addEventListener && window.location.protocol == \"file:\");\n\t\t\thas.add(\"native-xhr\", typeof XMLHttpRequest != \"undefined\");\n\t\t\tif(has(\"native-xhr\") && ! 0 ){\n\t\t\t\tgetXhr = function(){\n\t\t\t\t\treturn new XMLHttpRequest();\n\t\t\t\t};\n\t\t\t}else{\n\t\t\t\t// if in the browser an old IE; find an xhr\n\t\t\t\tfor(var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], progid, i = 0; i < 3;){\n\t\t\t\t\ttry{\n\t\t\t\t\t\tprogid = XMLHTTP_PROGIDS[i++];\n\t\t\t\t\t\tif(new ActiveXObject(progid)){\n\t\t\t\t\t\t\t// this progid works; therefore, use it from now on\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t// squelch; we're just trying to find a good ActiveX progid\n\t\t\t\t\t\t// if they all fail, then progid ends up as the last attempt and that will signal the error\n\t\t\t\t\t\t// the first time the client actually tries to exec an xhr\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tgetXhr = function(){\n\t\t\t\t\treturn new ActiveXObject(progid);\n\t\t\t\t};\n\t\t\t}\n\t\t\treq.getXhr = getXhr;\n\n\t\t\thas.add(\"dojo-gettext-api\", 1);\n\t\t\treq.getText = function(url, async, onLoad){\n\t\t\t\tvar xhr = getXhr();\n\t\t\t\txhr.open('GET', fixupUrl(url), false);\n\t\t\t\txhr.send(null);\n\t\t\t\tif(xhr.status == 200 || (!location.host && !xhr.status)){\n\t\t\t\t\tif(onLoad){\n\t\t\t\t\t\tonLoad(xhr.responseText, async);\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tthrow makeError(\"xhrFailed\", xhr.status);\n\t\t\t\t}\n\t\t\t\treturn xhr.responseText;\n\t\t\t};\n\t\t}\n\t}else{\n\t\treq.async = 1;\n\t}\n\n\t//\n\t// loader eval\n\t//\n\tvar eval_ = 1 ?\n\t\t// noop eval if there are csp restrictions\n\t\tfunction(){} :\n\t\t// use the function constructor so our eval is scoped close to (but not in) in the global space with minimal pollution\n\t\tnew Function('return eval(arguments[0]);');\n\n\treq.eval =\n\t\tfunction(text, hint){\n\t\t\treturn eval_(text + \"\\r\\n//# sourceURL=\" + hint);\n\t\t};\n\n\t//\n\t// loader micro events API\n\t//\n\tvar listenerQueues = {},\n\t\terror = \"error\",\n\t\tsignal = req.signal = function(type, args){\n\t\t\tvar queue = listenerQueues[type];\n\t\t\t// notice we run a copy of the queue; this allows listeners to add/remove\n\t\t\t// other listeners without affecting this particular signal\n\t\t\tforEach(queue && queue.slice(0), function(listener){\n\t\t\t\tlistener.apply(null, isArray(args) ? args : [args]);\n\t\t\t});\n\t\t},\n\t\ton = req.on = function(type, listener){\n\t\t\t// notice a queue is not created until a client actually connects\n\t\t\tvar queue = listenerQueues[type] || (listenerQueues[type] = []);\n\t\t\tqueue.push(listener);\n\t\t\treturn {\n\t\t\t\tremove:function(){\n\t\t\t\t\tfor(var i = 0; i<queue.length; i++){\n\t\t\t\t\t\tif(queue[i]===listener){\n\t\t\t\t\t\t\tqueue.splice(i, 1);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\n\t// configuration machinery; with an optimized/built defaultConfig, all configuration machinery can be discarded\n\t// lexical variables hold key loader data structures to help with minification; these may be completely,\n\t// one-time initialized by defaultConfig for optimized/built versions\n\tvar\n\t\taliases\n\t\t\t// a vector of pairs of [regexs or string, replacement] => (alias, actual)\n\t\t\t= [],\n\n\t\tpaths\n\t\t\t// CommonJS paths\n\t\t\t= {},\n\n\t\tpathsMapProg\n\t\t\t// list of (from-path, to-path, regex, length) derived from paths;\n\t\t\t// a \"program\" to apply paths; see computeMapProg\n\t\t\t= [],\n\n\t\tpacks\n\t\t\t// a map from packageId to package configuration object; see fixupPackageInfo\n\t\t\t= {},\n\n\t\tmap = req.map\n\t\t\t// AMD map config variable; dojo/_base/kernel needs req.map to figure out the scope map\n\t\t\t= {},\n\n\t\tmapProgs\n\t\t\t// vector of quads as described by computeMapProg; map-key is AMD map key, map-value is AMD map value\n\t\t\t= [],\n\n\t\tmodules\n\t\t\t// A hash:(mid) --> (module-object) the module namespace\n\t\t\t//\n\t\t\t// pid: the package identifier to which the module belongs (e.g., \"dojo\"); \"\" indicates the system or default package\n\t\t\t// mid: the fully-resolved (i.e., mappings have been applied) module identifier without the package identifier (e.g., \"dojo/io/script\")\n\t\t\t// url: the URL from which the module was retrieved\n\t\t\t// pack: the package object of the package to which the module belongs\n\t\t\t// executed: 0 => not executed; executing => in the process of traversing deps and running factory; executed => factory has been executed\n\t\t\t// deps: the dependency vector for this module (vector of modules objects)\n\t\t\t// def: the factory for this module\n\t\t\t// result: the result of the running the factory for this module\n\t\t\t// injected: (0 | requested | arrived) the status of the module; nonmodule means the resource did not call define\n\t\t\t// load: plugin load function; applicable only for plugins\n\t\t\t//\n\t\t\t// Modules go through several phases in creation:\n\t\t\t//\n\t\t\t// 1. Requested: some other module's definition or a require application contained the requested module in\n\t\t\t//\t its dependency vector or executing code explicitly demands a module via req.require.\n\t\t\t//\n\t\t\t// 2. Injected: a script element has been appended to the insert-point element demanding the resource implied by the URL\n\t\t\t//\n\t\t\t// 3. Loaded: the resource injected in [2] has been evaluated.\n\t\t\t//\n\t\t\t// 4. Defined: the resource contained a define statement that advised the loader about the module. Notice that some\n\t\t\t//\t resources may just contain a bundle of code and never formally define a module via define\n\t\t\t//\n\t\t\t// 5. Evaluated: the module was defined via define and the loader has evaluated the factory and computed a result.\n\t\t\t= {},\n\n\t\tcacheBust\n\t\t\t// query string to append to module URLs to bust browser cache\n\t\t\t= \"\",\n\n\t\tcache\n\t\t\t// hash:(mid | url)-->(function | string)\n\t\t\t//\n\t\t\t// A cache of resources. The resources arrive via a config.cache object, which is a hash from either mid --> function or\n\t\t\t// url --> string. The url key is distinguished from the mid key by always containing the prefix \"url:\". url keys as provided\n\t\t\t// by config.cache always have a string value that represents the contents of the resource at the given url. mid keys as provided\n\t\t\t// by configl.cache always have a function value that causes the same code to execute as if the module was script injected.\n\t\t\t//\n\t\t\t// Both kinds of key-value pairs are entered into cache via the function consumePendingCache, which may relocate keys as given\n\t\t\t// by any mappings *iff* the config.cache was received as part of a module resource request.\n\t\t\t//\n\t\t\t// Further, for mid keys, the implied url is computed and the value is entered into that key as well. This allows mapped modules\n\t\t\t// to retrieve cached items that may have arrived consequent to another namespace.\n\t\t\t//\n\t\t\t = {},\n\n\t\turlKeyPrefix\n\t\t\t// the prefix to prepend to a URL key in the cache.\n\t\t\t= \"url:\",\n\n\t\tpendingCacheInsert\n\t\t\t// hash:(mid)-->(function)\n\t\t\t//\n\t\t\t// Gives a set of cache modules pending entry into cache. When cached modules are published to the loader, they are\n\t\t\t// entered into pendingCacheInsert; modules are then pressed into cache upon (1) AMD define or (2) upon receiving another\n\t\t\t// independent set of cached modules. (1) is the usual case, and this case allows normalizing mids given in the pending\n\t\t\t// cache for the local configuration, possibly relocating modules.\n\t\t\t = {},\n\n\t\tdojoSniffConfig\n\t\t\t// map of configuration variables\n\t\t\t// give the data-dojo-config as sniffed from the document (if any)\n\t\t\t= {},\n\n\t\tinsertPointSibling\n\t\t\t// the nodes used to locate where scripts are injected into the document\n\t\t\t= 0;\n\n\tif( 0 ){\n\t\tif (! 1 ) {\n\t\t\tvar consumePendingCacheInsert = function(referenceModule, clear){\n\t\t\t\t\tclear = clear !== false;\n\t\t\t\t\tvar p, item, match, now, m;\n\t\t\t\t\tfor(p in pendingCacheInsert){\n\t\t\t\t\t\titem = pendingCacheInsert[p];\n\t\t\t\t\t\tmatch = p.match(/^url\\:(.+)/);\n\t\t\t\t\t\tif(match){\n\t\t\t\t\t\t\tcache[urlKeyPrefix + toUrl(match[1], referenceModule)] = item;\n\t\t\t\t\t\t}else if(p==\"*now\"){\n\t\t\t\t\t\t\tnow = item;\n\t\t\t\t\t\t}else if(p!=\"*noref\"){\n\t\t\t\t\t\t\tm = getModuleInfo(p, referenceModule, true);\n\t\t\t\t\t\t\tcache[m.mid] = cache[urlKeyPrefix + m.url] = item;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(now){\n\t\t\t\t\t\tnow(createRequire(referenceModule));\n\t\t\t\t\t}\n\t\t\t\t\tif(clear){\n\t\t\t\t\t\tpendingCacheInsert = {};\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\t\tvar escapeString = function(s){\n\t\t\t\treturn s.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g, function(c){ return \"\\\\\" + c; });\n\t\t\t},\n\n\t\t\tcomputeMapProg = function(map, dest){\n\t\t\t\t// This routine takes a map as represented by a JavaScript object and initializes dest, a vector of\n\t\t\t\t// quads of (map-key, map-value, refex-for-map-key, length-of-map-key), sorted decreasing by length-\n\t\t\t\t// of-map-key. The regex looks for the map-key followed by either \"/\" or end-of-string at the beginning\n\t\t\t\t// of a the search source. Notice the map-value is irrelevant to the algorithm\n\t\t\t\tdest.splice(0, dest.length);\n\t\t\t\tfor(var p in map){\n\t\t\t\t\tdest.push([\n\t\t\t\t\t\tp,\n\t\t\t\t\t\tmap[p],\n\t\t\t\t\t\tnew RegExp(\"^\" + escapeString(p) + \"(\\/|$)\"),\n\t\t\t\t\t\tp.length]);\n\t\t\t\t}\n\t\t\t\tdest.sort(function(lhs, rhs){ return rhs[3] - lhs[3]; });\n\t\t\t\treturn dest;\n\t\t\t},\n\n\t\t\tcomputeAliases = function(config, dest){\n\t\t\t\tforEach(config, function(pair){\n\t\t\t\t\t// take a fixed-up copy...\n\t\t\t\t\tdest.push([isString(pair[0]) ? new RegExp(\"^\" + escapeString(pair[0]) + \"$\") : pair[0], pair[1]]);\n\t\t\t\t});\n\t\t\t},\n\n\n\t\t\tfixupPackageInfo = function(packageInfo){\n\t\t\t\t// calculate the precise (name, location, main, mappings) for a package\n\t\t\t\tvar name = packageInfo.name;\n\t\t\t\tif(!name){\n\t\t\t\t\t// packageInfo must be a string that gives the name\n\t\t\t\t\tname = packageInfo;\n\t\t\t\t\tpackageInfo = {name:name};\n\t\t\t\t}\n\t\t\t\tpackageInfo = mix({main:\"main\"}, packageInfo);\n\t\t\t\tpackageInfo.location = packageInfo.location ? packageInfo.location : name;\n\n\t\t\t\t// packageMap is deprecated in favor of AMD map\n\t\t\t\tif(packageInfo.packageMap){\n\t\t\t\t\tmap[name] = packageInfo.packageMap;\n\t\t\t\t}\n\n\t\t\t\tif(!packageInfo.main.indexOf(\"./\")){\n\t\t\t\t\tpackageInfo.main = packageInfo.main.substring(2);\n\t\t\t\t}\n\n\t\t\t\t// now that we've got a fully-resolved package object, push it into the configuration\n\t\t\t\tpacks[name] = packageInfo;\n\t\t\t},\n\n\t\t\tdelayedModuleConfig\n\t\t\t\t// module config cannot be consumed until the loader is completely initialized; therefore, all\n\t\t\t\t// module config detected during booting is memorized and applied at the end of loader initialization\n\t\t\t\t// TODO: this is a bit of a kludge; all config should be moved to end of loader initialization, but\n\t\t\t\t// we'll delay this chore and do it with a final loader 1.x cleanup after the 2.x loader prototyping is complete\n\t\t\t\t= [],\n\n\n\t\t\tconfig = function(config, booting, referenceModule){\n\t\t\t\tfor(var p in config){\n\t\t\t\t\tif(p==\"waitSeconds\"){\n\t\t\t\t\t\treq.waitms = (config[p] || 0) * 1000;\n\t\t\t\t\t}\n\t\t\t\t\tif(p==\"cacheBust\"){\n\t\t\t\t\t\tcacheBust = config[p] ? (isString(config[p]) ? config[p] : (new Date()).getTime() + \"\") : \"\";\n\t\t\t\t\t}\n\t\t\t\t\tif(p==\"baseUrl\" || p==\"combo\"){\n\t\t\t\t\t\treq[p] = config[p];\n\t\t\t\t\t}\n\t\t\t\t\tif( 0 && p==\"async\"){\n\t\t\t\t\t\t// falsy or \"sync\" => legacy sync loader\n\t\t\t\t\t\t// \"xd\" => sync but loading xdomain tree and therefore loading asynchronously (not configurable, set automatically by the loader)\n\t\t\t\t\t\t// \"legacyAsync\" => permanently in \"xd\" by choice\n\t\t\t\t\t\t// \"debugAtAllCosts\" => trying to load everything via script injection (not implemented)\n\t\t\t\t\t\t// otherwise, must be truthy => AMD\n\t\t\t\t\t\t// legacyMode: sync | legacyAsync | xd | false\n\t\t\t\t\t\tvar mode = config[p];\n\t\t\t\t\t\treq.legacyMode = legacyMode = (isString(mode) && /sync|legacyAsync/.test(mode) ? mode : (!mode ? sync : false));\n\t\t\t\t\t\treq.async = !legacyMode;\n\t\t\t\t\t}\n\t\t\t\t\tif(config[p]!==hasCache){\n\t\t\t\t\t\t// accumulate raw config info for client apps which can use this to pass their own config\n\t\t\t\t\t\treq.rawConfig[p] = config[p];\n\t\t\t\t\t\tp!=\"has\" && has.add(\"config-\"+p, config[p], 0, booting);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// make sure baseUrl exists\n\t\t\t\tif(!req.baseUrl){\n\t\t\t\t\treq.baseUrl = \"./\";\n\t\t\t\t}\n\t\t\t\t// make sure baseUrl ends with a slash\n\t\t\t\tif(!/\\/$/.test(req.baseUrl)){\n\t\t\t\t\treq.baseUrl += \"/\";\n\t\t\t\t}\n\n\t\t\t\t// now do the special work for has, packages, packagePaths, paths, aliases, and cache\n\n\t\t\t\tfor(p in config.has){\n\t\t\t\t\thas.add(p, config.has[p], 0, booting);\n\t\t\t\t}\n\n\t\t\t\t// for each package found in any packages config item, augment the packs map owned by the loader\n\t\t\t\tforEach(config.packages, fixupPackageInfo);\n\n\t\t\t\t// for each packagePath found in any packagePaths config item, augment the packageConfig\n\t\t\t\t// packagePaths is deprecated; remove in 2.0\n\t\t\t\tfor(var baseUrl in config.packagePaths){\n\t\t\t\t\tforEach(config.packagePaths[baseUrl], function(packageInfo){\n\t\t\t\t\t\tvar location = baseUrl + \"/\" + packageInfo;\n\t\t\t\t\t\tif(isString(packageInfo)){\n\t\t\t\t\t\t\tpackageInfo = {name:packageInfo};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpackageInfo.location = location;\n\t\t\t\t\t\tfixupPackageInfo(packageInfo);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// notice that computeMapProg treats the dest as a reference; therefore, if/when that variable\n\t\t\t\t// is published (see dojo-publish-privates), the published variable will always hold a valid value.\n\n\t\t\t\t// this must come after all package processing since package processing may mutate map\n\t\t\t\tcomputeMapProg(mix(map, config.map), mapProgs);\n\t\t\t\tforEach(mapProgs, function(item){\n\t\t\t\t\titem[1] = computeMapProg(item[1], []);\n\t\t\t\t\tif(item[0]==\"*\"){\n\t\t\t\t\t\tmapProgs.star = item;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// push in any paths and recompute the internal pathmap\n\t\t\t\tcomputeMapProg(mix(paths, config.paths), pathsMapProg);\n\n\t\t\t\t// aliases\n\t\t\t\tcomputeAliases(config.aliases, aliases);\n\n\t\t\t\tif (! 1 ) {\n\t\t\t\t\tif(booting){\n\t\t\t\t\t\tdelayedModuleConfig.push({config:config.config});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tfor(p in config.config){\n\t\t\t\t\t\t\tvar module = getModule(p, referenceModule);\n\t\t\t\t\t\t\tmodule.config = mix(module.config || {}, config.config[p]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// push in any new cache values\n\t\t\t\t\tif(config.cache){\n\t\t\t\t\t\tconsumePendingCacheInsert();\n\t\t\t\t\t\tpendingCacheInsert = config.cache;\n\t\t\t\t\t\t//inject now all depencies so cache is available for mapped module\n\t\t\t\t\t\tconsumePendingCacheInsert(0, !!config.cache[\"*noref\"]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsignal(\"config\", [config, req.rawConfig]);\n\t\t\t};\n\n\t\t//\n\t\t// execute the various sniffs; userConfig can override and value\n\t\t//\n\n\t\tif( 0 || 0 ){\n\t\t\t// the sniff regex looks for a src attribute ending in dojo.js, optionally preceded with a path.\n\t\t\t// match[3] returns the path to dojo.js (if any) without the trailing slash. This is used for the\n\t\t\t// dojo location on CDN deployments and baseUrl when either/both of these are not provided\n\t\t\t// explicitly in the config data; this is the 1.6- behavior.\n\n\t\t\tvar scripts = doc.getElementsByTagName(\"script\"),\n\t\t\t\ti = 0,\n\t\t\t\tscript, dojoDir, src, match;\n\t\t\twhile(i < scripts.length){\n\t\t\t\tscript = scripts[i++];\n\t\t\t\tif((src = script.getAttribute(\"src\")) && (match = src.match(/(((.*)\\/)|^)dojo\\.js(\\W|$)/i))){\n\t\t\t\t\t// sniff dojoDir and baseUrl\n\t\t\t\t\tdojoDir = match[3] || \"\";\n\t\t\t\t\tdefaultConfig.baseUrl = defaultConfig.baseUrl || dojoDir;\n\n\t\t\t\t\t// remember an insertPointSibling\n\t\t\t\t\tinsertPointSibling = script;\n\t\t\t\t}\n\n\t\t\t\t// sniff configuration on attribute in script element\n\t\t\t\tif((src = (script.getAttribute(\"data-dojo-config\") || script.getAttribute(\"djConfig\")))){\n\t\t\t\t\tdojoSniffConfig = req.eval(\"({ \" + src + \" })\", \"data-dojo-config\");\n\n\t\t\t\t\t// remember an insertPointSibling\n\t\t\t\t\tinsertPointSibling = script;\n\t\t\t\t}\n\n\t\t\t\t// sniff requirejs attribute\n\t\t\t\tif( 0 ){\n\t\t\t\t\tif((src = script.getAttribute(\"data-main\"))){\n\t\t\t\t\t\tdojoSniffConfig.deps = dojoSniffConfig.deps || [src];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( 0 ){\n\t\t\t// pass down doh.testConfig from parent as if it were a data-dojo-config\n\t\t\ttry{\n\t\t\t\tif(window.parent != window && window.parent.require){\n\t\t\t\t\tvar doh = window.parent.require(\"doh\");\n\t\t\t\t\tdoh && mix(dojoSniffConfig, doh.testConfig);\n\t\t\t\t}\n\t\t\t}catch(e){}\n\t\t}\n\n\t\t// configure the loader; let the user override defaults\n\t\treq.rawConfig = {};\n\t\tconfig(defaultConfig, 1);\n\n\t\t// do this before setting userConfig/sniffConfig to allow userConfig/sniff overrides\n\t\tif( 0 ){\n\t\t\tpacks.dojo.location = dojoDir;\n\t\t\tif(dojoDir){\n\t\t\t\tdojoDir += \"/\";\n\t\t\t}\n\t\t\tpacks.dijit.location = dojoDir + \"../dijit/\";\n\t\t\tpacks.dojox.location = dojoDir + \"../dojox/\";\n\t\t}\n\n\t\tconfig(userConfig, 1);\n\t\tconfig(dojoSniffConfig, 1);\n\n\t}else{\n\t\t// no config API, assume defaultConfig has everything the loader needs...for the entire lifetime of the application\n\t\tpaths = defaultConfig.paths;\n\t\tpathsMapProg = defaultConfig.pathsMapProg;\n\t\tpacks = defaultConfig.packs;\n\t\taliases = defaultConfig.aliases;\n\t\tmapProgs = defaultConfig.mapProgs;\n\t\tmodules = defaultConfig.modules;\n\t\tcache = defaultConfig.cache;\n\t\tcacheBust = defaultConfig.cacheBust;\n\n\t\t// remember the default config for other processes (e.g., dojo/config)\n\t\treq.rawConfig = defaultConfig;\n\t}\n\n\n\tif (! 1 ) {\n\t\tif( 0 ){\n\t\t\treq.combo = req.combo || {add:noop};\n\t\t\tvar comboPending = 0,\n\t\t\t\tcombosPending = [],\n\t\t\t\tcomboPendingTimer = null;\n\t\t}\n\t\t\n\n\t\t// build the loader machinery iaw configuration, including has feature tests\n\t\tvar injectDependencies = function(module){\n\t\t\t\t// checkComplete!=0 holds the idle signal; we're not idle if we're injecting dependencies\n\t\t\t\tguardCheckComplete(function(){\n\t\t\t\t\tforEach(module.deps, injectModule);\n\t\t\t\t\tif( 0 && comboPending && !comboPendingTimer){\n\t\t\t\t\t\tcomboPendingTimer = setTimeout(function() {\n\t\t\t\t\t\t\tcomboPending = 0;\n\t\t\t\t\t\t\tcomboPendingTimer = null;\n\t\t\t\t\t\t\treq.combo.done(function(mids, url) {\n\t\t\t\t\t\t\t\tvar onLoadCallback= function(){\n\t\t\t\t\t\t\t\t\t// defQ is a vector of module definitions 1-to-1, onto mids\n\t\t\t\t\t\t\t\t\trunDefQ(0, mids);\n\t\t\t\t\t\t\t\t\tcheckComplete();\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tcombosPending.push(mids);\n\t\t\t\t\t\t\t\tinjectingModule = mids;\n\t\t\t\t\t\t\t\treq.injectUrl(url, onLoadCallback, mids);\n\t\t\t\t\t\t\t\tinjectingModule = 0;\n\t\t\t\t\t\t\t}, req);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tcontextRequire = function(a1, a2, a3, referenceModule, contextRequire){\n\t\t\t\tvar module, syntheticMid;\n\t\t\t\tif(isString(a1)){\n\t\t\t\t\t// signature is (moduleId)\n\t\t\t\t\tmodule = getModule(a1, referenceModule, true);\n\t\t\t\t\tif(module && module.executed){\n\t\t\t\t\t\treturn module.result;\n\t\t\t\t\t}\n\t\t\t\t\tthrow makeError(\"undefinedModule\", a1);\n\t\t\t\t}\n\t\t\t\tif(!isArray(a1)){\n\t\t\t\t\t// a1 is a configuration\n\t\t\t\t\tconfig(a1, 0, referenceModule);\n\n\t\t\t\t\t// juggle args; (a2, a3) may be (dependencies, callback)\n\t\t\t\t\ta1 = a2;\n\t\t\t\t\ta2 = a3;\n\t\t\t\t}\n\t\t\t\tif(isArray(a1)){\n\t\t\t\t\t// signature is (requestList [,callback])\n\t\t\t\t\tif(!a1.length){\n\t\t\t\t\t\ta2 && a2();\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsyntheticMid = \"require*\" + uid();\n\n\t\t\t\t\t\t// resolve the request list with respect to the reference module\n\t\t\t\t\t\tfor(var mid, deps = [], i = 0; i < a1.length;){\n\t\t\t\t\t\t\tmid = a1[i++];\n\t\t\t\t\t\t\tdeps.push(getModule(mid, referenceModule));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// construct a synthetic module to control execution of the requestList, and, optionally, callback\n\t\t\t\t\t\tmodule = mix(makeModuleInfo(\"\", syntheticMid, 0, \"\"), {\n\t\t\t\t\t\t\tinjected: arrived,\n\t\t\t\t\t\t\tdeps: deps,\n\t\t\t\t\t\t\tdef: a2 || noop,\n\t\t\t\t\t\t\trequire: referenceModule ? referenceModule.require : req,\n\t\t\t\t\t\t\tgc: 1 //garbage collect\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmodules[module.mid] = module;\n\n\t\t\t\t\t\t// checkComplete!=0 holds the idle signal; we're not idle if we're injecting dependencies\n\t\t\t\t\t\tinjectDependencies(module);\n\n\t\t\t\t\t\t// try to immediately execute\n\t\t\t\t\t\t// if already traversing a factory tree, then strict causes circular dependency to abort the execution; maybe\n\t\t\t\t\t\t// it's possible to execute this require later after the current traversal completes and avoid the circular dependency.\n\t\t\t\t\t\t// ...but *always* insist on immediate in synch mode\n\t\t\t\t\t\tvar strict = checkCompleteGuard && legacyMode!=sync;\n\t\t\t\t\t\tguardCheckComplete(function(){\n\t\t\t\t\t\t\texecModule(module, strict);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(!module.executed){\n\t\t\t\t\t\t\t// some deps weren't on board or circular dependency detected and strict; therefore, push into the execQ\n\t\t\t\t\t\t\texecQ.push(module);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcheckComplete();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn contextRequire;\n\t\t\t},\n\n\t\t\tcreateRequire = function(module){\n\t\t\t\tif(!module){\n\t\t\t\t\treturn req;\n\t\t\t\t}\n\t\t\t\tvar result = module.require;\n\t\t\t\tif(!result){\n\t\t\t\t\tresult = function(a1, a2, a3){\n\t\t\t\t\t\treturn contextRequire(a1, a2, a3, module, result);\n\t\t\t\t\t};\n\t\t\t\t\tmodule.require = mix(result, req);\n\t\t\t\t\tresult.module = module;\n\t\t\t\t\tresult.toUrl = function(name){\n\t\t\t\t\t\treturn toUrl(name, module);\n\t\t\t\t\t};\n\t\t\t\t\tresult.toAbsMid = function(mid){\n\t\t\t\t\t\treturn toAbsMid(mid, module);\n\t\t\t\t\t};\n\t\t\t\t\tif( 0 ){\n\t\t\t\t\t\tresult.undef = function(mid){\n\t\t\t\t\t\t\treq.undef(mid, module);\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif( 0 ){\n\t\t\t\t\t\tresult.syncLoadNls = function(mid){\n\t\t\t\t\t\t\tvar nlsModuleInfo = getModuleInfo(mid, module),\n\t\t\t\t\t\t\t\tnlsModule = modules[nlsModuleInfo.mid];\n\t\t\t\t\t\t\tif(!nlsModule || !nlsModule.executed){\n\t\t\t\t\t\t\t\tcached = cache[nlsModuleInfo.mid] || cache[urlKeyPrefix + nlsModuleInfo.url];\n\t\t\t\t\t\t\t\tif(cached){\n\t\t\t\t\t\t\t\t\tevalModuleText(cached);\n\t\t\t\t\t\t\t\t\tnlsModule = modules[nlsModuleInfo.mid];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn nlsModule && nlsModule.executed && nlsModule.result;\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t},\n\n\t\t execQ =\n\t\t\t\t// The list of modules that need to be evaluated.\n\t\t\t\t[],\n\n\t\t\tdefQ =\n\t\t\t\t// The queue of define arguments sent to loader.\n\t\t\t\t[],\n\n\t\t\twaiting =\n\t\t\t\t// The set of modules upon which the loader is waiting for definition to arrive\n\t\t\t\t{},\n\n\t\t\tsetRequested = function(module){\n\t\t\t\tmodule.injected = requested;\n\t\t\t\twaiting[module.mid] = 1;\n\t\t\t\tif(module.url){\n\t\t\t\t\twaiting[module.url] = module.pack || 1;\n\t\t\t\t}\n\t\t\t\tstartTimer();\n\t\t\t},\n\n\t\t\tsetArrived = function(module){\n\t\t\t\tmodule.injected = arrived;\n\t\t\t\tdelete waiting[module.mid];\n\t\t\t\tif(module.url){\n\t\t\t\t\tdelete waiting[module.url];\n\t\t\t\t}\n\t\t\t\tif(isEmpty(waiting)){\n\t\t\t\t\tclearTimer();\n\t\t\t\t\t 0 && legacyMode==xd && (legacyMode = sync);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\texecComplete = req.idle =\n\t\t\t\t// says the loader has completed (or not) its work\n\t\t\t\tfunction(){\n\t\t\t\t\treturn !defQ.length && isEmpty(waiting) && !execQ.length && !checkCompleteGuard;\n\t\t\t\t};\n\t}\n\n\tvar runMapProg = function(targetMid, map){\n\t\t\t// search for targetMid in map; return the map item if found; falsy otherwise\n\t\t\tif(map){\n\t\t\tfor(var i = 0; i < map.length; i++){\n\t\t\t\tif(map[i][2].test(targetMid)){\n\t\t\t\t\treturn map[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\tcompactPath = function(path){\n\t\t\tvar result = [],\n\t\t\t\tsegment, lastSegment;\n\t\t\tpath = path.replace(/\\\\/g, '/').split('/');\n\t\t\twhile(path.length){\n\t\t\t\tsegment = path.shift();\n\t\t\t\tif(segment==\"..\" && result.length && lastSegment!=\"..\"){\n\t\t\t\t\tresult.pop();\n\t\t\t\t\tlastSegment = result[result.length - 1];\n\t\t\t\t}else if(segment!=\".\"){\n\t\t\t\t\tresult.push(lastSegment= segment);\n\t\t\t\t} // else ignore \".\"\n\t\t\t}\n\t\t\treturn result.join(\"/\");\n\t\t},\n\n\t\tmakeModuleInfo = function(pid, mid, pack, url){\n\t\t\tif( 0 ){\n\t\t\t\tvar xd= req.isXdUrl(url);\n\t\t\t\treturn {pid:pid, mid:mid, pack:pack, url:url, executed:0, def:0, isXd:xd, isAmd:!!(xd || (packs[pid] && packs[pid].isAmd))};\n\t\t\t}else{\n\t\t\t\treturn {pid:pid, mid:mid, pack:pack, url:url, executed:0, def:0};\n\t\t\t}\n\t\t},\n\n\t\tgetModuleInfo_ = function(mid, referenceModule, packs, modules, baseUrl, mapProgs, pathsMapProg, aliases, alwaysCreate, fromPendingCache){\n\t\t\t// arguments are passed instead of using lexical variables so that this function my be used independent of the loader (e.g., the builder)\n\t\t\t// alwaysCreate is useful in this case so that getModuleInfo never returns references to real modules owned by the loader\n\t\t\tvar pid, pack, midInPackage, mapItem, url, result, isRelative, requestedMid;\n\t\t\trequestedMid = mid;\n\t\t\tisRelative = /^\\./.test(mid);\n\t\t\tif(/(^\\/)|(\\:)|(\\.js$)/.test(mid) || (isRelative && !referenceModule)){\n\t\t\t\t// absolute path or protocol of .js filetype, or relative path but no reference module and therefore relative to page\n\t\t\t\t// whatever it is, it's not a module but just a URL of some sort\n\t\t\t\t// note: pid===0 indicates the routine is returning an unmodified mid\n\n\t\t\t\treturn makeModuleInfo(0, mid, 0, mid);\n\t\t\t}else{\n\t\t\t\t// relative module ids are relative to the referenceModule; get rid of any dots\n\t\t\t\tmid = compactPath(isRelative ? (referenceModule.mid + \"/../\" + mid) : mid);\n\t\t\t\tif(/^\\./.test(mid)){\n\t\t\t\t\tthrow makeError(\"irrationalPath\", mid);\n\t\t\t\t}\n\t\t\t\t// at this point, mid is an absolute mid\n\n\t\t\t\t// map the mid\n\t\t\t\tif(!fromPendingCache && !isRelative && mapProgs.star){\n\t\t\t\t\tmapItem = runMapProg(mid, mapProgs.star[1]);\n\t\t\t\t}\n\t\t\t\tif(!mapItem && referenceModule){\n\t\t\t\t\tmapItem = runMapProg(referenceModule.mid, mapProgs);\n\t\t\t\t\tmapItem = mapItem && runMapProg(mid, mapItem[1]);\n\t\t\t\t}\n\n\t\t\t\tif(mapItem){\n\t\t\t\t\tmid = mapItem[1] + mid.substring(mapItem[3]);\n\t\t\t\t\t}\n\n\t\t\t\tmatch = mid.match(/^([^\\/]+)(\\/(.+))?$/);\n\t\t\t\tpid = match ? match[1] : \"\";\n\t\t\t\tif((pack = packs[pid])){\n\t\t\t\t\tmid = pid + \"/\" + (midInPackage = (match[3] || pack.main));\n\t\t\t\t}else{\n\t\t\t\t\tpid = \"\";\n\t\t\t\t}\n\n\t\t\t\t// search aliases\n\t\t\t\tvar candidateLength = 0,\n\t\t\t\t\tcandidate = 0;\n\t\t\t\tforEach(aliases, function(pair){\n\t\t\t\t\tvar match = mid.match(pair[0]);\n\t\t\t\t\tif(match && match.length>candidateLength){\n\t\t\t\t\t\tcandidate = isFunction(pair[1]) ? mid.replace(pair[0], pair[1]) : pair[1];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(candidate){\n\t\t\t\t\treturn getModuleInfo_(candidate, 0, packs, modules, baseUrl, mapProgs, pathsMapProg, aliases, alwaysCreate);\n\t\t\t\t}\n\n\t\t\t\tresult = modules[mid];\n\t\t\t\tif(result){\n\t\t\t\t\treturn alwaysCreate ? makeModuleInfo(result.pid, result.mid, result.pack, result.url) : modules[mid];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// get here iff the sought-after module does not yet exist; therefore, we need to compute the URL given the\n\t\t\t// fully resolved (i.e., all relative indicators and package mapping resolved) module id\n\n\t\t\t// note: pid!==0 indicates the routine is returning a url that has .js appended unmodified mid\n\t\t\tmapItem = runMapProg(mid, pathsMapProg);\n\t\t\tif(mapItem){\n\t\t\t\turl = mapItem[1] + mid.substring(mapItem[3]);\n\t\t\t}else if(pid){\n\t\t\t\turl = (pack.location.slice(-1) === '/' ? pack.location.slice(0, -1) : pack.location) + \"/\" + midInPackage;\n\t\t\t}else if( 0 ){\n\t\t\t\turl = \"../\" + mid;\n\t\t\t}else{\n\t\t\t\turl = mid;\n\t\t\t}\n\t\t\t// if result is not absolute, add baseUrl\n\t\t\tif(!(/(^\\/)|(\\:)/.test(url))){\n\t\t\t\turl = baseUrl + url;\n\t\t\t}\n\t\t\turl += \".js\";\n\t\t\treturn makeModuleInfo(pid, mid, pack, compactPath(url));\n\t\t},\n\n\t\tgetModuleInfo = function(mid, referenceModule, fromPendingCache){\n\t\t\treturn getModuleInfo_(mid, referenceModule, packs, modules, req.baseUrl, mapProgs, pathsMapProg, aliases, undefined, fromPendingCache);\n\t\t};\n\n\tif (! 1 ) {\n\t\tvar resolvePluginResourceId = function(plugin, prid, referenceModule){\n\t\t\t\treturn plugin.normalize ? plugin.normalize(prid, function(mid){return toAbsMid(mid, referenceModule);}) : toAbsMid(prid, referenceModule);\n\t\t\t},\n\n\t\t\tdynamicPluginUidGenerator = 0,\n\n\t\t\tgetModule = function(mid, referenceModule, immediate){\n\t\t\t\t// compute and optionally construct (if necessary) the module implied by the mid with respect to referenceModule\n\t\t\t\tvar match, plugin, prid, result;\n\t\t\t\tmatch = mid.match(/^(.+?)\\!(.*)$/);\n\t\t\t\tif(match){\n\t\t\t\t\t// name was <plugin-module>!<plugin-resource-id>\n\t\t\t\t\tplugin = getModule(match[1], referenceModule, immediate);\n\n\t\t\t\t\tif( 0 && legacyMode == sync && !plugin.executed){\n\t\t\t\t\t\tinjectModule(plugin);\n\t\t\t\t\t\tif(plugin.injected===arrived && !plugin.executed){\n\t\t\t\t\t\t\tguardCheckComplete(function(){\n\t\t\t\t\t\t\t\texecModule(plugin);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(plugin.executed){\n\t\t\t\t\t\t\tpromoteModuleToPlugin(plugin);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// we are in xdomain mode for some reason\n\t\t\t\t\t\t\texecQ.unshift(plugin);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\n\t\t\t\t\tif(plugin.executed === executed && !plugin.load){\n\t\t\t\t\t\t// executed the module not knowing it was a plugin\n\t\t\t\t\t\tpromoteModuleToPlugin(plugin);\n\t\t\t\t\t}\n\n\t\t\t\t\t// if the plugin has not been loaded, then can't resolve the prid and must assume this plugin is dynamic until we find out otherwise\n\t\t\t\t\tif(plugin.load){\n\t\t\t\t\t\tprid = resolvePluginResourceId(plugin, match[2], referenceModule);\n\t\t\t\t\t\tmid = (plugin.mid + \"!\" + (plugin.dynamic ? ++dynamicPluginUidGenerator + \"!\" : \"\") + prid);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tprid = match[2];\n\t\t\t\t\t\tmid = plugin.mid + \"!\" + (++dynamicPluginUidGenerator) + \"!waitingForPlugin\";\n\t\t\t\t\t}\n\t\t\t\t\tresult = {plugin:plugin, mid:mid, req:createRequire(referenceModule), prid:prid};\n\t\t\t\t}else{\n\t\t\t\t\tresult = getModuleInfo(mid, referenceModule);\n\t\t\t\t}\n\t\t\t\treturn modules[result.mid] || (!immediate && (modules[result.mid] = result));\n\t\t\t};\n\t}\n\n\tvar toAbsMid = req.toAbsMid = function(mid, referenceModule){\n\t\t\treturn getModuleInfo(mid, referenceModule).mid;\n\t\t},\n\n\t\ttoUrl = req.toUrl = function(name, referenceModule){\n\t\t\tvar moduleInfo = getModuleInfo(name+\"/x\", referenceModule),\n\t\t\t\turl= moduleInfo.url;\n\t\t\treturn fixupUrl(moduleInfo.pid===0 ?\n\t\t\t\t// if pid===0, then name had a protocol or absolute path; either way, toUrl is the identify function in such cases\n\t\t\t\tname :\n\t\t\t\t// \"/x.js\" since getModuleInfo automatically appends \".js\" and we appended \"/x\" to make name look like a module id\n\t\t\t\turl.substring(0, url.length-5)\n\t\t\t);\n\t\t};\n\n\tif (! 1 ) {\n\t\tvar nonModuleProps = {\n\t\t\t\tinjected: arrived,\n\t\t\t\texecuted: executed,\n\t\t\t\tdef: nonmodule,\n\t\t\t\tresult: nonmodule\n\t\t\t},\n\n\t\t\tmakeCjs = function(mid){\n\t\t\t\treturn modules[mid] = mix({mid:mid}, nonModuleProps);\n\t\t\t},\n\n\t\t\tcjsRequireModule = makeCjs(\"require\"),\n\t\t\tcjsExportsModule = makeCjs(\"exports\"),\n\t\t\tcjsModuleModule = makeCjs(\"module\"),\n\n\t\t\trunFactory = function(module, args){\n\t\t\t\treq.trace(\"loader-run-factory\", [module.mid]);\n\t\t\t\tvar factory = module.def,\n\t\t\t\t\tresult;\n\t\t\t\t 0 && syncExecStack.unshift(module);\n\t\t\t\tif( 0 ){\n\t\t\t\t\ttry{\n\t\t\t\t\t\tresult= isFunction(factory) ? factory.apply(null, args) : factory;\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tsignal(error, module.result = makeError(\"factoryThrew\", [module, e]));\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tresult= isFunction(factory) ? factory.apply(null, args) : factory;\n\t\t\t\t}\n\t\t\t\tmodule.result = result===undefined && module.cjs ? module.cjs.exports : result;\n\t\t\t\t 0 && syncExecStack.shift(module);\n\t\t\t},\n\n\t\t\tabortExec = {},\n\n\t\t\tdefOrder = 0,\n\n\t\t\tpromoteModuleToPlugin = function(pluginModule){\n\t\t\t\tvar plugin = pluginModule.result;\n\t\t\t\tpluginModule.dynamic = plugin.dynamic;\n\t\t\t\tpluginModule.normalize = plugin.normalize;\n\t\t\t\tpluginModule.load = plugin.load;\n\t\t\t\treturn pluginModule;\n\t\t\t},\n\n\t\t\tresolvePluginLoadQ = function(plugin){\n\t\t\t\t// plugins is a newly executed module that has a loadQ waiting to run\n\n\t\t\t\t// step 1: traverse the loadQ and fixup the mid and prid; remember the map from original mid to new mid\n\t\t\t\t// recall the original mid was created before the plugin was on board and therefore it was impossible to\n\t\t\t\t// compute the final mid; accordingly, prid may or may not change, but the mid will definitely change\n\t\t\t\tvar map = {};\n\t\t\t\tforEach(plugin.loadQ, function(pseudoPluginResource){\n\t\t\t\t\t// manufacture and insert the real module in modules\n\t\t\t\t\tvar prid = resolvePluginResourceId(plugin, pseudoPluginResource.prid, pseudoPluginResource.req.module),\n\t\t\t\t\t\tmid = plugin.dynamic ? pseudoPluginResource.mid.replace(/waitingForPlugin$/, prid) : (plugin.mid + \"!\" + prid),\n\t\t\t\t\t\tpluginResource = mix(mix({}, pseudoPluginResource), {mid:mid, prid:prid, injected:0});\n\t\t\t\t\tif(!modules[mid] || !modules[mid].injected /*for require.undef*/){\n\t\t\t\t\t\t// create a new (the real) plugin resource and inject it normally now that the plugin is on board\n\t\t\t\t\t\tinjectPlugin(modules[mid] = pluginResource);\n\t\t\t\t\t} // else this was a duplicate request for the same (plugin, rid) for a nondynamic plugin\n\n\t\t\t\t\t// pluginResource is really just a placeholder with the wrong mid (because we couldn't calculate it until the plugin was on board)\n\t\t\t\t\t// mark is as arrived and delete it from modules; the real module was requested above\n\t\t\t\t\tmap[pseudoPluginResource.mid] = modules[mid];\n\t\t\t\t\tsetArrived(pseudoPluginResource);\n\t\t\t\t\tdelete modules[pseudoPluginResource.mid];\n\t\t\t\t});\n\t\t\t\tplugin.loadQ = 0;\n\n\t\t\t\t// step2: replace all references to any placeholder modules with real modules\n\t\t\t\tvar substituteModules = function(module){\n\t\t\t\t\tfor(var replacement, deps = module.deps || [], i = 0; i<deps.length; i++){\n\t\t\t\t\t\treplacement = map[deps[i].mid];\n\t\t\t\t\t\tif(replacement){\n\t\t\t\t\t\t\tdeps[i] = replacement;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tfor(var p in modules){\n\t\t\t\t\tsubstituteModules(modules[p]);\n\t\t\t\t}\n\t\t\t\tforEach(execQ, substituteModules);\n\t\t\t},\n\n\t\t\tfinishExec = function(module){\n\t\t\t\treq.trace(\"loader-finish-exec\", [module.mid]);\n\t\t\t\tmodule.executed = executed;\n\t\t\t\tmodule.defOrder = defOrder++;\n\t\t\t\t 0 && forEach(module.provides, function(cb){ cb(); });\n\t\t\t\tif(module.loadQ){\n\t\t\t\t\t// the module was a plugin\n\t\t\t\t\tpromoteModuleToPlugin(module);\n\t\t\t\t\tresolvePluginLoadQ(module);\n\t\t\t\t}\n\t\t\t\t// remove all occurrences of this module from the execQ\n\t\t\t\tfor(i = 0; i < execQ.length;){\n\t\t\t\t\tif(execQ[i] === module){\n\t\t\t\t\t\texecQ.splice(i, 1);\n\t\t\t\t\t}else{\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// delete references to synthetic modules\n\t\t\t\tif (/^require\\*/.test(module.mid)) {\n\t\t\t\t\tdelete modules[module.mid];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tcircleTrace = [],\n\n\t\t\texecModule = function(module, strict){\n\t\t\t\t// run the dependency vector, then run the factory for module\n\t\t\t\tif(module.executed === executing){\n\t\t\t\t\treq.trace(\"loader-circular-dependency\", [circleTrace.concat(module.mid).join(\"->\")]);\n\t\t\t\t\treturn (!module.def || strict) ? abortExec : (module.cjs && module.cjs.exports);\n\t\t\t\t}\n\t\t\t\t// at this point the module is either not executed or fully executed\n\n\n\t\t\t\tif(!module.executed){\n\t\t\t\t\tif(!module.def){\n\t\t\t\t\t\treturn abortExec;\n\t\t\t\t\t}\n\t\t\t\t\tvar mid = module.mid,\n\t\t\t\t\t\tdeps = module.deps || [],\n\t\t\t\t\t\targ, argResult,\n\t\t\t\t\t\targs = [],\n\t\t\t\t\t\ti = 0;\n\n\t\t\t\t\tif( 0 ){\n\t\t\t\t\t\tcircleTrace.push(mid);\n\t\t\t\t\t\treq.trace(\"loader-exec-module\", [\"exec\", circleTrace.length, mid]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// for circular dependencies, assume the first module encountered was executed OK\n\t\t\t\t\t// modules that circularly depend on a module that has not run its factory will get\n\t\t\t\t\t// the pre-made cjs.exports===module.result. They can take a reference to this object and/or\n\t\t\t\t\t// add properties to it. When the module finally runs its factory, the factory can\n\t\t\t\t\t// read/write/replace this object. Notice that so long as the object isn't replaced, any\n\t\t\t\t\t// reference taken earlier while walking the deps list is still valid.\n\t\t\t\t\tmodule.executed = executing;\n\t\t\t\t\twhile((arg = deps[i++])){\n\t\t\t\t\t\targResult = ((arg === cjsRequireModule) ? createRequire(module) :\n\t\t\t\t\t\t\t\t\t\t((arg === cjsExportsModule) ? module.cjs.exports :\n\t\t\t\t\t\t\t\t\t\t\t((arg === cjsModuleModule) ? module.cjs :\n\t\t\t\t\t\t\t\t\t\t\t\texecModule(arg, strict))));\n\t\t\t\t\t\tif(argResult === abortExec){\n\t\t\t\t\t\t\tmodule.executed = 0;\n\t\t\t\t\t\t\treq.trace(\"loader-exec-module\", [\"abort\", mid]);\n\t\t\t\t\t\t\t 0 && circleTrace.pop();\n\t\t\t\t\t\t\treturn abortExec;\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.push(argResult);\n\t\t\t\t\t}\n\t\t\t\t\trunFactory(module, args);\n\t\t\t\t\tfinishExec(module);\n\t\t\t\t\t 0 && circleTrace.pop();\n\t\t\t\t}\n\t\t\t\t// at this point the module is guaranteed fully executed\n\n\t\t\t\treturn module.result;\n\t\t\t},\n\n\n\t\t\tcheckCompleteGuard = 0,\n\n\t\t\tguardCheckComplete = function(proc){\n\t\t\t\ttry{\n\t\t\t\t\tcheckCompleteGuard++;\n\t\t\t\t\tproc();\n\t\t\t\t}catch(e){\n\t\t\t\t\t// https://bugs.dojotoolkit.org/ticket/16617\n\t\t\t\t\tthrow e;\n\t\t\t\t}finally{\n\t\t\t\t\tcheckCompleteGuard--;\n\t\t\t\t}\n\t\t\t\tif(execComplete()){\n\t\t\t\t\tsignal(\"idle\", []);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tcheckComplete = function(){\n\t\t\t\t// keep going through the execQ as long as at least one factory is executed\n\t\t\t\t// plugins, recursion, cached modules all make for many execution path possibilities\n\t\t\t\tif(checkCompleteGuard){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tguardCheckComplete(function(){\n\t\t\t\t\tcheckDojoRequirePlugin();\n\t\t\t\t\tfor(var currentDefOrder, module, i = 0; i < execQ.length;){\n\t\t\t\t\t\tcurrentDefOrder = defOrder;\n\t\t\t\t\t\tmodule = execQ[i];\n\t\t\t\t\t\texecModule(module);\n\t\t\t\t\t\tif(currentDefOrder!=defOrder){\n\t\t\t\t\t\t\t// defOrder was bumped one or more times indicating something was executed (note, this indicates\n\t\t\t\t\t\t\t// the execQ was modified, maybe a lot (for example a later module causes an earlier module to execute)\n\t\t\t\t\t\t\tcheckDojoRequirePlugin();\n\t\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// nothing happened; check the next module in the exec queue\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t}\n\n\tvar fixupUrl= typeof userConfig.fixupUrl == \"function\" ? userConfig.fixupUrl : function(url){\n\t\t\turl += \"\"; // make sure url is a Javascript string (some paths may be a Java string)\n\t\t\treturn url + (cacheBust ? ((/\\?/.test(url) ? \"&\" : \"?\") + cacheBust) : \"\");\n\t\t};\n\n\n\n\tif( 0 ){\n\t\treq.undef = function(moduleId, referenceModule){\n\t\t\t// In order to reload a module, it must be undefined (this routine) and then re-requested.\n\t\t\t// This is useful for testing frameworks (at least).\n\t\t\tvar module = getModule(moduleId, referenceModule);\n\t\t\tsetArrived(module);\n\t\t\tmix(module, {def:0, executed:0, injected:0, node:0, load:0});\n\t\t};\n\t}\n\n\tif( false ){\n\t\tif( 0 ===undefined){\n\t\t\t 0 && has.add(\"dojo-loader-eval-hint-url\", 1);\n\t\t}\n\n\t\tvar injectPlugin = function(\n\t\t\t\tmodule\n\t\t\t){\n\t\t\t\t// injects the plugin module given by module; may have to inject the plugin itself\n\t\t\t\tvar plugin = module.plugin;\n\n\t\t\t\tif(plugin.executed === executed && !plugin.load){\n\t\t\t\t\t// executed the module not knowing it was a plugin\n\t\t\t\t\tpromoteModuleToPlugin(plugin);\n\t\t\t\t}\n\n\t\t\t\tvar onLoad = function(def){\n\t\t\t\t\t\tmodule.result = def;\n\t\t\t\t\t\tsetArrived(module);\n\t\t\t\t\t\tfinishExec(module);\n\t\t\t\t\t\tcheckComplete();\n\t\t\t\t\t};\n\n\t\t\t\tif(plugin.load){\n\t\t\t\t\tplugin.load(module.prid, module.req, onLoad);\n\t\t\t\t}else if(plugin.loadQ){\n\t\t\t\t\tplugin.loadQ.push(module);\n\t\t\t\t}else{\n\t\t\t\t\t// the unshift instead of push is important: we don't want plugins to execute as\n\t\t\t\t\t// dependencies of some other module because this may cause circles when the plugin\n\t\t\t\t\t// loadQ is run; also, generally, we want plugins to run early since they may load\n\t\t\t\t\t// several other modules and therefore can potentially unblock many modules\n\t\t\t\t\tplugin.loadQ = [module];\n\t\t\t\t\texecQ.unshift(plugin);\n\t\t\t\t\tinjectModule(plugin);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// for IE, injecting a module may result in a recursive execution if the module is in the cache\n\n\t\t\tcached = 0,\n\n\t\t\tinjectingModule = 0,\n\n\t\t\tinjectingCachedModule = 0,\n\n\t\t\tevalModuleText = function(text, module){\n\t\t\t\t// see def() for the injectingCachedModule bracket; it simply causes a short, safe circuit\n\t\t\t\tif( 0 ){\n\t\t\t\t\ttext = text.replace(/([\"'])use strict\\1/g, '');\n\t\t\t\t}\n\t\t\t\tinjectingCachedModule = 1;\n\t\t\t\tif( 0 ){\n\t\t\t\t\ttry{\n\t\t\t\t\t\tif(text===cached){\n\t\t\t\t\t\t\tcached.call(null);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\treq.eval(text, 0 ? module.url : module.mid);\n\t\t\t\t\t\t}\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tsignal(error, makeError(\"evalModuleThrew\", module));\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tif(text===cached){\n\t\t\t\t\t\tcached.call(null);\n\t\t\t\t\t}else{\n\t\t\t\t\t\treq.eval(text, 0 ? module.url : module.mid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tinjectingCachedModule = 0;\n\t\t\t},\n\n\t\t\tinjectModule = function(module){\n\t\t\t\t// Inject the module. In the browser environment, this means appending a script element into\n\t\t\t\t// the document; in other environments, it means loading a file.\n\t\t\t\t//\n\t\t\t\t// If in synchronous mode, then get the module synchronously if it's not xdomainLoading.\n\n\t\t\t\tvar mid = module.mid,\n\t\t\t\t\turl = module.url;\n\t\t\t\tif(module.executed || module.injected || waiting[mid] || (module.url && ((module.pack && waiting[module.url]===module.pack) || waiting[module.url]==1))){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetRequested(module);\n\n\t\t\t\tif( 0 ){\n\t\t\t\t\tvar viaCombo = 0;\n\t\t\t\t\tif(module.plugin && module.plugin.isCombo){\n\t\t\t\t\t\t// a combo plugin; therefore, must be handled by combo service\n\t\t\t\t\t\t// the prid should have already been converted to a URL (if required by the plugin) during\n\t\t\t\t\t\t// the normalize process; in any event, there is no way for the loader to know how to\n\t\t\t\t\t\t// to the conversion; therefore the third argument is zero\n\t\t\t\t\t\treq.combo.add(module.plugin.mid, module.prid, 0, req);\n\t\t\t\t\t\tviaCombo = 1;\n\t\t\t\t\t}else if(!module.plugin){\n\t\t\t\t\t\tviaCombo = req.combo.add(0, module.mid, module.url, req);\n\t\t\t\t\t}\n\t\t\t\t\tif(viaCombo){\n\t\t\t\t\t\tcomboPending= 1;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(module.plugin){\n\t\t\t\t\tinjectPlugin(module);\n\t\t\t\t\treturn;\n\t\t\t\t} // else a normal module (not a plugin)\n\n\n\t\t\t\tvar onLoadCallback = function(){\n\t\t\t\t\trunDefQ(module);\n\t\t\t\t\tif(module.injected !== arrived){\n\t\t\t\t\t\t// the script that contained the module arrived and has been executed yet\n\t\t\t\t\t\t// nothing was added to the defQ (so it wasn't an AMD module) and the module\n\t\t\t\t\t\t// wasn't marked as arrived by dojo.provide (so it wasn't a v1.6- module);\n\t\t\t\t\t\t// therefore, it must not have been a module; adjust state accordingly\n\t\t\t\t\t\tif( 0 ){\n\t\t\t\t\t\t\tsignal(error, makeError(\"noDefine\", module));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetArrived(module);\n\t\t\t\t\t\tmix(module, nonModuleProps);\n\t\t\t\t\t\treq.trace(\"loader-define-nonmodule\", [module.url]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif( 0 && legacyMode){\n\t\t\t\t\t\t// must call checkComplete even in for sync loader because we may be in xdomainLoading mode;\n\t\t\t\t\t\t// but, if xd loading, then don't call checkComplete until out of the current sync traversal\n\t\t\t\t\t\t// in order to preserve order of execution of the dojo.required modules\n\t\t\t\t\t\t!syncExecStack.length && checkComplete();\n\t\t\t\t\t}else{\n\t\t\t\t\t\tcheckComplete();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tcached = cache[mid] || cache[urlKeyPrefix + module.url];\n\t\t\t\tif(cached){\n\t\t\t\t\treq.trace(\"loader-inject\", [\"cache\", module.mid, url]);\n\t\t\t\t\tevalModuleText(cached, module);\n\t\t\t\t\tonLoadCallback();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif( 0 && legacyMode){\n\t\t\t\t\tif(module.isXd){\n\t\t\t\t\t\t// switch to async mode temporarily; if current legacyMode!=sync, then is must be one of {legacyAsync, xd, false}\n\t\t\t\t\t\tlegacyMode==sync && (legacyMode = xd);\n\t\t\t\t\t\t// fall through and load via script injection\n\t\t\t\t\t}else if(module.isAmd && legacyMode!=sync){\n\t\t\t\t\t\t// fall through and load via script injection\n\t\t\t\t\t}else{\n\t\t\t\t\t\t// mode may be sync, xd/legacyAsync, or async; module may be AMD or legacy; but module is always located on the same domain\n\t\t\t\t\t\tvar xhrCallback = function(text){\n\t\t\t\t\t\t\tif(legacyMode==sync){\n\t\t\t\t\t\t\t\t// the top of syncExecStack gives the current synchronously executing module; the loader needs\n\t\t\t\t\t\t\t\t// to know this if it has to switch to async loading in the middle of evaluating a legacy module\n\t\t\t\t\t\t\t\t// this happens when a modules dojo.require's a module that must be loaded async because it's xdomain\n\t\t\t\t\t\t\t\t// (using unshift/shift because there is no back() methods for Javascript arrays)\n\t\t\t\t\t\t\t\tsyncExecStack.unshift(module);\n\t\t\t\t\t\t\t\tevalModuleText(text, module);\n\t\t\t\t\t\t\t\tsyncExecStack.shift();\n\n\t\t\t\t\t\t\t\t// maybe the module was an AMD module\n\t\t\t\t\t\t\t\trunDefQ(module);\n\n\t\t\t\t\t\t\t\t// legacy modules never get to defineModule() => cjs and injected never set; also evaluation implies executing\n\t\t\t\t\t\t\t\tif(!module.cjs){\n\t\t\t\t\t\t\t\t\tsetArrived(module);\n\t\t\t\t\t\t\t\t\tfinishExec(module);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif(module.finish){\n\t\t\t\t\t\t\t\t\t// while synchronously evaluating this module, dojo.require was applied referencing a module\n\t\t\t\t\t\t\t\t\t// that had to be loaded async; therefore, the loader stopped answering all dojo.require\n\t\t\t\t\t\t\t\t\t// requests so they could be answered completely in the correct sequence; module.finish gives\n\t\t\t\t\t\t\t\t\t// the list of dojo.requires that must be re-applied once all target modules are available;\n\t\t\t\t\t\t\t\t\t// make a synthetic module to execute the dojo.require's in the correct order\n\n\t\t\t\t\t\t\t\t\t// compute a guaranteed-unique mid for the synthetic finish module; remember the finish vector; remove it from the reference module\n\t\t\t\t\t\t\t\t\t// TODO: can we just leave the module.finish...what's it hurting?\n\t\t\t\t\t\t\t\t\tvar finishMid = mid + \"*finish\",\n\t\t\t\t\t\t\t\t\t\tfinish = module.finish;\n\t\t\t\t\t\t\t\t\tdelete module.finish;\n\n\t\t\t\t\t\t\t\t\tdef(finishMid, [\"dojo\", (\"dojo/require!\" + finish.join(\",\")).replace(/\\./g, \"/\")], function(dojo){\n\t\t\t\t\t\t\t\t\t\tforEach(finish, function(mid){ dojo.require(mid); });\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t// unshift, not push, which causes the current traversal to be reattempted from the top\n\t\t\t\t\t\t\t\t\texecQ.unshift(getModule(finishMid));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonLoadCallback();\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\ttext = transformToAmd(module, text);\n\t\t\t\t\t\t\t\tif(text){\n\t\t\t\t\t\t\t\t\tevalModuleText(text, module);\n\t\t\t\t\t\t\t\t\tonLoadCallback();\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t// if transformToAmd returned falsy, then the module was already AMD and it can be script-injected\n\t\t\t\t\t\t\t\t\t// do so to improve debugability(even though it means another download...which probably won't happen with a good browser cache)\n\t\t\t\t\t\t\t\t\tinjectingModule = module;\n\t\t\t\t\t\t\t\t\treq.injectUrl(fixupUrl(url), onLoadCallback, module);\n\t\t\t\t\t\t\t\t\tinjectingModule = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treq.trace(\"loader-inject\", [\"xhr\", module.mid, url, legacyMode!=sync]);\n\t\t\t\t\t\tif( 0 ){\n\t\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\t\treq.getText(url, legacyMode!=sync, xhrCallback);\n\t\t\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t\t\tsignal(error, makeError(\"xhrInjectFailed\", [module, e]));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\treq.getText(url, legacyMode!=sync, xhrCallback);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} // else async mode or fell through in xdomain loading mode; either way, load by script injection\n\t\t\t\treq.trace(\"loader-inject\", [\"script\", module.mid, url]);\n\t\t\t\tinjectingModule = module;\n\t\t\t\treq.injectUrl(fixupUrl(url), onLoadCallback, module);\n\t\t\t\tinjectingModule = 0;\n\t\t\t},\n\n\t\t\tdefineModule = function(module, deps, def){\n\t\t\t\treq.trace(\"loader-define-module\", [module.mid, deps]);\n\n\t\t\t\tif( 0 && module.plugin && module.plugin.isCombo){\n\t\t\t\t\t// the module is a plugin resource loaded by the combo service\n\t\t\t\t\t// note: check for module.plugin should be enough since normal plugin resources should\n\t\t\t\t\t// not follow this path; module.plugin.isCombo is future-proofing belt and suspenders\n\t\t\t\t\tmodule.result = isFunction(def) ? def() : def;\n\t\t\t\t\tsetArrived(module);\n\t\t\t\t\tfinishExec(module);\n\t\t\t\t\treturn module;\n\t\t\t\t}\n\n\t\t\t\tvar mid = module.mid;\n\t\t\t\tif(module.injected === arrived){\n\t\t\t\t\tsignal(error, makeError(\"multipleDefine\", module));\n\t\t\t\t\treturn module;\n\t\t\t\t}\n\t\t\t\tmix(module, {\n\t\t\t\t\tdeps: deps,\n\t\t\t\t\tdef: def,\n\t\t\t\t\tcjs: {\n\t\t\t\t\t\tid: module.mid,\n\t\t\t\t\t\turi: module.url,\n\t\t\t\t\t\texports: (module.result = {}),\n\t\t\t\t\t\tsetExports: function(exports){\n\t\t\t\t\t\t\tmodule.cjs.exports = exports;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tconfig:function(){\n\t\t\t\t\t\t\treturn module.config;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// resolve deps with respect to this module\n\t\t\t\tfor(var i = 0; deps[i]; i++){\n\t\t\t\t\tdeps[i] = getModule(deps[i], module);\n\t\t\t\t}\n\n\t\t\t\tif( 0 && legacyMode && !waiting[mid]){\n\t\t\t\t\t// the module showed up without being asked for; it was probably in a <script> element\n\t\t\t\t\tinjectDependencies(module);\n\t\t\t\t\texecQ.push(module);\n\t\t\t\t\tcheckComplete();\n\t\t\t\t}\n\t\t\t\tsetArrived(module);\n\n\t\t\t\tif(!isFunction(def) && !deps.length){\n\t\t\t\t\tmodule.result = def;\n\t\t\t\t\tfinishExec(module);\n\t\t\t\t}\n\n\t\t\t\treturn module;\n\t\t\t},\n\n\t\t\trunDefQ = function(referenceModule, mids){\n\t\t\t\t// defQ is an array of [id, dependencies, factory]\n\t\t\t\t// mids (if any) is a vector of mids given by a combo service\n\t\t\t\tvar definedModules = [],\n\t\t\t\t\tmodule, args;\n\t\t\t\twhile(defQ.length){\n\t\t\t\t\targs = defQ.shift();\n\t\t\t\t\tmids && (args[0]= mids.shift());\n\t\t\t\t\t// explicit define indicates possible multiple modules in a single file; delay injecting dependencies until defQ fully\n\t\t\t\t\t// processed since modules earlier in the queue depend on already-arrived modules that are later in the queue\n\t\t\t\t\t// TODO: what if no args[0] and no referenceModule\n\t\t\t\t\tmodule = (args[0] && getModule(args[0])) || referenceModule;\n\t\t\t\t\tdefinedModules.push([module, args[1], args[2]]);\n\t\t\t\t}\n\t\t\t\tconsumePendingCacheInsert(referenceModule);\n\t\t\t\tforEach(definedModules, function(args){\n\t\t\t\t\tinjectDependencies(defineModule.apply(null, args));\n\t\t\t\t});\n\t\t\t};\n\t}\n\n\tvar timerId = 0,\n\t\tclearTimer = noop,\n\t\tstartTimer = noop;\n\tif( 0 ){\n\t\t// Timer machinery that monitors how long the loader is waiting and signals an error when the timer runs out.\n\t\tclearTimer = function(){\n\t\t\ttimerId && clearTimeout(timerId);\n\t\t\ttimerId = 0;\n\t\t};\n\n\t\tstartTimer = function(){\n\t\t\tclearTimer();\n\t\t\tif(req.waitms){\n\t\t\t\ttimerId = global.setTimeout(function(){\n\t\t\t\t\tclearTimer();\n\t\t\t\t\tsignal(error, makeError(\"timeout\", waiting));\n\t\t\t\t}, req.waitms);\n\t\t\t}\n\t\t};\n\t}\n\n\tif ( 0 ) {\n\t\t// Test for IE's different way of signaling when scripts finish loading. Note that according to\n\t\t// http://bugs.dojotoolkit.org/ticket/15096#comment:14, IE9 also needs to follow the\n\t\t// IE specific code path even though it has an addEventListener() method.\n\t\t// Unknown if special path needed on IE10+, which also has a document.attachEvent() method.\n\t\t// Should evaluate to false for Opera and Windows 8 apps, even though they document.attachEvent()\n\t\t// is defined in both those environments.\n\t\t 0 && has.add(\"ie-event-behavior\", doc.attachEvent && typeof Windows === \"undefined\" &&\n\t\t\t(typeof opera === \"undefined\" || opera.toString() != \"[object Opera]\"));\n\t}\n\n\tif( 0 && ( false || 1 )){\n\t\tvar domOn = function(node, eventName, ieEventName, handler){\n\t\t\t\t// Add an event listener to a DOM node using the API appropriate for the current browser;\n\t\t\t\t// return a function that will disconnect the listener.\n\t\t\t\tif(! 0 ){\n\t\t\t\t\tnode.addEventListener(eventName, handler, false);\n\t\t\t\t\treturn function(){\n\t\t\t\t\t\tnode.removeEventListener(eventName, handler, false);\n\t\t\t\t\t};\n\t\t\t\t}else{\n\t\t\t\t\tnode.attachEvent(ieEventName, handler);\n\t\t\t\t\treturn function(){\n\t\t\t\t\t\tnode.detachEvent(ieEventName, handler);\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\t\t\twindowOnLoadListener = domOn(window, \"load\", \"onload\", function(){\n\t\t\t\treq.pageLoaded = 1;\n\t\t\t\t// https://bugs.dojotoolkit.org/ticket/16248\n\t\t\t\ttry{\n\t\t\t\t\tdoc.readyState!=\"complete\" && (doc.readyState = \"complete\");\n\t\t\t\t}catch(e){\n\t\t\t\t}\n\t\t\t\twindowOnLoadListener();\n\t\t\t});\n\n\t\tif( false ){\n\t\t\t// if the loader is on the page, there must be at least one script element\n\t\t\t// getting its parent and then doing insertBefore solves the \"Operation Aborted\"\n\t\t\t// error in IE from appending to a node that isn't properly closed; see\n\t\t\t// dojo/tests/_base/loader/requirejs/simple-badbase.html for an example\n\t\t\t// don't use scripts with type dojo/... since these may be removed; see #15809\n\t\t\t// prefer to use the insertPoint computed during the config sniff in case a script is removed; see #16958\n\t\t\tvar scripts = doc.getElementsByTagName(\"script\"),\n\t\t\t\ti = 0,\n\t\t\t\tscript;\n\t\t\twhile(!insertPointSibling){\n\t\t\t\tif(!/^dojo/.test((script = scripts[i++]) && script.type)){\n\t\t\t\t\tinsertPointSibling= script;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treq.injectUrl = function(url, callback, owner){\n\t\t\t\t// insert a script element to the insert-point element with src=url;\n\t\t\t\t// apply callback upon detecting the script has loaded.\n\n\t\t\t\tvar node = owner.node = doc.createElement(\"script\"),\n\t\t\t\t\tonLoad = function(e){\n\t\t\t\t\t\te = e || window.event;\n\t\t\t\t\t\tvar node = e.target || e.srcElement;\n\t\t\t\t\t\tif(e.type === \"load\" || /complete|loaded/.test(node.readyState)){\n\t\t\t\t\t\t\tloadDisconnector();\n\t\t\t\t\t\t\terrorDisconnector();\n\t\t\t\t\t\t\tcallback && callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tloadDisconnector = domOn(node, \"load\", \"onreadystatechange\", onLoad),\n\t\t\t\t\terrorDisconnector = domOn(node, \"error\", \"onerror\", function(e){\n\t\t\t\t\t\tloadDisconnector();\n\t\t\t\t\t\terrorDisconnector();\n\t\t\t\t\t\tsignal(error, makeError(\"scriptError: \" + url, [url, e]));\n\t\t\t\t\t});\n\n\t\t\t\tnode.type = \"text/javascript\";\n\t\t\t\tnode.charset = \"utf-8\";\n\t\t\t\tnode.src = url;\n\t\t\t\tinsertPointSibling.parentNode.insertBefore(node, insertPointSibling);\n\t\t\t\treturn node;\n\t\t\t};\n\t\t}\n\t}\n\n\tif( 0 ){\n\t\treq.log = function(){\n\t\t\ttry{\n\t\t\t\tfor(var i = 0; i < arguments.length; i++){\n\t\t\t\t\tconsole.log(arguments[i]);\n\t\t\t\t}\n\t\t\t}catch(e){}\n\t\t};\n\t}else{\n\t\treq.log = noop;\n\t}\n\n\tif( 0 ){\n\t\tvar trace = req.trace = function(\n\t\t\tgroup,\t// the trace group to which this application belongs\n\t\t\targs\t// the contents of the trace\n\t\t){\n\t\t\t///\n\t\t\t// Tracing interface by group.\n\t\t\t//\n\t\t\t// Sends the contents of args to the console iff (req.trace.on && req.trace[group])\n\n\t\t\tif(trace.on && trace.group[group]){\n\t\t\t\tsignal(\"trace\", [group, args]);\n\t\t\t\tfor(var arg, dump = [], text= \"trace:\" + group + (args.length ? (\":\" + args[0]) : \"\"), i= 1; i<args.length;){\n\t\t\t\t\targ = args[i++];\n\t\t\t\t\tif(isString(arg)){\n\t\t\t\t\t\ttext += \", \" + arg;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdump.push(arg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treq.log(text);\n\t\t\t\tdump.length && dump.push(\".\");\n\t\t\t\treq.log.apply(req, dump);\n\t\t\t}\n\t\t};\n\t\tmix(trace, {\n\t\t\ton:1,\n\t\t\tgroup:{},\n\t\t\tset:function(group, value){\n\t\t\t\tif(isString(group)){\n\t\t\t\t\ttrace.group[group]= value;\n\t\t\t\t}else{\n\t\t\t\t\tmix(trace.group, group);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\ttrace.set(mix(mix(mix({}, defaultConfig.trace), userConfig.trace), dojoSniffConfig.trace));\n\t\ton(\"config\", function(config){\n\t\t\tconfig.trace && trace.set(config.trace);\n\t\t});\n\t}else{\n\t\treq.trace = noop;\n\t}\n\tif (! 1 ) {\n\t\tvar def = function(\n\t\t\tmid,\t\t //(commonjs.moduleId, optional)\n\t\t\tdependencies, //(array of commonjs.moduleId, optional) list of modules to be loaded before running factory\n\t\t\tfactory\t\t //(any)\n\t\t){\n\t\t\t///\n\t\t\t// Advises the loader of a module factory. //Implements http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition.\n\t\t\t///\n\t\t\t//note\n\t\t\t// CommonJS factory scan courtesy of http://requirejs.org\n\n\t\t\tvar arity = arguments.length,\n\t\t\t\tdefaultDeps = [\"require\", \"exports\", \"module\"],\n\t\t\t\t// the predominate signature...\n\t\t\t\targs = [0, mid, dependencies];\n\t\t\tif(arity==1){\n\t\t\t\targs = [0, (isFunction(mid) ? defaultDeps : []), mid];\n\t\t\t}else if(arity==2 && isString(mid)){\n\t\t\t\targs = [mid, (isFunction(dependencies) ? defaultDeps : []), dependencies];\n\t\t\t}else if(arity==3){\n\t\t\t\targs = [mid, dependencies, factory];\n\t\t\t}\n\n\t\t\tif( 0 && args[1]===defaultDeps){\n\t\t\t\targs[2].toString()\n\t\t\t\t\t.replace(/(\\/\\*([\\s\\S]*?)\\*\\/|\\/\\/(.*)$)/mg, \"\")\n\t\t\t\t\t.replace(/require\\([\"']([\\w\\!\\-_\\.\\/]+)[\"']\\)/g, function(match, dep){\n\t\t\t\t\targs[1].push(dep);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treq.trace(\"loader-define\", args.slice(0, 2));\n\t\t\tvar targetModule = args[0] && getModule(args[0]),\n\t\t\t\tmodule;\n\t\t\tif(targetModule && !waiting[targetModule.mid]){\n\t\t\t\t// given a mid that hasn't been requested; therefore, defined through means other than injecting\n\t\t\t\t// consequent to a require() or define() application; examples include defining modules on-the-fly\n\t\t\t\t// due to some code path or including a module in a script element. In any case,\n\t\t\t\t// there is no callback waiting to finish processing and nothing to trigger the defQ and the\n\t\t\t\t// dependencies are never requested; therefore, do it here.\n\t\t\t\tinjectDependencies(defineModule(targetModule, args[1], args[2]));\n\t\t\t}else if(! 0 || ! 1 || injectingCachedModule){\n\t\t\t\t// not IE path: anonymous module and therefore must have been injected; therefore, onLoad will fire immediately\n\t\t\t\t// after script finishes being evaluated and the defQ can be run from that callback to detect the module id\n\t\t\t\tdefQ.push(args);\n\t\t\t}else{\n\t\t\t\t// IE path: possibly anonymous module and therefore injected; therefore, cannot depend on 1-to-1,\n\t\t\t\t// in-order exec of onLoad with script eval (since it's IE) and must manually detect here\n\t\t\t\ttargetModule = targetModule || injectingModule;\n\t\t\t\tif(!targetModule){\n\t\t\t\t\tfor(mid in waiting){\n\t\t\t\t\t\tmodule = modules[mid];\n\t\t\t\t\t\tif(module && module.node && module.node.readyState === 'interactive'){\n\t\t\t\t\t\t\ttargetModule = module;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif( 0 && !targetModule){\n\t\t\t\t\t\tfor(var i = 0; i<combosPending.length; i++){\n\t\t\t\t\t\t\ttargetModule = combosPending[i];\n\t\t\t\t\t\t\tif(targetModule.node && targetModule.node.readyState === 'interactive'){\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttargetModule= 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif( 0 && isArray(targetModule)){\n\t\t\t\t\tinjectDependencies(defineModule(getModule(targetModule.shift()), args[1], args[2]));\n\t\t\t\t\tif(!targetModule.length){\n\t\t\t\t\t\tcombosPending.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}else if(targetModule){\n\t\t\t\t\tconsumePendingCacheInsert(targetModule);\n\t\t\t\t\tinjectDependencies(defineModule(targetModule, args[1], args[2]));\n\t\t\t\t}else{\n\t\t\t\t\tsignal(error, makeError(\"ieDefineFailed\", args[0]));\n\t\t\t\t}\n\t\t\t\tcheckComplete();\n\t\t\t}\n\t\t};\n\t\tdef.amd = {\n\t\t\tvendor:\"dojotoolkit.org\"\n\t\t};\n\n\t\tif( 0 ){\n\t\t\treq.def = def;\n\t\t}\n\t} else {\n\t\tvar def = noop;\n\t}\n\t// allow config to override default implementation of named functions; this is useful for\n\t// non-browser environments, e.g., overriding injectUrl, getText, log, etc. in node.js, Rhino, etc.\n\t// also useful for testing and monkey patching loader\n\tmix(mix(req, defaultConfig.loaderPatch), userConfig.loaderPatch);\n\n\t// now that req is fully initialized and won't change, we can hook it up to the error signal\n\ton(error, function(arg){\n\t\ttry{\n\t\t\tconsole.error(arg);\n\t\t\tif(arg instanceof Error){\n\t\t\t\tfor(var p in arg){\n\t\t\t\t\tconsole.log(p + \":\", arg[p]);\n\t\t\t\t}\n\t\t\t\tconsole.log(\".\");\n\t\t\t}\n\t\t}catch(e){}\n\t});\n\n\t// always publish these\n\tmix(req, {\n\t\tuid:uid,\n\t\tcache:cache,\n\t\tpacks:packs\n\t});\n\n\n\tif( 0 ){\n\t\tmix(req, {\n\t\t\t// these may be interesting to look at when debugging\n\t\t\tpaths:paths,\n\t\t\taliases:aliases,\n\t\t\tmodules:modules,\n\t\t\tlegacyMode:legacyMode,\n\t\t\texecQ:execQ,\n\t\t\tdefQ:defQ,\n\t\t\twaiting:waiting,\n\n\t\t\t// these are used for testing\n\t\t\t// TODO: move testing infrastructure to a different has feature\n\t\t\tpacks:packs,\n\t\t\tmapProgs:mapProgs,\n\t\t\tpathsMapProg:pathsMapProg,\n\t\t\tlistenerQueues:listenerQueues,\n\n\t\t\t// these are used by the builder (at least)\n\t\t\tcomputeMapProg:computeMapProg,\n\t\t\tcomputeAliases:computeAliases,\n\t\t\trunMapProg:runMapProg,\n\t\t\tcompactPath:compactPath,\n\t\t\tgetModuleInfo:getModuleInfo_\n\t\t});\n\t}\n\n\t// the loader can be defined exactly once; look for global define which is the symbol AMD loaders are\n\t// *required* to define (as opposed to require, which is optional)\n\tif(global.define){\n\t\tif( 0 ){\n\t\t\tsignal(error, makeError(\"defineAlreadyDefined\", 0));\n\t\t}\n\t\treturn;\n\t}else{\n\t\tglobal.define = def;\n\t\tglobal.require = req;\n\t\tif( 0 ){\n\t\t\trequire = req;\n\t\t}\n\t}\n\n\tif( 0 && req.combo && req.combo.plugins){\n\t\tvar plugins = req.combo.plugins,\n\t\t\tpluginName;\n\t\tfor(pluginName in plugins){\n\t\t\tmix(mix(getModule(pluginName), plugins[pluginName]), {isCombo:1, executed:\"executed\", load:1});\n\t\t}\n\t}\n\n\tif( 0 && ! 1 ){\n\t\tforEach(delayedModuleConfig, function(c){ config(c); });\n\t\tvar bootDeps = dojoSniffConfig.deps ||\tuserConfig.deps || defaultConfig.deps,\n\t\t\tbootCallback = dojoSniffConfig.callback || userConfig.callback || defaultConfig.callback;\n\t\treq.boot = (bootDeps || bootCallback) ? [bootDeps || [], bootCallback] : 0;\n\t}\n\tif(! 1 ){\n\t\t!req.async && req([\"dojo\"]);\n\t\treq.boot && req.apply(null, req.boot);\n\t}\n})\n.call(this, userConfig, defaultConfig);};","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","// 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\tid: moduleId,\n\t\tloaded: false,\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// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// 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};","(function() { /* Start dojo-webpack-plugin extensions */\n\t\tfunction mix(dest, src) { // eslint-disable-line no-unused-vars\n\t\t\tfor(var n in src) dest[n] = src[n];\n\t\t\treturn dest;\n\t\t}\n\n\t\tfunction toUrl(name, referenceModule) {\n\t\t\treturn loaderScope.require.toUrl(name, referenceModule);\n\t\t}\n\n\t\tfunction toAbsMid(name, referenceModule) {\n\t\t\treturn loaderScope.require.toAbsMid(name, referenceModule);\n\t\t}\n\n\t\t// dojo require function.\n\t\tfunction req(config, dependencies, callback) {\n\t\t\treturn contextRequire(config, dependencies, callback, 0, req);\n\t\t};\n\n\t\tfunction createContextRequire(module) { // eslint-disable-line no-unused-vars\n\t\t\tif (!module) return req;\n\t\t\tvar moduleId = module.absMid;\n\t\t\tif (!moduleId && req.absMidsById[module.id]) {\n\t\t\t\tmoduleId = req.absMidsById[module.id];\n\t\t\t}\n\t\t\tif (!moduleId) return req;\n\t\t\tvar result = function(a1, a2, a3) {\n\t\t\t\treturn contextRequire(a1, a2, a3, moduleId, req);\n\t\t\t};\n\t\t\tfor (var p in req) {\n\t\t\t\tif (req.hasOwnProperty(p)) {\n\t\t\t\t\tresult[p] = req[p];\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult.toUrl = function(name) {\n\t\t\t\treturn toUrl(name, moduleId ? {mid: moduleId} : null);\n\t\t\t};\n\t\t\tresult.toAbsMid = function(name) {\n\t\t\t\treturn toAbsMid(name, moduleId ? {mid: moduleId} : null);\n\t\t\t};\n\n\t\t\tif (req.undef) {\n\t\t\t\tresult.undef = function(mid) {\n\t\t\t\t\treq.undef(mid, moduleId);\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tfunction registerAbsMids(absMids) { // eslint-disable-line no-unused-vars\n\t\t\tfor (var s in absMids) {\n\t\t\t\treq.absMids[s] = absMids[s];\n\t\t\t\tif (!req.absMidsById[absMids[s]]) {\n\t\t\t\t\treq.absMidsById[absMids[s]] = s;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction resolveTernaryHasExpression(expr) { // eslint-disable-line no-unused-vars\n\t\t\t// Expects an expression of the form supported by dojo/has.js loader, except that module identifiers are\n\t\t\t// integers corresponding to webpack module ids. Returns a module reference if evaluation of the expression\n\t\t\t// using the currently defined features returns a module id, or else undefined.\n\n\t\t\tvar has = findModule(\"dojo/has\", null, false);\n\t\t\tvar id = has.normalize(expr, function(arg){return arg;});\n\t\t\treturn id && __webpack_require__(id) || undefined;\n\t\t}\n\n\t\tfunction findModule(mid, referenceModule, noInstall, asModuleObj) {\n\t\t\tmid = mid.split(\"!\").map(function(segment) {\n\t\t\t\tvar isRelative = segment.charAt(0) === '.';\n\t\t\t\tif(isRelative && !referenceModule){\n\t\t\t\t\treturn segment;\n\t\t\t\t}\n\t\t\t\treturn toAbsMid(segment, referenceModule ? {mid: referenceModule} : null);\n\t\t\t}).join(\"!\");\n\t\t\tvar result;\n\t\t\tif (mid in req.absMids && __webpack_require__.m[req.absMids[mid]]) {\n\t\t\t\tif (noInstall) {\n\t\t\t\t\tvar module = __webpack_module_cache__[req.absMids[mid]];\n\t\t\t\t\tresult = module && (asModuleObj ? module : module.exports);\n\t\t\t\t} else {\n\t\t\t\t\tresult = __webpack_require__(req.absMids[mid]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!result) {\n\t\t\t\tthrow new Error('Module not found: ' + mid);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tfunction dojoModuleFromWebpackModule(webpackModule) { // eslint-disable-line no-unused-vars\n\t\t\tif (webpackModule.absMid) return webpackModule; // Already converted\n\t\t\tvar result = {i:webpackModule.id};\n\t\t\tvar id = req.absMidsById[webpackModule.id];\n\t\t\tif (id) {\n\t\t\t\tresult.id = result.absMid = id;\n\t\t\t}\n\t\t\tObject.defineProperty(result, \"exports\", {\n\t\t\t\tget: function() { return webpackModule.exports;},\n\t\t\t\tset: function(value) {webpackModule.exports = value;},\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\tfunction contextRequire(a1, a2, a3, referenceModule, req) { // eslint-disable-line no-shadow\n\t\t\tvar type = ({}.toString).call(a1);\n\t\t\tif (type === '[object String]') {\n\t\t\t\t// a3 is passed by require calls injected into dependency arrays for dependencies specified\n\t\t\t\t// as identifiers (vs. string literals).\n\t\t\t\tvar noInstall = !(a3 === false);\n\t\t\t\tvar m = findModule(a1, referenceModule, noInstall);\n\t\t\t\tif (typeof m === 'object' && m.__DOJO_WEBPACK_DEFINE_PROMISE__) {\n\t\t\t\t\tthrow new Error('Module not found: ' + a1);\n\t\t\t\t}\n\t\t\t\treturn m;\n\t\t\t} else if (type === '[object Object]') {\n\t\t\t\tthrow new Error('Require config is not supported by WebPack');\n\t\t\t}\n\t\t\tif (type === '[object Array]') {\n\t\t\t\tvar modules = [], callback = a2, errors = [];\n\t\t\t\ta1.forEach(function (mid) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmodules.push(findModule(mid, referenceModule));\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\terrors.push({mid: mid, error: e});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (errors.length === 0) {\n\t\t\t\t\tif (callback) {\n\t\t\t\t\t\tif (false && isDefinePromise(modules)) { // eslint-disable-line no-undef\n\t\t\t\t\t\t\tPromise.all(wrapPromises(modules)).then(function(deps) { // eslint-disable-line no-undef\n\t\t\t\t\t\t\t\tcallback.apply(this, unwrapPromises(deps)); // eslint-disable-line no-undef\n\t\t\t\t\t\t\t}.bind(this)).catch(function(err){console.error(err);});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcallback.apply(this, modules);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar error = new Error(\"findModules\");\n\t\t\t\t\terror.src = \"dojo-webpack-plugin\";\n\t\t\t\t\terror.info = errors;\n\t\t\t\t\treq.signal(\"error\", error);\n\t\t\t\t}\n\t\t\t\treturn req;\n\t\t\t} else {\n\t\t\t\tthrow new Error('Unsupported require call');\n\t\t\t}\n\t\t}\n\t\treq.toUrl = toUrl;\n\t\treq.toAbsMid = toAbsMid;\n\t\treq.absMids = {};\n\t\treq.absMidsById = [];\n\t\treq.async = 1;\n\tvar globalObj = this||window;\n\tregisterAbsMids({\n\t\t// \"./lib-cjs/index\" = 2090\n\t\t// \"tslib\" = 5608\n\t\t// \"./__package__\" = 2990\n\t\t\"dojo/_base/declare\":6345,\n\t\t\"dojo/_base/kernel\":1054,\n\t\t\"dojo/global\":1925,\n\t\t\"dojo/has\":6356,\n\t\t\"dojo/_base/config\":7361,\n\t\t\"dojo/_base/lang\":6323,\n\t\t\"dojo/sniff\":2616,\n\t\t\"dojo/Deferred\":5625,\n\t\t\"dojo/errors/CancelError\":1662,\n\t\t\"dojo/errors/create\":4332,\n\t\t\"dojo/promise/Promise\":5479,\n\t\t\"dojo/promise/instrumentation\":2236,\n\t\t\"dojo/promise/tracer\":3185,\n\t\t\"dojo/Evented\":9925,\n\t\t\"dojo/aspect\":6566,\n\t\t\"dojo/on\":2075,\n\t\t// \"/home/runner/work/Visualization/Visualization/node_modules/dojo-webpack-plugin/lib/NoModule.js\" = 8819\n\t\t\"dojo/_base/array\":6974,\n\t\t\"dojo/dom-construct\":28,\n\t\t\"dojo/_base/window\":5075,\n\t\t\"dojo/dom\":2284,\n\t\t\"dojo/dom-attr\":7878,\n\t\t\"dojo/dom-style\":1248,\n\t\t\"dojo/dom-prop\":5244,\n\t\t\"dojo/_base/connect\":5641,\n\t\t\"dojo/topic\":7111,\n\t\t\"dojo/_base/event\":3503,\n\t\t\"dojo/dom-geometry\":2685,\n\t\t\"dojo/mouse\":8471,\n\t\t\"dojo/_base/sniff\":3927,\n\t\t\"dojo/keys\":4266,\n\t\t\"dojo-dstore/Memory\":5907,\n\t\t\"dojo-dstore/Store\":1603,\n\t\t\"dojo/when\":3534,\n\t\t\"dojo-dstore/QueryMethod\":2219,\n\t\t\"dojo-dstore/Filter\":8942,\n\t\t\"dojo-dstore/Promised\":6739,\n\t\t\"dojo-dstore/QueryResults\":2626,\n\t\t\"dojo-dstore/SimpleQuery\":3060,\n\t\t\"dgrid/Grid\":1540,\n\t\t\"dojo/dom-class\":8945,\n\t\t\"dgrid/List\":4624,\n\t\t\"dojo/query\":1172,\n\t\t\"dojo/selector/_loader\":5226,\n\t\t\"dojo/selector/lite\":6178,\n\t\t\"dojo/selector/_loader!default\":6178,\n\t\t\"dgrid/util/misc\":4975,\n\t\t\"dgrid/OnDemandGrid\":5602,\n\t\t\"dgrid/OnDemandList\":6850,\n\t\t\"dgrid/_StoreMixin\":8301,\n\t\t\"dgrid/Keyboard\":9173,\n\t\t\"dgrid/Selection\":2348,\n\t\t\"dgrid/util/touch\":5892,\n\t\t\"dgrid/extensions/ColumnResizer\":5533,\n\t\t\"dojo/_base/html\":1142,\n\t\t\"dgrid/extensions/CompoundColumns\":297,\n\t\t\"dgrid/extensions/nls/pagination\":4481,\n\t\t// \"./gridHelper\" = 4808\n\t\t\"dgrid/extensions/Pagination\":6937,\n\t\t\"dojo/string\":7539,\n\t\t\"dojo/i18n!dgrid/extensions/nls/pagination\":1442,\n\t\t\"dojo/i18n\":3878,\n\t\t\"dojo/_base/xhr\":225,\n\t\t\"dojo/io-query\":6587,\n\t\t\"dojo/dom-form\":3159,\n\t\t\"dojo/json\":8212,\n\t\t\"dojo/_base/Deferred\":280,\n\t\t\"dojo/_base/json\":4861,\n\t\t\"dojo/request/watch\":3621,\n\t\t\"dojo/request/util\":5540,\n\t\t\"dojo/errors/RequestError\":8241,\n\t\t\"dojo/errors/RequestTimeoutError\":9608,\n\t\t\"dojo/request/default!\":9648,\n\t\t\"dojo/request/xhr\":9648,\n\t\t\"dojo/request/handlers\":2573,\n\t\t// \"/home/runner/work/Visualization/Visualization/node_modules/dojo-webpack-plugin/loaders/dojo/runner.js\" = 5744\n\t\t\"dijit/Tooltip\":655,\n\t\t\"dojo/_base/fx\":5577,\n\t\t\"dojo/_base/Color\":1692,\n\t\t\"dijit/_base/manager\":9600,\n\t\t\"dijit/registry\":7601,\n\t\t\"dijit/main\":231,\n\t\t\"dijit/place\":1019,\n\t\t\"dijit/Viewport\":1600,\n\t\t\"dojo/domReady\":2641,\n\t\t\"dojo/window\":3930,\n\t\t\"dijit/_Widget\":3549,\n\t\t\"dojo/ready\":9671,\n\t\t\"dijit/_WidgetBase\":3068,\n\t\t\"dojo/Stateful\":4062,\n\t\t\"dijit/Destroyable\":6510,\n\t\t\"dijit/_BidiMixin\":5250,\n\t\t\"dijit/_OnDijitClickMixin\":8709,\n\t\t\"dijit/a11yclick\":8240,\n\t\t\"dojo/touch\":7443,\n\t\t\"dijit/_FocusMixin\":4368,\n\t\t\"dijit/focus\":7304,\n\t\t\"dijit/a11y\":3050,\n\t\t\"dojo/uacss\":2085,\n\t\t\"dijit/hccss\":664,\n\t\t\"dojo/hccss\":9276,\n\t\t\"dijit/_TemplatedMixin\":998,\n\t\t\"dojo/cache\":4642,\n\t\t\"dojo/text\":9445,\n\t\t\"dojo/request\":8769,\n\t\t\"dijit/_AttachMixin\":5659,\n\t\t\"dijit/BackgroundIframe\":610,\n\t\t\"dojo/text!dijit/templates/Tooltip.html\":9409,\n\t\t\"dojo/_base/query\":4203,\n\t\t\"dojo/_base/NodeList\":6659,\n\t\t\"dojo/NodeList-dom\":8288\n\t\t// \"/tmp/tmp-3424WjDfS5sTY29e/dojo/dojo.js\" = 3367\n\t});\n\n\tglobalObj.require = req;\n\t\t(self[\"webpackChunk_hpcc_js_dgrid_shim\"] = self[\"webpackChunk_hpcc_js_dgrid_shim\"] || []).registerAbsMids = registerAbsMids;\n\n\t// expose the Dojo compatibility functions as a properties of __webpack_require__\n\tif (__webpack_require__.dj && __webpack_require__.dj.name !== 'dojo-webpack-plugin') throw new Error(\"__webpack_require__.dj name collision.\")\n\t__webpack_require__.dj = {\n\t\tname: 'dojo-webpack-plugin',\n\t\tr: req,\n\t\tc: createContextRequire,\n\t\tm: dojoModuleFromWebpackModule,\n\t\th: resolveTernaryHasExpression,\n\t};\n\tvar loaderScope = Object.create(globalObj, {\n\t document:{value: globalObj.document},\n\t});\n\tObject.defineProperties(loaderScope, {\n\t window:{value:loaderScope},\n\t global:{value:loaderScope}\n\t});\n\tloaderScope.define = loaderScope.require = undefined\n\tglobalObj.dojoConfig = globalObj.dojoConfig || {}\n\tvar userConfig = mix(globalObj.dojoConfig, ({'baseUrl':'.','deps':['lib/index'],'async':true,'has':({'dojo-config-api':false}),'selectorEngine':'lite','fixupUrl':(function (url) {\n\t\t\t\t// Load the uncompressed versions of dojo/dijit/dojox javascript files when using the dojo loader.\n\t\t\t\t// When using a webpack build, the dojo loader is not used for loading javascript files so this\n\t\t\t\t// property has no effect. This is only needed because we're loading Dojo from a CDN for this\n\t\t\t\t// demo. In a normal development envorinment, Dojo would be installed locally and this wouldn't\n\t\t\t\t// be needed.\n\t\t\t\tif (/\\/(dojo|dijit|dojox)\\/.*\\.js$/.test(url)) {\n\t\t\t\t\turl += \".uncompressed.js\";\n\t\t\t\t}\n\t\t\t\treturn url;\n\t\t\t})}));\n\tvar defaultConfig = ({'hasCache':({'webpack':1,'host-browser':1,'dom':1,'dojo-loader':1,'dojo-has-api':1,'dojo-dom-ready-api':1,'dojo-sniff':1,'dojo-test-sniff':1,'config-deferredInstrumentation':1,'config-tlmSiblingOfDojo':1}),'paths':({'js':'js','theme':'theme','css':'//chuckdumont.github.io/dojo-css-plugin/1.0.0/css'}),'pathsMapProg':[['theme','theme',/^theme(\\/|$)/,5],['css','//chuckdumont.github.io/dojo-css-plugin/1.0.0/css',/^css(\\/|$)/,3],['js','js',/^js(\\/|$)/,2]],'packs':({'dojo':({'main':'main','name':'dojo','location':'./dist/dojo','lib':'.'}),'dijit':({'main':'main','name':'dijit','location':'./dist/dijit','lib':'.'}),'dojox':({'main':'main','name':'dojox','location':'./dist/dojox','lib':'.'}),'dijit-themes':({'main':'main','name':'dijit-themes','location':'./dist/dijit-themes','lib':'.'}),'dgrid':({'main':'main','name':'dgrid','location':'./dist/dgrid','lib':'.'}),'dstore':({'main':'main','name':'dstore','location':'./dist/dojo-dstore','lib':'.'})}),'aliases':[],'mapProgs':[],'cacheBust':undefined,'modules':({}),'cache':({})});\n\tvar dojoLoader = __webpack_require__(3367);\n\tdojoLoader.call(loaderScope, userConfig, defaultConfig, loaderScope, loaderScope);\n\tloaderScope.require.baseUrl = \"./\";\n\tObject.keys(loaderScope.require.packs).forEach(function(key) {\n\t\tvar pkg = loaderScope.require.packs[key];\n\t\tif ((/(^\\/)|(\\:)/.test(pkg.main)\t// main path is absolute\n\t\t || pkg.main.split('/').reduce(function(acc, pathComp) {\n\t\t\t\t\tif (acc < 0 || pathComp === '.') return acc;\n\t\t\t\t\treturn (pathComp === '..' ? --acc : ++acc);\n\t\t\t\t}, 0) <= 0) // main path is outside package\n\t\t\t\t&& typeof pkg.realMain === 'undefined'\t// hasn't already been adjusted\n\t\t) {\n\t\t\tpkg.realMain = pkg.main;\n\t\t\tpkg.main = '';\n\t\t}\n\t});\n\tfunction toAbsMid(name, referenceModule) {\n\t\tvar absMid = loaderScope.require.originalToAbsMid(name, referenceModule);\n\t\tif (absMid.indexOf('/') === absMid.length-1) {\n\t\t\tvar pkgName = absMid.substring(0, absMid.length-1);\n\t\t\tvar pkg = loaderScope.require.packs[pkgName];\n\t\t\tif (pkg && pkg.realMain) {\n\t\t\t\tabsMid = pkgName;\n\t\t\t}\n\t\t}\n\t\treturn absMid;\n\t}\n\tfunction toUrl(name, referenceModule) {\n\t\tvar url = loaderScope.require.originalToUrl(name, referenceModule);\n\t\tvar pkg = loaderScope.require.packs[name];\n\t\tif (pkg && pkg.realMain) {\n\t\t\tvar parts = url.split('?');\n\t\t\tif (/(^\\/)|(\\:)/.test(pkg.realMain)) {\n\t\t\t\t// absolute URL\n\t\t\t\tparts[0] = pkg.realMain;\n\t\t\t} else {\n\t\t\t\t// relative URL\n\t\t\t\tparts[0] = parts[0] + '/' + pkg.realMain;\n\t\t\t}\n\t\t\turl = parts.join('?');\n\t\t}\n\t\treturn url;\n\t}\n\tloaderScope.require.originalToAbsMid = loaderScope.require.toAbsMid;\n\tloaderScope.require.originalToUrl = loaderScope.require.toUrl;\n\tloaderScope.require.toAbsMid = toAbsMid;\n\tloaderScope.require.toUrl = toUrl;\n\t['baseUrl','has','rawConfig','on','signal'].forEach(function(name) {req[name] = loaderScope.require[name]})\n\tvar absMidsWaiting = globalObj[\"webpackChunk_hpcc_js_dgrid_shim\"].absMidsWaiting;\n\tif (absMidsWaiting) {\n\t absMidsWaiting.forEach(registerAbsMids);\n\t delete globalObj[\"webpackChunk_hpcc_js_dgrid_shim\"].absMidsWaiting;\n\t}\n})(); /* End dojo-webpack-plugin extensions */","","// module factories are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(2090);\n",""],"names":[],"sourceRoot":""}