{"version":3,"sources":["cssua.js","lazysizes.js","ls.bgset.js","picturefill.js","mutationobserver.min.js","iframeResizer.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3qBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxgDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"bower-plugins.js","sourcesContent":["/**\r\n * CssUserAgent (cssua.js) v2.1.31\r\n * http://cssuseragent.org\r\n * \r\n * Copyright (c)2006-2015 Stephen M. McKamey.\r\n * Licensed under The MIT License.\r\n */\r\n/*jshint smarttabs:true, regexp:false, browser:true */\r\n\r\n/**\r\n * @type {Object}\r\n */\r\nvar cssua = (\r\n\r\n/**\r\n * @param html {Object} root DOM element\r\n * @param userAgent {string} browser userAgent string\r\n * @return {Object}\r\n */\r\nfunction(html, userAgent, sa) {\r\n\t'use strict';\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {string}\r\n\t */\r\n\tvar PREFIX = ' ua-';\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_Platform = /\\s*([\\-\\w ]+)[\\s\\/\\:]([\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/;\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_Version = /([\\w\\-\\.]+[\\s\\/][v]?[\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/g;\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_BlackBerry = /\\b(?:(blackberry\\w*|bb10)|(rim tablet os))(?:\\/(\\d+\\.\\d+(?:\\.\\w+)*))?/;\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_Silk = /\\bsilk-accelerated=true\\b/;\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_FluidApp = /\\bfluidapp\\b/;\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_desktop = /(\\bwindows\\b|\\bmacintosh\\b|\\blinux\\b|\\bunix\\b)/;\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_mobile = /(\\bandroid\\b|\\bipad\\b|\\bipod\\b|\\bwindows phone\\b|\\bwpdesktop\\b|\\bxblwp7\\b|\\bzunewp7\\b|\\bwindows ce\\b|\\bblackberry\\w*|\\bbb10\\b|\\brim tablet os\\b|\\bmeego|\\bwebos\\b|\\bpalm|\\bsymbian|\\bj2me\\b|\\bdocomo\\b|\\bpda\\b|\\bchtml\\b|\\bmidp\\b|\\bcldc\\b|\\w*?mobile\\w*?|\\w*?phone\\w*?)/;\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {RegExp}\r\n\t */\r\n\tvar R_game = /(\\bxbox\\b|\\bplaystation\\b|\\bnintendo\\s+\\w+)/;\r\n\r\n\t/**\r\n\t * The root CssUserAgent\r\n\t * @type {Object}\r\n\t */\r\n\tvar cssua = {\r\n\r\n\t\tparse:\r\n\t\t\t/**\r\n\t\t\t * @param uaStr {string}\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tfunction(uaStr, sa) {\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @type {Object}\r\n\t\t\t\t */\r\n\t\t\t\tvar ua = {};\r\n\t\t\t\tif (sa) {\r\n\t\t\t\t\tua.standalone = sa;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tuaStr = (''+uaStr).toLowerCase();\r\n\t\t\t\tif (!uaStr) {\r\n\t\t\t\t\treturn ua;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar i, count, raw = uaStr.split(/[()]/);\r\n\t\t\t\tfor (var j=0, rawCount=raw.length; j 0) {\r\n\t\t\t\t\t\t\t// loop through chopping last '-' to end off\r\n\t\t\t\t\t\t\t// concat result onto return string\r\n\t\t\t\t\t\t\tcss += PREFIX+b+'-'+v.substring(0, i);\r\n\t\t\t\t\t\t\ti = v.indexOf('-', i+1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcss += PREFIX+b+'-'+v;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn css;\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\t/**\r\n\t\t\t\t * @type {string}\r\n\t\t\t\t */\r\n\t\t\t\tvar\tuaCss = '';\r\n\t\t\t\tfor (var b in ua) {\r\n\t\t\t\t\tif (b && ua.hasOwnProperty(b)) {\r\n\t\t\t\t\t\tuaCss += format(b, ua[b]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\t// user-agent classNames\r\n\t\t\t\treturn uaCss;\r\n\t\t\t},\r\n\r\n\t\tencode:\r\n\t\t\t/**\r\n\t\t\t * Encodes parsed userAgent object as a compact URI-Encoded key-value collection\r\n\t\t\t * @param ua {Object}\r\n\t\t\t * @return {string}\r\n\t\t\t */\r\n\t\t\tfunction(ua) {\r\n\t\t\t\tvar query = '';\r\n\t\t\t\tfor (var b in ua) {\r\n\t\t\t\t\tif (b && ua.hasOwnProperty(b)) {\r\n\t\t\t\t\t\tif (query) {\r\n\t\t\t\t\t\t\tquery += '&';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tquery += encodeURIComponent(b)+'='+encodeURIComponent(ua[b]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn query;\r\n\t\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {Object}\r\n\t */\r\n\tcssua.userAgent = cssua.ua = cssua.parse(userAgent, sa);\r\n\r\n\t/**\r\n\t * @const\r\n\t * @type {string}\r\n\t */\r\n\tvar ua = cssua.format(cssua.ua)+' js';\r\n\r\n\t// append CSS classes to HTML node\r\n\tif (html.className) {\r\n\t\thtml.className = html.className.replace(/\\bno-js\\b/g, '') + ua;\r\n\t\t\r\n\t} else {\r\n\t\thtml.className = ua.substr(1);\r\n\t}\r\n\r\n\treturn cssua;\r\n\r\n})(document.documentElement, navigator.userAgent, navigator.standalone);\r\n","(function(window, factory) {\r\n\tvar lazySizes = factory(window, window.document);\r\n\twindow.lazySizes = lazySizes;\r\n\tif(typeof module == 'object' && module.exports){\r\n\t\tmodule.exports = lazySizes;\r\n\t}\r\n}(window, function l(window, document) {\r\n\t'use strict';\r\n\t/*jshint eqnull:true */\r\n\tif(!document.getElementsByClassName){return;}\r\n\r\n\tvar lazySizesConfig;\r\n\r\n\tvar docElem = document.documentElement;\r\n\r\n\tvar Date = window.Date;\r\n\r\n\tvar supportPicture = window.HTMLPictureElement;\r\n\r\n\tvar _addEventListener = 'addEventListener';\r\n\r\n\tvar _getAttribute = 'getAttribute';\r\n\r\n\tvar addEventListener = window[_addEventListener];\r\n\r\n\tvar setTimeout = window.setTimeout;\r\n\r\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\r\n\r\n\tvar requestIdleCallback = window.requestIdleCallback;\r\n\r\n\tvar regPicture = /^picture$/i;\r\n\r\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\r\n\r\n\tvar regClassCache = {};\r\n\r\n\tvar forEach = Array.prototype.forEach;\r\n\r\n\tvar hasClass = function(ele, cls) {\r\n\t\tif(!regClassCache[cls]){\r\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\r\n\t\t}\r\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\r\n\t};\r\n\r\n\tvar addClass = function(ele, cls) {\r\n\t\tif (!hasClass(ele, cls)){\r\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\r\n\t\t}\r\n\t};\r\n\r\n\tvar removeClass = function(ele, cls) {\r\n\t\tvar reg;\r\n\t\tif ((reg = hasClass(ele,cls))) {\r\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\r\n\t\t}\r\n\t};\r\n\r\n\tvar addRemoveLoadEvents = function(dom, fn, add){\r\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\r\n\t\tif(add){\r\n\t\t\taddRemoveLoadEvents(dom, fn);\r\n\t\t}\r\n\t\tloadEvents.forEach(function(evt){\r\n\t\t\tdom[action](evt, fn);\r\n\t\t});\r\n\t};\r\n\r\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\r\n\t\tvar event = document.createEvent('CustomEvent');\r\n\r\n\t\tevent.initCustomEvent(name, !noBubbles, !noCancelable, detail || {});\r\n\r\n\t\telem.dispatchEvent(event);\r\n\t\treturn event;\r\n\t};\r\n\r\n\tvar updatePolyfill = function (el, full){\r\n\t\tvar polyfill;\r\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesConfig.pf) ) ){\r\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\r\n\t\t} else if(full && full.src){\r\n\t\t\tel.src = full.src;\r\n\t\t}\r\n\t};\r\n\r\n\tvar getCSS = function (elem, style){\r\n\t\treturn (getComputedStyle(elem, null) || {})[style];\r\n\t};\r\n\r\n\tvar getWidth = function(elem, parent, width){\r\n\t\twidth = width || elem.offsetWidth;\r\n\r\n\t\twhile(width < lazySizesConfig.minSize && parent && !elem._lazysizesWidth){\r\n\t\t\twidth = parent.offsetWidth;\r\n\t\t\tparent = parent.parentNode;\r\n\t\t}\r\n\r\n\t\treturn width;\r\n\t};\r\n\r\n\tvar rAF = (function(){\r\n\t\tvar running, waiting;\r\n\t\tvar fns = [];\r\n\r\n\t\tvar run = function(){\r\n\t\t\tvar fn;\r\n\t\t\trunning = true;\r\n\t\t\twaiting = false;\r\n\t\t\twhile(fns.length){\r\n\t\t\t\tfn = fns.shift();\r\n\t\t\t\tfn[0].apply(fn[1], fn[2]);\r\n\t\t\t}\r\n\t\t\trunning = false;\r\n\t\t};\r\n\r\n\t\tvar rafBatch = function(fn){\r\n\t\t\tif(running){\r\n\t\t\t\tfn.apply(this, arguments);\r\n\t\t\t} else {\r\n\t\t\t\tfns.push([fn, this, arguments]);\r\n\r\n\t\t\t\tif(!waiting){\r\n\t\t\t\t\twaiting = true;\r\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\trafBatch._lsFlush = run;\r\n\r\n\t\treturn rafBatch;\r\n\t})();\r\n\r\n\tvar rAFIt = function(fn, simple){\r\n\t\treturn simple ?\r\n\t\t\tfunction() {\r\n\t\t\t\trAF(fn);\r\n\t\t\t} :\r\n\t\t\tfunction(){\r\n\t\t\t\tvar that = this;\r\n\t\t\t\tvar args = arguments;\r\n\t\t\t\trAF(function(){\r\n\t\t\t\t\tfn.apply(that, args);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t;\r\n\t};\r\n\r\n\tvar throttle = function(fn){\r\n\t\tvar running;\r\n\t\tvar lastTime = 0;\r\n\t\tvar gDelay = 125;\r\n\t\tvar RIC_DEFAULT_TIMEOUT = 666;\r\n\t\tvar rICTimeout = RIC_DEFAULT_TIMEOUT;\r\n\t\tvar run = function(){\r\n\t\t\trunning = false;\r\n\t\t\tlastTime = Date.now();\r\n\t\t\tfn();\r\n\t\t};\r\n\t\tvar idleCallback = requestIdleCallback ?\r\n\t\t\tfunction(){\r\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\r\n\t\t\t\tif(rICTimeout !== RIC_DEFAULT_TIMEOUT){\r\n\t\t\t\t\trICTimeout = RIC_DEFAULT_TIMEOUT;\r\n\t\t\t\t}\r\n\t\t\t}:\r\n\t\t\trAFIt(function(){\r\n\t\t\t\tsetTimeout(run);\r\n\t\t\t}, true)\r\n\t\t;\r\n\r\n\t\treturn function(isPriority){\r\n\t\t\tvar delay;\r\n\t\t\tif((isPriority = isPriority === true)){\r\n\t\t\t\trICTimeout = 44;\r\n\t\t\t}\r\n\r\n\t\t\tif(running){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\trunning = true;\r\n\r\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\r\n\r\n\t\t\tif(delay < 0){\r\n\t\t\t\tdelay = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif(isPriority || (delay < 9 && requestIdleCallback)){\r\n\t\t\t\tidleCallback();\r\n\t\t\t} else {\r\n\t\t\t\tsetTimeout(idleCallback, delay);\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\r\n\tvar debounce = function(func) {\r\n\t\tvar timeout, timestamp;\r\n\t\tvar wait = 99;\r\n\t\tvar run = function(){\r\n\t\t\ttimeout = null;\r\n\t\t\tfunc();\r\n\t\t};\r\n\t\tvar later = function() {\r\n\t\t\tvar last = Date.now() - timestamp;\r\n\r\n\t\t\tif (last < wait) {\r\n\t\t\t\tsetTimeout(later, wait - last);\r\n\t\t\t} else {\r\n\t\t\t\t(requestIdleCallback || run)(run);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn function() {\r\n\t\t\ttimestamp = Date.now();\r\n\r\n\t\t\tif (!timeout) {\r\n\t\t\t\ttimeout = setTimeout(later, wait);\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\r\n\tvar loader = (function(){\r\n\t\tvar lazyloadElems, preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\r\n\r\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom;\r\n\r\n\t\tvar defaultExpand, preloadExpand, hFac;\r\n\r\n\t\tvar regImg = /^img$/i;\r\n\t\tvar regIframe = /^iframe$/i;\r\n\r\n\t\tvar supportScroll = ('onscroll' in window) && !(/glebot/.test(navigator.userAgent));\r\n\r\n\t\tvar shrinkExpand = 0;\r\n\t\tvar currentExpand = 0;\r\n\r\n\t\tvar isLoading = 0;\r\n\t\tvar lowRuns = -1;\r\n\r\n\t\tvar resetPreloading = function(e){\r\n\t\t\tisLoading--;\r\n\t\t\tif(e && e.target){\r\n\t\t\t\taddRemoveLoadEvents(e.target, resetPreloading);\r\n\t\t\t}\r\n\r\n\t\t\tif(!e || isLoading < 0 || !e.target){\r\n\t\t\t\tisLoading = 0;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar isNestedVisible = function(elem, elemExpand){\r\n\t\t\tvar outerRect;\r\n\t\t\tvar parent = elem;\r\n\t\t\tvar visible = getCSS(document.body, 'visibility') == 'hidden' || getCSS(elem, 'visibility') != 'hidden';\r\n\r\n\t\t\teLtop -= elemExpand;\r\n\t\t\teLbottom += elemExpand;\r\n\t\t\teLleft -= elemExpand;\r\n\t\t\teLright += elemExpand;\r\n\r\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\r\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\r\n\r\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\r\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\r\n\t\t\t\t\tvisible = eLright > outerRect.left &&\r\n\t\t\t\t\t\teLleft < outerRect.right &&\r\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\r\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\r\n\t\t\t\t\t;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn visible;\r\n\t\t};\r\n\r\n\t\tvar checkElements = function() {\r\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, beforeExpandVal;\r\n\r\n\t\t\tif((loadMode = lazySizesConfig.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\r\n\r\n\t\t\t\ti = 0;\r\n\r\n\t\t\t\tlowRuns++;\r\n\r\n\t\t\t\tif(preloadExpand == null){\r\n\t\t\t\t\tif(!('expand' in lazySizesConfig)){\r\n\t\t\t\t\t\tlazySizesConfig.expand = docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdefaultExpand = lazySizesConfig.expand;\r\n\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesConfig.expFactor;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\r\n\t\t\t\t\tcurrentExpand = preloadExpand;\r\n\t\t\t\t\tlowRuns = 0;\r\n\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\r\n\t\t\t\t\tcurrentExpand = defaultExpand;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcurrentExpand = shrinkExpand;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor(; i < eLlen; i++){\r\n\r\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\r\n\r\n\t\t\t\t\tif(!supportScroll){unveilElement(lazyloadElems[i]);continue;}\r\n\r\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\r\n\t\t\t\t\t\telemExpand = currentExpand;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\r\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\r\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\r\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\r\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\r\n\r\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\r\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\r\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\r\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\r\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\r\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\r\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\r\n\t\t\t\t\t\tloadedSomething = true;\r\n\t\t\t\t\t\tif(isLoading > 9){break;}\r\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\r\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\r\n\t\t\t\t\t\t(preloadElems[0] || lazySizesConfig.preloadAfterLoad) &&\r\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesConfig.sizesAttr) != 'auto')))){\r\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(autoLoadElem && !loadedSomething){\r\n\t\t\t\t\tunveilElement(autoLoadElem);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar throttledCheckElements = throttle(checkElements);\r\n\r\n\t\tvar switchLoadingClass = function(e){\r\n\t\t\taddClass(e.target, lazySizesConfig.loadedClass);\r\n\t\t\tremoveClass(e.target, lazySizesConfig.loadingClass);\r\n\t\t\taddRemoveLoadEvents(e.target, rafSwitchLoadingClass);\r\n\t\t};\r\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\r\n\t\tvar rafSwitchLoadingClass = function(e){\r\n\t\t\trafedSwitchLoadingClass({target: e.target});\r\n\t\t};\r\n\r\n\t\tvar changeIframeSrc = function(elem, src){\r\n\t\t\ttry {\r\n\t\t\t\telem.contentWindow.location.replace(src);\r\n\t\t\t} catch(e){\r\n\t\t\t\telem.src = src;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar handleSources = function(source){\r\n\t\t\tvar customMedia, parent;\r\n\r\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesConfig.srcsetAttr);\r\n\r\n\t\t\tif( (customMedia = lazySizesConfig.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\r\n\t\t\t\tsource.setAttribute('media', customMedia);\r\n\t\t\t}\r\n\r\n\t\t\tif(sourceSrcset){\r\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\r\n\t\t\t}\r\n\r\n\t\t\t//https://bugzilla.mozilla.org/show_bug.cgi?id=1170572\r\n\t\t\tif(customMedia){\r\n\t\t\t\tparent = source.parentNode;\r\n\t\t\t\tparent.insertBefore(source.cloneNode(), source);\r\n\t\t\t\tparent.removeChild(source);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\r\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\r\n\r\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\r\n\r\n\t\t\t\tif(sizes){\r\n\t\t\t\t\tif(isAuto){\r\n\t\t\t\t\t\taddClass(elem, lazySizesConfig.autosizesClass);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesConfig.srcsetAttr);\r\n\t\t\t\tsrc = elem[_getAttribute](lazySizesConfig.srcAttr);\r\n\r\n\t\t\t\tif(isImg) {\r\n\t\t\t\t\tparent = elem.parentNode;\r\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\r\n\r\n\t\t\t\tevent = {target: elem};\r\n\r\n\t\t\t\tif(firesLoad){\r\n\t\t\t\t\taddRemoveLoadEvents(elem, resetPreloading, true);\r\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\r\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\r\n\r\n\t\t\t\t\taddClass(elem, lazySizesConfig.loadingClass);\r\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(isPicture){\r\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(srcset){\r\n\t\t\t\t\telem.setAttribute('srcset', srcset);\r\n\t\t\t\t} else if(src && !isPicture){\r\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\r\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telem.src = src;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(srcset || isPicture){\r\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\trAF(function(){\r\n\t\t\t\tif(elem._lazyRace){\r\n\t\t\t\t\tdelete elem._lazyRace;\r\n\t\t\t\t}\r\n\t\t\t\tremoveClass(elem, lazySizesConfig.lazyClass);\r\n\r\n\t\t\t\tif( !firesLoad || elem.complete ){\r\n\t\t\t\t\tif(firesLoad){\r\n\t\t\t\t\t\tresetPreloading(event);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tisLoading--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tswitchLoadingClass(event);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tvar unveilElement = function (elem){\r\n\t\t\tvar detail;\r\n\r\n\t\t\tvar isImg = regImg.test(elem.nodeName);\r\n\r\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\r\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesConfig.sizesAttr) || elem[_getAttribute]('sizes'));\r\n\t\t\tvar isAuto = sizes == 'auto';\r\n\r\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem.src || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesConfig.errorClass)){return;}\r\n\r\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\r\n\r\n\t\t\tif(isAuto){\r\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\r\n\t\t\t}\r\n\r\n\t\t\telem._lazyRace = true;\r\n\t\t\tisLoading++;\r\n\r\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\r\n\t\t};\r\n\r\n\t\tvar onload = function(){\r\n\t\t\tif(isCompleted){return;}\r\n\t\t\tif(Date.now() - started < 999){\r\n\t\t\t\tsetTimeout(onload, 999);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar afterScroll = debounce(function(){\r\n\t\t\t\tlazySizesConfig.loadMode = 3;\r\n\t\t\t\tthrottledCheckElements();\r\n\t\t\t});\r\n\r\n\t\t\tisCompleted = true;\r\n\r\n\t\t\tlazySizesConfig.loadMode = 3;\r\n\r\n\t\t\tthrottledCheckElements();\r\n\r\n\t\t\taddEventListener('scroll', function(){\r\n\t\t\t\tif(lazySizesConfig.loadMode == 3){\r\n\t\t\t\t\tlazySizesConfig.loadMode = 2;\r\n\t\t\t\t}\r\n\t\t\t\tafterScroll();\r\n\t\t\t}, true);\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\t_: function(){\r\n\t\t\t\tstarted = Date.now();\r\n\r\n\t\t\t\tlazyloadElems = document.getElementsByClassName(lazySizesConfig.lazyClass);\r\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesConfig.lazyClass + ' ' + lazySizesConfig.preloadClass);\r\n\t\t\t\thFac = lazySizesConfig.hFac;\r\n\r\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\r\n\r\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\r\n\r\n\t\t\t\tif(window.MutationObserver){\r\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\r\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\r\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\r\n\t\t\t\t}\r\n\r\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\r\n\r\n\t\t\t\t//, 'fullscreenchange'\r\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend', 'webkitAnimationEnd'].forEach(function(name){\r\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\r\n\t\t\t\t\tonload();\r\n\t\t\t\t} else {\r\n\t\t\t\t\taddEventListener('load', onload);\r\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\r\n\t\t\t\t\tsetTimeout(onload, 20000);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(lazyloadElems.length){\r\n\t\t\t\t\tcheckElements();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrottledCheckElements();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tcheckElems: throttledCheckElements,\r\n\t\t\tunveil: unveilElement\r\n\t\t};\r\n\t})();\r\n\r\n\r\n\tvar autoSizer = (function(){\r\n\t\tvar autosizesElems;\r\n\r\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\r\n\t\t\tvar sources, i, len;\r\n\t\t\telem._lazysizesWidth = width;\r\n\t\t\twidth += 'px';\r\n\r\n\t\t\telem.setAttribute('sizes', width);\r\n\r\n\t\t\tif(regPicture.test(parent.nodeName || '')){\r\n\t\t\t\tsources = parent.getElementsByTagName('source');\r\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\r\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(!event.detail.dataAttr){\r\n\t\t\t\tupdatePolyfill(elem, event.detail);\r\n\t\t\t}\r\n\t\t});\r\n\t\tvar getSizeElement = function (elem, dataAttr, width){\r\n\t\t\tvar event;\r\n\t\t\tvar parent = elem.parentNode;\r\n\r\n\t\t\tif(parent){\r\n\t\t\t\twidth = getWidth(elem, parent, width);\r\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\r\n\r\n\t\t\t\tif(!event.defaultPrevented){\r\n\t\t\t\t\twidth = event.detail.width;\r\n\r\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\r\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar updateElementsSizes = function(){\r\n\t\t\tvar i;\r\n\t\t\tvar len = autosizesElems.length;\r\n\t\t\tif(len){\r\n\t\t\t\ti = 0;\r\n\r\n\t\t\t\tfor(; i < len; i++){\r\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\r\n\r\n\t\treturn {\r\n\t\t\t_: function(){\r\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesConfig.autosizesClass);\r\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\r\n\t\t\t},\r\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\r\n\t\t\tupdateElem: getSizeElement\r\n\t\t};\r\n\t})();\r\n\r\n\tvar init = function(){\r\n\t\tif(!init.i){\r\n\t\t\tinit.i = true;\r\n\t\t\tautoSizer._();\r\n\t\t\tloader._();\r\n\t\t}\r\n\t};\r\n\r\n\t(function(){\r\n\t\tvar prop;\r\n\r\n\t\tvar lazySizesDefaults = {\r\n\t\t\tlazyClass: 'lazyload',\r\n\t\t\tloadedClass: 'lazyloaded',\r\n\t\t\tloadingClass: 'lazyloading',\r\n\t\t\tpreloadClass: 'lazypreload',\r\n\t\t\terrorClass: 'lazyerror',\r\n\t\t\t//strictClass: 'lazystrict',\r\n\t\t\tautosizesClass: 'lazyautosizes',\r\n\t\t\tsrcAttr: 'data-src',\r\n\t\t\tsrcsetAttr: 'data-srcset',\r\n\t\t\tsizesAttr: 'data-sizes',\r\n\t\t\t//preloadAfterLoad: false,\r\n\t\t\tminSize: 40,\r\n\t\t\tcustomMedia: {},\r\n\t\t\tinit: true,\r\n\t\t\texpFactor: 1.5,\r\n\t\t\thFac: 0.8,\r\n\t\t\tloadMode: 2\r\n\t\t};\r\n\r\n\t\tlazySizesConfig = window.lazySizesConfig || window.lazysizesConfig || {};\r\n\r\n\t\tfor(prop in lazySizesDefaults){\r\n\t\t\tif(!(prop in lazySizesConfig)){\r\n\t\t\t\tlazySizesConfig[prop] = lazySizesDefaults[prop];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\twindow.lazySizesConfig = lazySizesConfig;\r\n\r\n\t\tsetTimeout(function(){\r\n\t\t\tif(lazySizesConfig.init){\r\n\t\t\t\tinit();\r\n\t\t\t}\r\n\t\t});\r\n\t})();\r\n\r\n\treturn {\r\n\t\tcfg: lazySizesConfig,\r\n\t\tautoSizer: autoSizer,\r\n\t\tloader: loader,\r\n\t\tinit: init,\r\n\t\tuP: updatePolyfill,\r\n\t\taC: addClass,\r\n\t\trC: removeClass,\r\n\t\thC: hasClass,\r\n\t\tfire: triggerEvent,\r\n\t\tgW: getWidth,\r\n\t\trAF: rAF,\r\n\t};\r\n}\r\n));\r\n","(function(){\r\n\t'use strict';\r\n\tif(!window.addEventListener){return;}\r\n\r\n\tvar regWhite = /\\s+/g;\r\n\tvar regSplitSet = /\\s*\\|\\s+|\\s+\\|\\s*/g;\r\n\tvar regSource = /^(.+?)(?:\\s+\\[\\s*(.+?)\\s*\\])?$/;\r\n\tvar regBgUrlEscape = /\\(|\\)|'/;\r\n\tvar allowedBackgroundSize = {contain: 1, cover: 1};\r\n\tvar proxyWidth = function(elem){\r\n\t\tvar width = lazySizes.gW(elem, elem.parentNode);\r\n\r\n\t\tif(!elem._lazysizesWidth || width > elem._lazysizesWidth){\r\n\t\t\telem._lazysizesWidth = width;\r\n\t\t}\r\n\t\treturn elem._lazysizesWidth;\r\n\t};\r\n\tvar getBgSize = function(elem){\r\n\t\tvar bgSize;\r\n\r\n\t\tbgSize = (getComputedStyle(elem) || {getPropertyValue: function(){}}).getPropertyValue('background-size');\r\n\r\n\t\tif(!allowedBackgroundSize[bgSize] && allowedBackgroundSize[elem.style.backgroundSize]){\r\n\t\t\tbgSize = elem.style.backgroundSize;\r\n\t\t}\r\n\r\n\t\treturn bgSize;\r\n\t};\r\n\tvar createPicture = function(sets, elem, img){\r\n\t\tvar picture = document.createElement('picture');\r\n\t\tvar sizes = elem.getAttribute(lazySizesConfig.sizesAttr);\r\n\t\tvar ratio = elem.getAttribute('data-ratio');\r\n\t\tvar optimumx = elem.getAttribute('data-optimumx');\r\n\r\n\t\tif(elem._lazybgset && elem._lazybgset.parentNode == elem){\r\n\t\t\telem.removeChild(elem._lazybgset);\r\n\t\t}\r\n\r\n\t\tObject.defineProperty(img, '_lazybgset', {\r\n\t\t\tvalue: elem,\r\n\t\t\twritable: true\r\n\t\t});\r\n\t\tObject.defineProperty(elem, '_lazybgset', {\r\n\t\t\tvalue: picture,\r\n\t\t\twritable: true\r\n\t\t});\r\n\r\n\t\tsets = sets.replace(regWhite, ' ').split(regSplitSet);\r\n\r\n\t\tpicture.style.display = 'none';\r\n\t\timg.className = lazySizesConfig.lazyClass;\r\n\r\n\t\tif(sets.length == 1 && !sizes){\r\n\t\t\tsizes = 'auto';\r\n\t\t}\r\n\r\n\t\tsets.forEach(function(set){\r\n\t\t\tvar source = document.createElement('source');\r\n\r\n\t\t\tif(sizes && sizes != 'auto'){\r\n\t\t\t\tsource.setAttribute('sizes', sizes);\r\n\t\t\t}\r\n\r\n\t\t\tif(set.match(regSource)){\r\n\t\t\t\tsource.setAttribute(lazySizesConfig.srcsetAttr, RegExp.$1);\r\n\t\t\t\tif(RegExp.$2){\r\n\t\t\t\t\tsource.setAttribute('media', lazySizesConfig.customMedia[RegExp.$2] || RegExp.$2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpicture.appendChild(source);\r\n\t\t});\r\n\r\n\t\tif(sizes){\r\n\t\t\timg.setAttribute(lazySizesConfig.sizesAttr, sizes);\r\n\t\t\telem.removeAttribute(lazySizesConfig.sizesAttr);\r\n\t\t\telem.removeAttribute('sizes');\r\n\t\t}\r\n\t\tif(optimumx){\r\n\t\t\timg.setAttribute('data-optimumx', optimumx);\r\n\t\t}\r\n\t\tif(ratio) {\r\n\t\t\timg.setAttribute('data-ratio', ratio);\r\n\t\t}\r\n\r\n\t\tpicture.appendChild(img);\r\n\r\n\t\telem.appendChild(picture);\r\n\t};\r\n\r\n\tvar proxyLoad = function(e){\r\n\t\tif(!e.target._lazybgset){return;}\r\n\r\n\t\tvar image = e.target;\r\n\t\tvar elem = image._lazybgset;\r\n\t\tvar bg = image.currentSrc || image.src;\r\n\r\n\t\tif(bg){\r\n\t\t\telem.style.backgroundImage = 'url(' + (regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg ) + ')';\r\n\t\t}\r\n\r\n\t\tif(image._lazybgsetLoading){\r\n\t\t\tlazySizes.fire(elem, '_lazyloaded', {}, false, true);\r\n\t\t\tdelete image._lazybgsetLoading;\r\n\t\t}\r\n\t};\r\n\r\n\taddEventListener('lazybeforeunveil', function(e){\r\n\t\tvar set, image, elem;\r\n\r\n\t\tif(e.defaultPrevented || !(set = e.target.getAttribute('data-bgset'))){return;}\r\n\r\n\t\telem = e.target;\r\n\t\timage = document.createElement('img');\r\n\r\n\t\timage.alt = '';\r\n\r\n\t\timage._lazybgsetLoading = true;\r\n\t\te.detail.firesLoad = true;\r\n\r\n\t\tcreatePicture(set, elem, image);\r\n\r\n\t\tsetTimeout(function(){\r\n\t\t\tlazySizes.loader.unveil(image);\r\n\r\n\t\t\tlazySizes.rAF(function(){\r\n\t\t\t\tlazySizes.fire(image, '_lazyloaded', {}, true, true);\r\n\t\t\t\tif(image.complete) {\r\n\t\t\t\t\tproxyLoad({target: image});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t});\r\n\r\n\tdocument.addEventListener('load', proxyLoad, true);\r\n\r\n\twindow.addEventListener('lazybeforesizes', function(e){\r\n\t\tif(e.target._lazybgset && e.detail.dataAttr){\r\n\t\t\tvar elem = e.target._lazybgset;\r\n\t\t\tvar bgSize = getBgSize(elem);\r\n\r\n\t\t\tif(allowedBackgroundSize[bgSize]){\r\n\t\t\t\te.target._lazysizesParentFit = bgSize;\r\n\r\n\t\t\t\tlazySizes.rAF(function(){\r\n\t\t\t\t\te.target.setAttribute('data-parent-fit', bgSize);\r\n\t\t\t\t\tif(e.target._lazysizesParentFit){\r\n\t\t\t\t\t\tdelete e.target._lazysizesParentFit;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}, true);\r\n\r\n\tdocument.documentElement.addEventListener('lazybeforesizes', function(e){\r\n\t\tif(e.defaultPrevented || !e.target._lazybgset){return;}\r\n\t\te.detail.width = proxyWidth(e.target._lazybgset);\r\n\t});\r\n})();\r\n","/*! picturefill - v3.0.2 - 2016-02-12\r\n * https://scottjehl.github.io/picturefill/\r\n * Copyright (c) 2016 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT\r\n */\r\n/*! Gecko-Picture - v1.0\r\n * https://github.com/scottjehl/picturefill/tree/3.0/src/plugins/gecko-picture\r\n * Firefox's early picture implementation (prior to FF41) is static and does\r\n * not react to viewport changes. This tiny module fixes this.\r\n */\r\n(function(window) {\r\n\t/*jshint eqnull:true */\r\n\tvar ua = navigator.userAgent;\r\n\r\n\tif ( window.HTMLPictureElement && ((/ecko/).test(ua) && ua.match(/rv\\:(\\d+)/) && RegExp.$1 < 45) ) {\r\n\t\taddEventListener(\"resize\", (function() {\r\n\t\t\tvar timer;\r\n\r\n\t\t\tvar dummySrc = document.createElement(\"source\");\r\n\r\n\t\t\tvar fixRespimg = function(img) {\r\n\t\t\t\tvar source, sizes;\r\n\t\t\t\tvar picture = img.parentNode;\r\n\r\n\t\t\t\tif (picture.nodeName.toUpperCase() === \"PICTURE\") {\r\n\t\t\t\t\tsource = dummySrc.cloneNode();\r\n\r\n\t\t\t\t\tpicture.insertBefore(source, picture.firstElementChild);\r\n\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\tpicture.removeChild(source);\r\n\t\t\t\t\t});\r\n\t\t\t\t} else if (!img._pfLastSize || img.offsetWidth > img._pfLastSize) {\r\n\t\t\t\t\timg._pfLastSize = img.offsetWidth;\r\n\t\t\t\t\tsizes = img.sizes;\r\n\t\t\t\t\timg.sizes += \",100vw\";\r\n\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\timg.sizes = sizes;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar findPictureImgs = function() {\r\n\t\t\t\tvar i;\r\n\t\t\t\tvar imgs = document.querySelectorAll(\"picture > img, img[srcset][sizes]\");\r\n\t\t\t\tfor (i = 0; i < imgs.length; i++) {\r\n\t\t\t\t\tfixRespimg(imgs[i]);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tvar onResize = function() {\r\n\t\t\t\tclearTimeout(timer);\r\n\t\t\t\ttimer = setTimeout(findPictureImgs, 99);\r\n\t\t\t};\r\n\t\t\tvar mq = window.matchMedia && matchMedia(\"(orientation: landscape)\");\r\n\t\t\tvar init = function() {\r\n\t\t\t\tonResize();\r\n\r\n\t\t\t\tif (mq && mq.addListener) {\r\n\t\t\t\t\tmq.addListener(onResize);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tdummySrc.srcset = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\r\n\r\n\t\t\tif (/^[c|i]|d$/.test(document.readyState || \"\")) {\r\n\t\t\t\tinit();\r\n\t\t\t} else {\r\n\t\t\t\tdocument.addEventListener(\"DOMContentLoaded\", init);\r\n\t\t\t}\r\n\r\n\t\t\treturn onResize;\r\n\t\t})());\r\n\t}\r\n})(window);\r\n\r\n/*! Picturefill - v3.0.2\r\n * http://scottjehl.github.io/picturefill\r\n * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt;\r\n * License: MIT\r\n */\r\n\r\n(function( window, document, undefined ) {\r\n\t// Enable strict mode\r\n\t\"use strict\";\r\n\r\n\t// HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround)\r\n\tdocument.createElement( \"picture\" );\r\n\r\n\tvar warn, eminpx, alwaysCheckWDescriptor, evalId;\r\n\t// local object for method references and testing exposure\r\n\tvar pf = {};\r\n\tvar isSupportTestReady = false;\r\n\tvar noop = function() {};\r\n\tvar image = document.createElement( \"img\" );\r\n\tvar getImgAttr = image.getAttribute;\r\n\tvar setImgAttr = image.setAttribute;\r\n\tvar removeImgAttr = image.removeAttribute;\r\n\tvar docElem = document.documentElement;\r\n\tvar types = {};\r\n\tvar cfg = {\r\n\t\t//resource selection:\r\n\t\talgorithm: \"\"\r\n\t};\r\n\tvar srcAttr = \"data-pfsrc\";\r\n\tvar srcsetAttr = srcAttr + \"set\";\r\n\t// ua sniffing is done for undetectable img loading features,\r\n\t// to do some non crucial perf optimizations\r\n\tvar ua = navigator.userAgent;\r\n\tvar supportAbort = (/rident/).test(ua) || ((/ecko/).test(ua) && ua.match(/rv\\:(\\d+)/) && RegExp.$1 > 35 );\r\n\tvar curSrcProp = \"currentSrc\";\r\n\tvar regWDesc = /\\s+\\+?\\d+(e\\d+)?w/;\r\n\tvar regSize = /(\\([^)]+\\))?\\s*(.+)/;\r\n\tvar setOptions = window.picturefillCFG;\r\n\t/**\r\n\t * Shortcut property for https://w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests )\r\n\t */\r\n\t// baseStyle also used by getEmValue (i.e.: width: 1em is important)\r\n\tvar baseStyle = \"position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)\";\r\n\tvar fsCss = \"font-size:100%!important;\";\r\n\tvar isVwDirty = true;\r\n\r\n\tvar cssCache = {};\r\n\tvar sizeLengthCache = {};\r\n\tvar DPR = window.devicePixelRatio;\r\n\tvar units = {\r\n\t\tpx: 1,\r\n\t\t\"in\": 96\r\n\t};\r\n\tvar anchor = document.createElement( \"a\" );\r\n\t/**\r\n\t * alreadyRun flag used for setOptions. is it true setOptions will reevaluate\r\n\t * @type {boolean}\r\n\t */\r\n\tvar alreadyRun = false;\r\n\r\n\t// Reusable, non-\"g\" Regexes\r\n\r\n\t// (Don't use \\s, to avoid matching non-breaking space.)\r\n\tvar regexLeadingSpaces = /^[ \\t\\n\\r\\u000c]+/,\r\n\t regexLeadingCommasOrSpaces = /^[, \\t\\n\\r\\u000c]+/,\r\n\t regexLeadingNotSpaces = /^[^ \\t\\n\\r\\u000c]+/,\r\n\t regexTrailingCommas = /[,]+$/,\r\n\t regexNonNegativeInteger = /^\\d+$/,\r\n\r\n\t // ( Positive or negative or unsigned integers or decimals, without or without exponents.\r\n\t // Must include at least one digit.\r\n\t // According to spec tests any decimal point must be followed by a digit.\r\n\t // No leading plus sign is allowed.)\r\n\t // https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number\r\n\t regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;\r\n\r\n\tvar on = function(obj, evt, fn, capture) {\r\n\t\tif ( obj.addEventListener ) {\r\n\t\t\tobj.addEventListener(evt, fn, capture || false);\r\n\t\t} else if ( obj.attachEvent ) {\r\n\t\t\tobj.attachEvent( \"on\" + evt, fn);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * simple memoize function:\r\n\t */\r\n\r\n\tvar memoize = function(fn) {\r\n\t\tvar cache = {};\r\n\t\treturn function(input) {\r\n\t\t\tif ( !(input in cache) ) {\r\n\t\t\t\tcache[ input ] = fn(input);\r\n\t\t\t}\r\n\t\t\treturn cache[ input ];\r\n\t\t};\r\n\t};\r\n\r\n\t// UTILITY FUNCTIONS\r\n\r\n\t// Manual is faster than RegEx\r\n\t// http://jsperf.com/whitespace-character/5\r\n\tfunction isSpace(c) {\r\n\t\treturn (c === \"\\u0020\" || // space\r\n\t\t c === \"\\u0009\" || // horizontal tab\r\n\t\t c === \"\\u000A\" || // new line\r\n\t\t c === \"\\u000C\" || // form feed\r\n\t\t c === \"\\u000D\"); // carriage return\r\n\t}\r\n\r\n\t/**\r\n\t * gets a mediaquery and returns a boolean or gets a css length and returns a number\r\n\t * @param css mediaqueries or css length\r\n\t * @returns {boolean|number}\r\n\t *\r\n\t * based on: https://gist.github.com/jonathantneal/db4f77009b155f083738\r\n\t */\r\n\tvar evalCSS = (function() {\r\n\r\n\t\tvar regLength = /^([\\d\\.]+)(em|vw|px)$/;\r\n\t\tvar replace = function() {\r\n\t\t\tvar args = arguments, index = 0, string = args[0];\r\n\t\t\twhile (++index in args) {\r\n\t\t\t\tstring = string.replace(args[index], args[++index]);\r\n\t\t\t}\r\n\t\t\treturn string;\r\n\t\t};\r\n\r\n\t\tvar buildStr = memoize(function(css) {\r\n\r\n\t\t\treturn \"return \" + replace((css || \"\").toLowerCase(),\r\n\t\t\t\t// interpret `and`\r\n\t\t\t\t/\\band\\b/g, \"&&\",\r\n\r\n\t\t\t\t// interpret `,`\r\n\t\t\t\t/,/g, \"||\",\r\n\r\n\t\t\t\t// interpret `min-` as >=\r\n\t\t\t\t/min-([a-z-\\s]+):/g, \"e.$1>=\",\r\n\r\n\t\t\t\t// interpret `max-` as <=\r\n\t\t\t\t/max-([a-z-\\s]+):/g, \"e.$1<=\",\r\n\r\n\t\t\t\t//calc value\r\n\t\t\t\t/calc([^)]+)/g, \"($1)\",\r\n\r\n\t\t\t\t// interpret css values\r\n\t\t\t\t/(\\d+[\\.]*[\\d]*)([a-z]+)/g, \"($1 * e.$2)\",\r\n\t\t\t\t//make eval less evil\r\n\t\t\t\t/^(?!(e.[a-z]|[0-9\\.&=|><\\+\\-\\*\\(\\)\\/])).*/ig, \"\"\r\n\t\t\t) + \";\";\r\n\t\t});\r\n\r\n\t\treturn function(css, length) {\r\n\t\t\tvar parsedLength;\r\n\t\t\tif (!(css in cssCache)) {\r\n\t\t\t\tcssCache[css] = false;\r\n\t\t\t\tif (length && (parsedLength = css.match( regLength ))) {\r\n\t\t\t\t\tcssCache[css] = parsedLength[ 1 ] * units[parsedLength[ 2 ]];\r\n\t\t\t\t} else {\r\n\t\t\t\t\t/*jshint evil:true */\r\n\t\t\t\t\ttry{\r\n\t\t\t\t\t\tcssCache[css] = new Function(\"e\", buildStr(css))(units);\r\n\t\t\t\t\t} catch(e) {}\r\n\t\t\t\t\t/*jshint evil:false */\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn cssCache[css];\r\n\t\t};\r\n\t})();\r\n\r\n\tvar setResolution = function( candidate, sizesattr ) {\r\n\t\tif ( candidate.w ) { // h = means height: || descriptor.type === 'h' do not handle yet...\r\n\t\t\tcandidate.cWidth = pf.calcListLength( sizesattr || \"100vw\" );\r\n\t\t\tcandidate.res = candidate.w / candidate.cWidth ;\r\n\t\t} else {\r\n\t\t\tcandidate.res = candidate.d;\r\n\t\t}\r\n\t\treturn candidate;\r\n\t};\r\n\r\n\t/**\r\n\t *\r\n\t * @param opt\r\n\t */\r\n\tvar picturefill = function( opt ) {\r\n\r\n\t\tif (!isSupportTestReady) {return;}\r\n\r\n\t\tvar elements, i, plen;\r\n\r\n\t\tvar options = opt || {};\r\n\r\n\t\tif ( options.elements && options.elements.nodeType === 1 ) {\r\n\t\t\tif ( options.elements.nodeName.toUpperCase() === \"IMG\" ) {\r\n\t\t\t\toptions.elements = [ options.elements ];\r\n\t\t\t} else {\r\n\t\t\t\toptions.context = options.elements;\r\n\t\t\t\toptions.elements = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telements = options.elements || pf.qsa( (options.context || document), ( options.reevaluate || options.reselect ) ? pf.sel : pf.selShort );\r\n\r\n\t\tif ( (plen = elements.length) ) {\r\n\r\n\t\t\tpf.setupRun( options );\r\n\t\t\talreadyRun = true;\r\n\r\n\t\t\t// Loop through all elements\r\n\t\t\tfor ( i = 0; i < plen; i++ ) {\r\n\t\t\t\tpf.fillImg(elements[ i ], options);\r\n\t\t\t}\r\n\r\n\t\t\tpf.teardownRun( options );\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * outputs a warning for the developer\r\n\t * @param {message}\r\n\t * @type {Function}\r\n\t */\r\n\twarn = ( window.console && console.warn ) ?\r\n\t\tfunction( message ) {\r\n\t\t\tconsole.warn( message );\r\n\t\t} :\r\n\t\tnoop\r\n\t;\r\n\r\n\tif ( !(curSrcProp in image) ) {\r\n\t\tcurSrcProp = \"src\";\r\n\t}\r\n\r\n\t// Add support for standard mime types.\r\n\ttypes[ \"image/jpeg\" ] = true;\r\n\ttypes[ \"image/gif\" ] = true;\r\n\ttypes[ \"image/png\" ] = true;\r\n\r\n\tfunction detectTypeSupport( type, typeUri ) {\r\n\t\t// based on Modernizr's lossless img-webp test\r\n\t\t// note: asynchronous\r\n\t\tvar image = new window.Image();\r\n\t\timage.onerror = function() {\r\n\t\t\ttypes[ type ] = false;\r\n\t\t\tpicturefill();\r\n\t\t};\r\n\t\timage.onload = function() {\r\n\t\t\ttypes[ type ] = image.width === 1;\r\n\t\t\tpicturefill();\r\n\t\t};\r\n\t\timage.src = typeUri;\r\n\t\treturn \"pending\";\r\n\t}\r\n\r\n\t// test svg support\r\n\ttypes[ \"image/svg+xml\" ] = document.implementation.hasFeature( \"http://www.w3.org/TR/SVG11/feature#Image\", \"1.1\" );\r\n\r\n\t/**\r\n\t * updates the internal vW property with the current viewport width in px\r\n\t */\r\n\tfunction updateMetrics() {\r\n\r\n\t\tisVwDirty = false;\r\n\t\tDPR = window.devicePixelRatio;\r\n\t\tcssCache = {};\r\n\t\tsizeLengthCache = {};\r\n\r\n\t\tpf.DPR = DPR || 1;\r\n\r\n\t\tunits.width = Math.max(window.innerWidth || 0, docElem.clientWidth);\r\n\t\tunits.height = Math.max(window.innerHeight || 0, docElem.clientHeight);\r\n\r\n\t\tunits.vw = units.width / 100;\r\n\t\tunits.vh = units.height / 100;\r\n\r\n\t\tevalId = [ units.height, units.width, DPR ].join(\"-\");\r\n\r\n\t\tunits.em = pf.getEmValue();\r\n\t\tunits.rem = units.em;\r\n\t}\r\n\r\n\tfunction chooseLowRes( lowerValue, higherValue, dprValue, isCached ) {\r\n\t\tvar bonusFactor, tooMuch, bonus, meanDensity;\r\n\r\n\t\t//experimental\r\n\t\tif (cfg.algorithm === \"saveData\" ){\r\n\t\t\tif ( lowerValue > 2.7 ) {\r\n\t\t\t\tmeanDensity = dprValue + 1;\r\n\t\t\t} else {\r\n\t\t\t\ttooMuch = higherValue - dprValue;\r\n\t\t\t\tbonusFactor = Math.pow(lowerValue - 0.6, 1.5);\r\n\r\n\t\t\t\tbonus = tooMuch * bonusFactor;\r\n\r\n\t\t\t\tif (isCached) {\r\n\t\t\t\t\tbonus += 0.1 * bonusFactor;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmeanDensity = lowerValue + bonus;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmeanDensity = (dprValue > 1) ?\r\n\t\t\t\tMath.sqrt(lowerValue * higherValue) :\r\n\t\t\t\tlowerValue;\r\n\t\t}\r\n\r\n\t\treturn meanDensity > dprValue;\r\n\t}\r\n\r\n\tfunction applyBestCandidate( img ) {\r\n\t\tvar srcSetCandidates;\r\n\t\tvar matchingSet = pf.getSet( img );\r\n\t\tvar evaluated = false;\r\n\t\tif ( matchingSet !== \"pending\" ) {\r\n\t\t\tevaluated = evalId;\r\n\t\t\tif ( matchingSet ) {\r\n\t\t\t\tsrcSetCandidates = pf.setRes( matchingSet );\r\n\t\t\t\tpf.applySetCandidate( srcSetCandidates, img );\r\n\t\t\t}\r\n\t\t}\r\n\t\timg[ pf.ns ].evaled = evaluated;\r\n\t}\r\n\r\n\tfunction ascendingSort( a, b ) {\r\n\t\treturn a.res - b.res;\r\n\t}\r\n\r\n\tfunction setSrcToCur( img, src, set ) {\r\n\t\tvar candidate;\r\n\t\tif ( !set && src ) {\r\n\t\t\tset = img[ pf.ns ].sets;\r\n\t\t\tset = set && set[set.length - 1];\r\n\t\t}\r\n\r\n\t\tcandidate = getCandidateForSrc(src, set);\r\n\r\n\t\tif ( candidate ) {\r\n\t\t\tsrc = pf.makeUrl(src);\r\n\t\t\timg[ pf.ns ].curSrc = src;\r\n\t\t\timg[ pf.ns ].curCan = candidate;\r\n\r\n\t\t\tif ( !candidate.res ) {\r\n\t\t\t\tsetResolution( candidate, candidate.set.sizes );\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn candidate;\r\n\t}\r\n\r\n\tfunction getCandidateForSrc( src, set ) {\r\n\t\tvar i, candidate, candidates;\r\n\t\tif ( src && set ) {\r\n\t\t\tcandidates = pf.parseSet( set );\r\n\t\t\tsrc = pf.makeUrl(src);\r\n\t\t\tfor ( i = 0; i < candidates.length; i++ ) {\r\n\t\t\t\tif ( src === pf.makeUrl(candidates[ i ].url) ) {\r\n\t\t\t\t\tcandidate = candidates[ i ];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn candidate;\r\n\t}\r\n\r\n\tfunction getAllSourceElements( picture, candidates ) {\r\n\t\tvar i, len, source, srcset;\r\n\r\n\t\t// SPEC mismatch intended for size and perf:\r\n\t\t// actually only source elements preceding the img should be used\r\n\t\t// also note: don't use qsa here, because IE8 sometimes doesn't like source as the key part in a selector\r\n\t\tvar sources = picture.getElementsByTagName( \"source\" );\r\n\r\n\t\tfor ( i = 0, len = sources.length; i < len; i++ ) {\r\n\t\t\tsource = sources[ i ];\r\n\t\t\tsource[ pf.ns ] = true;\r\n\t\t\tsrcset = source.getAttribute( \"srcset\" );\r\n\r\n\t\t\t// if source does not have a srcset attribute, skip\r\n\t\t\tif ( srcset ) {\r\n\t\t\t\tcandidates.push( {\r\n\t\t\t\t\tsrcset: srcset,\r\n\t\t\t\t\tmedia: source.getAttribute( \"media\" ),\r\n\t\t\t\t\ttype: source.getAttribute( \"type\" ),\r\n\t\t\t\t\tsizes: source.getAttribute( \"sizes\" )\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Srcset Parser\r\n\t * By Alex Bell | MIT License\r\n\t *\r\n\t * @returns Array [{url: _, d: _, w: _, h:_, set:_(????)}, ...]\r\n\t *\r\n\t * Based super duper closely on the reference algorithm at:\r\n\t * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\r\n\t */\r\n\r\n\t// 1. Let input be the value passed to this algorithm.\r\n\t// (TO-DO : Explain what \"set\" argument is here. Maybe choose a more\r\n\t// descriptive & more searchable name. Since passing the \"set\" in really has\r\n\t// nothing to do with parsing proper, I would prefer this assignment eventually\r\n\t// go in an external fn.)\r\n\tfunction parseSrcset(input, set) {\r\n\r\n\t\tfunction collectCharacters(regEx) {\r\n\t\t\tvar chars,\r\n\t\t\t match = regEx.exec(input.substring(pos));\r\n\t\t\tif (match) {\r\n\t\t\t\tchars = match[ 0 ];\r\n\t\t\t\tpos += chars.length;\r\n\t\t\t\treturn chars;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar inputLength = input.length,\r\n\t\t url,\r\n\t\t descriptors,\r\n\t\t currentDescriptor,\r\n\t\t state,\r\n\t\t c,\r\n\r\n\t\t // 2. Let position be a pointer into input, initially pointing at the start\r\n\t\t // of the string.\r\n\t\t pos = 0,\r\n\r\n\t\t // 3. Let candidates be an initially empty source set.\r\n\t\t candidates = [];\r\n\r\n\t\t/**\r\n\t\t* Adds descriptor properties to a candidate, pushes to the candidates array\r\n\t\t* @return undefined\r\n\t\t*/\r\n\t\t// (Declared outside of the while loop so that it's only created once.\r\n\t\t// (This fn is defined before it is used, in order to pass JSHINT.\r\n\t\t// Unfortunately this breaks the sequencing of the spec comments. :/ )\r\n\t\tfunction parseDescriptors() {\r\n\r\n\t\t\t// 9. Descriptor parser: Let error be no.\r\n\t\t\tvar pError = false,\r\n\r\n\t\t\t// 10. Let width be absent.\r\n\t\t\t// 11. Let density be absent.\r\n\t\t\t// 12. Let future-compat-h be absent. (We're implementing it now as h)\r\n\t\t\t w, d, h, i,\r\n\t\t\t candidate = {},\r\n\t\t\t desc, lastChar, value, intVal, floatVal;\r\n\r\n\t\t\t// 13. For each descriptor in descriptors, run the appropriate set of steps\r\n\t\t\t// from the following list:\r\n\t\t\tfor (i = 0 ; i < descriptors.length; i++) {\r\n\t\t\t\tdesc = descriptors[ i ];\r\n\r\n\t\t\t\tlastChar = desc[ desc.length - 1 ];\r\n\t\t\t\tvalue = desc.substring(0, desc.length - 1);\r\n\t\t\t\tintVal = parseInt(value, 10);\r\n\t\t\t\tfloatVal = parseFloat(value);\r\n\r\n\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\r\n\t\t\t\t// a U+0077 LATIN SMALL LETTER W character\r\n\t\t\t\tif (regexNonNegativeInteger.test(value) && (lastChar === \"w\")) {\r\n\r\n\t\t\t\t\t// If width and density are not both absent, then let error be yes.\r\n\t\t\t\t\tif (w || d) {pError = true;}\r\n\r\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\r\n\t\t\t\t\t// If the result is zero, let error be yes.\r\n\t\t\t\t\t// Otherwise, let width be the result.\r\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {w = intVal;}\r\n\r\n\t\t\t\t// If the descriptor consists of a valid floating-point number followed by\r\n\t\t\t\t// a U+0078 LATIN SMALL LETTER X character\r\n\t\t\t\t} else if (regexFloatingPoint.test(value) && (lastChar === \"x\")) {\r\n\r\n\t\t\t\t\t// If width, density and future-compat-h are not all absent, then let error\r\n\t\t\t\t\t// be yes.\r\n\t\t\t\t\tif (w || d || h) {pError = true;}\r\n\r\n\t\t\t\t\t// Apply the rules for parsing floating-point number values to the descriptor.\r\n\t\t\t\t\t// If the result is less than zero, let error be yes. Otherwise, let density\r\n\t\t\t\t\t// be the result.\r\n\t\t\t\t\tif (floatVal < 0) {pError = true;} else {d = floatVal;}\r\n\r\n\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\r\n\t\t\t\t// a U+0068 LATIN SMALL LETTER H character\r\n\t\t\t\t} else if (regexNonNegativeInteger.test(value) && (lastChar === \"h\")) {\r\n\r\n\t\t\t\t\t// If height and density are not both absent, then let error be yes.\r\n\t\t\t\t\tif (h || d) {pError = true;}\r\n\r\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\r\n\t\t\t\t\t// If the result is zero, let error be yes. Otherwise, let future-compat-h\r\n\t\t\t\t\t// be the result.\r\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {h = intVal;}\r\n\r\n\t\t\t\t// Anything else, Let error be yes.\r\n\t\t\t\t} else {pError = true;}\r\n\t\t\t} // (close step 13 for loop)\r\n\r\n\t\t\t// 15. If error is still no, then append a new image source to candidates whose\r\n\t\t\t// URL is url, associated with a width width if not absent and a pixel\r\n\t\t\t// density density if not absent. Otherwise, there is a parse error.\r\n\t\t\tif (!pError) {\r\n\t\t\t\tcandidate.url = url;\r\n\r\n\t\t\t\tif (w) { candidate.w = w;}\r\n\t\t\t\tif (d) { candidate.d = d;}\r\n\t\t\t\tif (h) { candidate.h = h;}\r\n\t\t\t\tif (!h && !d && !w) {candidate.d = 1;}\r\n\t\t\t\tif (candidate.d === 1) {set.has1x = true;}\r\n\t\t\t\tcandidate.set = set;\r\n\r\n\t\t\t\tcandidates.push(candidate);\r\n\t\t\t}\r\n\t\t} // (close parseDescriptors fn)\r\n\r\n\t\t/**\r\n\t\t* Tokenizes descriptor properties prior to parsing\r\n\t\t* Returns undefined.\r\n\t\t* (Again, this fn is defined before it is used, in order to pass JSHINT.\r\n\t\t* Unfortunately this breaks the logical sequencing of the spec comments. :/ )\r\n\t\t*/\r\n\t\tfunction tokenize() {\r\n\r\n\t\t\t// 8.1. Descriptor tokeniser: Skip whitespace\r\n\t\t\tcollectCharacters(regexLeadingSpaces);\r\n\r\n\t\t\t// 8.2. Let current descriptor be the empty string.\r\n\t\t\tcurrentDescriptor = \"\";\r\n\r\n\t\t\t// 8.3. Let state be in descriptor.\r\n\t\t\tstate = \"in descriptor\";\r\n\r\n\t\t\twhile (true) {\r\n\r\n\t\t\t\t// 8.4. Let c be the character at position.\r\n\t\t\t\tc = input.charAt(pos);\r\n\r\n\t\t\t\t// Do the following depending on the value of state.\r\n\t\t\t\t// For the purpose of this step, \"EOF\" is a special character representing\r\n\t\t\t\t// that position is past the end of input.\r\n\r\n\t\t\t\t// In descriptor\r\n\t\t\t\tif (state === \"in descriptor\") {\r\n\t\t\t\t\t// Do the following, depending on the value of c:\r\n\r\n\t\t\t\t // Space character\r\n\t\t\t\t // If current descriptor is not empty, append current descriptor to\r\n\t\t\t\t // descriptors and let current descriptor be the empty string.\r\n\t\t\t\t // Set state to after descriptor.\r\n\t\t\t\t\tif (isSpace(c)) {\r\n\t\t\t\t\t\tif (currentDescriptor) {\r\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\r\n\t\t\t\t\t\t\tcurrentDescriptor = \"\";\r\n\t\t\t\t\t\t\tstate = \"after descriptor\";\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// U+002C COMMA (,)\r\n\t\t\t\t\t// Advance position to the next character in input. If current descriptor\r\n\t\t\t\t\t// is not empty, append current descriptor to descriptors. Jump to the step\r\n\t\t\t\t\t// labeled descriptor parser.\r\n\t\t\t\t\t} else if (c === \",\") {\r\n\t\t\t\t\t\tpos += 1;\r\n\t\t\t\t\t\tif (currentDescriptor) {\r\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tparseDescriptors();\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t// U+0028 LEFT PARENTHESIS (()\r\n\t\t\t\t\t// Append c to current descriptor. Set state to in parens.\r\n\t\t\t\t\t} else if (c === \"\\u0028\") {\r\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\r\n\t\t\t\t\t\tstate = \"in parens\";\r\n\r\n\t\t\t\t\t// EOF\r\n\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\r\n\t\t\t\t\t// descriptors. Jump to the step labeled descriptor parser.\r\n\t\t\t\t\t} else if (c === \"\") {\r\n\t\t\t\t\t\tif (currentDescriptor) {\r\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tparseDescriptors();\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t// Anything else\r\n\t\t\t\t\t// Append c to current descriptor.\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\r\n\t\t\t\t\t}\r\n\t\t\t\t// (end \"in descriptor\"\r\n\r\n\t\t\t\t// In parens\r\n\t\t\t\t} else if (state === \"in parens\") {\r\n\r\n\t\t\t\t\t// U+0029 RIGHT PARENTHESIS ())\r\n\t\t\t\t\t// Append c to current descriptor. Set state to in descriptor.\r\n\t\t\t\t\tif (c === \")\") {\r\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\r\n\t\t\t\t\t\tstate = \"in descriptor\";\r\n\r\n\t\t\t\t\t// EOF\r\n\t\t\t\t\t// Append current descriptor to descriptors. Jump to the step labeled\r\n\t\t\t\t\t// descriptor parser.\r\n\t\t\t\t\t} else if (c === \"\") {\r\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\r\n\t\t\t\t\t\tparseDescriptors();\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t// Anything else\r\n\t\t\t\t\t// Append c to current descriptor.\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t// After descriptor\r\n\t\t\t\t} else if (state === \"after descriptor\") {\r\n\r\n\t\t\t\t\t// Do the following, depending on the value of c:\r\n\t\t\t\t\t// Space character: Stay in this state.\r\n\t\t\t\t\tif (isSpace(c)) {\r\n\r\n\t\t\t\t\t// EOF: Jump to the step labeled descriptor parser.\r\n\t\t\t\t\t} else if (c === \"\") {\r\n\t\t\t\t\t\tparseDescriptors();\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t// Anything else\r\n\t\t\t\t\t// Set state to in descriptor. Set position to the previous character in input.\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstate = \"in descriptor\";\r\n\t\t\t\t\t\tpos -= 1;\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Advance position to the next character in input.\r\n\t\t\t\tpos += 1;\r\n\r\n\t\t\t// Repeat this step.\r\n\t\t\t} // (close while true loop)\r\n\t\t}\r\n\r\n\t\t// 4. Splitting loop: Collect a sequence of characters that are space\r\n\t\t// characters or U+002C COMMA characters. If any U+002C COMMA characters\r\n\t\t// were collected, that is a parse error.\r\n\t\twhile (true) {\r\n\t\t\tcollectCharacters(regexLeadingCommasOrSpaces);\r\n\r\n\t\t\t// 5. If position is past the end of input, return candidates and abort these steps.\r\n\t\t\tif (pos >= inputLength) {\r\n\t\t\t\treturn candidates; // (we're done, this is the sole return path)\r\n\t\t\t}\r\n\r\n\t\t\t// 6. Collect a sequence of characters that are not space characters,\r\n\t\t\t// and let that be url.\r\n\t\t\turl = collectCharacters(regexLeadingNotSpaces);\r\n\r\n\t\t\t// 7. Let descriptors be a new empty list.\r\n\t\t\tdescriptors = [];\r\n\r\n\t\t\t// 8. If url ends with a U+002C COMMA character (,), follow these substeps:\r\n\t\t\t//\t\t(1). Remove all trailing U+002C COMMA characters from url. If this removed\r\n\t\t\t// more than one character, that is a parse error.\r\n\t\t\tif (url.slice(-1) === \",\") {\r\n\t\t\t\turl = url.replace(regexTrailingCommas, \"\");\r\n\t\t\t\t// (Jump ahead to step 9 to skip tokenization and just push the candidate).\r\n\t\t\t\tparseDescriptors();\r\n\r\n\t\t\t//\tOtherwise, follow these substeps:\r\n\t\t\t} else {\r\n\t\t\t\ttokenize();\r\n\t\t\t} // (close else of step 8)\r\n\r\n\t\t// 16. Return to the step labeled splitting loop.\r\n\t\t} // (Close of big while loop.)\r\n\t}\r\n\r\n\t/*\r\n\t * Sizes Parser\r\n\t *\r\n\t * By Alex Bell | MIT License\r\n\t *\r\n\t * Non-strict but accurate and lightweight JS Parser for the string value \r\n\t *\r\n\t * Reference algorithm at:\r\n\t * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-sizes-attribute\r\n\t *\r\n\t * Most comments are copied in directly from the spec\r\n\t * (except for comments in parens).\r\n\t *\r\n\t * Grammar is:\r\n\t * = # [ , ]? | \r\n\t * = \r\n\t * = \r\n\t * http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-sizes\r\n\t *\r\n\t * E.g. \"(max-width: 30em) 100vw, (max-width: 50em) 70vw, 100vw\"\r\n\t * or \"(min-width: 30em), calc(30vw - 15px)\" or just \"30vw\"\r\n\t *\r\n\t * Returns the first valid with a media condition that evaluates to true,\r\n\t * or \"100vw\" if all valid media conditions evaluate to false.\r\n\t *\r\n\t */\r\n\r\n\tfunction parseSizes(strValue) {\r\n\r\n\t\t// (Percentage CSS lengths are not allowed in this case, to avoid confusion:\r\n\t\t// https://html.spec.whatwg.org/multipage/embedded-content.html#valid-source-size-list\r\n\t\t// CSS allows a single optional plus or minus sign:\r\n\t\t// http://www.w3.org/TR/CSS2/syndata.html#numbers\r\n\t\t// CSS is ASCII case-insensitive:\r\n\t\t// http://www.w3.org/TR/CSS2/syndata.html#characters )\r\n\t\t// Spec allows exponential notation for type:\r\n\t\t// http://dev.w3.org/csswg/css-values/#numbers\r\n\t\tvar regexCssLengthWithUnits = /^(?:[+-]?[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i;\r\n\r\n\t\t// (This is a quick and lenient test. Because of optional unlimited-depth internal\r\n\t\t// grouping parens and strict spacing rules, this could get very complicated.)\r\n\t\tvar regexCssCalc = /^calc\\((?:[0-9a-z \\.\\+\\-\\*\\/\\(\\)]+)\\)$/i;\r\n\r\n\t\tvar i;\r\n\t\tvar unparsedSizesList;\r\n\t\tvar unparsedSizesListLength;\r\n\t\tvar unparsedSize;\r\n\t\tvar lastComponentValue;\r\n\t\tvar size;\r\n\r\n\t\t// UTILITY FUNCTIONS\r\n\r\n\t\t// (Toy CSS parser. The goals here are:\r\n\t\t// 1) expansive test coverage without the weight of a full CSS parser.\r\n\t\t// 2) Avoiding regex wherever convenient.\r\n\t\t// Quick tests: http://jsfiddle.net/gtntL4gr/3/\r\n\t\t// Returns an array of arrays.)\r\n\t\tfunction parseComponentValues(str) {\r\n\t\t\tvar chrctr;\r\n\t\t\tvar component = \"\";\r\n\t\t\tvar componentArray = [];\r\n\t\t\tvar listArray = [];\r\n\t\t\tvar parenDepth = 0;\r\n\t\t\tvar pos = 0;\r\n\t\t\tvar inComment = false;\r\n\r\n\t\t\tfunction pushComponent() {\r\n\t\t\t\tif (component) {\r\n\t\t\t\t\tcomponentArray.push(component);\r\n\t\t\t\t\tcomponent = \"\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfunction pushComponentArray() {\r\n\t\t\t\tif (componentArray[0]) {\r\n\t\t\t\t\tlistArray.push(componentArray);\r\n\t\t\t\t\tcomponentArray = [];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// (Loop forwards from the beginning of the string.)\r\n\t\t\twhile (true) {\r\n\t\t\t\tchrctr = str.charAt(pos);\r\n\r\n\t\t\t\tif (chrctr === \"\") { // ( End of string reached.)\r\n\t\t\t\t\tpushComponent();\r\n\t\t\t\t\tpushComponentArray();\r\n\t\t\t\t\treturn listArray;\r\n\t\t\t\t} else if (inComment) {\r\n\t\t\t\t\tif ((chrctr === \"*\") && (str[pos + 1] === \"/\")) { // (At end of a comment.)\r\n\t\t\t\t\t\tinComment = false;\r\n\t\t\t\t\t\tpos += 2;\r\n\t\t\t\t\t\tpushComponent();\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tpos += 1; // (Skip all characters inside comments.)\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (isSpace(chrctr)) {\r\n\t\t\t\t\t// (If previous character in loop was also a space, or if\r\n\t\t\t\t\t// at the beginning of the string, do not add space char to\r\n\t\t\t\t\t// component.)\r\n\t\t\t\t\tif ( (str.charAt(pos - 1) && isSpace( str.charAt(pos - 1) ) ) || !component ) {\r\n\t\t\t\t\t\tpos += 1;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t} else if (parenDepth === 0) {\r\n\t\t\t\t\t\tpushComponent();\r\n\t\t\t\t\t\tpos +=1;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// (Replace any space character with a plain space for legibility.)\r\n\t\t\t\t\t\tchrctr = \" \";\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (chrctr === \"(\") {\r\n\t\t\t\t\tparenDepth += 1;\r\n\t\t\t\t} else if (chrctr === \")\") {\r\n\t\t\t\t\tparenDepth -= 1;\r\n\t\t\t\t} else if (chrctr === \",\") {\r\n\t\t\t\t\tpushComponent();\r\n\t\t\t\t\tpushComponentArray();\r\n\t\t\t\t\tpos += 1;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t} else if ( (chrctr === \"/\") && (str.charAt(pos + 1) === \"*\") ) {\r\n\t\t\t\t\tinComment = true;\r\n\t\t\t\t\tpos += 2;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcomponent = component + chrctr;\r\n\t\t\t\tpos += 1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction isValidNonNegativeSourceSizeValue(s) {\r\n\t\t\tif (regexCssLengthWithUnits.test(s) && (parseFloat(s) >= 0)) {return true;}\r\n\t\t\tif (regexCssCalc.test(s)) {return true;}\r\n\t\t\t// ( http://www.w3.org/TR/CSS2/syndata.html#numbers says:\r\n\t\t\t// \"-0 is equivalent to 0 and is not a negative number.\" which means that\r\n\t\t\t// unitless zero and unitless negative zero must be accepted as special cases.)\r\n\t\t\tif ((s === \"0\") || (s === \"-0\") || (s === \"+0\")) {return true;}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// When asked to parse a sizes attribute from an element, parse a\r\n\t\t// comma-separated list of component values from the value of the element's\r\n\t\t// sizes attribute (or the empty string, if the attribute is absent), and let\r\n\t\t// unparsed sizes list be the result.\r\n\t\t// http://dev.w3.org/csswg/css-syntax/#parse-comma-separated-list-of-component-values\r\n\r\n\t\tunparsedSizesList = parseComponentValues(strValue);\r\n\t\tunparsedSizesListLength = unparsedSizesList.length;\r\n\r\n\t\t// For each unparsed size in unparsed sizes list:\r\n\t\tfor (i = 0; i < unparsedSizesListLength; i++) {\r\n\t\t\tunparsedSize = unparsedSizesList[i];\r\n\r\n\t\t\t// 1. Remove all consecutive s from the end of unparsed size.\r\n\t\t\t// ( parseComponentValues() already omits spaces outside of parens. )\r\n\r\n\t\t\t// If unparsed size is now empty, that is a parse error; continue to the next\r\n\t\t\t// iteration of this algorithm.\r\n\t\t\t// ( parseComponentValues() won't push an empty array. )\r\n\r\n\t\t\t// 2. If the last component value in unparsed size is a valid non-negative\r\n\t\t\t// , let size be its value and remove the component value\r\n\t\t\t// from unparsed size. Any CSS function other than the calc() function is\r\n\t\t\t// invalid. Otherwise, there is a parse error; continue to the next iteration\r\n\t\t\t// of this algorithm.\r\n\t\t\t// http://dev.w3.org/csswg/css-syntax/#parse-component-value\r\n\t\t\tlastComponentValue = unparsedSize[unparsedSize.length - 1];\r\n\r\n\t\t\tif (isValidNonNegativeSourceSizeValue(lastComponentValue)) {\r\n\t\t\t\tsize = lastComponentValue;\r\n\t\t\t\tunparsedSize.pop();\r\n\t\t\t} else {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// 3. Remove all consecutive s from the end of unparsed\r\n\t\t\t// size. If unparsed size is now empty, return size and exit this algorithm.\r\n\t\t\t// If this was not the last item in unparsed sizes list, that is a parse error.\r\n\t\t\tif (unparsedSize.length === 0) {\r\n\t\t\t\treturn size;\r\n\t\t\t}\r\n\r\n\t\t\t// 4. Parse the remaining component values in unparsed size as a\r\n\t\t\t// . If it does not parse correctly, or it does parse\r\n\t\t\t// correctly but the evaluates to false, continue to the\r\n\t\t\t// next iteration of this algorithm.\r\n\t\t\t// (Parsing all possible compound media conditions in JS is heavy, complicated,\r\n\t\t\t// and the payoff is unclear. Is there ever an situation where the\r\n\t\t\t// media condition parses incorrectly but still somehow evaluates to true?\r\n\t\t\t// Can we just rely on the browser/polyfill to do it?)\r\n\t\t\tunparsedSize = unparsedSize.join(\" \");\r\n\t\t\tif (!(pf.matchesMedia( unparsedSize ) ) ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// 5. Return size and exit this algorithm.\r\n\t\t\treturn size;\r\n\t\t}\r\n\r\n\t\t// If the above algorithm exhausts unparsed sizes list without returning a\r\n\t\t// size value, return 100vw.\r\n\t\treturn \"100vw\";\r\n\t}\r\n\r\n\t// namespace\r\n\tpf.ns = (\"pf\" + new Date().getTime()).substr(0, 9);\r\n\r\n\t// srcset support test\r\n\tpf.supSrcset = \"srcset\" in image;\r\n\tpf.supSizes = \"sizes\" in image;\r\n\tpf.supPicture = !!window.HTMLPictureElement;\r\n\r\n\t// UC browser does claim to support srcset and picture, but not sizes,\r\n\t// this extended test reveals the browser does support nothing\r\n\tif (pf.supSrcset && pf.supPicture && !pf.supSizes) {\r\n\t\t(function(image2) {\r\n\t\t\timage.srcset = \"data:,a\";\r\n\t\t\timage2.src = \"data:,a\";\r\n\t\t\tpf.supSrcset = image.complete === image2.complete;\r\n\t\t\tpf.supPicture = pf.supSrcset && pf.supPicture;\r\n\t\t})(document.createElement(\"img\"));\r\n\t}\r\n\r\n\t// Safari9 has basic support for sizes, but does't expose the `sizes` idl attribute\r\n\tif (pf.supSrcset && !pf.supSizes) {\r\n\r\n\t\t(function() {\r\n\t\t\tvar width2 = \"data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==\";\r\n\t\t\tvar width1 = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\r\n\t\t\tvar img = document.createElement(\"img\");\r\n\t\t\tvar test = function() {\r\n\t\t\t\tvar width = img.width;\r\n\r\n\t\t\t\tif (width === 2) {\r\n\t\t\t\t\tpf.supSizes = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\talwaysCheckWDescriptor = pf.supSrcset && !pf.supSizes;\r\n\r\n\t\t\t\tisSupportTestReady = true;\r\n\t\t\t\t// force async\r\n\t\t\t\tsetTimeout(picturefill);\r\n\t\t\t};\r\n\r\n\t\t\timg.onload = test;\r\n\t\t\timg.onerror = test;\r\n\t\t\timg.setAttribute(\"sizes\", \"9px\");\r\n\r\n\t\t\timg.srcset = width1 + \" 1w,\" + width2 + \" 9w\";\r\n\t\t\timg.src = width1;\r\n\t\t})();\r\n\r\n\t} else {\r\n\t\tisSupportTestReady = true;\r\n\t}\r\n\r\n\t// using pf.qsa instead of dom traversing does scale much better,\r\n\t// especially on sites mixing responsive and non-responsive images\r\n\tpf.selShort = \"picture>img,img[srcset]\";\r\n\tpf.sel = pf.selShort;\r\n\tpf.cfg = cfg;\r\n\r\n\t/**\r\n\t * Shortcut property for `devicePixelRatio` ( for easy overriding in tests )\r\n\t */\r\n\tpf.DPR = (DPR || 1 );\r\n\tpf.u = units;\r\n\r\n\t// container of supported mime types that one might need to qualify before using\r\n\tpf.types = types;\r\n\r\n\tpf.setSize = noop;\r\n\r\n\t/**\r\n\t * Gets a string and returns the absolute URL\r\n\t * @param src\r\n\t * @returns {String} absolute URL\r\n\t */\r\n\r\n\tpf.makeUrl = memoize(function(src) {\r\n\t\tanchor.href = src;\r\n\t\treturn anchor.href;\r\n\t});\r\n\r\n\t/**\r\n\t * Gets a DOM element or document and a selctor and returns the found matches\r\n\t * Can be extended with jQuery/Sizzle for IE7 support\r\n\t * @param context\r\n\t * @param sel\r\n\t * @returns {NodeList|Array}\r\n\t */\r\n\tpf.qsa = function(context, sel) {\r\n\t\treturn ( \"querySelector\" in context ) ? context.querySelectorAll(sel) : [];\r\n\t};\r\n\r\n\t/**\r\n\t * Shortcut method for matchMedia ( for easy overriding in tests )\r\n\t * wether native or pf.mMQ is used will be decided lazy on first call\r\n\t * @returns {boolean}\r\n\t */\r\n\tpf.matchesMedia = function() {\r\n\t\tif ( window.matchMedia && (matchMedia( \"(min-width: 0.1em)\" ) || {}).matches ) {\r\n\t\t\tpf.matchesMedia = function( media ) {\r\n\t\t\t\treturn !media || ( matchMedia( media ).matches );\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tpf.matchesMedia = pf.mMQ;\r\n\t\t}\r\n\r\n\t\treturn pf.matchesMedia.apply( this, arguments );\r\n\t};\r\n\r\n\t/**\r\n\t * A simplified matchMedia implementation for IE8 and IE9\r\n\t * handles only min-width/max-width with px or em values\r\n\t * @param media\r\n\t * @returns {boolean}\r\n\t */\r\n\tpf.mMQ = function( media ) {\r\n\t\treturn media ? evalCSS(media) : true;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns the calculated length in css pixel from the given sourceSizeValue\r\n\t * http://dev.w3.org/csswg/css-values-3/#length-value\r\n\t * intended Spec mismatches:\r\n\t * * Does not check for invalid use of CSS functions\r\n\t * * Does handle a computed length of 0 the same as a negative and therefore invalid value\r\n\t * @param sourceSizeValue\r\n\t * @returns {Number}\r\n\t */\r\n\tpf.calcLength = function( sourceSizeValue ) {\r\n\r\n\t\tvar value = evalCSS(sourceSizeValue, true) || false;\r\n\t\tif (value < 0) {\r\n\t\t\tvalue = false;\r\n\t\t}\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\t/**\r\n\t * Takes a type string and checks if its supported\r\n\t */\r\n\r\n\tpf.supportsType = function( type ) {\r\n\t\treturn ( type ) ? types[ type ] : true;\r\n\t};\r\n\r\n\t/**\r\n\t * Parses a sourceSize into mediaCondition (media) and sourceSizeValue (length)\r\n\t * @param sourceSizeStr\r\n\t * @returns {*}\r\n\t */\r\n\tpf.parseSize = memoize(function( sourceSizeStr ) {\r\n\t\tvar match = ( sourceSizeStr || \"\" ).match(regSize);\r\n\t\treturn {\r\n\t\t\tmedia: match && match[1],\r\n\t\t\tlength: match && match[2]\r\n\t\t};\r\n\t});\r\n\r\n\tpf.parseSet = function( set ) {\r\n\t\tif ( !set.cands ) {\r\n\t\t\tset.cands = parseSrcset(set.srcset, set);\r\n\t\t}\r\n\t\treturn set.cands;\r\n\t};\r\n\r\n\t/**\r\n\t * returns 1em in css px for html/body default size\r\n\t * function taken from respondjs\r\n\t * @returns {*|number}\r\n\t */\r\n\tpf.getEmValue = function() {\r\n\t\tvar body;\r\n\t\tif ( !eminpx && (body = document.body) ) {\r\n\t\t\tvar div = document.createElement( \"div\" ),\r\n\t\t\t\toriginalHTMLCSS = docElem.style.cssText,\r\n\t\t\t\toriginalBodyCSS = body.style.cssText;\r\n\r\n\t\t\tdiv.style.cssText = baseStyle;\r\n\r\n\t\t\t// 1em in a media query is the value of the default font size of the browser\r\n\t\t\t// reset docElem and body to ensure the correct value is returned\r\n\t\t\tdocElem.style.cssText = fsCss;\r\n\t\t\tbody.style.cssText = fsCss;\r\n\r\n\t\t\tbody.appendChild( div );\r\n\t\t\teminpx = div.offsetWidth;\r\n\t\t\tbody.removeChild( div );\r\n\r\n\t\t\t//also update eminpx before returning\r\n\t\t\teminpx = parseFloat( eminpx, 10 );\r\n\r\n\t\t\t// restore the original values\r\n\t\t\tdocElem.style.cssText = originalHTMLCSS;\r\n\t\t\tbody.style.cssText = originalBodyCSS;\r\n\r\n\t\t}\r\n\t\treturn eminpx || 16;\r\n\t};\r\n\r\n\t/**\r\n\t * Takes a string of sizes and returns the width in pixels as a number\r\n\t */\r\n\tpf.calcListLength = function( sourceSizeListStr ) {\r\n\t\t// Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33%\r\n\t\t//\r\n\t\t// or (min-width:30em) calc(30% - 15px)\r\n\t\tif ( !(sourceSizeListStr in sizeLengthCache) || cfg.uT ) {\r\n\t\t\tvar winningLength = pf.calcLength( parseSizes( sourceSizeListStr ) );\r\n\r\n\t\t\tsizeLengthCache[ sourceSizeListStr ] = !winningLength ? units.width : winningLength;\r\n\t\t}\r\n\r\n\t\treturn sizeLengthCache[ sourceSizeListStr ];\r\n\t};\r\n\r\n\t/**\r\n\t * Takes a candidate object with a srcset property in the form of url/\r\n\t * ex. \"images/pic-medium.png 1x, images/pic-medium-2x.png 2x\" or\r\n\t * \"images/pic-medium.png 400w, images/pic-medium-2x.png 800w\" or\r\n\t * \"images/pic-small.png\"\r\n\t * Get an array of image candidates in the form of\r\n\t * {url: \"/foo/bar.png\", resolution: 1}\r\n\t * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value\r\n\t * If sizes is specified, res is calculated\r\n\t */\r\n\tpf.setRes = function( set ) {\r\n\t\tvar candidates;\r\n\t\tif ( set ) {\r\n\r\n\t\t\tcandidates = pf.parseSet( set );\r\n\r\n\t\t\tfor ( var i = 0, len = candidates.length; i < len; i++ ) {\r\n\t\t\t\tsetResolution( candidates[ i ], set.sizes );\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn candidates;\r\n\t};\r\n\r\n\tpf.setRes.res = setResolution;\r\n\r\n\tpf.applySetCandidate = function( candidates, img ) {\r\n\t\tif ( !candidates.length ) {return;}\r\n\t\tvar candidate,\r\n\t\t\ti,\r\n\t\t\tj,\r\n\t\t\tlength,\r\n\t\t\tbestCandidate,\r\n\t\t\tcurSrc,\r\n\t\t\tcurCan,\r\n\t\t\tcandidateSrc,\r\n\t\t\tabortCurSrc;\r\n\r\n\t\tvar imageData = img[ pf.ns ];\r\n\t\tvar dpr = pf.DPR;\r\n\r\n\t\tcurSrc = imageData.curSrc || img[curSrcProp];\r\n\r\n\t\tcurCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set);\r\n\r\n\t\t// if we have a current source, we might either become lazy or give this source some advantage\r\n\t\tif ( curCan && curCan.set === candidates[ 0 ].set ) {\r\n\r\n\t\t\t// if browser can abort image request and the image has a higher pixel density than needed\r\n\t\t\t// and this image isn't downloaded yet, we skip next part and try to save bandwidth\r\n\t\t\tabortCurSrc = (supportAbort && !img.complete && curCan.res - 0.1 > dpr);\r\n\r\n\t\t\tif ( !abortCurSrc ) {\r\n\t\t\t\tcurCan.cached = true;\r\n\r\n\t\t\t\t// if current candidate is \"best\", \"better\" or \"okay\",\r\n\t\t\t\t// set it to bestCandidate\r\n\t\t\t\tif ( curCan.res >= dpr ) {\r\n\t\t\t\t\tbestCandidate = curCan;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( !bestCandidate ) {\r\n\r\n\t\t\tcandidates.sort( ascendingSort );\r\n\r\n\t\t\tlength = candidates.length;\r\n\t\t\tbestCandidate = candidates[ length - 1 ];\r\n\r\n\t\t\tfor ( i = 0; i < length; i++ ) {\r\n\t\t\t\tcandidate = candidates[ i ];\r\n\t\t\t\tif ( candidate.res >= dpr ) {\r\n\t\t\t\t\tj = i - 1;\r\n\r\n\t\t\t\t\t// we have found the perfect candidate,\r\n\t\t\t\t\t// but let's improve this a little bit with some assumptions ;-)\r\n\t\t\t\t\tif (candidates[ j ] &&\r\n\t\t\t\t\t\t(abortCurSrc || curSrc !== pf.makeUrl( candidate.url )) &&\r\n\t\t\t\t\t\tchooseLowRes(candidates[ j ].res, candidate.res, dpr, candidates[ j ].cached)) {\r\n\r\n\t\t\t\t\t\tbestCandidate = candidates[ j ];\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tbestCandidate = candidate;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( bestCandidate ) {\r\n\r\n\t\t\tcandidateSrc = pf.makeUrl( bestCandidate.url );\r\n\r\n\t\t\timageData.curSrc = candidateSrc;\r\n\t\t\timageData.curCan = bestCandidate;\r\n\r\n\t\t\tif ( candidateSrc !== curSrc ) {\r\n\t\t\t\tpf.setSrc( img, bestCandidate );\r\n\t\t\t}\r\n\t\t\tpf.setSize( img );\r\n\t\t}\r\n\t};\r\n\r\n\tpf.setSrc = function( img, bestCandidate ) {\r\n\t\tvar origWidth;\r\n\t\timg.src = bestCandidate.url;\r\n\r\n\t\t// although this is a specific Safari issue, we don't want to take too much different code paths\r\n\t\tif ( bestCandidate.set.type === \"image/svg+xml\" ) {\r\n\t\t\torigWidth = img.style.width;\r\n\t\t\timg.style.width = (img.offsetWidth + 1) + \"px\";\r\n\r\n\t\t\t// next line only should trigger a repaint\r\n\t\t\t// if... is only done to trick dead code removal\r\n\t\t\tif ( img.offsetWidth + 1 ) {\r\n\t\t\t\timg.style.width = origWidth;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tpf.getSet = function( img ) {\r\n\t\tvar i, set, supportsType;\r\n\t\tvar match = false;\r\n\t\tvar sets = img [ pf.ns ].sets;\r\n\r\n\t\tfor ( i = 0; i < sets.length && !match; i++ ) {\r\n\t\t\tset = sets[i];\r\n\r\n\t\t\tif ( !set.srcset || !pf.matchesMedia( set.media ) || !(supportsType = pf.supportsType( set.type )) ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif ( supportsType === \"pending\" ) {\r\n\t\t\t\tset = supportsType;\r\n\t\t\t}\r\n\r\n\t\t\tmatch = set;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\treturn match;\r\n\t};\r\n\r\n\tpf.parseSets = function( element, parent, options ) {\r\n\t\tvar srcsetAttribute, imageSet, isWDescripor, srcsetParsed;\r\n\r\n\t\tvar hasPicture = parent && parent.nodeName.toUpperCase() === \"PICTURE\";\r\n\t\tvar imageData = element[ pf.ns ];\r\n\r\n\t\tif ( imageData.src === undefined || options.src ) {\r\n\t\t\timageData.src = getImgAttr.call( element, \"src\" );\r\n\t\t\tif ( imageData.src ) {\r\n\t\t\t\tsetImgAttr.call( element, srcAttr, imageData.src );\r\n\t\t\t} else {\r\n\t\t\t\tremoveImgAttr.call( element, srcAttr );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( imageData.srcset === undefined || options.srcset || !pf.supSrcset || element.srcset ) {\r\n\t\t\tsrcsetAttribute = getImgAttr.call( element, \"srcset\" );\r\n\t\t\timageData.srcset = srcsetAttribute;\r\n\t\t\tsrcsetParsed = true;\r\n\t\t}\r\n\r\n\t\timageData.sets = [];\r\n\r\n\t\tif ( hasPicture ) {\r\n\t\t\timageData.pic = true;\r\n\t\t\tgetAllSourceElements( parent, imageData.sets );\r\n\t\t}\r\n\r\n\t\tif ( imageData.srcset ) {\r\n\t\t\timageSet = {\r\n\t\t\t\tsrcset: imageData.srcset,\r\n\t\t\t\tsizes: getImgAttr.call( element, \"sizes\" )\r\n\t\t\t};\r\n\r\n\t\t\timageData.sets.push( imageSet );\r\n\r\n\t\t\tisWDescripor = (alwaysCheckWDescriptor || imageData.src) && regWDesc.test(imageData.srcset || \"\");\r\n\r\n\t\t\t// add normal src as candidate, if source has no w descriptor\r\n\t\t\tif ( !isWDescripor && imageData.src && !getCandidateForSrc(imageData.src, imageSet) && !imageSet.has1x ) {\r\n\t\t\t\timageSet.srcset += \", \" + imageData.src;\r\n\t\t\t\timageSet.cands.push({\r\n\t\t\t\t\turl: imageData.src,\r\n\t\t\t\t\td: 1,\r\n\t\t\t\t\tset: imageSet\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t} else if ( imageData.src ) {\r\n\t\t\timageData.sets.push( {\r\n\t\t\t\tsrcset: imageData.src,\r\n\t\t\t\tsizes: null\r\n\t\t\t} );\r\n\t\t}\r\n\r\n\t\timageData.curCan = null;\r\n\t\timageData.curSrc = undefined;\r\n\r\n\t\t// if img has picture or the srcset was removed or has a srcset and does not support srcset at all\r\n\t\t// or has a w descriptor (and does not support sizes) set support to false to evaluate\r\n\t\timageData.supported = !( hasPicture || ( imageSet && !pf.supSrcset ) || (isWDescripor && !pf.supSizes) );\r\n\r\n\t\tif ( srcsetParsed && pf.supSrcset && !imageData.supported ) {\r\n\t\t\tif ( srcsetAttribute ) {\r\n\t\t\t\tsetImgAttr.call( element, srcsetAttr, srcsetAttribute );\r\n\t\t\t\telement.srcset = \"\";\r\n\t\t\t} else {\r\n\t\t\t\tremoveImgAttr.call( element, srcsetAttr );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (imageData.supported && !imageData.srcset && ((!imageData.src && element.src) || element.src !== pf.makeUrl(imageData.src))) {\r\n\t\t\tif (imageData.src === null) {\r\n\t\t\t\telement.removeAttribute(\"src\");\r\n\t\t\t} else {\r\n\t\t\t\telement.src = imageData.src;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\timageData.parsed = true;\r\n\t};\r\n\r\n\tpf.fillImg = function(element, options) {\r\n\t\tvar imageData;\r\n\t\tvar extreme = options.reselect || options.reevaluate;\r\n\r\n\t\t// expando for caching data on the img\r\n\t\tif ( !element[ pf.ns ] ) {\r\n\t\t\telement[ pf.ns ] = {};\r\n\t\t}\r\n\r\n\t\timageData = element[ pf.ns ];\r\n\r\n\t\t// if the element has already been evaluated, skip it\r\n\t\t// unless `options.reevaluate` is set to true ( this, for example,\r\n\t\t// is set to true when running `picturefill` on `resize` ).\r\n\t\tif ( !extreme && imageData.evaled === evalId ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( !imageData.parsed || options.reevaluate ) {\r\n\t\t\tpf.parseSets( element, element.parentNode, options );\r\n\t\t}\r\n\r\n\t\tif ( !imageData.supported ) {\r\n\t\t\tapplyBestCandidate( element );\r\n\t\t} else {\r\n\t\t\timageData.evaled = evalId;\r\n\t\t}\r\n\t};\r\n\r\n\tpf.setupRun = function() {\r\n\t\tif ( !alreadyRun || isVwDirty || (DPR !== window.devicePixelRatio) ) {\r\n\t\t\tupdateMetrics();\r\n\t\t}\r\n\t};\r\n\r\n\t// If picture is supported, well, that's awesome.\r\n\tif ( pf.supPicture ) {\r\n\t\tpicturefill = noop;\r\n\t\tpf.fillImg = noop;\r\n\t} else {\r\n\r\n\t\t // Set up picture polyfill by polling the document\r\n\t\t(function() {\r\n\t\t\tvar isDomReady;\r\n\t\t\tvar regReady = window.attachEvent ? /d$|^c/ : /d$|^c|^i/;\r\n\r\n\t\t\tvar run = function() {\r\n\t\t\t\tvar readyState = document.readyState || \"\";\r\n\r\n\t\t\t\ttimerId = setTimeout(run, readyState === \"loading\" ? 200 : 999);\r\n\t\t\t\tif ( document.body ) {\r\n\t\t\t\t\tpf.fillImgs();\r\n\t\t\t\t\tisDomReady = isDomReady || regReady.test(readyState);\r\n\t\t\t\t\tif ( isDomReady ) {\r\n\t\t\t\t\t\tclearTimeout( timerId );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar timerId = setTimeout(run, document.body ? 9 : 99);\r\n\r\n\t\t\t// Also attach picturefill on resize and readystatechange\r\n\t\t\t// http://modernjavascript.blogspot.com/2013/08/building-better-debounce.html\r\n\t\t\tvar debounce = function(func, wait) {\r\n\t\t\t\tvar timeout, timestamp;\r\n\t\t\t\tvar later = function() {\r\n\t\t\t\t\tvar last = (new Date()) - timestamp;\r\n\r\n\t\t\t\t\tif (last < wait) {\r\n\t\t\t\t\t\ttimeout = setTimeout(later, wait - last);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttimeout = null;\r\n\t\t\t\t\t\tfunc();\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\treturn function() {\r\n\t\t\t\t\ttimestamp = new Date();\r\n\r\n\t\t\t\t\tif (!timeout) {\r\n\t\t\t\t\t\ttimeout = setTimeout(later, wait);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t};\r\n\t\t\tvar lastClientWidth = docElem.clientHeight;\r\n\t\t\tvar onResize = function() {\r\n\t\t\t\tisVwDirty = Math.max(window.innerWidth || 0, docElem.clientWidth) !== units.width || docElem.clientHeight !== lastClientWidth;\r\n\t\t\t\tlastClientWidth = docElem.clientHeight;\r\n\t\t\t\tif ( isVwDirty ) {\r\n\t\t\t\t\tpf.fillImgs();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\ton( window, \"resize\", debounce(onResize, 99 ) );\r\n\t\t\ton( document, \"readystatechange\", run );\r\n\t\t})();\r\n\t}\r\n\r\n\tpf.picturefill = picturefill;\r\n\t//use this internally for easy monkey patching/performance testing\r\n\tpf.fillImgs = picturefill;\r\n\tpf.teardownRun = noop;\r\n\r\n\t/* expose methods for testing */\r\n\tpicturefill._ = pf;\r\n\r\n\twindow.picturefillCFG = {\r\n\t\tpf: pf,\r\n\t\tpush: function(args) {\r\n\t\t\tvar name = args.shift();\r\n\t\t\tif (typeof pf[name] === \"function\") {\r\n\t\t\t\tpf[name].apply(pf, args);\r\n\t\t\t} else {\r\n\t\t\t\tcfg[name] = args[0];\r\n\t\t\t\tif (alreadyRun) {\r\n\t\t\t\t\tpf.fillImgs( { reselect: true } );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\twhile (setOptions && setOptions.length) {\r\n\t\twindow.picturefillCFG.push(setOptions.shift());\r\n\t}\r\n\r\n\t/* expose picturefill */\r\n\twindow.picturefill = picturefill;\r\n\r\n\t/* expose picturefill */\r\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\r\n\t\t// CommonJS, just export\r\n\t\tmodule.exports = picturefill;\r\n\t} else if ( typeof define === \"function\" && define.amd ) {\r\n\t\t// AMD support\r\n\t\tdefine( \"picturefill\", function() { return picturefill; } );\r\n\t}\r\n\r\n\t// IE8 evals this sync, so it must be the last thing we do\r\n\tif ( !pf.supPicture ) {\r\n\t\ttypes[ \"image/webp\" ] = detectTypeSupport(\"image/webp\", \"data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==\" );\r\n\t}\r\n\r\n} )( window, document );\r\n","// mutationobserver-shim v0.3.2 (github.com/megawac/MutationObserver.js)\r\n// Authors: Graeme Yeates (github.com/megawac) \r\nwindow.MutationObserver=window.MutationObserver||function(w){function v(a){this.i=[];this.m=a}function I(a){(function c(){var d=a.takeRecords();d.length&&a.m(d,a);a.h=setTimeout(c,v._period)})()}function p(a){var b={type:null,target:null,addedNodes:[],removedNodes:[],previousSibling:null,nextSibling:null,attributeName:null,attributeNamespace:null,oldValue:null},c;for(c in a)b[c]!==w&&a[c]!==w&&(b[c]=a[c]);return b}function J(a,b){var c=C(a,b);return function(d){var f=d.length,n;b.a&&3===a.nodeType&&\r\na.nodeValue!==c.a&&d.push(new p({type:\"characterData\",target:a,oldValue:c.a}));b.b&&c.b&&A(d,a,c.b,b.f);if(b.c||b.g)n=K(d,a,c,b);if(n||d.length!==f)c=C(a,b)}}function L(a,b){return b.value}function M(a,b){return\"style\"!==b.name?b.value:a.style.cssText}function A(a,b,c,d){for(var f={},n=b.attributes,k,g,x=n.length;x--;)k=n[x],g=k.name,d&&d[g]===w||(D(b,k)!==c[g]&&a.push(p({type:\"attributes\",target:b,attributeName:g,oldValue:c[g],attributeNamespace:k.namespaceURI})),f[g]=!0);for(g in c)f[g]||a.push(p({target:b,\r\ntype:\"attributes\",attributeName:g,oldValue:c[g]}))}function K(a,b,c,d){function f(b,c,f,k,y){var g=b.length-1;y=-~((g-y)/2);for(var h,l,e;e=b.pop();)h=f[e.j],l=k[e.l],d.c&&y&&Math.abs(e.j-e.l)>=g&&(a.push(p({type:\"childList\",target:c,addedNodes:[h],removedNodes:[h],nextSibling:h.nextSibling,previousSibling:h.previousSibling})),y--),d.b&&l.b&&A(a,h,l.b,d.f),d.a&&3===h.nodeType&&h.nodeValue!==l.a&&a.push(p({type:\"characterData\",target:h,oldValue:l.a})),d.g&&n(h,l)}function n(b,c){for(var g=b.childNodes,\r\nq=c.c,x=g.length,v=q?q.length:0,h,l,e,m,t,z=0,u=0,r=0;umax) {\r\n\t\t\t\tsize=max;\r\n\t\t\t\tlog(iframeId,'Set ' + dimension + ' to max value');\r\n\t\t\t}\r\n\r\n\t\t\tmessageData[dimension] = '' + size;\r\n\t\t}\r\n\r\n\r\n\t\tfunction isMessageFromIFrame(){\r\n\t\t\tfunction checkAllowedOrigin(){\r\n\t\t\t\tfunction checkList(){\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\ti = 0,\r\n\t\t\t\t\t\tretCode = false;\r\n\r\n\t\t\t\t\tlog(iframeId,'Checking connection is from allowed list of origins: ' + checkOrigin);\r\n\r\n\t\t\t\t\tfor (; i < checkOrigin.length; i++) {\r\n\t\t\t\t\t\tif (checkOrigin[i] === origin) {\r\n\t\t\t\t\t\t\tretCode = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn retCode;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction checkSingle(){\r\n\t\t\t\t\tvar remoteHost = settings[iframeId].remoteHost;\r\n\t\t\t\t\tlog(iframeId,'Checking connection is from: '+remoteHost);\r\n\t\t\t\t\treturn origin === remoteHost;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn checkOrigin.constructor === Array ? checkList() : checkSingle();\r\n\t\t\t}\r\n\r\n\t\t\tvar\r\n\t\t\t\torigin = event.origin,\r\n\t\t\t\tcheckOrigin = settings[iframeId].checkOrigin;\r\n\r\n\t\t\tif (checkOrigin && (''+origin !== 'null') && !checkAllowedOrigin()) {\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t'Unexpected message received from: ' + origin +\r\n\t\t\t\t\t' for ' + messageData.iframe.id +\r\n\t\t\t\t\t'. Message was: ' + event.data +\r\n\t\t\t\t\t'. This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.'\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tfunction isMessageForUs(){\r\n\t\t\treturn msgId === (('' + msg).substr(0,msgIdLen)) && (msg.substr(msgIdLen).split(':')[0] in settings); //''+Protects against non-string msg\r\n\t\t}\r\n\r\n\t\tfunction isMessageFromMetaParent(){\r\n\t\t\t//Test if this message is from a parent above us. This is an ugly test, however, updating\r\n\t\t\t//the message format would break backwards compatibity.\r\n\t\t\tvar retCode = messageData.type in {'true':1,'false':1,'undefined':1};\r\n\r\n\t\t\tif (retCode){\r\n\t\t\t\tlog(iframeId,'Ignoring init message from meta parent page');\r\n\t\t\t}\r\n\r\n\t\t\treturn retCode;\r\n\t\t}\r\n\r\n\t\tfunction getMsgBody(offset){\r\n\t\t\treturn msg.substr(msg.indexOf(':')+msgHeaderLen+offset);\r\n\t\t}\r\n\r\n\t\tfunction forwardMsgFromIFrame(msgBody){\r\n\t\t\tlog(iframeId,'MessageCallback passed: {iframe: '+ messageData.iframe.id + ', message: ' + msgBody + '}');\r\n\t\t\tcallback('messageCallback',{\r\n\t\t\t\tiframe: messageData.iframe,\r\n\t\t\t\tmessage: JSON.parse(msgBody)\r\n\t\t\t});\r\n\t\t\tlog(iframeId,'--');\r\n\t\t}\r\n\r\n\t\tfunction getPageInfo(){\r\n\t\t\tvar\r\n\t\t\t\tbodyPosition = document.body.getBoundingClientRect(),\r\n\t\t\t\tiFramePosition = messageData.iframe.getBoundingClientRect();\r\n\r\n\t\t\treturn JSON.stringify({\r\n\t\t\t\tiframeHeight: iFramePosition.height,\r\n\t\t\t\tiframeWidth: iFramePosition.width,\r\n\t\t\t\tclientHeight: Math.max(document.documentElement.clientHeight, window.innerHeight || 0),\r\n\t\t\t\tclientWidth: Math.max(document.documentElement.clientWidth, window.innerWidth || 0),\r\n\t\t\t\toffsetTop: parseInt(iFramePosition.top - bodyPosition.top, 10),\r\n\t\t\t\toffsetLeft: parseInt(iFramePosition.left - bodyPosition.left, 10),\r\n\t\t\t\tscrollTop: window.pageYOffset,\r\n\t\t\t\tscrollLeft: window.pageXOffset\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction sendPageInfoToIframe(iframe,iframeId){\r\n\t\t\tfunction debouncedTrigger(){\r\n\t\t\t\ttrigger(\r\n\t\t\t\t\t'Send Page Info',\r\n\t\t\t\t\t'pageInfo:' + getPageInfo(),\r\n\t\t\t\t\tiframe,\r\n\t\t\t\t\tiframeId\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tdebouce(debouncedTrigger,32);\r\n\t\t}\r\n\r\n\r\n\t\tfunction startPageInfoMonitor(){\r\n\t\t\tfunction setListener(type,func){\r\n\t\t\t\tfunction sendPageInfo(){\r\n\t\t\t\t\tif (settings[id]){\r\n\t\t\t\t\t\tsendPageInfoToIframe(settings[id].iframe,id);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstop();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t['scroll','resize'].forEach(function(evt){\r\n\t\t\t\t\tlog(id, type + evt + ' listener for sendPageInfo');\r\n\t\t\t\t\tfunc(window,evt,sendPageInfo);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction stop(){\r\n\t\t\t\tsetListener('Remove ', removeEventListener);\r\n\t\t\t}\r\n\r\n\t\t\tfunction start(){\r\n\t\t\t\tsetListener('Add ', addEventListener);\r\n\t\t\t}\r\n\r\n\t\t\tvar id = iframeId; //Create locally scoped copy of iFrame ID\r\n\r\n\t\t\tstart();\r\n\r\n\t\t\tsettings[id].stopPageInfo = stop;\r\n\t\t}\r\n\r\n\t\tfunction stopPageInfoMonitor(){\r\n\t\t\tif (settings[iframeId] && settings[iframeId].stopPageInfo){\r\n\t\t\t\tsettings[iframeId].stopPageInfo();\r\n\t\t\t\tdelete settings[iframeId].stopPageInfo;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction checkIFrameExists(){\r\n\t\t\tvar retBool = true;\r\n\r\n\t\t\tif (null === messageData.iframe) {\r\n\t\t\t\twarn(iframeId,'IFrame ('+messageData.id+') not found');\r\n\t\t\t\tretBool = false;\r\n\t\t\t}\r\n\t\t\treturn retBool;\r\n\t\t}\r\n\r\n\t\tfunction getElementPosition(target){\r\n\t\t\tvar iFramePosition = target.getBoundingClientRect();\r\n\r\n\t\t\tgetPagePosition(iframeId);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tx: Math.floor( Number(iFramePosition.left) + Number(pagePosition.x) ),\r\n\t\t\t\ty: Math.floor( Number(iFramePosition.top) + Number(pagePosition.y) )\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction scrollRequestFromChild(addOffset){\r\n\t\t\t/* istanbul ignore next */ //Not testable in Karma\r\n\t\t\tfunction reposition(){\r\n\t\t\t\tpagePosition = newPosition;\r\n\t\t\t\tscrollTo();\r\n\t\t\t\tlog(iframeId,'--');\r\n\t\t\t}\r\n\r\n\t\t\tfunction calcOffset(){\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: Number(messageData.width) + offset.x,\r\n\t\t\t\t\ty: Number(messageData.height) + offset.y\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tfunction scrollParent(){\r\n\t\t\t\tif (window.parentIFrame){\r\n\t\t\t\t\twindow.parentIFrame['scrollTo'+(addOffset?'Offset':'')](newPosition.x,newPosition.y);\r\n\t\t\t\t} else {\r\n\t\t\t\t\twarn(iframeId,'Unable to scroll to requested position, window.parentIFrame not found');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar\r\n\t\t\t\toffset = addOffset ? getElementPosition(messageData.iframe) : {x:0,y:0},\r\n\t\t\t\tnewPosition = calcOffset();\r\n\r\n\t\t\tlog(iframeId,'Reposition requested from iFrame (offset x:'+offset.x+' y:'+offset.y+')');\r\n\r\n\t\t\tif(window.top !== window.self){\r\n\t\t\t\tscrollParent();\r\n\t\t\t} else {\r\n\t\t\t\treposition();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction scrollTo(){\r\n\t\t\tif (false !== callback('scrollCallback',pagePosition)){\r\n\t\t\t\tsetPagePosition(iframeId);\r\n\t\t\t} else {\r\n\t\t\t\tunsetPagePosition();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction findTarget(location){\r\n\t\t\tfunction jumpToTarget(){\r\n\t\t\t\tvar jumpPosition = getElementPosition(target);\r\n\r\n\t\t\t\tlog(iframeId,'Moving to in page link (#'+hash+') at x: '+jumpPosition.x+' y: '+jumpPosition.y);\r\n\t\t\t\tpagePosition = {\r\n\t\t\t\t\tx: jumpPosition.x,\r\n\t\t\t\t\ty: jumpPosition.y\r\n\t\t\t\t};\r\n\r\n\t\t\t\tscrollTo();\r\n\t\t\t\tlog(iframeId,'--');\r\n\t\t\t}\r\n\r\n\t\t\tfunction jumpToParent(){\r\n\t\t\t\tif (window.parentIFrame){\r\n\t\t\t\t\twindow.parentIFrame.moveToAnchor(hash);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog(iframeId,'In page link #'+hash+' not found and window.parentIFrame not found');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar\r\n\t\t\t\thash = location.split('#')[1] || '',\r\n\t\t\t\thashData = decodeURIComponent(hash),\r\n\t\t\t\ttarget = document.getElementById(hashData) || document.getElementsByName(hashData)[0];\r\n\r\n\t\t\tif (target){\r\n\t\t\t\tjumpToTarget();\r\n\t\t\t} else if(window.top!==window.self){\r\n\t\t\t\tjumpToParent();\r\n\t\t\t} else {\r\n\t\t\t\tlog(iframeId,'In page link #'+hash+' not found');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction callback(funcName,val){\r\n\t\t\treturn chkCallback(iframeId,funcName,val);\r\n\t\t}\r\n\r\n\t\tfunction actionMsg(){\r\n\r\n\t\t\tif(settings[iframeId].firstRun) firstRun();\r\n\r\n\t\t\tswitch(messageData.type){\r\n\t\t\tcase 'close':\r\n\t\t\t\tcloseIFrame(messageData.iframe);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'message':\r\n\t\t\t\tforwardMsgFromIFrame(getMsgBody(6));\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'scrollTo':\r\n\t\t\t\tscrollRequestFromChild(false);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'scrollToOffset':\r\n\t\t\t\tscrollRequestFromChild(true);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'pageInfo':\r\n\t\t\t\tsendPageInfoToIframe(settings[iframeId].iframe,iframeId);\r\n\t\t\t\tstartPageInfoMonitor();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'pageInfoStop':\r\n\t\t\t\tstopPageInfoMonitor();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'inPageLink':\r\n\t\t\t\tfindTarget(getMsgBody(9));\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'reset':\r\n\t\t\t\tresetIFrame(messageData);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'init':\r\n\t\t\t\tresizeIFrame();\r\n\t\t\t\tcallback('initCallback',messageData.iframe);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tresizeIFrame();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction hasSettings(iframeId){\r\n\t\t\tvar retBool = true;\r\n\r\n\t\t\tif (!settings[iframeId]){\r\n\t\t\t\tretBool = false;\r\n\t\t\t\twarn(messageData.type + ' No settings for ' + iframeId + '. Message was: ' + msg);\r\n\t\t\t}\r\n\r\n\t\t\treturn retBool;\r\n\t\t}\r\n\r\n\t\tfunction iFrameReadyMsgReceived(){\r\n\t\t\tfor (var iframeId in settings){\r\n\t\t\t\ttrigger('iFrame requested init',createOutgoingMsg(iframeId),document.getElementById(iframeId),iframeId);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction firstRun() {\r\n\t\t\tsettings[iframeId].firstRun = false;\r\n\t\t}\r\n\r\n\t\tfunction clearWarningTimeout() {\r\n\t\t\tclearTimeout(settings[iframeId].msgTimeout);\r\n\t\t\tsettings[iframeId].warningTimeout = 0;\r\n\t\t}\r\n\r\n\t\tvar\r\n\t\t\tmsg = event.data,\r\n\t\t\tmessageData = {},\r\n\t\t\tiframeId = null;\r\n\r\n\t\tif('[iFrameResizerChild]Ready' === msg){\r\n\t\t\tiFrameReadyMsgReceived();\r\n\t\t} else if (isMessageForUs()){\r\n\t\t\tmessageData = processMsg();\r\n\t\t\tiframeId = logId = messageData.id;\r\n\t\t\tsettings[iframeId].loaded = true;\r\n\r\n\t\t\tif (!isMessageFromMetaParent() && hasSettings(iframeId)){\r\n\t\t\t\tlog(iframeId,'Received: '+msg);\r\n\r\n\t\t\t\tif ( checkIFrameExists() && isMessageFromIFrame() ){\r\n\t\t\t\t\tactionMsg();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tinfo(iframeId,'Ignored: '+msg);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\tfunction chkCallback(iframeId,funcName,val){\r\n\t\tvar\r\n\t\t\tfunc = null,\r\n\t\t\tretVal = null;\r\n\r\n\t\tif(settings[iframeId]){\r\n\t\t\tfunc = settings[iframeId][funcName];\r\n\r\n\t\t\tif( 'function' === typeof func){\r\n\t\t\t\tretVal = func(val);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new TypeError(funcName+' on iFrame['+iframeId+'] is not a function');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn retVal;\r\n\t}\r\n\r\n\tfunction closeIFrame(iframe){\r\n\t\tvar iframeId = iframe.id;\r\n\r\n\t\tlog(iframeId,'Removing iFrame: '+iframeId);\r\n\t\tif (iframe.parentNode) { iframe.parentNode.removeChild(iframe); }\r\n\t\tchkCallback(iframeId,'closedCallback',iframeId);\r\n\t\tlog(iframeId,'--');\r\n\t\tdelete settings[iframeId];\r\n\t}\r\n\r\n\tfunction getPagePosition(iframeId){\r\n\t\tif(null === pagePosition){\r\n\t\t\tpagePosition = {\r\n\t\t\t\tx: (window.pageXOffset !== undefined) ? window.pageXOffset : document.documentElement.scrollLeft,\r\n\t\t\t\ty: (window.pageYOffset !== undefined) ? window.pageYOffset : document.documentElement.scrollTop\r\n\t\t\t};\r\n\t\t\tlog(iframeId,'Get page position: '+pagePosition.x+','+pagePosition.y);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setPagePosition(iframeId){\r\n\t\tif(null !== pagePosition){\r\n\t\t\twindow.scrollTo(pagePosition.x,pagePosition.y);\r\n\t\t\tlog(iframeId,'Set page position: '+pagePosition.x+','+pagePosition.y);\r\n\t\t\tunsetPagePosition();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction unsetPagePosition(){\r\n\t\tpagePosition = null;\r\n\t}\r\n\r\n\tfunction resetIFrame(messageData){\r\n\t\tfunction reset(){\r\n\t\t\tsetSize(messageData);\r\n\t\t\ttrigger('reset','reset',messageData.iframe,messageData.id);\r\n\t\t}\r\n\r\n\t\tlog(messageData.id,'Size reset requested by '+('init'===messageData.type?'host page':'iFrame'));\r\n\t\tgetPagePosition(messageData.id);\r\n\t\tsyncResize(reset,messageData,'reset');\r\n\t}\r\n\r\n\tfunction setSize(messageData){\r\n\t\tfunction setDimension(dimension){\r\n\t\t\tmessageData.iframe.style[dimension] = messageData[dimension] + 'px';\r\n\t\t\tlog(\r\n\t\t\t\tmessageData.id,\r\n\t\t\t\t'IFrame (' + iframeId +\r\n\t\t\t\t') ' + dimension +\r\n\t\t\t\t' set to ' + messageData[dimension] + 'px'\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tfunction chkZero(dimension){\r\n\t\t\t//FireFox sets dimension of hidden iFrames to zero.\r\n\t\t\t//So if we detect that set up an event to check for\r\n\t\t\t//when iFrame becomes visible.\r\n\r\n\t\t\t/* istanbul ignore next */ //Not testable in PhantomJS\r\n\t\t\tif (!hiddenCheckEnabled && '0' === messageData[dimension]){\r\n\t\t\t\thiddenCheckEnabled = true;\r\n\t\t\t\tlog(iframeId,'Hidden iFrame detected, creating visibility listener');\r\n\t\t\t\tfixHiddenIFrames();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction processDimension(dimension){\r\n\t\t\tsetDimension(dimension);\r\n\t\t\tchkZero(dimension);\r\n\t\t}\r\n\r\n\t\tvar iframeId = messageData.iframe.id;\r\n\r\n\t\tif(settings[iframeId]){\r\n\t\t\tif( settings[iframeId].sizeHeight) { processDimension('height'); }\r\n\t\t\tif( settings[iframeId].sizeWidth ) { processDimension('width'); }\r\n\t\t}\r\n\t}\r\n\r\n\tfunction syncResize(func,messageData,doNotSync){\r\n\t\t/* istanbul ignore if */ //Not testable in PhantomJS\r\n\t\tif(doNotSync!==messageData.type && requestAnimationFrame){\r\n\t\t\tlog(messageData.id,'Requesting animation frame');\r\n\t\t\trequestAnimationFrame(func);\r\n\t\t} else {\r\n\t\t\tfunc();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction trigger(calleeMsg, msg, iframe, id, noResponseWarning) {\r\n\t\tfunction postMessageToIFrame(){\r\n\t\t\tvar target = settings[id].targetOrigin;\r\n\t\t\tlog(id,'[' + calleeMsg + '] Sending msg to iframe['+id+'] ('+msg+') targetOrigin: '+target);\r\n\t\t\tiframe.contentWindow.postMessage( msgId + msg, target );\r\n\t\t}\r\n\r\n\t\tfunction iFrameNotFound(){\r\n\t\t\twarn(id,'[' + calleeMsg + '] IFrame('+id+') not found');\r\n\t\t}\r\n\r\n\t\tfunction chkAndSend(){\r\n\t\t\tif(iframe && 'contentWindow' in iframe && (null !== iframe.contentWindow)){ //Null test for PhantomJS\r\n\t\t\t\tpostMessageToIFrame();\r\n\t\t\t} else {\r\n\t\t\t\tiFrameNotFound();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction warnOnNoResponse() {\r\n\t\t\tfunction warning() {\r\n\t\t\t\tif (settings[id] && !settings[id].loaded && !errorShown) {\r\n\t\t\t\t\terrorShown = true;\r\n\t\t\t\t\twarn(id, 'IFrame has not responded within '+ settings[id].warningTimeout/1000 +' seconds. Check iFrameResizer.contentWindow.js has been loaded in iFrame. This message can be ingored if everything is working, or you can set the warningTimeout option to a higher value or zero to suppress this warning.');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!!noResponseWarning && !!settings[id].warningTimeout) {\r\n\t\t\t\tsettings[id].msgTimeout = setTimeout(warning, settings[id].warningTimeout);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar errorShown = false;\r\n\r\n\t\tid = id || iframe.id;\r\n\r\n\t\tif(settings[id]) {\r\n\t\t\tchkAndSend();\r\n\t\t\twarnOnNoResponse();\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction createOutgoingMsg(iframeId){\r\n\t\treturn iframeId +\r\n\t\t\t':' + settings[iframeId].bodyMarginV1 +\r\n\t\t\t':' + settings[iframeId].sizeWidth +\r\n\t\t\t':' + settings[iframeId].log +\r\n\t\t\t':' + settings[iframeId].interval +\r\n\t\t\t':' + settings[iframeId].enablePublicMethods +\r\n\t\t\t':' + settings[iframeId].autoResize +\r\n\t\t\t':' + settings[iframeId].bodyMargin +\r\n\t\t\t':' + settings[iframeId].heightCalculationMethod +\r\n\t\t\t':' + settings[iframeId].bodyBackground +\r\n\t\t\t':' + settings[iframeId].bodyPadding +\r\n\t\t\t':' + settings[iframeId].tolerance +\r\n\t\t\t':' + settings[iframeId].inPageLinks +\r\n\t\t\t':' + settings[iframeId].resizeFrom +\r\n\t\t\t':' + settings[iframeId].widthCalculationMethod;\r\n\t}\r\n\r\n\tfunction setupIFrame(iframe,options){\r\n\t\tfunction setLimits(){\r\n\t\t\tfunction addStyle(style){\r\n\t\t\t\tif ((Infinity !== settings[iframeId][style]) && (0 !== settings[iframeId][style])){\r\n\t\t\t\t\tiframe.style[style] = settings[iframeId][style] + 'px';\r\n\t\t\t\t\tlog(iframeId,'Set '+style+' = '+settings[iframeId][style]+'px');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfunction chkMinMax(dimension){\r\n\t\t\t\tif (settings[iframeId]['min'+dimension]>settings[iframeId]['max'+dimension]){\r\n\t\t\t\t\tthrow new Error('Value for min'+dimension+' can not be greater than max'+dimension);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tchkMinMax('Height');\r\n\t\t\tchkMinMax('Width');\r\n\r\n\t\t\taddStyle('maxHeight');\r\n\t\t\taddStyle('minHeight');\r\n\t\t\taddStyle('maxWidth');\r\n\t\t\taddStyle('minWidth');\r\n\t\t}\r\n\r\n\t\tfunction newId(){\r\n\t\t\tvar id = ((options && options.id) || defaults.id + count++);\r\n\t\t\tif (null !== document.getElementById(id)){\r\n\t\t\t\tid = id + count++;\r\n\t\t\t}\r\n\t\t\treturn id;\r\n\t\t}\r\n\r\n\t\tfunction ensureHasId(iframeId){\r\n\t\t\tlogId=iframeId;\r\n\t\t\tif (''===iframeId){\r\n\t\t\t\tiframe.id = iframeId = newId();\r\n\t\t\t\tlogEnabled = (options || {}).log;\r\n\t\t\t\tlogId=iframeId;\r\n\t\t\t\tlog(iframeId,'Added missing iframe ID: '+ iframeId +' (' + iframe.src + ')');\r\n\t\t\t}\r\n\r\n\r\n\t\t\treturn iframeId;\r\n\t\t}\r\n\r\n\t\tfunction setScrolling(){\r\n\t\t\tlog(iframeId,'IFrame scrolling ' + (settings[iframeId].scrolling ? 'enabled' : 'disabled') + ' for ' + iframeId);\r\n\t\t\tiframe.style.overflow = false === settings[iframeId].scrolling ? 'hidden' : 'auto';\r\n\t\t\tswitch(settings[iframeId].scrolling) {\r\n\t\t\t\tcase true:\r\n\t\t\t\t\tiframe.scrolling = 'yes';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase false:\r\n\t\t\t\t\tiframe.scrolling = 'no';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tiframe.scrolling = settings[iframeId].scrolling;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//The V1 iFrame script expects an int, where as in V2 expects a CSS\r\n\t\t//string value such as '1px 3em', so if we have an int for V2, set V1=V2\r\n\t\t//and then convert V2 to a string PX value.\r\n\t\tfunction setupBodyMarginValues(){\r\n\t\t\tif (('number'===typeof(settings[iframeId].bodyMargin)) || ('0'===settings[iframeId].bodyMargin)){\r\n\t\t\t\tsettings[iframeId].bodyMarginV1 = settings[iframeId].bodyMargin;\r\n\t\t\t\tsettings[iframeId].bodyMargin = '' + settings[iframeId].bodyMargin + 'px';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction checkReset(){\r\n\t\t\t// Reduce scope of firstRun to function, because IE8's JS execution\r\n\t\t\t// context stack is borked and this value gets externally\r\n\t\t\t// changed midway through running this function!!!\r\n\t\t\tvar\r\n\t\t\t\tfirstRun = settings[iframeId].firstRun,\r\n\t\t\t\tresetRequertMethod = settings[iframeId].heightCalculationMethod in resetRequiredMethods;\r\n\r\n\t\t\tif (!firstRun && resetRequertMethod){\r\n\t\t\t\tresetIFrame({iframe:iframe, height:0, width:0, type:'init'});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction setupIFrameObject(){\r\n\t\t\tif(Function.prototype.bind){ //Ignore unpolyfilled IE8.\r\n\t\t\t\tsettings[iframeId].iframe.iFrameResizer = {\r\n\r\n\t\t\t\t\tclose : closeIFrame.bind(null,settings[iframeId].iframe),\r\n\r\n\t\t\t\t\tresize : trigger.bind(null,'Window resize', 'resize', settings[iframeId].iframe),\r\n\r\n\t\t\t\t\tmoveToAnchor : function(anchor){\r\n\t\t\t\t\t\ttrigger('Move to anchor','moveToAnchor:'+anchor, settings[iframeId].iframe,iframeId);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tsendMessage : function(message){\r\n\t\t\t\t\t\tmessage = JSON.stringify(message);\r\n\t\t\t\t\t\ttrigger('Send Message','message:'+message, settings[iframeId].iframe, iframeId);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//We have to call trigger twice, as we can not be sure if all\r\n\t\t//iframes have completed loading when this code runs. The\r\n\t\t//event listener also catches the page changing in the iFrame.\r\n\t\tfunction init(msg){\r\n\t\t\tfunction iFrameLoaded(){\r\n\t\t\t\ttrigger('iFrame.onload', msg, iframe, undefined , true);\r\n\t\t\t\tcheckReset();\r\n\t\t\t}\r\n\r\n\t\t\taddEventListener(iframe,'load',iFrameLoaded);\r\n\t\t\ttrigger('init', msg, iframe, undefined, true);\r\n\t\t}\r\n\r\n\t\tfunction checkOptions(options){\r\n\t\t\tif ('object' !== typeof options){\r\n\t\t\t\tthrow new TypeError('Options is not an object');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction copyOptions(options){\r\n\t\t\tfor (var option in defaults) {\r\n\t\t\t\tif (defaults.hasOwnProperty(option)){\r\n\t\t\t\t\tsettings[iframeId][option] = options.hasOwnProperty(option) ? options[option] : defaults[option];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction getTargetOrigin (remoteHost){\r\n\t\t\treturn ('' === remoteHost || 'file://' === remoteHost) ? '*' : remoteHost;\r\n\t\t}\r\n\r\n\t\tfunction processOptions(options){\r\n\t\t\toptions = options || {};\r\n\t\t\tsettings[iframeId] = {\r\n\t\t\t\tfirstRun\t: true,\r\n\t\t\t\tiframe\t\t: iframe,\r\n\t\t\t\tremoteHost\t: iframe.src.split('/').slice(0,3).join('/')\r\n\t\t\t};\r\n\r\n\t\t\tcheckOptions(options);\r\n\t\t\tcopyOptions(options);\r\n\r\n\t\t\tsettings[iframeId].targetOrigin = true === settings[iframeId].checkOrigin ? getTargetOrigin(settings[iframeId].remoteHost) : '*';\r\n\t\t}\r\n\r\n\t\tfunction beenHere(){\r\n\t\t\treturn (iframeId in settings && 'iFrameResizer' in iframe);\r\n\t\t}\r\n\r\n\t\tvar iframeId = ensureHasId(iframe.id);\r\n\r\n\t\tif (!beenHere()){\r\n\t\t\tprocessOptions(options);\r\n\t\t\tsetScrolling();\r\n\t\t\tsetLimits();\r\n\t\t\tsetupBodyMarginValues();\r\n\t\t\tinit(createOutgoingMsg(iframeId));\r\n\t\t\tsetupIFrameObject();\r\n\t\t} else {\r\n\t\t\twarn(iframeId,'Ignored iFrame, already setup.');\r\n\t\t}\r\n\t}\r\n\r\n\tfunction debouce(fn,time){\r\n\t\tif (null === timer){\r\n\t\t\ttimer = setTimeout(function(){\r\n\t\t\t\ttimer = null;\r\n\t\t\t\tfn();\r\n\t\t\t}, time);\r\n\t\t}\r\n\t}\r\n\r\n\t/* istanbul ignore next */ //Not testable in PhantomJS\r\n\tfunction fixHiddenIFrames(){\r\n\t\tfunction checkIFrames(){\r\n\t\t\tfunction checkIFrame(settingId){\r\n\t\t\t\tfunction chkDimension(dimension){\r\n\t\t\t\t\treturn '0px' === settings[settingId].iframe.style[dimension];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction isVisible(el) {\r\n\t\t\t\t\treturn (null !== el.offsetParent);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isVisible(settings[settingId].iframe) && (chkDimension('height') || chkDimension('width'))){\r\n\t\t\t\t\ttrigger('Visibility change', 'resize', settings[settingId].iframe, settingId);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor (var settingId in settings){\r\n\t\t\t\tcheckIFrame(settingId);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction mutationObserved(mutations){\r\n\t\t\tlog('window','Mutation observed: ' + mutations[0].target + ' ' + mutations[0].type);\r\n\t\t\tdebouce(checkIFrames,16);\r\n\t\t}\r\n\r\n\t\tfunction createMutationObserver(){\r\n\t\t\tvar\r\n\t\t\t\ttarget = document.querySelector('body'),\r\n\r\n\t\t\t\tconfig = {\r\n\t\t\t\t\tattributes : true,\r\n\t\t\t\t\tattributeOldValue : false,\r\n\t\t\t\t\tcharacterData : true,\r\n\t\t\t\t\tcharacterDataOldValue : false,\r\n\t\t\t\t\tchildList : true,\r\n\t\t\t\t\tsubtree : true\r\n\t\t\t\t},\r\n\r\n\t\t\t\tobserver = new MutationObserver(mutationObserved);\r\n\r\n\t\t\tobserver.observe(target, config);\r\n\t\t}\r\n\r\n\t\tvar MutationObserver = window.MutationObserver || window.WebKitMutationObserver;\r\n\r\n\t\tif (MutationObserver) createMutationObserver();\r\n\t}\r\n\r\n\r\n\tfunction resizeIFrames(event){\r\n\t\tfunction resize(){\r\n\t\t\tsendTriggerMsg('Window '+event,'resize');\r\n\t\t}\r\n\r\n\t\tlog('window','Trigger event: '+event);\r\n\t\tdebouce(resize,16);\r\n\t}\r\n\r\n\t/* istanbul ignore next */ //Not testable in PhantomJS\r\n\tfunction tabVisible() {\r\n\t\tfunction resize(){\r\n\t\t\tsendTriggerMsg('Tab Visable','resize');\r\n\t\t}\r\n\r\n\t\tif('hidden' !== document.visibilityState) {\r\n\t\t\tlog('document','Trigger event: Visiblity change');\r\n\t\t\tdebouce(resize,16);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction sendTriggerMsg(eventName,event){\r\n\t\tfunction isIFrameResizeEnabled(iframeId) {\r\n\t\t\treturn\t'parent' === settings[iframeId].resizeFrom &&\r\n\t\t\t\t\tsettings[iframeId].autoResize &&\r\n\t\t\t\t\t!settings[iframeId].firstRun;\r\n\t\t}\r\n\r\n\t\tfor (var iframeId in settings){\r\n\t\t\tif(isIFrameResizeEnabled(iframeId)){\r\n\t\t\t\ttrigger(eventName, event, document.getElementById(iframeId), iframeId);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setupEventListeners(){\r\n\t\taddEventListener(window,'message',iFrameListener);\r\n\r\n\t\taddEventListener(window,'resize', function(){resizeIFrames('resize');});\r\n\r\n\t\taddEventListener(document,'visibilitychange',tabVisible);\r\n\t\taddEventListener(document,'-webkit-visibilitychange',tabVisible); //Andriod 4.4\r\n\t\taddEventListener(window,'focusin',function(){resizeIFrames('focus');}); //IE8-9\r\n\t\taddEventListener(window,'focus',function(){resizeIFrames('focus');});\r\n\t}\r\n\r\n\r\n\tfunction factory(){\r\n\t\tfunction init(options,element){\r\n\t\t\tfunction chkType(){\r\n\t\t\t\tif(!element.tagName) {\r\n\t\t\t\t\tthrow new TypeError('Object is not a valid DOM element');\r\n\t\t\t\t} else if ('IFRAME' !== element.tagName.toUpperCase()) {\r\n\t\t\t\t\tthrow new TypeError('Expected