window.localizedMessages = {"tower.pips.published.contact.requiredField":"This field is required.","tower.pips.published.contact.invalidEmail":"Invalid Email Address","tower.pips.published.contact.error":"There was an error. Please try","tower.pips.published.contact.resubmit":"resubmitting your message","tower.pips.published.paypal.addToCart":"Add to Cart","tower.pips.published.paypal.quantityLabel":"Qty","tower.published.paypalCart.title":"Shopping Cart","tower.published.paypalCart.close":"Close","tower.published.paypalCart.empty":"Your Cart is Empty","tower.published.paypalCart.total":"Total","tower.published.paypalCart.checkout":"Proceed To Checkout","tower.published.paypalCart.continueShopping":"Continue Shopping"}; /*********/ (function(){ // Copyright (c) 2005 Tom Wu // All Rights Reserved. // See "LICENSE" for details. // Basic JavaScript BN library - subset useful for RSA encryption. // Bits per digit var dbits; // JavaScript engine analysis var canary = 0xdeadbeefcafe; var j_lm = ((canary&0xffffff)==0xefcafe); // (public) Constructor function BigInteger(a,b,c) { if(a != null) if("number" == typeof a) this.fromNumber(a,b,c); else if(b == null && "string" != typeof a) this.fromString(a,256); else this.fromString(a,b); } // return new, unset BigInteger function nbi() { return new BigInteger(null); } // am: Compute w_j += (x*this_i), propagate carries, // c is initial carry, returns final carry. // c < 3*dvalue, x < 2*dvalue, this_i < dvalue // We need to select the fastest one that works in this environment. // am1: use a single mult and divide to get the high bits, // max digit bits should be 26 because // max internal value = 2*dvalue^2-2*dvalue (< 2^53) function am1(i,x,w,j,c,n) { while(--n >= 0) { var v = x*this[i++]+w[j]+c; c = Math.floor(v/0x4000000); w[j++] = v&0x3ffffff; } return c; } // am2 avoids a big mult-and-extract completely. // Max digit bits should be <= 30 because we do bitwise ops // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) function am2(i,x,w,j,c,n) { var xl = x&0x7fff, xh = x>>15; while(--n >= 0) { var l = this[i]&0x7fff; var h = this[i++]>>15; var m = xh*l+h*xl; l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff); c = (l>>>30)+(m>>>15)+xh*h+(c>>>30); w[j++] = l&0x3fffffff; } return c; } // Alternately, set max digit bits to 28 since some // browsers slow down when dealing with 32-bit numbers. function am3(i,x,w,j,c,n) { var xl = x&0x3fff, xh = x>>14; while(--n >= 0) { var l = this[i]&0x3fff; var h = this[i++]>>14; var m = xh*l+h*xl; l = xl*l+((m&0x3fff)<<14)+w[j]+c; c = (l>>28)+(m>>14)+xh*h; w[j++] = l&0xfffffff; } return c; } var inBrowser = typeof navigator !== "undefined"; if(inBrowser && j_lm && (navigator.appName == "Microsoft Internet Explorer")) { BigInteger.prototype.am = am2; dbits = 30; } else if(inBrowser && j_lm && (navigator.appName != "Netscape")) { BigInteger.prototype.am = am1; dbits = 26; } else { // Mozilla/Netscape seems to prefer am3 BigInteger.prototype.am = am3; dbits = 28; } BigInteger.prototype.DB = dbits; BigInteger.prototype.DM = ((1<= 0; --i) r[i] = this[i]; r.t = this.t; r.s = this.s; } // (protected) set from integer value x, -DV <= x < DV function bnpFromInt(x) { this.t = 1; this.s = (x<0)?-1:0; if(x > 0) this[0] = x; else if(x < -1) this[0] = x+this.DV; else this.t = 0; } // return bigint initialized to value function nbv(i) { var r = nbi(); r.fromInt(i); return r; } // (protected) set from string and radix function bnpFromString(s,b) { var k; if(b == 16) k = 4; else if(b == 8) k = 3; else if(b == 256) k = 8; // byte array else if(b == 2) k = 1; else if(b == 32) k = 5; else if(b == 4) k = 2; else { this.fromRadix(s,b); return; } this.t = 0; this.s = 0; var i = s.length, mi = false, sh = 0; while(--i >= 0) { var x = (k==8)?s[i]&0xff:intAt(s,i); if(x < 0) { if(s.charAt(i) == "-") mi = true; continue; } mi = false; if(sh == 0) this[this.t++] = x; else if(sh+k > this.DB) { this[this.t-1] |= (x&((1<>(this.DB-sh)); } else this[this.t-1] |= x<= this.DB) sh -= this.DB; } if(k == 8 && (s[0]&0x80) != 0) { this.s = -1; if(sh > 0) this[this.t-1] |= ((1< 0 && this[this.t-1] == c) --this.t; } // (public) return string representation in given radix function bnToString(b) { if(this.s < 0) return "-"+this.negate().toString(b); var k; if(b == 16) k = 4; else if(b == 8) k = 3; else if(b == 2) k = 1; else if(b == 32) k = 5; else if(b == 4) k = 2; else return this.toRadix(b); var km = (1< 0) { if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); } while(i >= 0) { if(p < k) { d = (this[i]&((1<

>(p+=this.DB-k); } else { d = (this[i]>>(p-=k))&km; if(p <= 0) { p += this.DB; --i; } } if(d > 0) m = true; if(m) r += int2char(d); } } return m?r:"0"; } // (public) -this function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; } // (public) |this| function bnAbs() { return (this.s<0)?this.negate():this; } // (public) return + if this > a, - if this < a, 0 if equal function bnCompareTo(a) { var r = this.s-a.s; if(r != 0) return r; var i = this.t; r = i-a.t; if(r != 0) return (this.s<0)?-r:r; while(--i >= 0) if((r=this[i]-a[i]) != 0) return r; return 0; } // returns bit length of the integer x function nbits(x) { var r = 1, t; if((t=x>>>16) != 0) { x = t; r += 16; } if((t=x>>8) != 0) { x = t; r += 8; } if((t=x>>4) != 0) { x = t; r += 4; } if((t=x>>2) != 0) { x = t; r += 2; } if((t=x>>1) != 0) { x = t; r += 1; } return r; } // (public) return the number of bits in "this" function bnBitLength() { if(this.t <= 0) return 0; return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM)); } // (protected) r = this << n*DB function bnpDLShiftTo(n,r) { var i; for(i = this.t-1; i >= 0; --i) r[i+n] = this[i]; for(i = n-1; i >= 0; --i) r[i] = 0; r.t = this.t+n; r.s = this.s; } // (protected) r = this >> n*DB function bnpDRShiftTo(n,r) { for(var i = n; i < this.t; ++i) r[i-n] = this[i]; r.t = Math.max(this.t-n,0); r.s = this.s; } // (protected) r = this << n function bnpLShiftTo(n,r) { var bs = n%this.DB; var cbs = this.DB-bs; var bm = (1<= 0; --i) { r[i+ds+1] = (this[i]>>cbs)|c; c = (this[i]&bm)<= 0; --i) r[i] = 0; r[ds] = c; r.t = this.t+ds+1; r.s = this.s; r.clamp(); } // (protected) r = this >> n function bnpRShiftTo(n,r) { r.s = this.s; var ds = Math.floor(n/this.DB); if(ds >= this.t) { r.t = 0; return; } var bs = n%this.DB; var cbs = this.DB-bs; var bm = (1<>bs; for(var i = ds+1; i < this.t; ++i) { r[i-ds-1] |= (this[i]&bm)<>bs; } if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<>= this.DB; } if(a.t < this.t) { c -= a.s; while(i < this.t) { c += this[i]; r[i++] = c&this.DM; c >>= this.DB; } c += this.s; } else { c += this.s; while(i < a.t) { c -= a[i]; r[i++] = c&this.DM; c >>= this.DB; } c -= a.s; } r.s = (c<0)?-1:0; if(c < -1) r[i++] = this.DV+c; else if(c > 0) r[i++] = c; r.t = i; r.clamp(); } // (protected) r = this * a, r != this,a (HAC 14.12) // "this" should be the larger one if appropriate. function bnpMultiplyTo(a,r) { var x = this.abs(), y = a.abs(); var i = x.t; r.t = i+y.t; while(--i >= 0) r[i] = 0; for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t); r.s = 0; r.clamp(); if(this.s != a.s) BigInteger.ZERO.subTo(r,r); } // (protected) r = this^2, r != this (HAC 14.16) function bnpSquareTo(r) { var x = this.abs(); var i = r.t = 2*x.t; while(--i >= 0) r[i] = 0; for(i = 0; i < x.t-1; ++i) { var c = x.am(i,x[i],r,2*i,0,1); if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) { r[i+x.t] -= x.DV; r[i+x.t+1] = 1; } } if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1); r.s = 0; r.clamp(); } // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) // r != q, this != m. q or r may be null. function bnpDivRemTo(m,q,r) { var pm = m.abs(); if(pm.t <= 0) return; var pt = this.abs(); if(pt.t < pm.t) { if(q != null) q.fromInt(0); if(r != null) this.copyTo(r); return; } if(r == null) r = nbi(); var y = nbi(), ts = this.s, ms = m.s; var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); } else { pm.copyTo(y); pt.copyTo(r); } var ys = y.t; var y0 = y[ys-1]; if(y0 == 0) return; var yt = y0*(1<1)?y[ys-2]>>this.F2:0); var d1 = this.FV/yt, d2 = (1<= 0) { r[r.t++] = 1; r.subTo(t,r); } BigInteger.ONE.dlShiftTo(ys,t); t.subTo(y,y); // "negative" y so we can replace sub with am later while(y.t < ys) y[y.t++] = 0; while(--j >= 0) { // Estimate quotient digit var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2); if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out y.dlShiftTo(j,t); r.subTo(t,r); while(r[i] < --qd) r.subTo(t,r); } } if(q != null) { r.drShiftTo(ys,q); if(ts != ms) BigInteger.ZERO.subTo(q,q); } r.t = ys; r.clamp(); if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder if(ts < 0) BigInteger.ZERO.subTo(r,r); } // (public) this mod a function bnMod(a) { var r = nbi(); this.abs().divRemTo(a,null,r); if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r); return r; } // Modular reduction using "classic" algorithm function Classic(m) { this.m = m; } function cConvert(x) { if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); else return x; } function cRevert(x) { return x; } function cReduce(x) { x.divRemTo(this.m,null,x); } function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); } Classic.prototype.convert = cConvert; Classic.prototype.revert = cRevert; Classic.prototype.reduce = cReduce; Classic.prototype.mulTo = cMulTo; Classic.prototype.sqrTo = cSqrTo; // (protected) return "-1/this % 2^DB"; useful for Mont. reduction // justification: // xy == 1 (mod m) // xy = 1+km // xy(2-xy) = (1+km)(1-km) // x[y(2-xy)] = 1-k^2m^2 // x[y(2-xy)] == 1 (mod m^2) // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. // JS multiply "overflows" differently from C/C++, so care is needed here. function bnpInvDigit() { if(this.t < 1) return 0; var x = this[0]; if((x&1) == 0) return 0; var y = x&3; // y == 1/x mod 2^2 y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4 y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8 y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16 // last step - calculate inverse mod DV directly; // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits // we really want the negative inverse, and -DV < y < DV return (y>0)?this.DV-y:-y; } // Montgomery reduction function Montgomery(m) { this.m = m; this.mp = m.invDigit(); this.mpl = this.mp&0x7fff; this.mph = this.mp>>15; this.um = (1< 0) this.m.subTo(r,r); return r; } // x/R mod m function montRevert(x) { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } // x = x/R mod m (HAC 14.32) function montReduce(x) { while(x.t <= this.mt2) // pad x so am has enough room later x[x.t++] = 0; for(var i = 0; i < this.m.t; ++i) { // faster way of calculating u0 = x[i]*mp mod DV var j = x[i]&0x7fff; var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM; // use am to combine the multiply-shift-add into one call j = i+this.m.t; x[j] += this.m.am(0,u0,x,i,0,this.m.t); // propagate carry while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; } } x.clamp(); x.drShiftTo(this.m.t,x); if(x.compareTo(this.m) >= 0) x.subTo(this.m,x); } // r = "x^2/R mod m"; x != r function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); } // r = "xy/R mod m"; x,y != r function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } Montgomery.prototype.convert = montConvert; Montgomery.prototype.revert = montRevert; Montgomery.prototype.reduce = montReduce; Montgomery.prototype.mulTo = montMulTo; Montgomery.prototype.sqrTo = montSqrTo; // (protected) true iff this is even function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; } // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) function bnpExp(e,z) { if(e > 0xffffffff || e < 1) return BigInteger.ONE; var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1; g.copyTo(r); while(--i >= 0) { z.sqrTo(r,r2); if((e&(1< 0) z.mulTo(r2,g,r); else { var t = r; r = r2; r2 = t; } } return z.revert(r); } // (public) this^e % m, 0 <= e < 2^32 function bnModPowInt(e,m) { var z; if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m); return this.exp(e,z); } // protected BigInteger.prototype.copyTo = bnpCopyTo; BigInteger.prototype.fromInt = bnpFromInt; BigInteger.prototype.fromString = bnpFromString; BigInteger.prototype.clamp = bnpClamp; BigInteger.prototype.dlShiftTo = bnpDLShiftTo; BigInteger.prototype.drShiftTo = bnpDRShiftTo; BigInteger.prototype.lShiftTo = bnpLShiftTo; BigInteger.prototype.rShiftTo = bnpRShiftTo; BigInteger.prototype.subTo = bnpSubTo; BigInteger.prototype.multiplyTo = bnpMultiplyTo; BigInteger.prototype.squareTo = bnpSquareTo; BigInteger.prototype.divRemTo = bnpDivRemTo; BigInteger.prototype.invDigit = bnpInvDigit; BigInteger.prototype.isEven = bnpIsEven; BigInteger.prototype.exp = bnpExp; // public BigInteger.prototype.toString = bnToString; BigInteger.prototype.negate = bnNegate; BigInteger.prototype.abs = bnAbs; BigInteger.prototype.compareTo = bnCompareTo; BigInteger.prototype.bitLength = bnBitLength; BigInteger.prototype.mod = bnMod; BigInteger.prototype.modPowInt = bnModPowInt; // "constants" BigInteger.ZERO = nbv(0); BigInteger.ONE = nbv(1); // Copyright (c) 2005-2009 Tom Wu // All Rights Reserved. // See "LICENSE" for details. // Extended JavaScript BN functions, required for RSA private ops. // Version 1.1: new BigInteger("0", 10) returns "proper" zero // Version 1.2: square() API, isProbablePrime fix // (public) function bnClone() { var r = nbi(); this.copyTo(r); return r; } // (public) return value as integer function bnIntValue() { if(this.s < 0) { if(this.t == 1) return this[0]-this.DV; else if(this.t == 0) return -1; } else if(this.t == 1) return this[0]; else if(this.t == 0) return 0; // assumes 16 < DB < 32 return ((this[1]&((1<>24; } // (public) return value as short (assumes DB>=16) function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; } // (protected) return x s.t. r^x < DV function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); } // (public) 0 if this == 0, 1 if this > 0 function bnSigNum() { if(this.s < 0) return -1; else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; else return 1; } // (protected) convert to radix string function bnpToRadix(b) { if(b == null) b = 10; if(this.signum() == 0 || b < 2 || b > 36) return "0"; var cs = this.chunkSize(b); var a = Math.pow(b,cs); var d = nbv(a), y = nbi(), z = nbi(), r = ""; this.divRemTo(d,y,z); while(y.signum() > 0) { r = (a+z.intValue()).toString(b).substr(1) + r; y.divRemTo(d,y,z); } return z.intValue().toString(b) + r; } // (protected) convert from radix string function bnpFromRadix(s,b) { this.fromInt(0); if(b == null) b = 10; var cs = this.chunkSize(b); var d = Math.pow(b,cs), mi = false, j = 0, w = 0; for(var i = 0; i < s.length; ++i) { var x = intAt(s,i); if(x < 0) { if(s.charAt(i) == "-" && this.signum() == 0) mi = true; continue; } w = b*w+x; if(++j >= cs) { this.dMultiply(d); this.dAddOffset(w,0); j = 0; w = 0; } } if(j > 0) { this.dMultiply(Math.pow(b,j)); this.dAddOffset(w,0); } if(mi) BigInteger.ZERO.subTo(this,this); } // (protected) alternate constructor function bnpFromNumber(a,b,c) { if("number" == typeof b) { // new BigInteger(int,int,RNG) if(a < 2) this.fromInt(1); else { this.fromNumber(a,c); if(!this.testBit(a-1)) // force MSB set this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this); if(this.isEven()) this.dAddOffset(1,0); // force odd while(!this.isProbablePrime(b)) { this.dAddOffset(2,0); if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this); } } } else { // new BigInteger(int,RNG) var x = new Array(), t = a&7; x.length = (a>>3)+1; b.nextBytes(x); if(t > 0) x[0] &= ((1< 0) { if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p) r[k++] = d|(this.s<= 0) { if(p < 8) { d = (this[i]&((1<

>(p+=this.DB-8); } else { d = (this[i]>>(p-=8))&0xff; if(p <= 0) { p += this.DB; --i; } } if((d&0x80) != 0) d |= -256; if(k == 0 && (this.s&0x80) != (d&0x80)) ++k; if(k > 0 || d != this.s) r[k++] = d; } } return r; } function bnEquals(a) { return(this.compareTo(a)==0); } function bnMin(a) { return(this.compareTo(a)<0)?this:a; } function bnMax(a) { return(this.compareTo(a)>0)?this:a; } // (protected) r = this op a (bitwise) function bnpBitwiseTo(a,op,r) { var i, f, m = Math.min(a.t,this.t); for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]); if(a.t < this.t) { f = a.s&this.DM; for(i = m; i < this.t; ++i) r[i] = op(this[i],f); r.t = this.t; } else { f = this.s&this.DM; for(i = m; i < a.t; ++i) r[i] = op(f,a[i]); r.t = a.t; } r.s = op(this.s,a.s); r.clamp(); } // (public) this & a function op_and(x,y) { return x&y; } function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; } // (public) this | a function op_or(x,y) { return x|y; } function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; } // (public) this ^ a function op_xor(x,y) { return x^y; } function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; } // (public) this & ~a function op_andnot(x,y) { return x&~y; } function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; } // (public) ~this function bnNot() { var r = nbi(); for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i]; r.t = this.t; r.s = ~this.s; return r; } // (public) this << n function bnShiftLeft(n) { var r = nbi(); if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r); return r; } // (public) this >> n function bnShiftRight(n) { var r = nbi(); if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r); return r; } // return index of lowest 1-bit in x, x < 2^31 function lbit(x) { if(x == 0) return -1; var r = 0; if((x&0xffff) == 0) { x >>= 16; r += 16; } if((x&0xff) == 0) { x >>= 8; r += 8; } if((x&0xf) == 0) { x >>= 4; r += 4; } if((x&3) == 0) { x >>= 2; r += 2; } if((x&1) == 0) ++r; return r; } // (public) returns index of lowest 1-bit (or -1 if none) function bnGetLowestSetBit() { for(var i = 0; i < this.t; ++i) if(this[i] != 0) return i*this.DB+lbit(this[i]); if(this.s < 0) return this.t*this.DB; return -1; } // return number of 1 bits in x function cbit(x) { var r = 0; while(x != 0) { x &= x-1; ++r; } return r; } // (public) return number of set bits function bnBitCount() { var r = 0, x = this.s&this.DM; for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x); return r; } // (public) true iff nth bit is set function bnTestBit(n) { var j = Math.floor(n/this.DB); if(j >= this.t) return(this.s!=0); return((this[j]&(1<>= this.DB; } if(a.t < this.t) { c += a.s; while(i < this.t) { c += this[i]; r[i++] = c&this.DM; c >>= this.DB; } c += this.s; } else { c += this.s; while(i < a.t) { c += a[i]; r[i++] = c&this.DM; c >>= this.DB; } c += a.s; } r.s = (c<0)?-1:0; if(c > 0) r[i++] = c; else if(c < -1) r[i++] = this.DV+c; r.t = i; r.clamp(); } // (public) this + a function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; } // (public) this - a function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; } // (public) this * a function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; } // (public) this^2 function bnSquare() { var r = nbi(); this.squareTo(r); return r; } // (public) this / a function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; } // (public) this % a function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; } // (public) [this/a,this%a] function bnDivideAndRemainder(a) { var q = nbi(), r = nbi(); this.divRemTo(a,q,r); return new Array(q,r); } // (protected) this *= n, this >= 0, 1 < n < DV function bnpDMultiply(n) { this[this.t] = this.am(0,n-1,this,0,0,this.t); ++this.t; this.clamp(); } // (protected) this += n << w words, this >= 0 function bnpDAddOffset(n,w) { if(n == 0) return; while(this.t <= w) this[this.t++] = 0; this[w] += n; while(this[w] >= this.DV) { this[w] -= this.DV; if(++w >= this.t) this[this.t++] = 0; ++this[w]; } } // A "null" reducer function NullExp() {} function nNop(x) { return x; } function nMulTo(x,y,r) { x.multiplyTo(y,r); } function nSqrTo(x,r) { x.squareTo(r); } NullExp.prototype.convert = nNop; NullExp.prototype.revert = nNop; NullExp.prototype.mulTo = nMulTo; NullExp.prototype.sqrTo = nSqrTo; // (public) this^e function bnPow(e) { return this.exp(e,new NullExp()); } // (protected) r = lower n words of "this * a", a.t <= n // "this" should be the larger one if appropriate. function bnpMultiplyLowerTo(a,n,r) { var i = Math.min(this.t+a.t,n); r.s = 0; // assumes a,this >= 0 r.t = i; while(i > 0) r[--i] = 0; var j; for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t); for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i); r.clamp(); } // (protected) r = "this * a" without lower n words, n > 0 // "this" should be the larger one if appropriate. function bnpMultiplyUpperTo(a,n,r) { --n; var i = r.t = this.t+a.t-n; r.s = 0; // assumes a,this >= 0 while(--i >= 0) r[i] = 0; for(i = Math.max(n-this.t,0); i < a.t; ++i) r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n); r.clamp(); r.drShiftTo(1,r); } // Barrett modular reduction function Barrett(m) { // setup Barrett this.r2 = nbi(); this.q3 = nbi(); BigInteger.ONE.dlShiftTo(2*m.t,this.r2); this.mu = this.r2.divide(m); this.m = m; } function barrettConvert(x) { if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m); else if(x.compareTo(this.m) < 0) return x; else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } } function barrettRevert(x) { return x; } // x = x mod m (HAC 14.42) function barrettReduce(x) { x.drShiftTo(this.m.t-1,this.r2); if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); } this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3); this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2); while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1); x.subTo(this.r2,x); while(x.compareTo(this.m) >= 0) x.subTo(this.m,x); } // r = x^2 mod m; x != r function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); } // r = x*y mod m; x,y != r function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } Barrett.prototype.convert = barrettConvert; Barrett.prototype.revert = barrettRevert; Barrett.prototype.reduce = barrettReduce; Barrett.prototype.mulTo = barrettMulTo; Barrett.prototype.sqrTo = barrettSqrTo; // (public) this^e % m (HAC 14.85) function bnModPow(e,m) { var i = e.bitLength(), k, r = nbv(1), z; if(i <= 0) return r; else if(i < 18) k = 1; else if(i < 48) k = 3; else if(i < 144) k = 4; else if(i < 768) k = 5; else k = 6; if(i < 8) z = new Classic(m); else if(m.isEven()) z = new Barrett(m); else z = new Montgomery(m); // precomputation var g = new Array(), n = 3, k1 = k-1, km = (1< 1) { var g2 = nbi(); z.sqrTo(g[1],g2); while(n <= km) { g[n] = nbi(); z.mulTo(g2,g[n-2],g[n]); n += 2; } } var j = e.t-1, w, is1 = true, r2 = nbi(), t; i = nbits(e[j])-1; while(j >= 0) { if(i >= k1) w = (e[j]>>(i-k1))&km; else { w = (e[j]&((1< 0) w |= e[j-1]>>(this.DB+i-k1); } n = k; while((w&1) == 0) { w >>= 1; --n; } if((i -= n) < 0) { i += this.DB; --j; } if(is1) { // ret == 1, don't bother squaring or multiplying it g[w].copyTo(r); is1 = false; } else { while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; } if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; } z.mulTo(r2,g[w],r); } while(j >= 0 && (e[j]&(1< 0) { x.rShiftTo(g,x); y.rShiftTo(g,y); } while(x.signum() > 0) { if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x); if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y); if(x.compareTo(y) >= 0) { x.subTo(y,x); x.rShiftTo(1,x); } else { y.subTo(x,y); y.rShiftTo(1,y); } } if(g > 0) y.lShiftTo(g,y); return y; } // (protected) this % n, n < 2^26 function bnpModInt(n) { if(n <= 0) return 0; var d = this.DV%n, r = (this.s<0)?n-1:0; if(this.t > 0) if(d == 0) r = this[0]%n; else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n; return r; } // (public) 1/this % m (HAC 14.61) function bnModInverse(m) { var ac = m.isEven(); if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; var u = m.clone(), v = this.clone(); var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); while(u.signum() != 0) { while(u.isEven()) { u.rShiftTo(1,u); if(ac) { if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); } a.rShiftTo(1,a); } else if(!b.isEven()) b.subTo(m,b); b.rShiftTo(1,b); } while(v.isEven()) { v.rShiftTo(1,v); if(ac) { if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); } c.rShiftTo(1,c); } else if(!d.isEven()) d.subTo(m,d); d.rShiftTo(1,d); } if(u.compareTo(v) >= 0) { u.subTo(v,u); if(ac) a.subTo(c,a); b.subTo(d,b); } else { v.subTo(u,v); if(ac) c.subTo(a,c); d.subTo(b,d); } } if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; if(d.compareTo(m) >= 0) return d.subtract(m); if(d.signum() < 0) d.addTo(m,d); else return d; if(d.signum() < 0) return d.add(m); else return d; } var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997]; var lplim = (1<<26)/lowprimes[lowprimes.length-1]; // (public) test primality with certainty >= 1-.5^t function bnIsProbablePrime(t) { var i, x = this.abs(); if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) { for(i = 0; i < lowprimes.length; ++i) if(x[0] == lowprimes[i]) return true; return false; } if(x.isEven()) return false; i = 1; while(i < lowprimes.length) { var m = lowprimes[i], j = i+1; while(j < lowprimes.length && m < lplim) m *= lowprimes[j++]; m = x.modInt(m); while(i < j) if(m%lowprimes[i++] == 0) return false; } return x.millerRabin(t); } // (protected) true if probably prime (HAC 4.24, Miller-Rabin) function bnpMillerRabin(t) { var n1 = this.subtract(BigInteger.ONE); var k = n1.getLowestSetBit(); if(k <= 0) return false; var r = n1.shiftRight(k); t = (t+1)>>1; if(t > lowprimes.length) t = lowprimes.length; var a = nbi(); for(var i = 0; i < t; ++i) { //Pick bases at random, instead of starting at 2 a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]); var y = a.modPow(r,this); if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { var j = 1; while(j++ < k && y.compareTo(n1) != 0) { y = y.modPowInt(2,this); if(y.compareTo(BigInteger.ONE) == 0) return false; } if(y.compareTo(n1) != 0) return false; } } return true; } // protected BigInteger.prototype.chunkSize = bnpChunkSize; BigInteger.prototype.toRadix = bnpToRadix; BigInteger.prototype.fromRadix = bnpFromRadix; BigInteger.prototype.fromNumber = bnpFromNumber; BigInteger.prototype.bitwiseTo = bnpBitwiseTo; BigInteger.prototype.changeBit = bnpChangeBit; BigInteger.prototype.addTo = bnpAddTo; BigInteger.prototype.dMultiply = bnpDMultiply; BigInteger.prototype.dAddOffset = bnpDAddOffset; BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; BigInteger.prototype.modInt = bnpModInt; BigInteger.prototype.millerRabin = bnpMillerRabin; // public BigInteger.prototype.clone = bnClone; BigInteger.prototype.intValue = bnIntValue; BigInteger.prototype.byteValue = bnByteValue; BigInteger.prototype.shortValue = bnShortValue; BigInteger.prototype.signum = bnSigNum; BigInteger.prototype.toByteArray = bnToByteArray; BigInteger.prototype.equals = bnEquals; BigInteger.prototype.min = bnMin; BigInteger.prototype.max = bnMax; BigInteger.prototype.and = bnAnd; BigInteger.prototype.or = bnOr; BigInteger.prototype.xor = bnXor; BigInteger.prototype.andNot = bnAndNot; BigInteger.prototype.not = bnNot; BigInteger.prototype.shiftLeft = bnShiftLeft; BigInteger.prototype.shiftRight = bnShiftRight; BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; BigInteger.prototype.bitCount = bnBitCount; BigInteger.prototype.testBit = bnTestBit; BigInteger.prototype.setBit = bnSetBit; BigInteger.prototype.clearBit = bnClearBit; BigInteger.prototype.flipBit = bnFlipBit; BigInteger.prototype.add = bnAdd; BigInteger.prototype.subtract = bnSubtract; BigInteger.prototype.multiply = bnMultiply; BigInteger.prototype.divide = bnDivide; BigInteger.prototype.remainder = bnRemainder; BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; BigInteger.prototype.modPow = bnModPow; BigInteger.prototype.modInverse = bnModInverse; BigInteger.prototype.pow = bnPow; BigInteger.prototype.gcd = bnGCD; BigInteger.prototype.isProbablePrime = bnIsProbablePrime; // JSBN-specific extension BigInteger.prototype.square = bnSquare; // Expose the Barrett function BigInteger.prototype.Barrett = Barrett // BigInteger interfaces not implemented in jsbn: // BigInteger(int signum, byte[] magnitude) // double doubleValue() // float floatValue() // int hashCode() // long longValue() // static BigInteger valueOf(long val) // Random number generator - requires a PRNG backend, e.g. prng4.js // For best results, put code like // // in your main HTML document. var rng_state; var rng_pool; var rng_pptr; // Mix in a 32-bit integer into the pool function rng_seed_int(x) { rng_pool[rng_pptr++] ^= x & 255; rng_pool[rng_pptr++] ^= (x >> 8) & 255; rng_pool[rng_pptr++] ^= (x >> 16) & 255; rng_pool[rng_pptr++] ^= (x >> 24) & 255; if(rng_pptr >= rng_psize) rng_pptr -= rng_psize; } // Mix in the current time (w/milliseconds) into the pool function rng_seed_time() { rng_seed_int(new Date().getTime()); } // Initialize the pool with junk if needed. if(rng_pool == null) { rng_pool = new Array(); rng_pptr = 0; var t; if(typeof window !== "undefined" && window.crypto) { if (window.crypto.getRandomValues) { // Use webcrypto if available var ua = new Uint8Array(32); window.crypto.getRandomValues(ua); for(t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t]; } else if(navigator.appName == "Netscape" && navigator.appVersion < "5") { // Extract entropy (256 bits) from NS4 RNG if available var z = window.crypto.random(32); for(t = 0; t < z.length; ++t) rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; } } while(rng_pptr < rng_psize) { // extract some randomness from Math.random() t = Math.floor(65536 * Math.random()); rng_pool[rng_pptr++] = t >>> 8; rng_pool[rng_pptr++] = t & 255; } rng_pptr = 0; rng_seed_time(); //rng_seed_int(window.screenX); //rng_seed_int(window.screenY); } function rng_get_byte() { if(rng_state == null) { rng_seed_time(); rng_state = prng_newstate(); rng_state.init(rng_pool); for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) rng_pool[rng_pptr] = 0; rng_pptr = 0; //rng_pool = null; } // TODO: allow reseeding after first request return rng_state.next(); } function rng_get_bytes(ba) { var i; for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); } function SecureRandom() {} SecureRandom.prototype.nextBytes = rng_get_bytes; // prng4.js - uses Arcfour as a PRNG function Arcfour() { this.i = 0; this.j = 0; this.S = new Array(); } // Initialize arcfour context from key, an array of ints, each from [0..255] function ARC4init(key) { var i, j, t; for(i = 0; i < 256; ++i) this.S[i] = i; j = 0; for(i = 0; i < 256; ++i) { j = (j + this.S[i] + key[i % key.length]) & 255; t = this.S[i]; this.S[i] = this.S[j]; this.S[j] = t; } this.i = 0; this.j = 0; } function ARC4next() { var t; this.i = (this.i + 1) & 255; this.j = (this.j + this.S[this.i]) & 255; t = this.S[this.i]; this.S[this.i] = this.S[this.j]; this.S[this.j] = t; return this.S[(t + this.S[this.i]) & 255]; } Arcfour.prototype.init = ARC4init; Arcfour.prototype.next = ARC4next; // Plug in your RNG constructor here function prng_newstate() { return new Arcfour(); } // Pool size must be a multiple of 4 and greater than 32. // An array of bytes the size of the pool will be passed to init() var rng_psize = 256; if (typeof exports !== 'undefined') { exports = module.exports = { BigInteger: BigInteger, SecureRandom: SecureRandom, }; } else { this.BigInteger = BigInteger; this.SecureRandom = SecureRandom; } }).call(this); /*********/ (function (factory) { "use strict"; var root = (typeof self === "object" && self.self === self && self) || (typeof global === "object" && global.global === global && global); if (typeof exports !== "undefined") { var BigInteger = require("jsbn").BigInteger; factory(root, exports, BigInteger); } else { var BigInt = root.BigInteger ? root.BigInteger : root.jsbn.BigInteger; root.Money = factory(root, {}, BigInt); } }(function (root, Money, BigInteger) { "use strict"; var Currency = function (code) { this.code = code; }, separateThousands = function (inStr, withStr) { var sign = "", src = inStr, ret = "", appendix; if (inStr[0] === "-") { sign = "-"; src = src.substr(1); } while (src.length > 0) { if (ret.length > 0) { ret = withStr + ret; } if (src.length <= 3) { ret = src + ret; break; } appendix = src.substr(src.length - 3, 3); ret = appendix + ret; src = src.substr(0, src.length - 3); } return sign + ret; }, integerValue = function (amount) { return (/^(\-?\d+)\.\d\d$/).exec(amount)[1]; }, isString = function (obj) { return Object.prototype.toString.call(obj) === "[object String]"; }, round = function (amount) { var fraction = parseInt(amount.substr(-2), 10), wholeAmount = integerValue(amount) + ".00"; return ( fraction < 50 ? wholeAmount : Money.add(wholeAmount, "1.00") ); }; Currency.prototype.format = function (amount) { switch (this.code) { case "JPY": return separateThousands(integerValue(amount), ","); case "EUR": case "GBP": return separateThousands(integerValue(amount), ".") + "," + amount.substr(-2); case "CHF": case "USD": return separateThousands(integerValue(amount), ",") + "." + amount.substr(-2); case "SEK": case "LTL": case "PLN": case "SKK": case "UAH": return separateThousands(integerValue(amount), " ") + "," + amount.substr(-2); default: return amount; } }; Money.amountToCents = function (amount) { return amount.replace(".", ""); }; Money.centsToAmount = function (cents) { var sign, abs; if (!isString(cents)) { return undefined; } sign = (cents[0] === "-" ? "-" : ""); abs = (sign === "-" ? cents.substr(1) : cents); while (abs.length < 3) { abs = ["0", abs].join(""); } return sign + abs.substr(0, abs.length - 2) + "." + abs.substr(-2); }; Money.floatToAmount = function (f) { return ("" + (Math.round(f * 100.0) / 100.0)) .replace(/^-(\d+)$/, "-$1.00") //-xx .replace(/^(\d+)$/, "$1.00") //xx .replace(/^-(\d+)\.(\d)$/, "-$1.$20") //-xx.xx .replace(/^(\d+)\.(\d)$/, "$1.$20"); //xx.xx }; Money.integralPart = function (amount) { return integerValue(amount); }; Money.format = function (currency, amount) { return new Currency(currency).format(amount); }; Money.add = function (a, b) { return Money.centsToAmount( new BigInteger( Money.amountToCents(a) ).add( new BigInteger(Money.amountToCents(b)) ).toString() ); }; Money.subtract = function (a, b) { return Money.centsToAmount( new BigInteger( Money.amountToCents(a) ).subtract( new BigInteger(Money.amountToCents(b)) ).toString() ); }; Money.mul = function (a, b) { return Money.centsToAmount( new BigInteger( Money.amountToCents(a) ).multiply( new BigInteger(Money.amountToCents(b)) ).divide( new BigInteger("100") ).toString() ); }; Money.div = function (a, b) { var hundredthsOfCents = new BigInteger( Money.amountToCents(a) ).multiply( new BigInteger("10000") ).divide( new BigInteger(Money.amountToCents(b)) ), remainder = parseInt(hundredthsOfCents.toString().substr(-2), 10); return Money.centsToAmount( hundredthsOfCents.divide( new BigInteger("100") ).add( new BigInteger(remainder > 50 ? "1" : "0") ).toString() ); }; Money.percent = function (value, percent) { var p = new BigInteger( Money.amountToCents(value) ).multiply( new BigInteger(Money.amountToCents(percent)) ), q = p.divide(new BigInteger("10000")), r = p.mod(new BigInteger("10000")); return Money.centsToAmount( (r.compareTo(new BigInteger("4999")) > 0 ? q.add(new BigInteger("1")) : q).toString() ); }; Money.roundUpTo5Cents = function (amount) { var lastDigit = parseInt(amount.substr(-1), 10), additon = "0.00"; if ((lastDigit % 5) !== 0) { additon = "0.0" + (5 - (lastDigit % 5)); } return Money.add(amount, additon); }; Money.roundTo5Cents = function (amount) { return Money.div( round(Money.mul(amount, "20.00")), "20.00" ); }; Money.cmp = function (a, b) { return new BigInteger(a.replace(".", "")).compareTo(new BigInteger(b.replace(".", ""))); }; return Money; })); /*********/ "use strict"; /* eslint no-var: 0, prefer-const: 0 */ /* exported throttle */ /************** * UTILITY *************/ // lodash.throttle, copy/pasted here to avoid including all of lodash var _now = Date.now || function () { return new Date().getTime(); }; var throttle = function throttle(func, wait, options) { var context; var args; var result; var timeout = null; var previous = 0; if (!options) { options = {}; } var later = function later() { previous = options.leading === false ? 0 : _now(); timeout = null; result = func.apply(context, args); if (!timeout) { context = args = null; } }; return function () { var now = _now(); if (!previous && options.leading === false) { previous = now; } var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); if (!timeout) { context = args = null; } } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; }; /*********/ /* eslint no-var: 0, prefer-const: 0 */ 'use strict'; /* * ANIMATED INTERNAL LINK SCROLLING */ var anchorScrolling = function anchorScrolling() { var navigationPipLinks = document.querySelectorAll('.navigation-pip .link a'); var IE = navigator.userAgent.indexOf('Trident') >= 0; var FF = navigator.userAgent.indexOf('Gecko/') >= 0; function getViewportNode() { if (document.scrollingElement) { return document.scrollingElement; } else if (IE || FF) { return document.documentElement; } else { return document.body; } } function linkClickHandler(event) { event.preventDefault(); var href = event.target.getAttribute('href'); var targetName = event.target.getAttribute('data-destinationBlock'); if (!targetName) { targetName = href.substring(1); event.target.setAttribute('data-destinationBlock', target); } var target = document.querySelector('[name="' + targetName + '"]'); // The bounding rect's top is relative to the viewport, so it represents the delta // in scroll position (top > 0 : scroll down, top < 0 : scroll up) var delta = target.getBoundingClientRect().top; // Number of pixels we want to "ease" the block into view when scrolling var BLOCK_SCROLL_EASE_AMOUNT = 750; window.doScroll(getViewportNode(), delta, BLOCK_SCROLL_EASE_AMOUNT, function () { window.location.hash = href; }); } for (var i = 0; i < navigationPipLinks.length; i++) { var link = navigationPipLinks.item(i); var href = link.getAttribute('href'); if (href.indexOf('#') === 0) { if (link.addEventListener) { link.addEventListener('click', linkClickHandler); } else { // IE8 link.attachEvent('onclick', linkClickHandler); } } } }; anchorScrolling(); /*********/ /* eslint no-var: 0, prefer-const: 0 */ 'use strict'; (function () { var currentLightboxImage = 0; var totalLightboxImages = 0; var lightboxVisible = false; var preloaded = false; var preloadUrls = []; var preloadedImages = []; var IMAGE_SELECTOR = 'section.lightbox-mode .graphic-pip-container:not(.force-disable-lightbox)' + ' img[data-lightbox-display="true"], .force-lightbox img[data-lightbox-display="true"]'; // Preload all lightbox images when called. Only works on first call. function preloadImages() { if (!preloaded) { for (var i = 0; i < preloadUrls.length; i++) { preloadedImages[i] = new Image(); preloadedImages[i].src = preloadUrls[i]; } preloaded = true; } } // Handler for on hover on lightbox images function handlePreload() { forEachLightboxImage(function (thisImage) { thisImage.removeEventListener('mouseenter', handlePreload); }); preloadImages(); } // Returns the dom node list of all lightbox images function getLightboxImages() { return document.querySelectorAll(IMAGE_SELECTOR); } // Run a function for each lightbox image function forEachLightboxImage(callback) { var images = getLightboxImages(); for (var i = 0; i < images.length; i++) { callback(images[i], i); } } // Do a first time setup for lightbox images function setupLightboxImage(thisImage, idx) { if (thisImage.dataset.lightboxUrl) { preloadUrls.push(thisImage.dataset.lightboxUrl); thisImage.dataset.lightboxImageIndex = idx; thisImage.style.cursor = 'pointer'; thisImage.addEventListener('click', showLightboxImage.bind(thisImage, thisImage)); thisImage.addEventListener('mouseenter', handlePreload); } } // Run the first time setup for all lightbox images function prepImagesForLightbox() { var images = getLightboxImages(); totalLightboxImages = images.length; forEachLightboxImage(setupLightboxImage); } // Returns a dom node based on lightbox image index function getImageElementByLightboxId(id) { return document.querySelector('[data-lightbox-image-index="' + id + '"]'); } // Show the next lightox image function nextLightboxImage() { currentLightboxImage += 1; if (currentLightboxImage >= totalLightboxImages) { currentLightboxImage = 0; } var nextImageEl = getImageElementByLightboxId(currentLightboxImage); showLightboxImage(nextImageEl); } // Show the previous lightbox image function previousLightboxImage() { currentLightboxImage -= 1; if (currentLightboxImage < 0) { currentLightboxImage = totalLightboxImages - 1; } var previousImageEl = getImageElementByLightboxId(currentLightboxImage); showLightboxImage(previousImageEl); } // Show a given image element in the lightbox function showLightboxImage(imageEl) { lightboxVisible = true; var imageToShow = imageEl.dataset.lightboxUrl; currentLightboxImage = parseInt(imageEl.dataset.lightboxImageIndex); document.querySelector('.lightbox-image').src = imageToShow; document.querySelector('.lightbox').classList.add('lightbox--visible'); } // Close the lightbox function closeLightbox() { lightboxVisible = false; document.querySelector('.lightbox').classList.remove('lightbox--visible'); } // Build the lightbox dom and add it to the page function addLightboxElementToPage() { var container = document.createElement('div'); container.classList.add('lightbox'); var cover = document.createElement('div'); cover.classList.add('lightbox-cover'); cover.addEventListener('click', closeLightbox); var xButton = document.createElement('div'); xButton.innerHTML = '×'; xButton.classList.add('lightbox-xButton'); xButton.addEventListener('click', closeLightbox); var next = document.createElement('div'); next.classList.add('lightbox-nav--next'); next.classList.add('lightbox-nav'); next.addEventListener('click', nextLightboxImage); var previous = document.createElement('div'); previous.classList.add('lightbox-nav--previous'); previous.classList.add('lightbox-nav'); previous.addEventListener('click', previousLightboxImage); var image = document.createElement('img'); image.classList.add('lightbox-image'); image.addEventListener('click', nextLightboxImage); container.appendChild(cover); container.appendChild(image); container.appendChild(next); container.appendChild(previous); container.appendChild(xButton); document.body.appendChild(container); } // Add keyboard listeners for the lightbox function setupKeyboardLightboxControls() { window.addEventListener('keydown', function (keyboardEvent) { if (lightboxVisible) { switch (keyboardEvent.keyCode) { case 37: previousLightboxImage(); break; case 39: nextLightboxImage(); break; case 27: closeLightbox(); break; } } }); } function removeLightboxClass() { var lightboxBlocks = document.querySelectorAll('section.lightbox-mode'); for (var i = 0; i < lightboxBlocks.length; i++) { lightboxBlocks[i].classList.remove('lightbox-mode'); } } // Only run the lightbox on browsers with dataset support (to prevent IE10- breakages) if (typeof document.body.dataset !== 'undefined') { addLightboxElementToPage(); prepImagesForLightbox(); setupKeyboardLightboxControls(); } else { // If the browser doesn't support dataset, we also want to remove the lightbox-mode class from blocks removeLightboxClass(); } })(); /*********/ /* eslint no-var: 0, prefer-const: 0 */ 'use strict'; (function () { var CAROUSEL_SELECTOR = '.block-content.carousel'; var FACE_WRAPPER_SELECTOR = '.carousel-faces'; var FACE_CONTROL_SELECTOR = '.carousel-face-controls .face-control'; var FACE_SELECTOR = FACE_WRAPPER_SELECTOR + ' .carousel-face'; var CURRENT_FACE_SELECTOR = FACE_WRAPPER_SELECTOR + ' .current'; var SWIPE_THRESHOLD = 50; function getCarouselBlocks() { return document.querySelectorAll(CAROUSEL_SELECTOR); } function getCarouselFaceControls(block) { return block.querySelectorAll(FACE_CONTROL_SELECTOR); } function getCarouselFaces(block) { return block.querySelectorAll(FACE_SELECTOR); } // Run a function for each element in the array function forEachElement(elements, callback) { for (var i = 0; i < elements.length; i++) { callback(elements[i], i); } } // Update the dot controls to display newly selected index function updateSelectedControls(block, selectedIndex) { forEachElement(getCarouselFaceControls(block), function (control, index) { if (index === selectedIndex) { control.classList.add('selected'); } else { control.classList.remove('selected'); } }); } // Set the transitioning class on the face wrapper and attach listener for its transitionend function setTransitionState(block, currentFace) { var faceWrapper = block.querySelector(FACE_WRAPPER_SELECTOR); faceWrapper.classList.add('transitioning'); currentFace.addEventListener(currentFace.style.WebkitTransition !== undefined ? 'webkitTransitionEnd' : 'transitionend', removeTransitionState.bind(null, block)); } // Remove the transition class and event when the animation has ended function removeTransitionState(block, transitionEvent) { if (!transitionEvent.target.classList.contains('carousel-face')) { return; } transitionEvent.target.parentNode.classList.remove('transitioning'); transitionEvent.target.removeEventListener(transitionEvent.type, this.removeTransitionState); } // Returns the currently selected block face index function getCurrentFaceIndex(block) { var faces = getCarouselFaces(block); var currentFace = block.querySelector(CURRENT_FACE_SELECTOR); return Array.prototype.indexOf.call(faces, currentFace); } function selectNextCarouselFace(block) { return selectCarouselFace(getCurrentFaceIndex(block) + 1, block); } function selectPreviousCarouselFace(block) { return selectCarouselFace(getCurrentFaceIndex(block) - 1, block); } // Handles the selection of a carousel face function selectCarouselFace(selectedIndex, block) { var faces = getCarouselFaces(block); var previousFace = block.querySelector(CURRENT_FACE_SELECTOR); var previousIndex = Array.prototype.indexOf.call(faces, previousFace); // Cycle through faces if we're at the end if (selectedIndex < 0) { selectedIndex = faces.length - 1; } else if (selectedIndex >= faces.length) { selectedIndex = 0; } updateSelectedControls(block, selectedIndex); setTransitionState(block, faces[selectedIndex]); forEachElement(getCarouselFaces(block), function (face, index) { if (index === selectedIndex) { face.classList.add('current'); face.classList.remove('left'); face.classList.remove('right'); face.classList.remove('previous'); } else { face.classList.remove('current'); if (index === previousIndex) { face.classList.add('previous'); } else { face.classList.remove('previous'); } if (index > selectedIndex) { face.classList.remove('left'); face.classList.add('right'); } else { face.classList.add('left'); face.classList.remove('right'); } } }); } function setContainerHeight(block) { // Set the height of the faces container to equal the height of the tallest face var maxFaceHeight = 0; forEachElement(block.querySelectorAll('.carousel-face'), function (face) { var faceHeight = face.getBoundingClientRect().height; if (faceHeight > maxFaceHeight) { maxFaceHeight = faceHeight; } }); block.querySelector('.carousel-faces').style.height = maxFaceHeight + 'px'; } // Initialize all the listeners we need for clickable elements forEachElement(getCarouselBlocks(), function (block) { var swipeStartX = 0; block.addEventListener('touchstart', function (event) { var touchInfo = event.changedTouches[0]; swipeStartX = touchInfo.pageX; }); block.addEventListener('touchend', function (event) { var touchInfo = event.changedTouches[0]; var swipeEndX = touchInfo.pageX; var swipeDiff = swipeStartX - swipeEndX; // Swipe right if (swipeDiff > SWIPE_THRESHOLD) { selectNextCarouselFace(block); } else if (swipeDiff < -1 * SWIPE_THRESHOLD) { selectPreviousCarouselFace(block); } }); // Attach click listeners for the dot controls. forEachElement(getCarouselFaceControls(block), function (control, index) { control.addEventListener('click', selectCarouselFace.bind(null, index, block)); }); // Attach click listners for the side controls. forEachElement(block.querySelectorAll('.face-control-side'), function (control) { if (control.classList.contains('left')) { control.addEventListener('click', selectPreviousCarouselFace.bind(null, block)); } else if (control.classList.contains('right')) { control.addEventListener('click', selectNextCarouselFace.bind(null, block)); } }); window.setTimeout(setContainerHeight.bind(null, block), 1); window.addEventListener('resize', setContainerHeight.bind(null, block)); var imagesInCarousel = block.querySelectorAll('.carousel-face img'); var imagesLoaded = 0; forEachElement(imagesInCarousel, function (image) { var imageToLoad = new Image(); imageToLoad.onload = function () { imagesLoaded++; if (imagesLoaded === imagesInCarousel.length) { setContainerHeight(block); } }; imageToLoad.src = image.getAttribute('src'); }); }); })(); /*********/ 'use strict'; /* eslint no-var: 0, prefer-const: 0 */ /* eslint camelcase: 0 */ (function () { var PAYPAL_ENDPOINT = 'https://www.paypal.com/cgi-bin/webscr'; var Money = window.Money; var validMoneyRegex = /^\-?\d+\.\d\d$/; function Cart() { this.items = []; this.cartNode = document.getElementsByClassName('shoppingCart')[0]; this.pipNodes = document.getElementsByClassName('paypal-pip'); this.business = this.cartNode && this.cartNode.getAttribute('data-publishedjs-merchant-id'); this.currency = this.cartNode && this.cartNode.getAttribute('data-publishedjs-currency'); this.currencySymbol = this.cartNode && this.cartNode.getAttribute('data-publishedjs-currency-symbol'); // abort cart creation in the case of no cart or business if (!this.cartNode || !this.business) { return false; } if (typeof window.localStorage !== 'undefined') { this.fromJSON(window.localStorage.getItem('shoppingCart')); } // attach event listeners to payment buttons for (var i = 0; i < this.pipNodes.length; i++) { var paypalPip = this.pipNodes[i]; var paypalPipButton = paypalPip.getElementsByClassName('paypal-addToCart')[0]; paypalPipButton.addEventListener('click', function (event) { var item = getItemData(event.target); this.addItem(item); event.preventDefault(); return false; }.bind(this)); } // attach event listener to cart widget var cartHandler = this.cartNode.querySelector('.shoppingCart__openHandler'); cartHandler.addEventListener('click', this.toggleCartOpen.bind(this)); var continueShoppingButton = this.cartNode.querySelector('.shoppingCart__button__continue'); continueShoppingButton.addEventListener('click', this.toggleCartOpen.bind(this)); var closeButton = this.cartNode.querySelector('.shoppingCart__close'); closeButton.addEventListener('click', this.toggleCartOpen.bind(this)); var checkoutButton = this.cartNode.querySelector('.shoppingCart__button__checkout'); checkoutButton.addEventListener('click', this.checkout.bind(this)); document.addEventListener('click', function (e) { if (this.cartNode.classList.contains('shoppingCart--open') && !this.cartNode.contains(e.target)) { this.toggleCartOpen(e); } }.bind(this)); this.updateCartContents(); } Cart.prototype.toggleCartOpen = function (event) { this.cartNode.classList.toggle('shoppingCart--open'); document.body.classList.toggle('no-scroll'); event.preventDefault(); event.stopPropagation(); return false; }; Cart.prototype.fromJSON = function (json) { if (!json) { return; } if (typeof json === 'string') { try { json = JSON.parse(json); } catch (e) { console.error(e); return; } } if (json.items) { this.items = json.items; } }; Cart.prototype.toJSON = function () { return { items: this.items }; }; Cart.prototype.addItem = function (item) { // If an entry already exists for this item, combine quantity var itemExists = false; for (var i = 0; i < this.items.length; i++) { if (this.items[i].id === item.id) { this.items[i].quantity += item.quantity; itemExists = true; break; } } // Otherwise add entry for item if (!itemExists) { this.items.push(item); } this.updateCartContents(); }; Cart.prototype.removeItemAtIndex = function (index) { this.items.splice(index, 1); this.updateCartContents(); }; Cart.prototype.isEmpty = function () { return this.items.length === 0; }; Cart.prototype.removeAllItems = function () { this.items = []; this.updateCartContents(); }; /* * Returns an object that represents the cart and the items in it. * The attributes in the object conform directly to the paypal cart upload command: * https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/cart_upload/ */ Cart.prototype.getCart = function () { var cart = this.items.reduce(function (result, item, index) { for (var key in item) { result[[key, index + 1].join('_')] = item[key]; } return result; }, {}); cart.cmd = '_cart'; cart.upload = '1'; cart.business = this.business; cart.currency_code = this.currency; return cart; }; Cart.prototype.getQuantity = function () { return this.items.reduce(function (sum, item) { return sum + item.quantity; }, 0); }; Cart.prototype.updateCartContents = function () { var contentsNode = this.cartNode.querySelector('.shoppingCart__contents'); if (this.items.length) { contentsNode.classList.remove('shoppingCart__contents--empty'); } else { contentsNode.classList.add('shoppingCart__contents--empty'); } var itemsNode = this.cartNode.querySelector('.shoppingCart__items'); itemsNode.innerHTML = ''; for (var i = 0; i < this.items.length; i++) { var item = this.createItemNode(this.items[i], i); itemsNode.appendChild(item); } var removeButtons = this.cartNode.querySelectorAll('.shoppingCart__item .item-remove'); for (i = 0; i < removeButtons.length; i++) { var button = removeButtons[i]; button.addEventListener('click', function (e) { var itemIndex = e.target.getAttribute('data-item-index'); this.removeItemAtIndex(itemIndex); e.preventDefault(); e.stopPropagation(); return false; }.bind(this)); } this.updateLabel(); this.updateTotal(); if (this.items.length > 0) { if (typeof window.localStorage !== 'undefined') { window.localStorage.setItem('shoppingCart', JSON.stringify(this.toJSON())); } } else { if (typeof window.localStorage !== 'undefined') { window.localStorage.removeItem('shoppingCart'); } } }; Cart.prototype.createItemNode = function (item, index) { var totalItemAmount = Money.mul(item.amount, Money.floatToAmount(item.quantity)); var itemNode = this.cartNode.querySelector('.shoppingCart__item__template').firstChild.cloneNode(true); if (item.quantity > 1) { itemNode.classList.add('hasQuantity'); itemNode.querySelector('.item-quantity').innerHTML = item.quantity + ' x ' + this.currencySymbol + Money.format(this.currency_code, item.amount); } else { var quantityNode = itemNode.querySelector('.item-quantity'); quantityNode.parentNode.removeChild(quantityNode); } itemNode.querySelector('.item-name').innerHTML = item.item_name; itemNode.querySelector('.item-price').innerHTML = this.currencySymbol + Money.format(this.currency_code, totalItemAmount); itemNode.querySelector('.item-remove').setAttribute('data-item-index', index); return itemNode; }; Cart.prototype.updateLabel = function () { var quantity = this.getQuantity(); this.cartNode.setAttribute('data-quantity', quantity); if (quantity >= 100) { this.cartNode.classList.add('shoppingCart--large'); } else { this.cartNode.classList.remove('shoppingCart--large'); } }; Cart.prototype.updateTotal = function () { if (!this.items.length) { return; } var total = this.items.reduce(function (sum, item) { return Money.add(Money.floatToAmount(sum), Money.mul(item.amount, Money.floatToAmount(item.quantity))); }, 0); var totalNode = this.cartNode.querySelector('.shoppingCart__total .total-amount'); totalNode.innerHTML = this.currencySymbol + Money.format(this.currency_code, total); }; Cart.prototype.checkout = function (event) { if (this.isEmpty()) { return false; } post(PAYPAL_ENDPOINT, this.getCart()); this.removeAllItems(); event.preventDefault(); return false; }; /* * Ensure that the amount is in the format xx.xx * This is a requirement for the money-math library. */ function getMoneyAmount(value) { if (!value || value.match(validMoneyRegex)) { return value; } value = parseFloat(value); return Money.floatToAmount(value); } function getItemData(element) { return { id: element.getAttribute('data-publishedjs-id'), item_name: element.getAttribute('data-publishedjs-item-name'), amount: getMoneyAmount(element.getAttribute('data-publishedjs-amount')), shipping: getMoneyAmount(element.getAttribute('data-publishedjs-shipping')), tax: getMoneyAmount(element.getAttribute('data-publishedjs-tax')), quantity: parseInt(element.getAttribute('data-publishedjs-quantity'), 10) }; } function post(path, params) { var form = document.createElement('form'); form.setAttribute('method', 'post'); form.setAttribute('target', '_blank'); if (path) { form.setAttribute('action', path); } for (var key in params) { var name = key; var value = params[key]; var hiddenField = document.createElement('input'); hiddenField.setAttribute('type', 'hidden'); hiddenField.setAttribute('name', name); hiddenField.setAttribute('value', value); form.appendChild(hiddenField); } document.body.appendChild(form); form.submit(); } new Cart(); })(); /*********/ /* eslint no-var: 0, prefer-const: 0 */ 'use strict'; (function () { function toggleMenuClasses() { var mobileContent = document.querySelector('.mobile-content'); document.body.classList.toggle('no-scroll'); document.body.classList.toggle('mobile-menu-active'); mobileContent.classList.toggle('active'); } function handleMenuClick(event) { if (event) { event.preventDefault(); event.stopPropagation(); } toggleMenuClasses(); } function setUpButtonHandler() { // Set header z-index to be higher permanently at the block level // This guarantees that the overlay will be above all other site content // By changing its stacking context var headerBlock = document.querySelector('.is-position-top'); if (headerBlock) { headerBlock.style.zIndex = '10'; } var menuButton = document.querySelectorAll('.pip.navigation-pip .mobile-menu-button'); for (var m = 0; m < menuButton.length; m++) { menuButton[m].onclick = handleMenuClick; } var navLinks = document.querySelectorAll('.mobile-wrapper a'); for (var i = 0; i < navLinks.length; i++) { // Only apply a click handler to internal block links if (navLinks[i].getAttribute('href').indexOf('#') === 0) { navLinks[i].addEventListener('click', toggleMenuClasses); } } } setUpButtonHandler(); })(); /*********/ /* eslint no-var: 0, prefer-const: 0 */ 'use strict'; function shouldDockRight(elm) { if (!elm) { return false; } var rect = elm.getBoundingClientRect(); var elmWidth = rect.width; var elmLeft = rect.left; return elmWidth + elmLeft > window.pageXOffset + window.innerWidth; } function positionChildNav(elm) { if (shouldDockRight(elm)) { elm.classList.add('nav-children--right'); } } function applyPositionToSubnav(elm) { if (elm.tagName === 'LI' && elm.classList.contains('link')) { return positionChildNav(elm.querySelector('.nav-children')); } else if (elm.parentNode) { // recursively call to check if the parent node is `li.link` return applyPositionToSubnav(elm.parentNode); } } function handleSubnavEvent(event) { applyPositionToSubnav(event.target); } function setupSubNavPositioningEventHandlers() { var desktopLinkList = document.querySelector('.desktopLinks'); if (!desktopLinkList) { return; } desktopLinkList.addEventListener('mouseover', handleSubnavEvent); desktopLinkList.addEventListener('click', handleSubnavEvent); var topLevelLinks = document.querySelectorAll('.desktopLinks > li > a'); if (!topLevelLinks) { return; } for (var i = 0; i < topLevelLinks.length; i++) { topLevelLinks[i].addEventListener('focus', handleSubnavEvent); } } // only execute when in preview or publish mode if (typeof window !== 'undefined' && window.towerData === undefined) { setupSubNavPositioningEventHandlers(); } if (typeof module !== 'undefined') { module.exports = { shouldDockRight: shouldDockRight }; } /*********/ var tower = {"document":{"documentStyle":{"colorPalette":{"userSet":true,"name":"Pour House 3","slug":"pourHouse3","colors":{"color1":{"name":"Pour House 3 - Coffee","value":"#332019"},"color2":{"name":"Pour House 3 - Carmel","value":"#b6550e"},"color3":{"name":"Pour House 3 - Tan","value":"#8f765a"},"color4":{"name":"Pour House 3 - White","value":"#ece8e2"},"color5":{"name":"Pour House 3 - Black","value":"#090909"}},"matchingDefault":false},"fontPack":{"name":"Oxygen & Source Sans Pro","slug":"oxygen-source-sans-pro","imports":{"google":["Oxygen","Source Sans Pro"]},"fonts":{"font1":{"name":"Oxygen","value":"\"Oxygen\", sans-serif"},"font2":{"name":"Source Sans Pro","value":"\"Source Sans Pro\", sans-serif"}},"fontSizes":{"fontSize1":{"name":"Smallest","value":"60%"},"fontSize2":{"name":"Smaller","value":"80%"},"fontSize3":{"name":"Normal","value":"100%"},"fontSize4":{"name":"Larger","value":"120%"},"fontSize5":{"name":"Largest","value":"140%"}}},"width":"1100px","align":"center","buttonStyle":{"radius":"square","style":"flat"},"animation":true,"backgroundColor":"#332019","siteAlignment":"center"},"headerBlock":{"slug":"header-crafty-logo","displayName":"Middle Line","lessSheet":".block.header-crafty,\n.block.header-crafty-logo {\n\tposition: relative;\n\theight: 450px;\n\n\t@media @mobile {\n\t\theight: 350px;\n\t}\n\n\t.block-background {\n\t\t.block-background-color {\n\t\t\theight: auto;\n\t\t\tbottom: 50%;\n\n\t\t\t@media @mobile {\n\t\t\t\tbottom: 0;\n\t\t\t}\n\n\t\t\tbackground: #000 !important;\n\t\t}\n\t}\n\n\t.block-content {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-width: none !important;\n\t\tpadding: 0;\n\t\ttext-align: center;\n\n\t\t.hero-group {\n\t\t\theight: ~'calc(50% - 30px)';\n\n\t\t\t@media @mobile {\n\t\t\t\theight: ~'calc(95% - 30px)';\n\t\t\t}\n\n\t\t\t.display-flex();\n\t\t\t.flex-direction(column);\n\t\t\t.justify-content(center);\n\n\t\t\t.header-title {\n\t\t\t\twidth: 80%;\n\t\t\t\tmargin: 0 auto 10px;\n\t\t\t\tz-index: 2;\n\n\t\t\t\t@media @mobile {\n\t\t\t\t\t.title {\n\t\t\t\t\t\tline-height: 1.2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.header-subtitle {\n\t\t\t\twidth: 80%;\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tz-index: 2;\n\t\t\t}\n\t\t}\n\n\t\t.navigation-pip {\n\t\t\tz-index: 3;\n\t\t\twidth: 100%;\n\t\t\tmin-height: 60px;\n\t\t\tmargin: 5em auto 0;\n\t\t\tpadding: 0;\n\t\t\tline-height: 60px;\n\n\t\t\t@media @tablet {\n\t\t\t\tbackground-color: transparent !important;\n\t\t\t}\n\n\t\t\t.link {\n\t\t\t\tmargin: 0;\n\n\t\t\t\ta {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\tpadding: 0 20px;\n\t\t\t\t\ttext-decoration: none !important;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.link-placeholder:before {\n\t\t\t\ttop: 0;\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.block.header-crafty-logo {\n\t.block-content {\n\n\t\t.logo-pip {\n\t\t\tmargin-bottom: 5px;\n\t\t\tmargin-top: 30px;\n\n\t\t\t.logo-type-container {\n\t\t\t\tleft: -10px;\n\t\t\t}\n\n\t\t\t&.graphic-mode {\n\t\t\t\t.logo-type-container {\n\t\t\t\t\tbottom: -20px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.homeLink {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t.hero-group .header-title {\n\t\t\twidth: auto;\n\t\t\tmargin-bottom: 0;\n\t\t\tfont-size: 2.125em;\n\t\t\tline-height: 1.4em;\n\t\t}\n\n\t\t.icon-pip.is-resizable .icon-container {\n\t\t\twidth: auto !important;\n\t\t\theight: auto !important;\n\t\t}\n\t}\n\n\t&.slim {\n\t\theight: 350px;\n\n\t\t.block-background .block-background-color {\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t.hero-group {\n\t\t\theight: ~'calc(100% - 90px)';\n\t\t}\n\n\t\t.block-image-edit-change-wrapper,\n\t\t.block-image-crop-toolbar-wrapper {\n\t\t\tbottom: 70px;\n\t\t}\n\t}\n}\n","props":{"disableBottomResizing":true,"nameable":true,"positionOverlay":true,"position":"top","moveable":false,"name":"Home","styleOptions":["full","slim"],"background":{"contentBinding":{"name":"headerBackgroundImage","source":"page"},"color":{"value":"color1","opacity":0.5},"image":{"url":"stockservice.digital.vistaprint.com/94461aa29e8c4b3e9980484f2d5756b3.jpg","originalUrl":"stockservice.digital.vistaprint.com/94461aa29e8c4b3e9980484f2d5756b3.jpg","cropData":{"verticalOffset":50},"imageSearchText":"wedding","imageId":"S000002906","forceChangeImage":false},"backgroundType":"image"},"instanceLess":".block.header-crafty[data-tower-id=@{towerId}],\n.block.header-crafty-logo[data-tower-id=@{towerId}] {\n\tbackground-color: @foregroundColor;\n\n\t.navigation-pip {\n\t\tbackground: @backgroundColor;\n\t\t.link {\n\t\t\t&:hover, a.navigation-link-active-page {\n\t\t\t\tbackground: fadeOut(@foregroundColor, 93%);\n\t\t\t}\n\t\t\ta {\n\t\t\t\tcolor: @accentColor1;\n\t\t\t}\n\t\t}\n\t}\n}\n","type":"header","disableTopResizing":true},"children":[{"pip":"col","props":{"className":"hero-group","uid":1450366894230},"children":[{"pip":"logo","props":{"logoMode":"textOnly","height":"60px","homeLink":true,"layout":"centerStacked","contentBinding":{"name":"headerLogoMode","source":"site"},"uid":1450366894231},"children":[{"pip":"graphic","props":{"supportedTypes":["icon","image"],"uid":1450366894232,"aspectRatio":-1,"contentBinding":{"name":"headerLogoImage","source":"site"},"userSize":100,"resizeMin":25,"resizeMax":105,"resizeDefault":100,"iconStyle":{"height":"60px","width":"60px"},"url":"//imageprocessor.digital.vistaprint.com/crop/0,2,304x478/http://www.vistaprint.com/any/preview/image.aspx?image_type=upload&image_token=338012024-6e027803e8-d30c82&png=1&mcp_rp=1","originalUrl":"http://www.vistaprint.com/any/preview/image.aspx?image_type=upload&image_token=338012024-6e027803e8-d30c82&png=1&mcp_rp=1","cropData":{"x":0,"y":2,"width":304,"height":478,"verticalOffset":100},"rotation":0,"forceChangeImage":false,"linkUrl":"","linkNewTab":true,"linkEmailUrl":"","hideStockImages":false,"setCropBoxToPicture":false,"lightboxStatus":"default","contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}},{"pip":"logo-text","props":{"className":"header-title","content":"

Your Business Name

","level":1,"defaultColor":"color4","defaultFont":"font1","contentBinding":{"name":"headerLogoText","source":"site"},"uid":1450366894233,"paragraphWrappedContent":true,"fontRequired":[]}}]},{"pip":"title","props":{"showBeacon":false,"paragraphWrappedContent":true,"defaultColor":"color4","className":"header-subtitle","level":5,"requiresCustomization":true,"contentBinding":{"name":"headerSubtitleText","source":"page"},"uid":1450366894234,"defaultFont":"font1","content":"Creating Extravagant Events
","fontRequired":["google:Dancing Script"],"websafeFonts":[],"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}]},{"pip":"navigation","props":{"defaultFontSize":"fontSize3","mobileMenu":"tablet","defaultColor":"color4","defaultFont":"font2","uid":1450366894235,"isRelative":false,"adjustableMobileMenuColor":false,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}],"_uid":1450366894229},"footerBlock":{"slug":"footer-local-social","props":{"nameable":false,"moveable":false,"position":"bottom","positionOverlay":true,"background":{"color":{"value":"color1","opacity":1},"backgroundType":"color"},"instanceLess":".block.footer-local-social[data-tower-id=@{towerId}] {\n\t.pip.social-col {\n\t\t&:before {\n\t\t\tbackground-color: darken(@backgroundColor, 5%);\n\t\t}\n\t}\n}\n"},"children":[{"pip":"row","props":{"className":"footer--row","backgroundOpacity":1,"uid":1511721230126},"children":[{"pip":"group","props":{"className":"group--contact","backgroundOpacity":1,"uid":1511721230127},"children":[{"pip":"row","children":[{"pip":"col","children":[{"pip":"paragraph","props":{"className":"footer-company-name","level":5,"defaultFont":"font2","contentBinding":{"name":"footerTitle","source":"site"},"content":"

© 2017 The Wedding Decorators Inc.

","defaultFontSize":"fontSize3","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"paragraphWrappedContent":true,"uid":1511721230130,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","0","content"]}]}],"props":{"uid":1511721230129}},{"pip":"col","children":[{"pip":"paragraph","props":{"className":"footer-email","level":5,"defaultFont":"font2","contentBinding":{"name":"footerEmail","source":"site"},"content":"

weddingdecorators@hotmail.com

","defaultFontSize":"fontSize3","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"paragraphWrappedContent":true,"uid":1511721230132,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","1","content"]}]}],"props":{"uid":1511721230131}},{"pip":"col","children":[{"pip":"paragraph","props":{"className":"footer-address","level":5,"defaultFont":"font2","contentBinding":{"name":"footerAddress","source":"site"},"content":"

Brampton, ON Canada

","defaultFontSize":"fontSize3","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"paragraphWrappedContent":true,"uid":1511721230134,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","2","content"]}]}],"props":{"uid":1511721230133}}],"props":{"uid":1511721230128,"backgroundOpacity":1}}]},{"pip":"group","props":{"className":"group--social","backgroundOpacity":1,"uid":1511721230135},"children":[{"pip":"col","props":{"className":"social-col","uid":1511721230136},"children":[{"pip":"social","props":{"className":"footer-social-links","requiresCustomization":true,"contentBinding":{"name":"footerSocialLinks","source":"site"},"links":[{"service":"facebook","url":"https://facebook.com/theweddingdecoratorsinc"},{"service":"twitter","url":"https://twitter.com/theweddingdecor"},{"service":"instagram","url":"https://instagram.com/theweddingdecoratorsinc"}],"iconType":"circle","outerSize":"42px","innerSizeNoBG":"26px","innerSizeWithBG":"16px","uid":1511721230137,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","links"],"assetPath":["socialLinks","0","links"]},{"propertyPath":["props","iconType"],"assetPath":["socialLinks","0","iconType"]}]}]}]}]}],"assets":[{"propertyPath":["displayName"],"assetPath":["displayName"]},{"propertyPath":["props","background"],"assetPath":["background"]},{"propertyPath":["props","userHeight"],"assetPath":["userHeight"]}],"displayName":"Local Social Footer","lessSheet":".block.footer-local-social {\n\t.block-content {\n\t\tpadding: 0;\n\t\tmax-width: none;\n\t}\n\n\t@media @tablet {\n\t\t.footer--row {\n\t\t\t.display-flex(block);\n\t\t}\n\t}\n\n\t.footer--row .pip.paragraph-pip {\n\t\tmargin: 0;\n\t\tline-height: 1.5;\n\t}\n\n\t.group--contact {\n\t\tmargin: 0 70px;\n\t\tpadding: 40px 0;\n\t\t.flex(1);\n\t\t.align-self(center);\n\n\t\t@media @tablet {\n\t\t\t.display-flex(block);\n\t\t\tmargin: 0;\n\t\t\t.col-pip{\n\t\t\t\tdisplay: block;\n\t\t\t\tmargin: 0 10px;\n\t\t\t}\n\t\t}\n\t\t@media @mobile {\n\t\t\t.col-pip{\n\t\t\t\tdisplay: block;\n\t\t\t\tmargin: 20px;\n\t\t\t}\n\t\t\t.row-pip{\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n\n\t.group--social {\n\t\t.display-flex(flex);\n\t\twidth: 25%;\n\n\t\t@media @tablet {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t.social-col {\n\t\tmargin: 0;\n\t\tpadding: 40px 60px;\n\n\t\t@media @tablet {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t&:before {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\t}\n\n\t.social-link{\n\t\tmargin-top: 5px;\n\t\tmargin-bottom: 5px;\n\t}\n\t\n\t.social-col .social-icon {\n\t\twidth: 38px;\n\t\theight: 38px;\n\t}\n}\n","_uid":1511721230125},"homePageId":2684608560,"multipage":true,"pages":{"2684608560":{"id":2684608560,"name":"Home","path":"","order":0,"hidden":false,"seoTitle":"The Wedding Decorators Inc"},"1585154601910954":{"id":1585154601910954,"name":"Contact","path":"contact","order":6,"hidden":false,"seoTitle":"Contact"},"1585154602198244":{"id":1585154602198244,"name":"About","path":"about","order":1,"hidden":false,"seoTitle":"About"},"1585156906509756":{"id":1585156906509756,"name":"Quotes & Packages","path":"quotes-and-packages","order":4,"hidden":false,"external":false,"url":"","seoTitle":"Quotes & Packages"},"1585157471254980":{"id":1585157471254980,"name":"Gallery","path":"gallery","order":3,"hidden":false,"external":false,"url":"","seoTitle":"Gallery"},"1585158787388787":{"id":1585158787388787,"name":"Services","path":"services","order":2,"hidden":false,"external":false,"url":"","seoTitle":"Services"},"1614785196630942":{"id":1614785196630942,"name":"Jobs/Volunteer","path":"jobsvolunteer","order":5,"hidden":false,"external":false,"url":"","seoTitle":"Jobs/Volunteer"}},"metadata":{"publishedUrl":"http://2rd99ijn8ul0lvza.vistaprintdigital.com","towerVersion":"17.0.0","hasBeenEdited":true,"goals":[0],"matchingLogo":"","industry":{"id":11,"slug":"events","i18n":"events","original":21},"businessName":"The Wedding Decorators Inc","contentBinding":{"headerLogoText":{"content":"The Wedding Decorators Inc"},"headerLogoImage":{"url":"//imageprocessor.digital.vistaprint.com/crop/0,2,304x478/http://www.vistaprint.com/any/preview/image.aspx?image_type=upload&image_token=338012024-6e027803e8-d30c82&png=1&mcp_rp=1","originalUrl":"http://www.vistaprint.com/any/preview/image.aspx?image_type=upload&image_token=338012024-6e027803e8-d30c82&png=1&mcp_rp=1","cropData":{"x":0,"y":2,"width":304,"height":478,"verticalOffset":100},"svgdata":""},"headerServiceIcon1":{"svgdata":"","iconSearchText":"","iconId":"70156","tags":["cater","event"]},"headerServiceIcon2":{"svgdata":"","iconSearchText":"","iconId":"18594","tags":["birthday","event"]},"headerServiceIcon3":{"svgdata":"","iconSearchText":"","iconId":"7516","tags":["party","event"]},"footerTitle":{"content":"

© 2018 The Wedding Decorators Inc.

","fontRequired":[]},"footerEmail":{"content":"

weddingdecorators@hotmail.com

","fontRequired":[]},"footerAddress":{"content":"

Brampton, ON Canada

","fontRequired":[]},"footerSocialLinks":{"links":[{"service":"facebook","url":"https://facebook.com/theweddingdecoratorsinc"},{"service":"twitter","url":"https://twitter.com/theweddingdecor"},{"service":"instagram","url":"https://instagram.com/theweddingdecoratorsinc"}]},"headerLogoMode":{"logoMode":"textOnly"},"socialLinks":{"links":[{"service":"instagram","url":"https://instagram.com/theweddingdecoratorsinc"},{"service":"facebook","url":"https://facebook.com/theweddingdecoratorsinc"},{"service":"twitter","url":"https://twitter.com/theweddingdecor"}]},"headerBackgroundImage":{"image":{"url":"http://stockservice.digital.vistaprint.com/94461aa29e8c4b3e9980484f2d5756b3.jpg","originalUrl":"http://stockservice.digital.vistaprint.com/94461aa29e8c4b3e9980484f2d5756b3.jpg","imageSearchText":"","tags":["event","wedding"],"imageId":16,"size":{"width":5410,"height":3600}}},"headerSubtitleText":{"content":"Creating Extravagant Events
","fontRequired":["google:Dancing Script"]}},"domain":"2rd99ijn8ul0lvza.vistaprintdigital.com","email":"weddingdecorators@hotmail.com","customizedPips":["1585154602198244-1450366894234","1585154602198244-1450366894234","1585154602198244-1450366894234","1585154602198244-1450366894234","1585154602198244-1450366894234","1585154602198244-1450366894232","1585154602198244-1450366894232","1585154602198244-1450366894232","1585154602198244-1511721230054","1585154602198244-1450366894291","1585154602198244-1450366894291","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230130","1585154602198244-1511721230134","1585154602198244-1511721230134","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230137","1585154602198244-1511721230132","1585154602198244-1511721230054","1585154602198244-1511721230054","1585154602198244-1511721230054","1585154602198244-1511721230141","1585154602198244-1450366894231","1585154602198244-1511721230134","1585154602198244-1511721230132","1585154602198244-1511721230132","1585154602198244-1511721230130","1585154602198244-1511721230130","1585154602198244-1511721230132","1585154602198244-1511721230134","2684608560-1450366894234","2684608560-1450366894234","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230144","1585154601910954-1511721230163","1585154601910954-1511721230167","1585154601910954-1511721230159","1585154601910954-1511721230163","1585154601910954-1511721230163","1585154601910954-1511721230161","1585154601910954-1511721230160","1585154601910954-1511721230163","1585154601910954-1511721230158","1585156906509756-1511721230170","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585154601910954-1511721230157","1585154601910954-1511721230157","1585154601910954-1511721230163","1585154601910954-1511721230178","1585154601910954-1511721230179","1585154601910954-1511721230177","1585154601910954-1511721230181","1585154601910954-1511721230181","1585157471254980-1511721230184","1585157471254980-1511721230184","1585157471254980-1511721230188","1585157471254980-1511721230191","1585157471254980-1511721230194","1585157471254980-1511721230197","1585157471254980-1511721230200","1585157471254980-1511721230203","1585157471254980-1511721230206","1585157471254980-1511721230209","1585157471254980-1511721230235","1585157471254980-1511721230245","1585157471254980-1511721230247","1585157471254980-1511721230242","1585157471254980-1511721230242","1585157471254980-1511721230242","2684608560-1511721230264","2684608560-1511721230267","2684608560-1511721230270","2684608560-1511721230273","2684608560-1511721230277","2684608560-1511721230277","2684608560-1511721230277","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230277","2684608560-1511721230277","1585158787388787-1511721230292","1585158787388787-1511721230301","1585158787388787-1511721230310","1585158787388787-1511721230310","1585158787388787-1511721230294","1585158787388787-1511721230303","1585158787388787-1511721230312","1585158787388787-1511721230296","1585158787388787-1511721230296","1585158787388787-1511721230305","1585158787388787-1511721230305","1585158787388787-1511721230305","1585158787388787-1511721230305","1585158787388787-1511721230305","1585158787388787-1511721230305","1585158787388787-1511721230305","1585158787388787-1511721230314","1585158787388787-1511721230314","1585158787388787-1511721230314","1585158787388787-1511721230352","1585158787388787-1511721230352","1585158787388787-1511721230352","1585158787388787-1511721230354","1585158787388787-1511721230354","1585158787388787-1450366894234","1585158787388787-1450366894234","1585157471254980-1450366894234","1585156906509756-1450366894234","1585154601910954-1450366894234","2684608560-1450366894234","1585154601910954-1450366894234","1585156906509756-1450366894234","1585157471254980-1450366894234","1585158787388787-1450366894234","1585156906509756-1511721230172","1585156906509756-1511794130876","1585157471254980-1511721230200","1585157471254980-1511721230194","1585157471254980-1511721230206","1585157471254980-1511721230209","1585158787388787-1511721230305","1585158787388787-1511721230305","1585154601910954-1511794130891","1585154601910954-1511794130891","1585154601910954-1511794130891","1585154601910954-1511794130895","1585154601910954-1511794130895","1585154601910954-1511794130893","1585154601910954-1511794130897","1585154601910954-1511794130886","1585154601910954-1511794130886","1585154601910954-1511794130888","1585154601910954-1511794130888","1585154601910954-1511794130886","1585154601910954-1511794130886","1585154601910954-1511794130886","1585154601910954-1511794130886","1585154601910954-1511794130886","1585154601910954-1511794130888","1585154601910954-1511794130888","1585154601910954-1511794130886","1585154601910954-1511794130886","1585154601910954-1511794130885","1585154601910954-1511721230179","1585154601910954-1511721230177","1585156906509756-1515178645487","1585156906509756-1515178645487","1585156906509756-1515178645484","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645494","1585156906509756-1515178645494","1585156906509756-1515178645494","1585156906509756-1515178645494","1585156906509756-1515178645494","1585156906509756-1515178645498","1585156906509756-1515178645494","1585156906509756-1515178645494","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645496","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1511721230172","1585156906509756-1515178645494","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645489","1585156906509756-1515178645503","1585156906509756-1515178645501","1585156906509756-1515178645501","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585156906509756-1515178645505","1585154601910954-1511721230181","1585154602198244-1511721230141","1585154602198244-1511721230141","1585156906509756-1515178645484","1585156906509756-1515178645498","1585154601910954-1511721230181","1585154601910954-1511721230179","1585154601910954-1511721230179","1585154601910954-1511721230179","1585154601910954-1511721230179","1585154601910954-1511721230179","1585154601910954-1511721230177","1585154601910954-1511721230177","1585154601910954-1511721230179","1585158787388787-5c9b6ee8563c4619846b5e205ec6a4ec","1585158787388787-2d9b8911b6434c0b95d14dd4370a8e12","1585158787388787-53517170ffc84901b849b3c6e591225b","1585158787388787-53517170ffc84901b849b3c6e591225b","1585158787388787-53517170ffc84901b849b3c6e591225b","1585158787388787-53517170ffc84901b849b3c6e591225b","1585158787388787-53517170ffc84901b849b3c6e591225b","1585158787388787-53517170ffc84901b849b3c6e591225b","1585158787388787-53517170ffc84901b849b3c6e591225b","1585157471254980-1511721230130","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585154602198244-1511721230146","1585158787388787-1fedfceca30e4c1dbff9f2256716bafd","1585158787388787-49c6f948bd7141b4a2a6d0594bcacfc7","1585158787388787-1bedabc07abf43d5b8927d886ef09a33","1585158787388787-1bedabc07abf43d5b8927d886ef09a33","1585154601910954-1511721230179","1585154601910954-1511721230179","1585154601910954-1511721230179","1585154601910954-1511721230181","2684608560-1511721230277","2684608560-1511721230277","2684608560-1511721230277","2684608560-1511721230277","2684608560-1511721230277","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","2684608560-1511721230280","1614785196630942-a7c5884680354c5d8fb6d2c544694af4","1614785196630942-a7c5884680354c5d8fb6d2c544694af4","1614785196630942-a7c5884680354c5d8fb6d2c544694af4","1614785196630942-a7c5884680354c5d8fb6d2c544694af4","1614785196630942-b3170c5ff6e04b309e2de2c3ebc7d7bc","1614785196630942-7ac7c907860549b2b3f82079c607c882","1614785196630942-b3170c5ff6e04b309e2de2c3ebc7d7bc","1614785196630942-5534dc757090494a889939c5433c158f","1614785196630942-3e84cb015f2d49aab81cf2a6a37ce459","1614785196630942-3e84cb015f2d49aab81cf2a6a37ce459","1614785196630942-3e84cb015f2d49aab81cf2a6a37ce459","1614785196630942-3e84cb015f2d49aab81cf2a6a37ce459","1614785196630942-7ac7c907860549b2b3f82079c607c882","1585158787388787-2d9b8911b6434c0b95d14dd4370a8e12","2684608560-1450366894234","2684608560-1450366894234","2684608560-1450366894234","2684608560-1450366894234","2684608560-1450366894234","2684608560-1450366894234","2684608560-1450366894234"],"FTEEvents":{"colorPalettes":true},"prefabId":"Church","headerStyle":"full"},"builderData":{"recentFonts":[{"name":"Dancing Script","slug":"dancing_script","public":true,"source":"google","imageUrl":"/images/fonts/dancing_script.png","fontFamily":"Dancing Script"},{"name":"Calligraffitti","slug":"calligraffitti","public":true,"source":"google","imageUrl":"/images/fonts/calligraffitti.png","fontFamily":"Calligraffitti"}]},"id":2684608560,"blocks":[{"slug":"header-crafty-logo","displayName":"Middle Line","lessSheet":".block.header-crafty,\n.block.header-crafty-logo {\n\tposition: relative;\n\theight: 450px;\n\n\t@media @mobile {\n\t\theight: 350px;\n\t}\n\n\t.block-background {\n\t\t.block-background-color {\n\t\t\theight: auto;\n\t\t\tbottom: 50%;\n\n\t\t\t@media @mobile {\n\t\t\t\tbottom: 0;\n\t\t\t}\n\n\t\t\tbackground: #000 !important;\n\t\t}\n\t}\n\n\t.block-content {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-width: none !important;\n\t\tpadding: 0;\n\t\ttext-align: center;\n\n\t\t.hero-group {\n\t\t\theight: ~'calc(50% - 30px)';\n\n\t\t\t@media @mobile {\n\t\t\t\theight: ~'calc(95% - 30px)';\n\t\t\t}\n\n\t\t\t.display-flex();\n\t\t\t.flex-direction(column);\n\t\t\t.justify-content(center);\n\n\t\t\t.header-title {\n\t\t\t\twidth: 80%;\n\t\t\t\tmargin: 0 auto 10px;\n\t\t\t\tz-index: 2;\n\n\t\t\t\t@media @mobile {\n\t\t\t\t\t.title {\n\t\t\t\t\t\tline-height: 1.2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.header-subtitle {\n\t\t\t\twidth: 80%;\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tz-index: 2;\n\t\t\t}\n\t\t}\n\n\t\t.navigation-pip {\n\t\t\tz-index: 3;\n\t\t\twidth: 100%;\n\t\t\tmin-height: 60px;\n\t\t\tmargin: 5em auto 0;\n\t\t\tpadding: 0;\n\t\t\tline-height: 60px;\n\n\t\t\t@media @tablet {\n\t\t\t\tbackground-color: transparent !important;\n\t\t\t}\n\n\t\t\t.link {\n\t\t\t\tmargin: 0;\n\n\t\t\t\ta {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\tpadding: 0 20px;\n\t\t\t\t\ttext-decoration: none !important;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.link-placeholder:before {\n\t\t\t\ttop: 0;\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.block.header-crafty-logo {\n\t.block-content {\n\n\t\t.logo-pip {\n\t\t\tmargin-bottom: 5px;\n\t\t\tmargin-top: 30px;\n\n\t\t\t.logo-type-container {\n\t\t\t\tleft: -10px;\n\t\t\t}\n\n\t\t\t&.graphic-mode {\n\t\t\t\t.logo-type-container {\n\t\t\t\t\tbottom: -20px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.homeLink {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t.hero-group .header-title {\n\t\t\twidth: auto;\n\t\t\tmargin-bottom: 0;\n\t\t\tfont-size: 2.125em;\n\t\t\tline-height: 1.4em;\n\t\t}\n\n\t\t.icon-pip.is-resizable .icon-container {\n\t\t\twidth: auto !important;\n\t\t\theight: auto !important;\n\t\t}\n\t}\n\n\t&.slim {\n\t\theight: 350px;\n\n\t\t.block-background .block-background-color {\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t.hero-group {\n\t\t\theight: ~'calc(100% - 90px)';\n\t\t}\n\n\t\t.block-image-edit-change-wrapper,\n\t\t.block-image-crop-toolbar-wrapper {\n\t\t\tbottom: 70px;\n\t\t}\n\t}\n}\n","props":{"disableBottomResizing":true,"nameable":true,"positionOverlay":true,"position":"top","moveable":false,"name":"Home","styleOptions":["full","slim"],"background":{"contentBinding":{"name":"headerBackgroundImage","source":"page"},"color":{"value":"color1","opacity":0.5},"image":{"url":"stockservice.digital.vistaprint.com/94461aa29e8c4b3e9980484f2d5756b3.jpg","originalUrl":"stockservice.digital.vistaprint.com/94461aa29e8c4b3e9980484f2d5756b3.jpg","cropData":{"verticalOffset":50},"imageSearchText":"wedding","imageId":"S000002906","forceChangeImage":false},"backgroundType":"image"},"instanceLess":".block.header-crafty[data-tower-id=@{towerId}],\n.block.header-crafty-logo[data-tower-id=@{towerId}] {\n\tbackground-color: @foregroundColor;\n\n\t.navigation-pip {\n\t\tbackground: @backgroundColor;\n\t\t.link {\n\t\t\t&:hover, a.navigation-link-active-page {\n\t\t\t\tbackground: fadeOut(@foregroundColor, 93%);\n\t\t\t}\n\t\t\ta {\n\t\t\t\tcolor: @accentColor1;\n\t\t\t}\n\t\t}\n\t}\n}\n","type":"header","disableTopResizing":true},"children":[{"pip":"col","props":{"className":"hero-group","uid":1450366894230},"children":[{"pip":"logo","props":{"logoMode":"textOnly","height":"60px","homeLink":true,"layout":"centerStacked","contentBinding":{"name":"headerLogoMode","source":"site"},"uid":1450366894231},"children":[{"pip":"graphic","props":{"supportedTypes":["icon","image"],"uid":1450366894232,"aspectRatio":-1,"contentBinding":{"name":"headerLogoImage","source":"site"},"userSize":100,"resizeMin":25,"resizeMax":105,"resizeDefault":100,"iconStyle":{"height":"60px","width":"60px"},"url":"//imageprocessor.digital.vistaprint.com/crop/0,2,304x478/http://www.vistaprint.com/any/preview/image.aspx?image_type=upload&image_token=338012024-6e027803e8-d30c82&png=1&mcp_rp=1","originalUrl":"http://www.vistaprint.com/any/preview/image.aspx?image_type=upload&image_token=338012024-6e027803e8-d30c82&png=1&mcp_rp=1","cropData":{"x":0,"y":2,"width":304,"height":478,"verticalOffset":100},"rotation":0,"forceChangeImage":false,"linkUrl":"","linkNewTab":true,"linkEmailUrl":"","hideStockImages":false,"setCropBoxToPicture":false,"lightboxStatus":"default","contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}},{"pip":"logo-text","props":{"className":"header-title","content":"

Your Business Name

","level":1,"defaultColor":"color4","defaultFont":"font1","contentBinding":{"name":"headerLogoText","source":"site"},"uid":1450366894233,"paragraphWrappedContent":true,"fontRequired":[]}}]},{"pip":"title","props":{"showBeacon":false,"paragraphWrappedContent":true,"defaultColor":"color4","className":"header-subtitle","level":5,"requiresCustomization":true,"contentBinding":{"name":"headerSubtitleText","source":"page"},"uid":1450366894234,"defaultFont":"font1","content":"Creating Extravagant Events
","fontRequired":["google:Dancing Script"],"websafeFonts":[],"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}]},{"pip":"navigation","props":{"defaultFontSize":"fontSize3","mobileMenu":"tablet","defaultColor":"color4","defaultFont":"font2","uid":1450366894235,"isRelative":false,"adjustableMobileMenuColor":false,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}],"_uid":1450366894229},{"slug":"images-text-2col","children":[{"pip":"row","props":{"className":"wrappable image-grid","backgroundOpacity":1,"uid":1511721230261},"children":[{"pip":"factory","children":[{"pip":"col","children":[{"pip":"image","assets":[{"propertyPath":["props"],"assetPath":["factories","factory_group_0",0,"images","0"]}],"props":{"supportedTypes":["icon","image"],"uid":1511721230264,"style":{"height":"200px"},"aspectRatio":1,"userSize":100,"resizeMin":25,"resizeMax":105,"resizeDefault":100,"url":"//imageprocessor.digital.vistaprint.com/crop/72,4,875x875/http://uploads.documents.cimpress.io/v1/uploads/d596691b-5170-4bc2-8f8c-cbf4a17d3070~110/original?tenant=vbu-digital","originalUrl":"http://uploads.documents.cimpress.io/v1/uploads/d596691b-5170-4bc2-8f8c-cbf4a17d3070~110/original?tenant=vbu-digital","cropData":{"x":72,"y":4,"width":875,"height":875,"horizontalOffset":85,"verticalOffset":5},"rotation":0,"forceChangeImage":false,"linkUrl":"","linkNewTab":true,"linkEmailUrl":"","hideStockImages":false,"setCropBoxToPicture":false,"lightboxStatus":"default","contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}],"props":{"uid":1511721230263}}],"props":{"uid":1511721230262,"childPips":null,"className":"","addButtonClasses":"","removeButtonClasses":"","moveButtonClasses":""}},{"pip":"factory","children":[{"pip":"col","children":[{"pip":"image","assets":[{"propertyPath":["props"],"assetPath":["factories","factory_group_0",1,"images","0"]}],"props":{"supportedTypes":["icon","image"],"uid":1511721230267,"style":{"height":"200px"},"aspectRatio":1,"userSize":100,"resizeMin":25,"resizeMax":105,"resizeDefault":100,"url":"//imageprocessor.digital.vistaprint.com/crop/20,0,875x875/http://uploads.documents.cimpress.io/v1/uploads/ba8b5d34-f357-4c92-aaba-76fa9cceb9a6~110/original?tenant=vbu-digital","originalUrl":"http://uploads.documents.cimpress.io/v1/uploads/ba8b5d34-f357-4c92-aaba-76fa9cceb9a6~110/original?tenant=vbu-digital","cropData":{"x":20,"y":0,"width":875,"height":875,"horizontalOffset":44,"verticalOffset":0},"rotation":0,"forceChangeImage":false,"linkUrl":"","linkNewTab":true,"linkEmailUrl":"","hideStockImages":false,"setCropBoxToPicture":false,"lightboxStatus":"default","contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}],"props":{"uid":1511721230266}}],"props":{"uid":1511721230265,"childPips":null,"className":"","addButtonClasses":"","removeButtonClasses":"","moveButtonClasses":""}},{"pip":"factory","children":[{"pip":"col","children":[{"pip":"image","assets":[{"propertyPath":["props"],"assetPath":["factories","factory_group_0",2,"images","0"]}],"props":{"supportedTypes":["icon","image"],"uid":1511721230270,"style":{"height":"200px"},"aspectRatio":1,"userSize":100,"resizeMin":25,"resizeMax":105,"resizeDefault":100,"url":"//imageprocessor.digital.vistaprint.com/crop/0,192,720x720/http://uploads.documents.cimpress.io/v1/uploads/8725a156-7c03-48a3-aabf-533e622d308f~110/original?tenant=vbu-digital","originalUrl":"http://uploads.documents.cimpress.io/v1/uploads/8725a156-7c03-48a3-aabf-533e622d308f~110/original?tenant=vbu-digital","cropData":{"x":0,"y":192,"width":720,"height":720,"verticalOffset":80},"rotation":0,"forceChangeImage":false,"linkUrl":"","linkNewTab":true,"linkEmailUrl":"","hideStockImages":false,"setCropBoxToPicture":false,"lightboxStatus":"default","contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}],"props":{"uid":1511721230269}}],"props":{"uid":1511721230268,"childPips":null,"className":"","addButtonClasses":"","removeButtonClasses":"","moveButtonClasses":""}},{"pip":"factory","children":[{"pip":"col","children":[{"pip":"image","assets":[{"propertyPath":["props"],"assetPath":["factories","factory_group_0",3,"images","0"]}],"props":{"supportedTypes":["icon","image"],"uid":1511721230273,"style":{"height":"200px"},"aspectRatio":1,"userSize":100,"resizeMin":25,"resizeMax":105,"resizeDefault":100,"url":"//imageprocessor.digital.vistaprint.com/crop/47,8,875x875/http://uploads.documents.cimpress.io/v1/uploads/25ef4097-e9f6-48c9-8863-82d571a747ef~110/original?tenant=vbu-digital","originalUrl":"http://uploads.documents.cimpress.io/v1/uploads/25ef4097-e9f6-48c9-8863-82d571a747ef~110/original?tenant=vbu-digital","cropData":{"x":47,"y":8,"width":875,"height":875,"horizontalOffset":55,"verticalOffset":9},"rotation":0,"forceChangeImage":false,"linkUrl":"","linkNewTab":true,"linkEmailUrl":"","hideStockImages":false,"setCropBoxToPicture":false,"lightboxStatus":"default","contentPadding":{"top":0,"bottom":0,"left":0,"right":0}}}],"props":{"uid":1511721230272}}],"props":{"uid":1511721230271,"childPips":null,"className":"","addButtonClasses":"","removeButtonClasses":"","moveButtonClasses":""}}]},{"pip":"row","props":{"className":"text-container","backgroundOpacity":1,"uid":1511721230274},"children":[{"pip":"col","children":[{"pip":"row","props":{"hideable":true,"backgroundOpacity":1,"uid":1511721230276},"children":[{"pip":"paragraph","props":{"defaultFontSize":"fontSize3","defaultFont":"font2","content":"

Allow us to decorate your wedding or event with beautiful backdrops, room draping, head table & cake table decor, ceremony alter draping, aisle decor, fresh flower centrepieces & much more. 

","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"className":"","paragraphWrappedContent":true,"uid":1511721230277,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","0","content"]}]}],"assets":[{"propertyPath":["props","hidden"],"assetPath":["rows","1","hidden"]}]}],"props":{"uid":1511721230275}},{"pip":"col","children":[{"pip":"row","props":{"hideable":true,"backgroundOpacity":1,"uid":1511721230279},"children":[{"pip":"paragraph","props":{"defaultFontSize":"fontSize3","defaultFont":"font2","content":"

Full-service and day of coordinators are ready and available to assist you with your social, corporate and charity events. 

","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"className":"","paragraphWrappedContent":true,"uid":1511721230280,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","1","content"]}]}],"assets":[{"propertyPath":["props","hidden"],"assetPath":["rows","2","hidden"]}]}],"props":{"uid":1511721230278}}]}],"assets":[{"propertyPath":["displayName"],"assetPath":["displayName"]},{"propertyPath":["props","background"],"assetPath":["background"]},{"propertyPath":["props","userHeight"],"assetPath":["userHeight"]}],"displayName":"Images & Two Columns","props":{"background":{"color":{"value":"color4","opacity":1},"backgroundType":"color"},"instanceLess":""},"lessSheet":".block.image-grid {\n\n\t.block-content {\n\t\tpadding-left: 10px;\n\t\tpadding-right: 10px;\n\t}\n}\n.row-pip.wrappable.image-grid {\n\n\t.justify-content(center);\n\n\t.factory-pip {\n\t\t.flex-basis();\n\t\twidth: ~'calc(100% - 20px)';\n\n\t\t&:last-of-type {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\n\t\t@media (min-width: @max-mobile-landscape) {\n\t\t\twidth: ~'calc(50% - 20px)';\n\n\t\t\t// At landscape widths, this block has 2 items in a row.\n\t\t\t// Remove bottom padding from last 2 pips to avoid excess whitespace in the block\n\t\t\t&:last-of-type,\n\t\t\t&:nth-last-of-type(2) {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\t\t}\n\n\t\t@media (min-width: @min-full-desktop) {\n\t\t\twidth: ~'calc(25% - 20px)';\n\n\t\t\t// At desktop width, this block has 4 items in a row.\n\t\t\t// Remove bottom padding from last 4 pips to avoid excess whitespace in the block\n\t\t\t&:last-of-type,\n\t\t\t&:nth-last-of-type(2),\n\t\t\t&:nth-last-of-type(3),\n\t\t\t&:nth-last-of-type(4) {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\t\t}\n\n\t\t.image-pip {\n\t\t\twidth: auto !important;\n\t\t\theight: auto !important;\n\t\t}\n\n\t\t.col-pip {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\t.pip.factory-pip + .pip.factory-pip:last-of-type {\n\t\tmargin-bottom: 0;\n\t}\n}\n\n.images-text-2col {\n\t.paragraph-pip {\n\t\ttext-align: left;\n\t}\n}\n\n.image-grid .factory-pip {\n\tmargin: 10px;\n}\n","_uid":1511721230260},{"slug":"footer-local-social","props":{"nameable":false,"moveable":false,"position":"bottom","positionOverlay":true,"background":{"color":{"value":"color1","opacity":1},"backgroundType":"color"},"instanceLess":".block.footer-local-social[data-tower-id=@{towerId}] {\n\t.pip.social-col {\n\t\t&:before {\n\t\t\tbackground-color: darken(@backgroundColor, 5%);\n\t\t}\n\t}\n}\n"},"children":[{"pip":"row","props":{"className":"footer--row","backgroundOpacity":1,"uid":1511721230126},"children":[{"pip":"group","props":{"className":"group--contact","backgroundOpacity":1,"uid":1511721230127},"children":[{"pip":"row","children":[{"pip":"col","children":[{"pip":"paragraph","props":{"className":"footer-company-name","level":5,"defaultFont":"font2","contentBinding":{"name":"footerTitle","source":"site"},"content":"

© 2017 The Wedding Decorators Inc.

","defaultFontSize":"fontSize3","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"paragraphWrappedContent":true,"uid":1511721230130,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","0","content"]}]}],"props":{"uid":1511721230129}},{"pip":"col","children":[{"pip":"paragraph","props":{"className":"footer-email","level":5,"defaultFont":"font2","contentBinding":{"name":"footerEmail","source":"site"},"content":"

weddingdecorators@hotmail.com

","defaultFontSize":"fontSize3","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"paragraphWrappedContent":true,"uid":1511721230132,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","1","content"]}]}],"props":{"uid":1511721230131}},{"pip":"col","children":[{"pip":"paragraph","props":{"className":"footer-address","level":5,"defaultFont":"font2","contentBinding":{"name":"footerAddress","source":"site"},"content":"

Brampton, ON Canada

","defaultFontSize":"fontSize3","requiresCustomization":true,"fontRequired":[],"websafeFonts":[],"paragraphWrappedContent":true,"uid":1511721230134,"customized":true,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","content"],"assetPath":["text","paragraphs","2","content"]}]}],"props":{"uid":1511721230133}}],"props":{"uid":1511721230128,"backgroundOpacity":1}}]},{"pip":"group","props":{"className":"group--social","backgroundOpacity":1,"uid":1511721230135},"children":[{"pip":"col","props":{"className":"social-col","uid":1511721230136},"children":[{"pip":"social","props":{"className":"footer-social-links","requiresCustomization":true,"contentBinding":{"name":"footerSocialLinks","source":"site"},"links":[{"service":"facebook","url":"https://facebook.com/theweddingdecoratorsinc"},{"service":"twitter","url":"https://twitter.com/theweddingdecor"},{"service":"instagram","url":"https://instagram.com/theweddingdecoratorsinc"}],"iconType":"circle","outerSize":"42px","innerSizeNoBG":"26px","innerSizeWithBG":"16px","uid":1511721230137,"contentPadding":{"top":0,"bottom":0,"left":0,"right":0}},"assets":[{"propertyPath":["props","links"],"assetPath":["socialLinks","0","links"]},{"propertyPath":["props","iconType"],"assetPath":["socialLinks","0","iconType"]}]}]}]}]}],"assets":[{"propertyPath":["displayName"],"assetPath":["displayName"]},{"propertyPath":["props","background"],"assetPath":["background"]},{"propertyPath":["props","userHeight"],"assetPath":["userHeight"]}],"displayName":"Local Social Footer","lessSheet":".block.footer-local-social {\n\t.block-content {\n\t\tpadding: 0;\n\t\tmax-width: none;\n\t}\n\n\t@media @tablet {\n\t\t.footer--row {\n\t\t\t.display-flex(block);\n\t\t}\n\t}\n\n\t.footer--row .pip.paragraph-pip {\n\t\tmargin: 0;\n\t\tline-height: 1.5;\n\t}\n\n\t.group--contact {\n\t\tmargin: 0 70px;\n\t\tpadding: 40px 0;\n\t\t.flex(1);\n\t\t.align-self(center);\n\n\t\t@media @tablet {\n\t\t\t.display-flex(block);\n\t\t\tmargin: 0;\n\t\t\t.col-pip{\n\t\t\t\tdisplay: block;\n\t\t\t\tmargin: 0 10px;\n\t\t\t}\n\t\t}\n\t\t@media @mobile {\n\t\t\t.col-pip{\n\t\t\t\tdisplay: block;\n\t\t\t\tmargin: 20px;\n\t\t\t}\n\t\t\t.row-pip{\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n\n\t.group--social {\n\t\t.display-flex(flex);\n\t\twidth: 25%;\n\n\t\t@media @tablet {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t.social-col {\n\t\tmargin: 0;\n\t\tpadding: 40px 60px;\n\n\t\t@media @tablet {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t&:before {\n\t\t\tcontent: '';\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\t}\n\n\t.social-link{\n\t\tmargin-top: 5px;\n\t\tmargin-bottom: 5px;\n\t}\n\t\n\t.social-col .social-icon {\n\t\twidth: 38px;\n\t\theight: 38px;\n\t}\n}\n","_uid":1511721230125}]},"service":{}}; /*********/ window.doScroll = function scroll(element, change, easeAmount, callback) { // Maximum scroll duration to ensure that scrolling doesn't take forever on long sites var MAX_SCROLL_DURATION = 2500; if (typeof easeAmount === 'function') { callback = easeAmount; easeAmount = undefined; } if (easeAmount) { /* * We may not want to fully animate the scroll. * On long documents, this can be dizzying. Instead, we can * jump to just before the element, then scroll the rest of the way. */ if (Math.abs(change) < easeAmount) { easeAmount = change; } if (change < 0) { easeAmount = -easeAmount; } element.scrollTop += change - easeAmount; change = easeAmount; } var move = function move(amount) { element.scrollTop = amount; }; // quadratic easing in/out - acceleration until halfway, then deceleration var ease = function ease(t, b, c, d) { t = t / (d / 2); if (t < 1) { return c / 2 * t * t + b; } t = t - 1; return -c / 2 * (t * (t - 2) - 1) + b; }; var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function (cb) { window.setTimeout(cb, 1000 / 60); }; var start = element.scrollTop; var currentTime = 0; var increment = 20; var duration = Math.abs(change) * 500 / 1000; if (duration > MAX_SCROLL_DURATION) { duration = MAX_SCROLL_DURATION; } var animateScroll = function animateScroll() { currentTime = currentTime + increment; // Don't call ease if currentTime > duration, it gives wacky results. if (currentTime < duration) { move(ease(currentTime, start, change, duration)); requestAnimationFrame.call(window, animateScroll); } else { move(start + change); if (typeof callback === 'function') { callback(); } } }; requestAnimationFrame.call(window, animateScroll); }