// lighthouse, browserified. 5.7.0 (005c2e6f48e7cc4bfefaa4b0551122edbe04a993)
require=function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a;}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r);},p,p.exports,r,e,n,t);}return n[i].exports;}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o;}return r;}()({"../audits/accessibility/accesskeys":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[accesskey]` values are unique',

failureTitle:'`[accesskey]` values are not unique',

description:'Access keys let users quickly focus a part of the page. For proper '+
'navigation, each access key must be unique. '+
'[Learn more](https://web.dev/accesskeys/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Accesskeys extends AxeAudit{



static get meta(){
return{
id:'accesskeys',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=Accesskeys;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/accesskeys.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-allowed-attr":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[aria-*]` attributes match their roles',

failureTitle:'`[aria-*]` attributes do not match their roles',

description:'Each ARIA `role` supports a specific subset of `aria-*` attributes. '+
'Mismatching these invalidates the `aria-*` attributes. [Learn '+
'more](https://web.dev/aria-allowed-attr/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ARIAAllowedAttr extends AxeAudit{



static get meta(){
return{
id:'aria-allowed-attr',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ARIAAllowedAttr;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/aria-allowed-attr.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-attr":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[role]`s have all required `[aria-*]` attributes',

failureTitle:'`[role]`s do not have all required `[aria-*]` attributes',

description:'Some ARIA roles have required attributes that describe the state '+
'of the element to screen readers. [Learn more](https://web.dev/aria-required-attr/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ARIARequiredAttr extends AxeAudit{



static get meta(){
return{
id:'aria-required-attr',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ARIARequiredAttr;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/aria-required-attr.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-children":[function(require,module,exports){
(function(__filename){





'use strict';







const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Elements with an ARIA `[role]` that require children to contain a specific '+
'`[role]` have all required children.',

failureTitle:'Elements with an ARIA `[role]` that require children to contain a specific '+
'`[role]` are missing some or all of those required children.',

description:'Some ARIA parent roles must contain specific child roles to perform '+
'their intended accessibility functions. '+
'[Learn more](https://web.dev/aria-required-children/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class AriaRequiredChildren extends AxeAudit{



static get meta(){
return{
id:'aria-required-children',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=AriaRequiredChildren;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/aria-required-children.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-parent":[function(require,module,exports){
(function(__filename){





'use strict';







const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[role]`s are contained by their required parent element',

failureTitle:'`[role]`s are not contained by their required parent element',

description:'Some ARIA child roles must be contained by specific parent roles to '+
'properly perform their intended accessibility functions. '+
'[Learn more](https://web.dev/aria-required-parent/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class AriaRequiredParent extends AxeAudit{



static get meta(){
return{
id:'aria-required-parent',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=AriaRequiredParent;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/aria-required-parent.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-roles":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[role]` values are valid',

failureTitle:'`[role]` values are not valid',

description:'ARIA roles must have valid values in order to perform their '+
'intended accessibility functions. '+
'[Learn more](https://web.dev/aria-roles/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class AriaRoles extends AxeAudit{



static get meta(){
return{
id:'aria-roles',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=AriaRoles;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/aria-roles.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr-value":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[aria-*]` attributes have valid values',

failureTitle:'`[aria-*]` attributes do not have valid values',

description:'Assistive technologies, like screen readers, can\'t interpret ARIA '+
'attributes with invalid values. [Learn '+
'more](https://web.dev/aria-valid-attr-value/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ARIAValidAttr extends AxeAudit{



static get meta(){
return{
id:'aria-valid-attr-value',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ARIAValidAttr;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr-value.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[aria-*]` attributes are valid and not misspelled',

failureTitle:'`[aria-*]` attributes are not valid or misspelled',

description:'Assistive technologies, like screen readers, can\'t interpret ARIA '+
'attributes with invalid names. [Learn '+
'more](https://web.dev/aria-valid-attr/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ARIAValidAttr extends AxeAudit{



static get meta(){
return{
id:'aria-valid-attr',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ARIAValidAttr;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/audio-caption":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<audio>` elements contain a `<track>` element with `[kind="captions"]`',

failureTitle:'`<audio>` elements are missing a `<track>` element with '+
'`[kind="captions"]`.',

description:'Captions make audio elements usable for deaf or hearing-impaired users, '+
'providing critical information such as who is talking, what they\'re saying, '+
'and other non-speech information. '+
'[Learn more](https://web.dev/audio-caption/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class AudioCaption extends AxeAudit{



static get meta(){
return{
id:'audio-caption',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=AudioCaption;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/audio-caption.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/button-name":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Buttons have an accessible name',

failureTitle:'Buttons do not have an accessible name',

description:'When a button doesn\'t have an accessible name, screen readers announce it '+
'as "button", making it unusable for users who rely on screen readers. '+
'[Learn more](https://web.dev/button-name/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ButtonName extends AxeAudit{



static get meta(){
return{
id:'button-name',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ButtonName;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/button-name.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/bypass":[function(require,module,exports){
(function(__filename){





'use strict';







const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'The page contains a heading, skip link, or landmark region',

failureTitle:'The page does not contain a heading, skip link, or landmark region',

description:'Adding ways to bypass repetitive content lets keyboard users navigate the '+
'page more efficiently. '+
'[Learn more](https://web.dev/bypass/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Bypass extends AxeAudit{



static get meta(){
return{
id:'bypass',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=Bypass;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/bypass.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/color-contrast":[function(require,module,exports){
(function(__filename){





'use strict';







const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Background and foreground colors have a sufficient contrast ratio',

failureTitle:'Background and foreground colors do not have a '+
'sufficient contrast ratio.',

description:'Low-contrast text is difficult or impossible for many users to read. '+
'[Learn more](https://web.dev/color-contrast/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ColorContrast extends AxeAudit{



static get meta(){
return{
id:'color-contrast',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ColorContrast;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/color-contrast.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/definition-list":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<dl>`\'s contain only properly-ordered `<dt>` and `<dd>` groups, `<script>` '+
'or `<template>` elements.',

failureTitle:'`<dl>`\'s do not contain only properly-ordered `<dt>` and `<dd>` '+
'groups, `<script>` or `<template>` elements.',

description:'When definition lists are not properly marked up, screen readers may produce '+
'confusing or inaccurate output. '+
'[Learn more](https://web.dev/definition-list/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class DefinitionList extends AxeAudit{



static get meta(){
return{
id:'definition-list',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=DefinitionList;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/definition-list.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/dlitem":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Definition list items are wrapped in `<dl>` elements',

failureTitle:'Definition list items are not wrapped in `<dl>` elements',

description:'Definition list items (`<dt>` and `<dd>`) must be wrapped in a '+
'parent `<dl>` element to ensure that screen readers can properly announce them. '+
'[Learn more](https://web.dev/dlitem/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class DLItem extends AxeAudit{



static get meta(){
return{
id:'dlitem',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=DLItem;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/dlitem.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/document-title":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Document has a `<title>` element',

failureTitle:'Document doesn\'t have a `<title>` element',

description:'The title gives screen reader users an overview of the page, and search '+
'engine users rely on it heavily to determine if a page is relevant to their search. '+
'[Learn more](https://web.dev/document-title/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class DocumentTitle extends AxeAudit{



static get meta(){
return{
id:'document-title',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=DocumentTitle;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/document-title.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/duplicate-id":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[id]` attributes on the page are unique',

failureTitle:'`[id]` attributes on the page are not unique',

description:'The value of an id attribute must be unique to prevent '+
'other instances from being overlooked by assistive technologies. '+
'[Learn more](https://web.dev/duplicate-id/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class DuplicateId extends AxeAudit{



static get meta(){
return{
id:'duplicate-id',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=DuplicateId;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/duplicate-id.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/frame-title":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<frame>` or `<iframe>` elements have a title',

failureTitle:'`<frame>` or `<iframe>` elements do not have a title',

description:'Screen reader users rely on frame titles to describe the contents of frames. '+
'[Learn more](https://web.dev/frame-title/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class FrameTitle extends AxeAudit{



static get meta(){
return{
id:'frame-title',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=FrameTitle;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/frame-title.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-has-lang":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<html>` element has a `[lang]` attribute',

failureTitle:'`<html>` element does not have a `[lang]` attribute',

description:'If a page doesn\'t specify a lang attribute, a screen reader assumes '+
'that the page is in the default language that the user chose when setting up the '+
'screen reader. If the page isn\'t actually in the default language, then the screen '+
'reader might not announce the page\'s text correctly. '+
'[Learn more](https://web.dev/html-has-lang/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class HTMLHasLang extends AxeAudit{



static get meta(){
return{
id:'html-has-lang',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=HTMLHasLang;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/html-has-lang.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-lang-valid":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<html>` element has a valid value for its `[lang]` attribute',

failureTitle:'`<html>` element does not have a valid value for '+
'its `[lang]` attribute.',

description:'Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) '+
'helps screen readers announce text properly. '+
'[Learn more](https://web.dev/html-lang-valid/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class HTMLLangValid extends AxeAudit{



static get meta(){
return{
id:'html-lang-valid',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=HTMLLangValid;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/html-lang-valid.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/image-alt":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Image elements have `[alt]` attributes',

failureTitle:'Image elements do not have `[alt]` attributes',

description:'Informative elements should aim for short, descriptive alternate text. '+
'Decorative elements can be ignored with an empty alt attribute. '+
'[Learn more](https://web.dev/image-alt/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ImageAlt extends AxeAudit{



static get meta(){
return{
id:'image-alt',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ImageAlt;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/image-alt.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/input-image-alt":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<input type="image">` elements have `[alt]` text',

failureTitle:'`<input type="image">` elements do not have `[alt]` text',

description:'When an image is being used as an `<input>` button, providing alternative '+
'text can help screen reader users understand the purpose of the button. '+
'[Learn more](https://web.dev/input-image-alt/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class InputImageAlt extends AxeAudit{



static get meta(){
return{
id:'input-image-alt',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=InputImageAlt;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/input-image-alt.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/label":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Form elements have associated labels',

failureTitle:'Form elements do not have associated labels',

description:'Labels ensure that form controls are announced properly by assistive '+
'technologies, like screen readers. [Learn '+
'more](https://web.dev/label/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Label extends AxeAudit{



static get meta(){
return{
id:'label',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=Label;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/label.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/layout-table":[function(require,module,exports){
(function(__filename){





'use strict';







const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Presentational `<table>` elements avoid using `<th>`, `<caption>` or the '+
'`[summary]` attribute.',

failureTitle:'Presentational `<table>` elements do not avoid using `<th>`, '+
'`<caption>` or the `[summary]` attribute.',

description:'A table being used for layout purposes should not include data elements, '+
'such as the th or caption elements or the summary attribute, because this can '+
'create a confusing experience for screen reader users. '+
'[Learn more](https://web.dev/layout-table/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class LayoutTable extends AxeAudit{



static get meta(){
return{
id:'layout-table',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=LayoutTable;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/layout-table.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/link-name":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Links have a discernible name',

failureTitle:'Links do not have a discernible name',

description:'Link text (and alternate text for images, when used as links) that is '+
'discernible, unique, and focusable improves the navigation experience for '+
'screen reader users. '+
'[Learn more](https://web.dev/link-name/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class LinkName extends AxeAudit{



static get meta(){
return{
id:'link-name',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=LinkName;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/link-name.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/listitem":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'List items (`<li>`) are contained within `<ul>` or `<ol>` parent elements',

failureTitle:'List items (`<li>`) are not contained within `<ul>` '+
'or `<ol>` parent elements.',

description:'Screen readers require list items (`<li>`) to be contained within a '+
'parent `<ul>` or `<ol>` to be announced properly. '+
'[Learn more](https://web.dev/listitem/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ListItem extends AxeAudit{



static get meta(){
return{
id:'listitem',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ListItem;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/listitem.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/list":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Lists contain only `<li>` elements and script supporting elements '+
'(`<script>` and `<template>`).',

failureTitle:'Lists do not contain only `<li>` elements and script '+
'supporting elements (`<script>` and `<template>`).',

description:'Screen readers have a specific way of announcing lists. Ensuring proper list '+
'structure aids screen reader output. '+
'[Learn more](https://web.dev/list/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class List extends AxeAudit{



static get meta(){
return{
id:'list',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=List;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/list.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/manual/custom-controls-labels":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class CustomControlsLabels extends ManualAudit{



static get meta(){
return Object.assign({
id:'custom-controls-labels',
description:'Custom interactive controls have associated labels, provided by aria-label or aria-labelledby. [Learn more](https://web.dev/custom-controls-labels/).',
title:'Custom controls have associated labels'},
super.partialMeta);
}}


module.exports=CustomControlsLabels;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/custom-controls-roles":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class CustomControlsRoles extends ManualAudit{



static get meta(){
return Object.assign({
id:'custom-controls-roles',
description:'Custom interactive controls have appropriate ARIA roles. [Learn more](https://web.dev/custom-control-roles/).',
title:'Custom controls have ARIA roles'},
super.partialMeta);
}}


module.exports=CustomControlsRoles;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focus-traps":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class FocusTraps extends ManualAudit{



static get meta(){
return Object.assign({
id:'focus-traps',
description:'A user can tab into and out of any control or region without accidentally trapping their focus. [Learn more](https://web.dev/focus-traps/).',
title:'User focus is not accidentally trapped in a region'},
super.partialMeta);
}}


module.exports=FocusTraps;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focusable-controls":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class FocusableControls extends ManualAudit{



static get meta(){
return Object.assign({
id:'focusable-controls',
description:'Custom interactive controls are keyboard focusable and display a focus indicator. [Learn more](https://web.dev/focusable-controls/).',
title:'Interactive controls are keyboard focusable'},
super.partialMeta);
}}


module.exports=FocusableControls;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/heading-levels":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class HeadingLevels extends ManualAudit{



static get meta(){
return Object.assign({
id:'heading-levels',
description:'Headings are used to create an outline for the page and heading levels are not skipped. [Learn more](https://web.dev/heading-levels/).',
title:'Headings don\'t skip levels'},
super.partialMeta);
}}


module.exports=HeadingLevels;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/interactive-element-affordance":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class InteractiveElementAffordance extends ManualAudit{



static get meta(){
return Object.assign({
id:'interactive-element-affordance',
description:'Interactive elements, such as links and buttons, should indicate their state and be distinguishable from non-interactive elements. [Learn more](https://web.dev/interactive-element-affordance/).',
title:'Interactive elements indicate their purpose and state'},
super.partialMeta);
}}


module.exports=InteractiveElementAffordance;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/logical-tab-order":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class LogicalTabOrder extends ManualAudit{



static get meta(){
return Object.assign({
id:'logical-tab-order',
description:'Tabbing through the page follows the visual layout. Users cannot focus elements that are offscreen. [Learn more](https://web.dev/logical-tab-order/).',
title:'The page has a logical tab order'},
super.partialMeta);
}}


module.exports=LogicalTabOrder;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/managed-focus":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class ManagedFocus extends ManualAudit{



static get meta(){
return Object.assign({
id:'managed-focus',
description:'If new content, such as a dialog, is added to the page, the user\'s focus is directed to it. [Learn more](https://web.dev/managed-focus/).',
title:'The user\'s focus is directed to new content added to the page'},
super.partialMeta);
}}


module.exports=ManagedFocus;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/offscreen-content-hidden":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');






class OffscreenContentHidden extends ManualAudit{



static get meta(){
return Object.assign({
id:'offscreen-content-hidden',
description:'Offscreen content is hidden with display: none or aria-hidden=true. [Learn more](https://web.dev/offscreen-content-hidden/).',
title:'Offscreen content is hidden from assistive technology'},
super.partialMeta);
}}


module.exports=OffscreenContentHidden;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/use-landmarks":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class UseLandmarks extends ManualAudit{



static get meta(){
return Object.assign({
id:'use-landmarks',
description:'Landmark elements (<main>, <nav>, etc.) are used to improve the keyboard navigation of the page for assistive technology. [Learn more](https://web.dev/use-landmarks/).',
title:'HTML5 landmark elements are used to improve navigation'},
super.partialMeta);
}}


module.exports=UseLandmarks;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/visual-order-follows-dom":[function(require,module,exports){






'use strict';

const ManualAudit=require('../../manual/manual-audit.js');





class VisualOrderFollowsDOM extends ManualAudit{



static get meta(){
return Object.assign({
id:'visual-order-follows-dom',
description:'DOM order matches the visual order, improving navigation for assistive technology. [Learn more](https://web.dev/visual-order-follows-dom/).',
title:'Visual order on the page follows DOM order'},
super.partialMeta);
}}


module.exports=VisualOrderFollowsDOM;

},{"../../manual/manual-audit.js":5}],"../audits/accessibility/meta-refresh":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'The document does not use `<meta http-equiv="refresh">`',

failureTitle:'The document uses `<meta http-equiv="refresh">`',

description:'Users do not expect a page to refresh automatically, and doing so will move '+
'focus back to the top of the page. This may create a frustrating or '+
'confusing experience. '+
'[Learn more](https://web.dev/meta-refresh/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class MetaRefresh extends AxeAudit{



static get meta(){
return{
id:'meta-refresh',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=MetaRefresh;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/meta-refresh.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/meta-viewport":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[user-scalable="no"]` is not used in the `<meta name="viewport">` '+
'element and the `[maximum-scale]` attribute is not less than 5.',

failureTitle:'`[user-scalable="no"]` is used in the `<meta name="viewport">` '+
'element or the `[maximum-scale]` attribute is less than 5.',

description:'Disabling zooming is problematic for users with low vision who rely on '+
'screen magnification to properly see the contents of a web page. '+
'[Learn more](https://web.dev/meta-viewport/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class MetaViewport extends AxeAudit{



static get meta(){
return{
id:'meta-viewport',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=MetaViewport;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/meta-viewport.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/object-alt":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<object>` elements have `[alt]` text',

failureTitle:'`<object>` elements do not have `[alt]` text',

description:'Screen readers cannot translate non-text content. Adding alt text to '+
'`<object>` elements helps screen readers convey meaning to users. '+
'[Learn more](https://web.dev/object-alt/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ObjectAlt extends AxeAudit{



static get meta(){
return{
id:'object-alt',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ObjectAlt;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/object-alt.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/tabindex":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'No element has a `[tabindex]` value greater than 0',

failureTitle:'Some elements have a `[tabindex]` value greater than 0',

description:'A value greater than 0 implies an explicit navigation ordering. '+
'Although technically valid, this often creates frustrating experiences '+
'for users who rely on assistive technologies. [Learn more](https://web.dev/tabindex/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class TabIndex extends AxeAudit{



static get meta(){
return{
id:'tabindex',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=TabIndex;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/tabindex.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/td-headers-attr":[function(require,module,exports){
(function(__filename){





'use strict';







const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Cells in a `<table>` element that use the `[headers]` attribute refer '+
'to table cells within the same table.',

failureTitle:'Cells in a `<table>` element that use the `[headers]` attribute refer '+
'to an element `id` not found within the same table.',

description:'Screen readers have features to make navigating tables easier. Ensuring '+
'`<td>` cells using the `[headers]` attribute only refer to other cells in the same '+
'table may improve the experience for screen reader users. '+
'[Learn more](https://web.dev/td-headers-attr/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class TDHeadersAttr extends AxeAudit{



static get meta(){
return{
id:'td-headers-attr',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=TDHeadersAttr;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/td-headers-attr.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/th-has-data-cells":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<th>` elements and elements with `[role="columnheader"/"rowheader"]` have '+
'data cells they describe.',

failureTitle:'`<th>` elements and elements with '+
'`[role="columnheader"/"rowheader"]` do not have data cells they describe.',

description:'Screen readers have features to make navigating tables easier. Ensuring '+
'table headers always refer to some set of cells may improve the experience for screen '+
'reader users. '+
'[Learn more](https://web.dev/th-has-data-cells/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class THHasDataCells extends AxeAudit{



static get meta(){
return{
id:'th-has-data-cells',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=THHasDataCells;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/th-has-data-cells.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/valid-lang":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`[lang]` attributes have a valid value',

failureTitle:'`[lang]` attributes do not have a valid value',

description:'Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) '+
'on elements helps ensure that text is pronounced correctly by a screen reader. '+
'[Learn more](https://web.dev/valid-lang/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ValidLang extends AxeAudit{



static get meta(){
return{
id:'valid-lang',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=ValidLang;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/valid-lang.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-caption":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<video>` elements contain a `<track>` element with `[kind="captions"]`',

failureTitle:'`<video>` elements do not contain a `<track>` element '+
'with `[kind="captions"]`.',

description:'When a video provides a caption it is easier for deaf and hearing impaired '+
'users to access its information. '+
'[Learn more](https://web.dev/video-caption/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class VideoCaption extends AxeAudit{



static get meta(){
return{
id:'video-caption',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=VideoCaption;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/video-caption.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-description":[function(require,module,exports){
(function(__filename){





'use strict';






const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'`<video>` elements contain a `<track>` element with `[kind="description"]`',

failureTitle:'`<video>` elements do not contain a `<track>` element with '+
'`[kind="description"]`.',

description:'Audio descriptions provide relevant information for videos that dialogue '+
'cannot, such as facial expressions and scenes. '+
'[Learn more](https://web.dev/video-description/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class VideoDescription extends AxeAudit{



static get meta(){
return{
id:'video-description',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Accessibility']};

}}


module.exports=VideoDescription;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/video-description.js");
},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/apple-touch-icon":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');





const UIStrings={

title:'Provides a valid `apple-touch-icon`',

failureTitle:'Does not provide a valid `apple-touch-icon`',

description:'For ideal appearance on iOS when users add a progressive web app to the home '+
'screen, define an `apple-touch-icon`. It must point to a non-transparent 192px (or 180px) '+
'square PNG. [Learn More](https://web.dev/apple-touch-icon/).',

precomposedWarning:'`apple-touch-icon-precomposed` is out of date; '+
'`apple-touch-icon` is preferred.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class AppleTouchIcon extends Audit{



static get meta(){
return{
id:'apple-touch-icon',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['LinkElements']};

}





static audit(artifacts){
const appleTouchIcons=artifacts.LinkElements.
filter(el=>el.rel==='apple-touch-icon'||el.rel==='apple-touch-icon-precomposed').
filter(el=>!!el.href);


const passed=appleTouchIcons.length!==0;

const warnings=[];
if(appleTouchIcons.filter(el=>el.rel==='apple-touch-icon-precomposed').length!==0&&
appleTouchIcons.filter(el=>el.rel==='apple-touch-icon').length===0){
warnings.push(str_(UIStrings.precomposedWarning));
}

return{
score:passed?1:0,
warnings};

}}


module.exports=AppleTouchIcon;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/apple-touch-icon.js");
},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/bootup-time":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const NetworkRequest=require('../lib/network-request.js');
const{taskGroups}=require('../lib/tracehouse/task-groups.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkRecords=require('../computed/network-records.js');
const MainThreadTasks=require('../computed/main-thread-tasks.js');

const UIStrings={

title:'JavaScript execution time',

failureTitle:'Reduce JavaScript execution time',

description:'Consider reducing the time spent parsing, compiling, and executing JS. '+
'You may find delivering smaller JS payloads helps with this. [Learn '+
'more](https://web.dev/bootup-time).',

columnTotal:'Total CPU Time',

columnScriptEval:'Script Evaluation',

columnScriptParse:'Script Parse',

chromeExtensionsWarning:'Chrome extensions negatively affected this page\'s load performance. '+
'Try auditing the page in incognito mode or from a Chrome profile without extensions.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class BootupTime extends Audit{



static get meta(){
return{
id:'bootup-time',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{


scorePODR:600,
scoreMedian:3500,
thresholdInMs:50};

}




static getJavaScriptURLs(records){

const urls=new Set();
for(const record of records){
if(record.resourceType===NetworkRequest.TYPES.Script){
urls.add(record.url);
}
}

return urls;
}






static getAttributableURLForTask(task,jsURLs){
const jsURL=task.attributableURLs.find(url=>jsURLs.has(url));
const fallbackURL=task.attributableURLs[0];
let attributableURL=jsURL||fallbackURL;

if(!attributableURL||attributableURL==='about:blank')attributableURL='Other';
return attributableURL;
}






static getExecutionTimingsByURL(tasks,jsURLs){

const result=new Map();

for(const task of tasks){
const attributableURL=BootupTime.getAttributableURLForTask(task,jsURLs);
const timingByGroupId=result.get(attributableURL)||{};
const originalTime=timingByGroupId[task.group.id]||0;
timingByGroupId[task.group.id]=originalTime+task.selfTime;
result.set(attributableURL,timingByGroupId);
}

return result;
}






static async audit(artifacts,context){
const settings=context.settings||{};
const trace=artifacts.traces[BootupTime.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[BootupTime.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const tasks=await MainThreadTasks.request(trace,context);
const multiplier=settings.throttlingMethod==='simulate'?
settings.throttling.cpuSlowdownMultiplier:1;

const jsURLs=BootupTime.getJavaScriptURLs(networkRecords);
const executionTimings=BootupTime.getExecutionTimingsByURL(tasks,jsURLs);

let hadExcessiveChromeExtension=false;
let totalBootupTime=0;
const results=Array.from(executionTimings).
map(([url,timingByGroupId])=>{

let totalExecutionTimeForURL=0;
for(const[groupId,timespanMs]of Object.entries(timingByGroupId)){
timingByGroupId[groupId]=timespanMs*multiplier;
totalExecutionTimeForURL+=timespanMs*multiplier;
}

const scriptingTotal=timingByGroupId[taskGroups.scriptEvaluation.id]||0;
const parseCompileTotal=timingByGroupId[taskGroups.scriptParseCompile.id]||0;


if(totalExecutionTimeForURL>=context.options.thresholdInMs){
totalBootupTime+=scriptingTotal+parseCompileTotal;
}

hadExcessiveChromeExtension=hadExcessiveChromeExtension||
url.startsWith('chrome-extension:')&&scriptingTotal>100;

return{
url:url,
total:totalExecutionTimeForURL,

scripting:scriptingTotal,
scriptParseCompile:parseCompileTotal};

}).
filter(result=>result.total>=context.options.thresholdInMs).
sort((a,b)=>b.total-a.total);



if(hadExcessiveChromeExtension){
context.LighthouseRunWarnings.push(str_(UIStrings.chromeExtensionsWarning));
}

const summary={wastedMs:totalBootupTime};


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'total',granularity:1,itemType:'ms',text:str_(UIStrings.columnTotal)},
{key:'scripting',granularity:1,itemType:'ms',text:str_(UIStrings.columnScriptEval)},
{key:'scriptParseCompile',granularity:1,itemType:'ms',
text:str_(UIStrings.columnScriptParse)}];


const details=BootupTime.makeTableDetails(headings,results,summary);

const score=Audit.computeLogNormalScore(
totalBootupTime,
context.options.scorePODR,
context.options.scoreMedian);


return{
score,
numericValue:totalBootupTime,
displayValue:totalBootupTime>0?
str_(i18n.UIStrings.seconds,{timeInMs:totalBootupTime}):'',
details};

}}


module.exports=BootupTime;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/bootup-time.js");
},{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/network-request.js":75,"../lib/tracehouse/task-groups.js":84,"./audit.js":3}],"../audits/byte-efficiency/efficient-animated-content":[function(require,module,exports){
(function(__filename){








'use strict';

const NetworkRequest=require('../../lib/network-request.js');
const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Use video formats for animated content',

description:'Large GIFs are inefficient for delivering animated content. Consider using '+
'MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save '+
'network bytes. [Learn more](https://web.dev/efficient-animated-content)'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);



const GIF_BYTE_THRESHOLD=100*1024;

class EfficientAnimatedContent extends ByteEfficiencyAudit{



static get meta(){
return{
id:'efficient-animated-content',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['devtoolsLogs','traces']};

}







static getPercentSavings(bytes){
return Math.round(29.1*Math.log10(bytes)-100.7)/100;
}






static audit_(artifacts,networkRecords){
const unoptimizedContent=networkRecords.filter(
record=>record.mimeType==='image/gif'&&
record.resourceType===NetworkRequest.TYPES.Image&&
(record.resourceSize||0)>GIF_BYTE_THRESHOLD);



const items=unoptimizedContent.map(record=>{
const resourceSize=record.resourceSize||0;
return{
url:record.url,
totalBytes:resourceSize,
wastedBytes:Math.round(resourceSize*
EfficientAnimatedContent.getPercentSavings(resourceSize))};

});


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
items,
headings};

}}


module.exports=EfficientAnimatedContent;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/efficient-animated-content.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/offscreen-images":[function(require,module,exports){
(function(__filename){









'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const Sentry=require('../../lib/sentry.js');
const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
const Interactive=require('../../computed/metrics/interactive.js');
const TraceOfTab=require('../../computed/trace-of-tab.js');

const UIStrings={

title:'Defer offscreen images',

description:
'Consider lazy-loading offscreen and hidden images after all critical resources have '+
'finished loading to lower time to interactive. '+
'[Learn more](https://web.dev/offscreen-images).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const ALLOWABLE_OFFSCREEN_X=100;
const ALLOWABLE_OFFSCREEN_Y=200;

const IGNORE_THRESHOLD_IN_BYTES=2048;
const IGNORE_THRESHOLD_IN_PERCENT=75;
const IGNORE_THRESHOLD_IN_MS=50;



class OffscreenImages extends ByteEfficiencyAudit{



static get meta(){
return{
id:'offscreen-images',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['ImageElements','ViewportDimensions','devtoolsLogs','traces']};

}






static computeVisiblePixels(imageRect,viewportDimensions){
const innerWidth=viewportDimensions.innerWidth;
const innerHeight=viewportDimensions.innerHeight;

const top=Math.max(imageRect.top,-1*ALLOWABLE_OFFSCREEN_Y);
const right=Math.min(imageRect.right,innerWidth+ALLOWABLE_OFFSCREEN_X);
const bottom=Math.min(imageRect.bottom,innerHeight+ALLOWABLE_OFFSCREEN_Y);
const left=Math.max(imageRect.left,-1*ALLOWABLE_OFFSCREEN_X);

return Math.max(right-left,0)*Math.max(bottom-top,0);
}







static computeWaste(image,viewportDimensions,networkRecords){
const networkRecord=networkRecords.find(record=>record.url===image.src);
if(!image.resourceSize||!networkRecord){
return null;
}

const url=URL.elideDataURI(image.src);
const totalPixels=image.displayedWidth*image.displayedHeight;
const visiblePixels=this.computeVisiblePixels(image.clientRect,viewportDimensions);

const wastedRatio=totalPixels===0?1:1-visiblePixels/totalPixels;
const totalBytes=image.resourceSize;
const wastedBytes=Math.round(totalBytes*wastedRatio);

if(!Number.isFinite(wastedRatio)){
return new Error(`Invalid image sizing information ${url}`);
}

return{
url,
requestStartTime:networkRecord.startTime,
totalBytes,
wastedBytes,
wastedPercent:100*wastedRatio};

}







static filterLanternResults(images,lanternMetricData){
const nodeTimings=lanternMetricData.pessimisticEstimate.nodeTimings;


let lastLongTaskStartTime=0;


const startTimesByURL=new Map();
for(const[node,timing]of nodeTimings){
if(node.type==='cpu'&&timing.duration>=50){
lastLongTaskStartTime=Math.max(lastLongTaskStartTime,timing.startTime);
}else if(node.type==='network'){
const networkNode=node;
startTimesByURL.set(networkNode.record.url,timing.startTime);
}
}

return images.filter(image=>{

if(image.wastedBytes<IGNORE_THRESHOLD_IN_BYTES)return false;
if(image.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT)return false;

const imageRequestStartTime=startTimesByURL.get(image.url)||0;
return imageRequestStartTime<lastLongTaskStartTime-IGNORE_THRESHOLD_IN_MS;
});
}







static filterObservedResults(images,interactiveTimestamp){
return images.filter(image=>{
if(image.wastedBytes<IGNORE_THRESHOLD_IN_BYTES)return false;
if(image.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT)return false;
return image.requestStartTime<interactiveTimestamp/1e6-IGNORE_THRESHOLD_IN_MS/1000;
});
}











static computeWasteWithTTIGraph(results,graph,simulator){
return super.computeWasteWithTTIGraph(results,graph,simulator,
{includeLoad:false});
}







static async audit_(artifacts,networkRecords,context){
const images=artifacts.ImageElements;
const viewportDimensions=artifacts.ViewportDimensions;
const trace=artifacts.traces[ByteEfficiencyAudit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[ByteEfficiencyAudit.DEFAULT_PASS];


const warnings=[];
const resultsMap=images.reduce((results,image)=>{
const processed=OffscreenImages.computeWaste(image,viewportDimensions,networkRecords);
if(processed===null){
return results;
}

if(processed instanceof Error){
warnings.push(processed.message);
Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
return results;
}


const existing=results.get(processed.url);
if(!existing||existing.wastedBytes>processed.wastedBytes){
results.set(processed.url,processed);
}

return results;
},new Map());

const settings=context.settings;

let items;
const unfilteredResults=Array.from(resultsMap.values());

try{
const interactive=await Interactive.request({trace,devtoolsLog,settings},context);


const lanternInteractive=interactive;

items=context.settings.throttlingMethod==='simulate'?
OffscreenImages.filterLanternResults(unfilteredResults,lanternInteractive):

OffscreenImages.filterObservedResults(unfilteredResults,interactive.timestamp);
}catch(err){

if(context.settings.throttlingMethod==='simulate'){
throw err;
}

items=OffscreenImages.filterObservedResults(unfilteredResults,(
await TraceOfTab.request(trace,context).then(tot=>tot.timestamps.traceEnd)));
}


const headings=[
{key:'url',valueType:'thumbnail',label:''},
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
warnings,
items,
headings};

}}


module.exports=OffscreenImages;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/offscreen-images.js");
},{"../../computed/metrics/interactive.js":18,"../../computed/trace-of-tab.js":39,"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/render-blocking-resources":[function(require,module,exports){
(function(__filename){









'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');
const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const UnusedCSS=require('./unused-css-rules.js');
const NetworkRequest=require('../../lib/network-request.js');
const TraceOfTab=require('../../computed/trace-of-tab.js');
const LoadSimulator=require('../../computed/load-simulator.js');
const FirstContentfulPaint=require('../../computed/metrics/first-contentful-paint.js');









const MINIMUM_WASTED_MS=50;

const UIStrings={

title:'Eliminate render-blocking resources',

description:'Resources are blocking the first paint of your page. Consider '+
'delivering critical JS/CSS inline and deferring all non-critical '+
'JS/styles. [Learn more](https://web.dev/render-blocking-resources).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);






function getNodesAndTimingByUrl(nodeTimings){

const urlMap={};
const nodes=Array.from(nodeTimings.keys());
nodes.forEach(node=>{
if(node.type!=='network')return;
const nodeTiming=nodeTimings.get(node);
if(!nodeTiming)return;

urlMap[node.record.url]={node,nodeTiming};
});

return urlMap;
}

class RenderBlockingResources extends Audit{



static get meta(){
return{
id:'render-blocking-resources',
title:str_(UIStrings.title),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
description:str_(UIStrings.description),


requiredArtifacts:['URL','TagsBlockingFirstPaint','traces','devtoolsLogs','CSSUsage']};

}






static async computeResults(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const simulatorData={devtoolsLog,settings:context.settings};
const traceOfTab=await TraceOfTab.request(trace,context);
const simulator=await LoadSimulator.request(simulatorData,context);
const wastedCssBytes=await RenderBlockingResources.computeWastedCSSBytes(artifacts,context);

const metricSettings={throttlingMethod:'simulate'};
const metricComputationData={trace,devtoolsLog,simulator,settings:metricSettings};

const fcpSimulation=await FirstContentfulPaint.request(metricComputationData,context);
const fcpTsInMs=traceOfTab.timestamps.firstContentfulPaint/1000;

const nodesByUrl=getNodesAndTimingByUrl(fcpSimulation.optimisticEstimate.nodeTimings);

const results=[];
const deferredNodeIds=new Set();
for(const resource of artifacts.TagsBlockingFirstPaint){

if(resource.endTime*1000>fcpTsInMs)continue;

if(!nodesByUrl[resource.tag.url])continue;

const{node,nodeTiming}=nodesByUrl[resource.tag.url];


node.traverse(node=>deferredNodeIds.add(node.id));


const wastedMs=Math.round(nodeTiming.duration);
if(wastedMs<MINIMUM_WASTED_MS)continue;

results.push({
url:resource.tag.url,
totalBytes:resource.transferSize,
wastedMs});

}

if(!results.length){
return{results,wastedMs:0};
}

const wastedMs=RenderBlockingResources.estimateSavingsWithGraphs(
simulator,
fcpSimulation.optimisticGraph,
deferredNodeIds,
wastedCssBytes);


return{results,wastedMs};
}

















static estimateSavingsWithGraphs(simulator,fcpGraph,deferredIds,wastedCssBytesByUrl){
const originalEstimate=simulator.simulate(fcpGraph).timeInMs;

let totalChildNetworkBytes=0;
const minimalFCPGraph=fcpGraph.cloneWithRelationships(node=>{

const canDeferRequest=deferredIds.has(node.id);
if(node.type!==BaseNode.TYPES.NETWORK)return!canDeferRequest;

const isStylesheet=
node.record.resourceType===NetworkRequest.TYPES.Stylesheet;
if(canDeferRequest&&isStylesheet){

const wastedBytes=wastedCssBytesByUrl.get(node.record.url)||0;
totalChildNetworkBytes+=(node.record.transferSize||0)-wastedBytes;
}
return!canDeferRequest;
});


const originalTransferSize=minimalFCPGraph.record.transferSize;
const safeTransferSize=originalTransferSize||0;
minimalFCPGraph.record.transferSize=safeTransferSize+totalChildNetworkBytes;
const estimateAfterInline=simulator.simulate(minimalFCPGraph).timeInMs;
minimalFCPGraph.record.transferSize=originalTransferSize;
return Math.round(Math.max(originalEstimate-estimateAfterInline,0));
}






static async computeWastedCSSBytes(artifacts,context){
const wastedBytesByUrl=new Map();
try{
const results=await UnusedCSS.audit(artifacts,context);
if(results.details&&results.details.type==='opportunity'){
for(const item of results.details.items){
wastedBytesByUrl.set(item.url,item.wastedBytes);
}
}
}catch(_){}

return wastedBytesByUrl;
}






static async audit(artifacts,context){
const{results,wastedMs}=await RenderBlockingResources.computeResults(artifacts,context);

let displayValue='';
if(results.length>0){
displayValue=str_(i18n.UIStrings.displayValueMsSavings,{wastedMs});
}


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];


const details=Audit.makeOpportunityDetails(headings,results,wastedMs);

return{
displayValue,
score:ByteEfficiencyAudit.scoreForWastedMs(wastedMs),
numericValue:wastedMs,
details};

}}


module.exports=RenderBlockingResources;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/render-blocking-resources.js");
},{"../../computed/load-simulator.js":10,"../../computed/metrics/first-contentful-paint.js":15,"../../computed/trace-of-tab.js":39,"../../lib/dependency-graph/base-node.js":57,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"../audit.js":3,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/total-byte-weight":[function(require,module,exports){
(function(__filename){





'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const NetworkRecords=require('../../computed/network-records.js');

const UIStrings={

title:'Avoids enormous network payloads',

failureTitle:'Avoid enormous network payloads',

description:
'Large network payloads cost users real money and are highly correlated with '+
'long load times. [Learn '+
'more](https://web.dev/total-byte-weight).',

displayValue:'Total size was {totalBytes, number, bytes}\xa0KB'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class TotalByteWeight extends ByteEfficiencyAudit{



static get meta(){
return{
id:'total-byte-weight',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['devtoolsLogs','traces']};

}




static get defaultOptions(){
return{


scorePODR:2500*1024,
scoreMedian:4000*1024};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[ByteEfficiencyAudit.DEFAULT_PASS];
const records=await NetworkRecords.request(devtoolsLog,context);

let totalBytes=0;

let results=[];
records.forEach(record=>{


if(record.parsedURL.scheme==='data'||!record.finished)return;

const result={
url:record.url,
totalBytes:record.transferSize};


totalBytes+=result.totalBytes;
results.push(result);
});
const totalCompletedRequests=results.length;
results=results.sort((itemA,itemB)=>{
return itemB.totalBytes-itemA.totalBytes||
itemA.url.localeCompare(itemB.url);
}).slice(0,10);

const score=ByteEfficiencyAudit.computeLogNormalScore(
totalBytes,
context.options.scorePODR,
context.options.scoreMedian);



const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize)}];


const tableDetails=ByteEfficiencyAudit.makeTableDetails(headings,results);

return{
score,
numericValue:totalBytes,
displayValue:str_(UIStrings.displayValue,{totalBytes}),
extendedInfo:{
value:{
results,
totalCompletedRequests}},


details:tableDetails};

}}


module.exports=TotalByteWeight;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/total-byte-weight.js");
},{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unminified-css":[function(require,module,exports){
(function(__filename){





'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const UnusedCSSRules=require('./unused-css-rules.js');
const i18n=require('../../lib/i18n/i18n.js');
const computeTokenLength=require('../../lib/minification-estimator.js').computeCSSTokenLength;

const UIStrings={

title:'Minify CSS',

description:'Minifying CSS files can reduce network payload sizes. '+
'[Learn more](https://web.dev/unminified-css).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const IGNORE_THRESHOLD_IN_PERCENT=5;
const IGNORE_THRESHOLD_IN_BYTES=2048;




class UnminifiedCSS extends ByteEfficiencyAudit{



static get meta(){
return{
id:'unminified-css',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['CSSUsage','devtoolsLogs','traces','URL']};

}







static computeTokenLength(content){
return computeTokenLength(content);
}







static computeWaste(stylesheet,networkRecord,pageUrl){
const content=stylesheet.content;
const totalTokenLength=UnminifiedCSS.computeTokenLength(content);

let url=stylesheet.header.sourceURL;
if(!url||url===pageUrl){
const contentPreview=UnusedCSSRules.determineContentPreview(stylesheet.content);
url=contentPreview;
}

const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,content.length,
'Stylesheet');
const wastedRatio=1-totalTokenLength/content.length;
const wastedBytes=Math.round(totalBytes*wastedRatio);

return{
url,
totalBytes,
wastedBytes,
wastedPercent:100*wastedRatio};

}






static audit_(artifacts,networkRecords){
const pageUrl=artifacts.URL.finalUrl;
const items=[];
for(const stylesheet of artifacts.CSSUsage.stylesheets){
const networkRecord=networkRecords.
find(record=>record.url===stylesheet.header.sourceURL);
if(!stylesheet.content)continue;

const result=UnminifiedCSS.computeWaste(stylesheet,networkRecord,pageUrl);



if(result.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT||
result.wastedBytes<IGNORE_THRESHOLD_IN_BYTES||
!Number.isFinite(result.wastedBytes))continue;
items.push(result);
}


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{items,headings};
}}


module.exports=UnminifiedCSS;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-css.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":73,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/unminified-javascript":[function(require,module,exports){
(function(__filename){





'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const computeTokenLength=require('../../lib/minification-estimator.js').computeJSTokenLength;

const UIStrings={

title:'Minify JavaScript',

description:'Minifying JavaScript files can reduce payload sizes and script parse time. '+
'[Learn more](https://web.dev/unminified-javascript).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const IGNORE_THRESHOLD_IN_PERCENT=10;
const IGNORE_THRESHOLD_IN_BYTES=2048;











class UnminifiedJavaScript extends ByteEfficiencyAudit{



static get meta(){
return{
id:'unminified-javascript',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['ScriptElements','devtoolsLogs','traces']};

}







static computeWaste(scriptContent,displayUrl,networkRecord){
const contentLength=scriptContent.length;
const totalTokenLength=computeTokenLength(scriptContent);

const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,contentLength,
'Script');
const wastedRatio=1-totalTokenLength/contentLength;
const wastedBytes=Math.round(totalBytes*wastedRatio);

return{
url:displayUrl,
totalBytes,
wastedBytes,
wastedPercent:100*wastedRatio};

}






static audit_(artifacts,networkRecords){

const items=[];
const warnings=[];
for(const{requestId,src,content}of artifacts.ScriptElements){
if(!content)continue;

const networkRecord=networkRecords.find(record=>record.requestId===requestId);
const displayUrl=!src||!networkRecord?
`inline: ${content.substr(0,40)}...`:
networkRecord.url;
try{
const result=UnminifiedJavaScript.computeWaste(content,displayUrl,networkRecord);


if(result.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT||
result.wastedBytes<IGNORE_THRESHOLD_IN_BYTES||
!Number.isFinite(result.wastedBytes))continue;
items.push(result);
}catch(err){
const url=networkRecord?networkRecord.url:'?';
warnings.push(`Unable to process script ${url}: ${err.message}`);
}
}


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
items,
warnings,
headings};

}}


module.exports=UnminifiedJavaScript;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-javascript.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":73,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-css-rules":[function(require,module,exports){
(function(__filename){





'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Remove unused CSS',

description:'Remove dead rules from stylesheets and defer the loading of CSS not used for '+
'above-the-fold content to reduce unnecessary bytes consumed by network activity. '+
'[Learn more](https://web.dev/unused-css-rules).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);



const IGNORE_THRESHOLD_IN_BYTES=10*1024;
const PREVIEW_LENGTH=100;



class UnusedCSSRules extends ByteEfficiencyAudit{



static get meta(){
return{
id:'unused-css-rules',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['CSSUsage','URL','devtoolsLogs','traces']};

}






static indexStylesheetsById(styles,networkRecords){
const indexedNetworkRecords=networkRecords.



filter(record=>record.resourceSize>0).
reduce((indexed,record)=>{
indexed[record.url]=record;
return indexed;
},{});

return styles.reduce((indexed,stylesheet)=>{
indexed[stylesheet.header.styleSheetId]=Object.assign({
usedRules:[],
networkRecord:indexedNetworkRecords[stylesheet.header.sourceURL]},
stylesheet);
return indexed;
},{});
}






static indexUsedRules(rules,indexedStylesheets){
rules.forEach(rule=>{
const stylesheetInfo=indexedStylesheets[rule.styleSheetId];

if(!stylesheetInfo){
return;
}

if(rule.used){
stylesheetInfo.usedRules.push(rule);
}
});
}





static computeUsage(stylesheetInfo){
let usedUncompressedBytes=0;
const totalUncompressedBytes=stylesheetInfo.content.length;

for(const usedRule of stylesheetInfo.usedRules){
usedUncompressedBytes+=usedRule.endOffset-usedRule.startOffset;
}

const totalTransferredBytes=ByteEfficiencyAudit.estimateTransferSize(
stylesheetInfo.networkRecord,totalUncompressedBytes,'Stylesheet');
const percentUnused=(totalUncompressedBytes-usedUncompressedBytes)/totalUncompressedBytes;
const wastedBytes=Math.round(percentUnused*totalTransferredBytes);

return{
wastedBytes,
wastedPercent:percentUnused*100,
totalBytes:totalTransferredBytes};

}






static determineContentPreview(content){
let preview=(content||'').
slice(0,PREVIEW_LENGTH*5).
replace(/( {2,}|\t)+/g,'  ').
replace(/\n\s+}/g,'\n}').
trim();

if(preview.length>PREVIEW_LENGTH){
const firstRuleStart=preview.indexOf('{');
const firstRuleEnd=preview.indexOf('}');

if(firstRuleStart===-1||firstRuleEnd===-1||
firstRuleStart>firstRuleEnd||
firstRuleStart>PREVIEW_LENGTH){

preview=preview.slice(0,PREVIEW_LENGTH)+'...';
}else if(firstRuleEnd<PREVIEW_LENGTH){

preview=preview.slice(0,firstRuleEnd+1)+' ...';
}else{

const lastSemicolonIndex=preview.slice(0,PREVIEW_LENGTH).lastIndexOf(';');
preview=lastSemicolonIndex<firstRuleStart?
preview.slice(0,PREVIEW_LENGTH)+'... } ...':
preview.slice(0,lastSemicolonIndex+1)+' ... } ...';
}
}

return preview;
}






static mapSheetToResult(stylesheetInfo,pageUrl){
let url=stylesheetInfo.header.sourceURL;
if(!url||url===pageUrl){
const contentPreview=UnusedCSSRules.determineContentPreview(stylesheetInfo.content);
url=contentPreview;
}

const usage=UnusedCSSRules.computeUsage(stylesheetInfo);
return{url,...usage};
}






static audit_(artifacts,networkRecords){
const styles=artifacts.CSSUsage.stylesheets;
const usage=artifacts.CSSUsage.rules;
const pageUrl=artifacts.URL.finalUrl;

return Promise.resolve(networkRecords).then(networkRecords=>{
const indexedSheets=UnusedCSSRules.indexStylesheetsById(styles,networkRecords);
UnusedCSSRules.indexUsedRules(usage,indexedSheets);

const items=Object.keys(indexedSheets).
map(sheetId=>UnusedCSSRules.mapSheetToResult(indexedSheets[sheetId],pageUrl)).
filter(sheet=>sheet&&sheet.wastedBytes>IGNORE_THRESHOLD_IN_BYTES);


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
items,
headings};

});
}}


module.exports=UnusedCSSRules;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/unused-css-rules.js");
},{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-javascript":[function(require,module,exports){
(function(__filename){





'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Remove unused JavaScript',

description:'Remove unused JavaScript to reduce bytes consumed by network activity.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const IGNORE_THRESHOLD_IN_BYTES=2048;

class UnusedJavaScript extends ByteEfficiencyAudit{



static get meta(){
return{
id:'unused-javascript',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['JsUsage','devtoolsLogs','traces']};

}





static computeWaste(script){
let maximumEndOffset=0;
for(const func of script.functions){
for(const range of func.ranges){
maximumEndOffset=Math.max(maximumEndOffset,range.endOffset);
}
}



const unusedByIndex=new Uint8Array(maximumEndOffset);
for(const func of script.functions){
for(const range of func.ranges){
if(range.count===0){
for(let i=range.startOffset;i<range.endOffset;i++){
unusedByIndex[i]=1;
}
}
}
}

let unused=0;
for(const x of unusedByIndex){
unused+=x;
}

return{
unusedLength:unused,
contentLength:maximumEndOffset};

}






static mergeWaste(wasteData,networkRecord){
let unusedLength=0;
let contentLength=0;
for(const usage of wasteData){
unusedLength+=usage.unusedLength;
contentLength+=usage.contentLength;
}

const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,contentLength,
'Script');
const wastedRatio=unusedLength/contentLength||0;
const wastedBytes=Math.round(totalBytes*wastedRatio);

return{
url:networkRecord.url,
totalBytes,
wastedBytes,
wastedPercent:100*wastedRatio};

}






static audit_(artifacts,networkRecords){

const scriptsByUrl=new Map();
for(const script of artifacts.JsUsage){
const scripts=scriptsByUrl.get(script.url)||[];
scripts.push(script);
scriptsByUrl.set(script.url,scripts);
}

const items=[];
for(const[url,scripts]of scriptsByUrl.entries()){
const networkRecord=networkRecords.find(record=>record.url===url);
if(!networkRecord)continue;
const wasteData=scripts.map(UnusedJavaScript.computeWaste);
const item=UnusedJavaScript.mergeWaste(wasteData,networkRecord);
if(item.wastedBytes<=IGNORE_THRESHOLD_IN_BYTES)continue;
items.push(item);
}

return{
items,
headings:[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}]};


}}


module.exports=UnusedJavaScript;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/unused-javascript.js");
},{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-long-cache-ttl":[function(require,module,exports){
(function(__filename){





'use strict';

const assert=require('assert');
const parseCacheControl=require('parse-cache-control');
const Audit=require('../audit.js');
const NetworkRequest=require('../../lib/network-request.js');
const URL=require('../../lib/url-shim.js');
const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
const i18n=require('../../lib/i18n/i18n.js');
const NetworkRecords=require('../../computed/network-records.js');

const UIStrings={

title:'Uses efficient cache policy on static assets',

failureTitle:'Serve static assets with an efficient cache policy',

description:
'A long cache lifetime can speed up repeat visits to your page. '+
'[Learn more](https://web.dev/uses-long-cache-ttl).',

displayValue:`{itemCount, plural,
    =1 {1 resource found}
    other {# resources found}
    }`};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const IGNORE_THRESHOLD_IN_PERCENT=0.925;

class CacheHeaders extends Audit{



static get meta(){
return{
id:'uses-long-cache-ttl',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['devtoolsLogs','traces']};

}




static get defaultOptions(){
return{



scorePODR:4*1024,
scoreMedian:128*1024};

}







static getCacheHitProbability(maxAgeInSeconds){





const RESOURCE_AGE_IN_HOURS_DECILES=[0,0.2,1,3,8,12,24,48,72,168,8760,Infinity];
assert.ok(RESOURCE_AGE_IN_HOURS_DECILES.length===12,'deciles 0-10 and 1 for overflow');

const maxAgeInHours=maxAgeInSeconds/3600;
const upperDecileIndex=RESOURCE_AGE_IN_HOURS_DECILES.findIndex(
decile=>decile>=maxAgeInHours);



if(upperDecileIndex===RESOURCE_AGE_IN_HOURS_DECILES.length-1)return 1;
if(upperDecileIndex===0)return 0;


const upperDecileValue=RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex];
const lowerDecileValue=RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex-1];
const upperDecile=upperDecileIndex/10;
const lowerDecile=(upperDecileIndex-1)/10;


return linearInterpolation(
lowerDecileValue,
lowerDecile,
upperDecileValue,
upperDecile,
maxAgeInHours);

}







static computeCacheLifetimeInSeconds(headers,cacheControl){
if(cacheControl&&cacheControl['max-age']!==undefined){
return cacheControl['max-age'];
}

const expiresHeaders=headers.get('expires');
if(expiresHeaders){
const expires=new Date(expiresHeaders).getTime();

if(!expires)return 0;
return Math.ceil((expires-Date.now())/1000);
}

return null;
}
















static isCacheableAsset(record){
const CACHEABLE_STATUS_CODES=new Set([200,203,206]);


const STATIC_RESOURCE_TYPES=new Set([
NetworkRequest.TYPES.Font,
NetworkRequest.TYPES.Image,
NetworkRequest.TYPES.Media,
NetworkRequest.TYPES.Script,
NetworkRequest.TYPES.Stylesheet]);



if(URL.NON_NETWORK_PROTOCOLS.includes(record.protocol))return false;

return(
CACHEABLE_STATUS_CODES.has(record.statusCode)&&
STATIC_RESOURCE_TYPES.has(record.resourceType||'Other'));

}







static shouldSkipRecord(headers,cacheControl){

if(!cacheControl&&(headers.get('pragma')||'').includes('no-cache')){
return true;
}


if(cacheControl&&(

cacheControl['must-revalidate']||
cacheControl['no-cache']||
cacheControl['no-store']||
cacheControl['private'])){
return true;
}

return false;
}






static audit(artifacts,context){
const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
return NetworkRecords.request(devtoolsLogs,context).then(records=>{
const results=[];
let queryStringCount=0;
let totalWastedBytes=0;

for(const record of records){
if(!CacheHeaders.isCacheableAsset(record))continue;


const headers=new Map();
for(const header of record.responseHeaders||[]){
if(headers.has(header.name.toLowerCase())){
const previousHeaderValue=headers.get(header.name.toLowerCase());
headers.set(header.name.toLowerCase(),
`${previousHeaderValue}, ${header.value}`);
}else{
headers.set(header.name.toLowerCase(),header.value);
}
}

const cacheControl=parseCacheControl(headers.get('cache-control'));
if(this.shouldSkipRecord(headers,cacheControl)){
continue;
}


let cacheLifetimeInSeconds=CacheHeaders.computeCacheLifetimeInSeconds(
headers,cacheControl);
if(cacheLifetimeInSeconds!==null&&(
!Number.isFinite(cacheLifetimeInSeconds)||cacheLifetimeInSeconds<=0)){
continue;
}
cacheLifetimeInSeconds=cacheLifetimeInSeconds||0;


const cacheHitProbability=CacheHeaders.getCacheHitProbability(cacheLifetimeInSeconds);
if(cacheHitProbability>IGNORE_THRESHOLD_IN_PERCENT)continue;

const url=URL.elideDataURI(record.url);
const totalBytes=record.transferSize||0;
const wastedBytes=(1-cacheHitProbability)*totalBytes;

totalWastedBytes+=wastedBytes;
if(url.includes('?'))queryStringCount++;



let debugData;
if(cacheControl){
debugData={
type:'debugdata',
...cacheControl};

}

results.push({
url,
debugData,
cacheLifetimeMs:cacheLifetimeInSeconds*1000,
cacheHitProbability,
totalBytes,
wastedBytes});

}

results.sort((a,b)=>{
return a.cacheLifetimeMs-b.cacheLifetimeMs||
b.totalBytes-a.totalBytes||
a.url.localeCompare(b.url);
});

const score=Audit.computeLogNormalScore(
totalWastedBytes,
context.options.scorePODR,
context.options.scoreMedian);



const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},

{key:'cacheLifetimeMs',itemType:'ms',text:str_(i18n.UIStrings.columnCacheTTL),
displayUnit:'duration'},
{key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize),
displayUnit:'kb',granularity:1}];


const summary={wastedBytes:totalWastedBytes};
const details=Audit.makeTableDetails(headings,results,summary);

return{
score,
numericValue:totalWastedBytes,
displayValue:str_(UIStrings.displayValue,{itemCount:results.length}),
extendedInfo:{
value:{
results,
queryStringCount}},


details};

});
}}


module.exports=CacheHeaders;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js");
},{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"../../lib/statistics.js":81,"../../lib/url-shim.js":"url","../audit.js":3,"assert":92,"parse-cache-control":155}],"../audits/byte-efficiency/uses-optimized-images":[function(require,module,exports){
(function(__filename){









'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Efficiently encode images',

description:'Optimized images load faster and consume less cellular data. '+
'[Learn more](https://web.dev/uses-optimized-images).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const IGNORE_THRESHOLD_IN_BYTES=4096;

class UsesOptimizedImages extends ByteEfficiencyAudit{



static get meta(){
return{
id:'uses-optimized-images',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['OptimizedImages','ImageElements','devtoolsLogs','traces','URL']};

}





static computeSavings(image){
const bytes=image.originalSize-image.jpegSize;
const percent=100*bytes/image.originalSize;
return{bytes,percent};
}





static estimateJPEGSizeFromDimensions(imageElement){
const totalPixels=imageElement.naturalWidth*imageElement.naturalHeight;




const expectedBytesPerPixel=2*1/8;
return Math.round(totalPixels*expectedBytesPerPixel);
}





static audit_(artifacts){
const pageURL=artifacts.URL.finalUrl;
const images=artifacts.OptimizedImages;
const imageElements=artifacts.ImageElements;

const imageElementsByURL=new Map();
imageElements.forEach(img=>imageElementsByURL.set(img.src,img));


const items=[];
const warnings=[];
for(const image of images){
if(image.failed){
warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
continue;
}else if(/(jpeg|bmp)/.test(image.mimeType)===false){
continue;
}

let jpegSize=image.jpegSize;
let fromProtocol=true;

if(typeof jpegSize==='undefined'){
const imageElement=imageElementsByURL.get(image.url);
if(!imageElement){
warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
continue;
}

jpegSize=UsesOptimizedImages.estimateJPEGSizeFromDimensions(imageElement);
fromProtocol=false;
}

if(image.originalSize<jpegSize+IGNORE_THRESHOLD_IN_BYTES)continue;

const url=URL.elideDataURI(image.url);
const isCrossOrigin=!URL.originsMatch(pageURL,image.url);
const jpegSavings=UsesOptimizedImages.computeSavings({...image,jpegSize});

items.push({
url,
fromProtocol,
isCrossOrigin,
totalBytes:image.originalSize,
wastedBytes:jpegSavings.bytes});

}


const headings=[
{key:'url',valueType:'thumbnail',label:''},
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
warnings,
items,
headings};

}}


module.exports=UsesOptimizedImages;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-optimized-images.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-responsive-images":[function(require,module,exports){
(function(__filename){













'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const Sentry=require('../../lib/sentry.js');
const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Properly size images',

description:
'Serve images that are appropriately-sized to save cellular data '+
'and improve load time. '+
'[Learn more](https://web.dev/uses-responsive-images).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const IGNORE_THRESHOLD_IN_BYTES=2048;

class UsesResponsiveImages extends ByteEfficiencyAudit{



static get meta(){
return{
id:'uses-responsive-images',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['ImageElements','ViewportDimensions','devtoolsLogs','traces']};

}






static computeWaste(image,DPR){

if(!image.resourceSize){
return null;
}

const url=URL.elideDataURI(image.src);
const actualPixels=image.naturalWidth*image.naturalHeight;
const usedPixels=image.displayedWidth*image.displayedHeight*Math.pow(DPR,2);
const wastedRatio=1-usedPixels/actualPixels;
const totalBytes=image.resourceSize;
const wastedBytes=Math.round(totalBytes*wastedRatio);



if(!usedPixels){
return null;
}

if(!Number.isFinite(wastedRatio)){
return new Error(`Invalid image sizing information ${url}`);
}

return{
url,
totalBytes,
wastedBytes,
wastedPercent:100*wastedRatio};

}





static audit_(artifacts){
const images=artifacts.ImageElements;
const DPR=artifacts.ViewportDimensions.devicePixelRatio;


const warnings=[];

const resultsMap=new Map();
for(const image of images){




if(!image.resourceSize||image.mimeType==='image/svg+xml'||image.isCss){
continue;
}

const processed=UsesResponsiveImages.computeWaste(image,DPR);
if(!processed)continue;

if(processed instanceof Error){
warnings.push(processed.message);
Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
continue;
}


const existing=resultsMap.get(processed.url);
if(!existing||existing.wastedBytes>processed.wastedBytes){
resultsMap.set(processed.url,processed);
}
}

const items=Array.from(resultsMap.values()).
filter(item=>item.wastedBytes>IGNORE_THRESHOLD_IN_BYTES);


const headings=[
{key:'url',valueType:'thumbnail',label:''},
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
warnings,
items,
headings};

}}


module.exports=UsesResponsiveImages;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-responsive-images.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-text-compression":[function(require,module,exports){
(function(__filename){









'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Enable text compression',

description:'Text-based resources should be served with compression (gzip, deflate or'+
' brotli) to minimize total network bytes.'+
' [Learn more](https://web.dev/uses-text-compression).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const IGNORE_THRESHOLD_IN_BYTES=1400;
const IGNORE_THRESHOLD_IN_PERCENT=0.1;

class ResponsesAreCompressed extends ByteEfficiencyAudit{



static get meta(){
return{
id:'uses-text-compression',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['ResponseCompression','devtoolsLogs','traces']};

}





static audit_(artifacts){
const uncompressedResponses=artifacts.ResponseCompression;


const items=[];
uncompressedResponses.forEach(record=>{

if(!record.gzipSize||record.gzipSize<0)return;

const originalSize=record.resourceSize;
const gzipSize=record.gzipSize;
const gzipSavings=originalSize-gzipSize;



if(1-gzipSize/originalSize<IGNORE_THRESHOLD_IN_PERCENT||
gzipSavings<IGNORE_THRESHOLD_IN_BYTES||
record.transferSize<gzipSize)
{
return;
}


const url=URL.elideDataURI(record.url);
const isDuplicate=items.find(item=>item.url===url&&
item.totalBytes===record.resourceSize);
if(isDuplicate){
return;
}

items.push({
url,
totalBytes:originalSize,
wastedBytes:gzipSavings});

});


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
items,
headings};

}}


module.exports=ResponsesAreCompressed;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-text-compression.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-webp-images":[function(require,module,exports){
(function(__filename){








'use strict';

const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Serve images in next-gen formats',

description:'Image formats like JPEG 2000, JPEG XR, and WebP often provide better '+
'compression than PNG or JPEG, which means faster downloads and less data consumption. '+
'[Learn more](https://web.dev/uses-webp-images).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const IGNORE_THRESHOLD_IN_BYTES=8192;

class UsesWebPImages extends ByteEfficiencyAudit{



static get meta(){
return{
id:'uses-webp-images',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
requiredArtifacts:['OptimizedImages','devtoolsLogs','traces','URL','ImageElements']};

}





static computeSavings(image){
const bytes=image.originalSize-image.webpSize;
const percent=100*bytes/image.originalSize;
return{bytes,percent};
}





static estimateWebPSizeFromDimensions(imageElement){
const totalPixels=imageElement.naturalWidth*imageElement.naturalHeight;





const expectedBytesPerPixel=2*1/10;
return Math.round(totalPixels*expectedBytesPerPixel);
}





static audit_(artifacts){
const pageURL=artifacts.URL.finalUrl;
const images=artifacts.OptimizedImages;
const imageElements=artifacts.ImageElements;

const imageElementsByURL=new Map();
imageElements.forEach(img=>imageElementsByURL.set(img.src,img));


const items=[];
const warnings=[];
for(const image of images){
if(image.failed){
warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
continue;
}

let webpSize=image.webpSize;
let fromProtocol=true;

if(typeof webpSize==='undefined'){
const imageElement=imageElementsByURL.get(image.url);
if(!imageElement){
warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
continue;
}

webpSize=UsesWebPImages.estimateWebPSizeFromDimensions(imageElement);
fromProtocol=false;
}

if(image.originalSize<webpSize+IGNORE_THRESHOLD_IN_BYTES)continue;

const url=URL.elideDataURI(image.url);
const isCrossOrigin=!URL.originsMatch(pageURL,image.url);
const webpSavings=UsesWebPImages.computeSavings({...image,webpSize:webpSize});

items.push({
url,
fromProtocol,
isCrossOrigin,
totalBytes:image.originalSize,
wastedBytes:webpSavings.bytes});

}


const headings=[
{key:'url',valueType:'thumbnail',label:''},
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];


return{
warnings,
items,
headings};

}}


module.exports=UsesWebPImages;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-webp-images.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/content-width":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Content is sized correctly for the viewport',

failureTitle:'Content is not sized correctly for the viewport',

description:'If the width of your app\'s content doesn\'t match the width '+
'of the viewport, your app might not be optimized for mobile screens. '+
'[Learn more](https://web.dev/content-width).',





explanation:'The viewport size of {innerWidth}px does not match the window '+
'size of {outerWidth}px.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ContentWidth extends Audit{



static get meta(){
return{
id:'content-width',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ViewportDimensions','TestedAsMobileDevice']};

}





static audit(artifacts){
const IsMobile=artifacts.TestedAsMobileDevice;
const viewportWidth=artifacts.ViewportDimensions.innerWidth;
const windowWidth=artifacts.ViewportDimensions.outerWidth;
const widthsMatch=viewportWidth===windowWidth;

if(!IsMobile){
return{
score:1,
notApplicable:true};

}

let explanation='';
if(!widthsMatch){
explanation=str_(UIStrings.explanation,
{innerWidth:artifacts.ViewportDimensions.innerWidth,
outerWidth:artifacts.ViewportDimensions.outerWidth});
}

return{
score:Number(widthsMatch),
explanation};

}}


module.exports=ContentWidth;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/content-width.js");
},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/critical-request-chains":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const ComputedChains=require('../computed/critical-request-chains.js');

const UIStrings={

title:'Avoid chaining critical requests',

description:'The Critical Request Chains below show you what resources are '+
'loaded with a high priority. Consider reducing '+
'the length of chains, reducing the download size of resources, or '+
'deferring the download of unnecessary resources to improve page load. '+
'[Learn more](https://web.dev/critical-request-chains).',

displayValue:`{itemCount, plural,
    =1 {1 chain found}
    other {# chains found}
    }`};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class CriticalRequestChains extends Audit{



static get meta(){
return{
id:'critical-request-chains',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
requiredArtifacts:['devtoolsLogs','URL']};

}







static _traverse(tree,cb){






function walk(node,depth,startTime,transferSize=0){
const children=Object.keys(node);
if(children.length===0){
return;
}
children.forEach(id=>{
const child=node[id];
if(!startTime){
startTime=child.request.startTime;
}


cb({
depth,
id,
node:child,
chainDuration:(child.request.endTime-startTime)*1000,
chainTransferSize:transferSize+child.request.transferSize});



if(child.children){
walk(child.children,depth+1,startTime);
}
},'');
}

walk(tree,0);
}






static _getLongestChain(tree){
const longest={
duration:0,
length:0,
transferSize:0};

CriticalRequestChains._traverse(tree,opts=>{
const duration=opts.chainDuration;
if(duration>longest.duration){
longest.duration=duration;
longest.transferSize=opts.chainTransferSize;
longest.length=opts.depth;
}
});

longest.length++;
return longest;
}





static flattenRequests(tree){

const flattendChains={};

const chainMap=new Map();


function flatten(opts){
const request=opts.node.request;
const simpleRequest={
url:request.url,
startTime:request.startTime,
endTime:request.endTime,
responseReceivedTime:request.responseReceivedTime,
transferSize:request.transferSize};


let chain=chainMap.get(opts.id);
if(chain){
chain.request=simpleRequest;
}else{
chain={
request:simpleRequest};

flattendChains[opts.id]=chain;
}

if(opts.node.children){
for(const chainId of Object.keys(opts.node.children)){

const childChain={
request:{}};

chainMap.set(chainId,childChain);
if(!chain.children){
chain.children={};
}
chain.children[chainId]=childChain;
}
}
chainMap.set(opts.id,chain);
}

CriticalRequestChains._traverse(tree,flatten);

return flattendChains;
}







static audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const URL=artifacts.URL;
return ComputedChains.request({devtoolsLog,URL},context).then(chains=>{
let chainCount=0;




function walk(node,depth){
const childIds=Object.keys(node);

childIds.forEach(id=>{
const child=node[id];
if(child.children){
walk(child.children,depth+1);
}else{

chainCount++;
}
},'');
}

const flattenedChains=CriticalRequestChains.flattenRequests(chains);


const initialNavKey=Object.keys(flattenedChains)[0];
const initialNavChildren=initialNavKey&&flattenedChains[initialNavKey].children;
if(initialNavChildren&&Object.keys(initialNavChildren).length>0){
walk(initialNavChildren,0);
}

const longestChain=CriticalRequestChains._getLongestChain(flattenedChains);

return{
score:Number(chainCount===0),
notApplicable:chainCount===0,
displayValue:chainCount?str_(UIStrings.displayValue,{itemCount:chainCount}):'',
extendedInfo:{
value:{
chains:flattenedChains,
longestChain}},


details:{
type:'criticalrequestchain',
chains:flattenedChains,
longestChain}};


});
}}


module.exports=CriticalRequestChains;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/critical-request-chains.js");
},{"../computed/critical-request-chains.js":9,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/deprecations":[function(require,module,exports){
(function(__filename){





'use strict';







const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Avoids deprecated APIs',

failureTitle:'Uses deprecated APIs',

description:'Deprecated APIs will eventually be removed from the browser. '+
'[Learn more](https://web.dev/deprecations).',

displayValue:`{itemCount, plural,
    =1 {1 warning found}
    other {# warnings found}
    }`,

columnDeprecate:'Deprecation / Warning',

columnLine:'Line'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Deprecations extends Audit{



static get meta(){
return{
id:'deprecations',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ConsoleMessages']};

}





static audit(artifacts){
const entries=artifacts.ConsoleMessages;

const deprecations=entries.filter(log=>log.entry.source==='deprecation').map(log=>{
return{
value:log.entry.text,
url:log.entry.url||'',
source:log.entry.source,
lineNumber:log.entry.lineNumber};

});


const headings=[
{key:'value',itemType:'text',text:str_(UIStrings.columnDeprecate)},
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'lineNumber',itemType:'text',text:str_(UIStrings.columnLine)}];

const details=Audit.makeTableDetails(headings,deprecations);

let displayValue='';
if(deprecations.length>0){
displayValue=str_(UIStrings.displayValue,{itemCount:deprecations.length});
}

return{
score:Number(deprecations.length===0),
displayValue,
extendedInfo:{
value:deprecations},

details};

}}


module.exports=Deprecations;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/deprecations.js");
},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/diagnostics":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const MainThreadTasksComputed=require('../computed/main-thread-tasks.js');
const NetworkRecordsComputed=require('../computed/network-records.js');
const NetworkAnalysisComputed=require('../computed/network-analysis.js');
const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');

class Diagnostics extends Audit{



static get meta(){
return{
id:'diagnostics',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:'Diagnostics',
description:'Collection of useful page vitals.',
requiredArtifacts:['traces','devtoolsLogs']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const tasks=await MainThreadTasksComputed.request(trace,context);
const records=await NetworkRecordsComputed.request(devtoolsLog,context);
const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);

const toplevelTasks=tasks.filter(t=>!t.parent);
const mainDocumentTransferSize=NetworkAnalyzer.findMainDocument(records).transferSize;
const totalByteWeight=records.reduce((sum,r)=>sum+(r.transferSize||0),0);
const totalTaskTime=toplevelTasks.reduce((sum,t)=>sum+(t.duration||0),0);
const maxRtt=Math.max(...analysis.additionalRttByOrigin.values())+analysis.rtt;
const maxServerLatency=Math.max(...analysis.serverResponseTimeByOrigin.values());

const diagnostics={
numRequests:records.length,
numScripts:records.filter(r=>r.resourceType==='Script').length,
numStylesheets:records.filter(r=>r.resourceType==='Stylesheet').length,
numFonts:records.filter(r=>r.resourceType==='Font').length,
numTasks:toplevelTasks.length,
numTasksOver10ms:toplevelTasks.filter(t=>t.duration>10).length,
numTasksOver25ms:toplevelTasks.filter(t=>t.duration>25).length,
numTasksOver50ms:toplevelTasks.filter(t=>t.duration>50).length,
numTasksOver100ms:toplevelTasks.filter(t=>t.duration>100).length,
numTasksOver500ms:toplevelTasks.filter(t=>t.duration>500).length,
rtt:analysis.rtt,
throughput:analysis.throughput,
maxRtt,
maxServerLatency,
totalByteWeight,
totalTaskTime,
mainDocumentTransferSize};


return{
score:1,
details:{
type:'debugdata',

items:[diagnostics]}};


}}


module.exports=Diagnostics;

},{"../computed/main-thread-tasks.js":12,"../computed/network-analysis.js":33,"../computed/network-records.js":34,"../lib/dependency-graph/simulator/network-analyzer.js":62,"./audit.js":3}],"../audits/dobetterweb/appcache-manifest":[function(require,module,exports){
(function(__filename){










'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Avoids Application Cache',

failureTitle:'Uses Application Cache',

description:'Application Cache is deprecated. '+
'[Learn more](https://web.dev/appcache-manifest).',




displayValue:'Found "{AppCacheManifest}"'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class AppCacheManifestAttr extends Audit{



static get meta(){
return{
id:'appcache-manifest',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['AppCacheManifest']};

}





static audit(artifacts){

if(artifacts.AppCacheManifest!==null){
return{
score:0,
displayValue:str_(UIStrings.displayValue,{AppCacheManifest:artifacts.AppCacheManifest})};

}

return{
score:1};

}}


module.exports=AppCacheManifestAttr;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/appcache-manifest.js");
},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/doctype":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Page has the HTML doctype',

failureTitle:'Page lacks the HTML doctype, thus triggering quirks-mode',

description:'Specifying a doctype prevents the browser '+
'from switching to quirks-mode. '+
'[Learn more](https://web.dev/doctype).',

explanationNoDoctype:'Document must contain a doctype',

explanationPublicId:'Expected publicId to be an empty string',

explanationSystemId:'Expected systemId to be an empty string',

explanationBadDoctype:'Doctype name must be the lowercase string `html`'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Doctype extends Audit{



static get meta(){
return{
id:'doctype',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Doctype']};

}





static audit(artifacts){
if(!artifacts.Doctype){
return{
score:0,
explanation:str_(UIStrings.explanationNoDoctype)};

}


const doctypeName=artifacts.Doctype.name.trim();
const doctypePublicId=artifacts.Doctype.publicId;
const doctypeSystemId=artifacts.Doctype.systemId;

if(doctypePublicId!==''){
return{
score:0,
explanation:str_(UIStrings.explanationPublicId)};

}

if(doctypeSystemId!==''){
return{
score:0,
explanation:str_(UIStrings.explanationSystemId)};

}




if(doctypeName==='html'){
return{
score:1};

}else{
return{
score:0,
explanation:str_(UIStrings.explanationBadDoctype)};

}
}}


module.exports=Doctype;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/doctype.js");
},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/dom-size":[function(require,module,exports){
(function(__filename){












'use strict';

const Audit=require('../audit.js');
const Util=require('../../report/html/renderer/util.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Avoids an excessive DOM size',

failureTitle:'Avoid an excessive DOM size',

description:'A large DOM will increase memory usage, cause longer '+
'[style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), '+
'and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://web.dev/dom-size).',

columnStatistic:'Statistic',

columnElement:'Element',

columnValue:'Value',

displayValue:`{itemCount, plural,
    =1 {1 element}
    other {# elements}
    }`,

statisticDOMElements:'Total DOM Elements',

statisticDOMDepth:'Maximum DOM Depth',

statisticDOMWidth:'Maximum Child Elements'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


class DOMSize extends Audit{



static get meta(){
return{
id:'dom-size',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['DOMStats']};

}




static get defaultOptions(){
return{



scorePODR:700,
scoreMedian:1400};

}







static audit(artifacts,context){
const stats=artifacts.DOMStats;

const score=Audit.computeLogNormalScore(
stats.totalBodyElements,
context.options.scorePODR,
context.options.scoreMedian);



const headings=[
{key:'statistic',itemType:'text',text:str_(UIStrings.columnStatistic)},
{key:'element',itemType:'code',text:str_(UIStrings.columnElement)},
{key:'value',itemType:'numeric',text:str_(UIStrings.columnValue)}];



const items=[
{
statistic:str_(UIStrings.statisticDOMElements),
element:'',
value:Util.formatNumber(stats.totalBodyElements)},

{
statistic:str_(UIStrings.statisticDOMDepth),
element:{
type:'code',
value:stats.depth.snippet},

value:Util.formatNumber(stats.depth.max)},

{
statistic:str_(UIStrings.statisticDOMWidth),
element:{
type:'code',
value:stats.width.snippet},

value:Util.formatNumber(stats.width.max)}];



return{
score,
numericValue:stats.totalBodyElements,
displayValue:str_(UIStrings.displayValue,{itemCount:stats.totalBodyElements}),
extendedInfo:{
value:items},

details:Audit.makeTableDetails(headings,items)};

}}


module.exports=DOMSize;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/dom-size.js");
},{"../../lib/i18n/i18n.js":66,"../../report/html/renderer/util.js":87,"../audit.js":3}],"../audits/dobetterweb/external-anchors-use-rel-noopener":[function(require,module,exports){
(function(__filename){





'use strict';

const URL=require('../../lib/url-shim.js');
const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Links to cross-origin destinations are safe',

failureTitle:'Links to cross-origin destinations are unsafe',

description:'Add `rel="noopener"` or `rel="noreferrer"` to any external links to improve '+
'performance and prevent security vulnerabilities. '+
'[Learn more](https://web.dev/external-anchors-use-rel-noopener).',




warning:'Unable to determine the destination for anchor ({anchorHTML}). '+
'If not used as a hyperlink, consider removing target=_blank.',

columnTarget:'Target',

columnRel:'Rel'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ExternalAnchorsUseRelNoopenerAudit extends Audit{



static get meta(){
return{
id:'external-anchors-use-rel-noopener',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['URL','AnchorElements']};

}





static audit(artifacts){

const warnings=[];
const pageHost=new URL(artifacts.URL.finalUrl).host;
const failingAnchors=artifacts.AnchorElements.
filter(anchor=>anchor.target==='_blank'&&!anchor.rel.includes('noopener')&&
!anchor.rel.includes('noreferrer')).

filter(anchor=>{
try{
return new URL(anchor.href).host!==pageHost;
}catch(err){
warnings.push(str_(UIStrings.warning,{anchorHTML:anchor.outerHTML}));
return true;
}
}).
filter(anchor=>{
return!anchor.href||anchor.href.toLowerCase().startsWith('http');
}).
map(anchor=>{
return{
href:anchor.href||'Unknown',
target:anchor.target||'',
rel:anchor.rel||'',
outerHTML:anchor.outerHTML||''};

});


const headings=[
{key:'href',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'target',itemType:'text',text:str_(UIStrings.columnTarget)},
{key:'rel',itemType:'text',text:str_(UIStrings.columnRel)}];


const details=Audit.makeTableDetails(headings,failingAnchors);

return{
score:Number(failingAnchors.length===0),
extendedInfo:{
value:failingAnchors},

details,
warnings};

}}


module.exports=ExternalAnchorsUseRelNoopenerAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/dobetterweb/geolocation-on-start":[function(require,module,exports){
(function(__filename){











'use strict';

const ViolationAudit=require('../violation-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Avoids requesting the geolocation permission on page load',

failureTitle:'Requests the geolocation permission on page load',

description:'Users are mistrustful of or confused by sites that request their '+
'location without context. Consider tying the request to a user action instead. '+
'[Learn more](https://web.dev/geolocation-on-start).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class GeolocationOnStart extends ViolationAudit{



static get meta(){
return{
id:'geolocation-on-start',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ConsoleMessages']};

}





static audit(artifacts){

const results=ViolationAudit.getViolationResults(artifacts,/geolocation/);


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];



const details=ViolationAudit.makeTableDetails(headings,results);

return{
score:Number(results.length===0),
extendedInfo:{
value:results},

details};

}}


module.exports=GeolocationOnStart;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/geolocation-on-start.js");
},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/js-libraries":[function(require,module,exports){
(function(__filename){










'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Detected JavaScript libraries',

description:'All front-end JavaScript libraries detected on the page. [Learn more](https://web.dev/js-libraries).',

columnVersion:'Version'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class JsLibrariesAudit extends Audit{



static get meta(){
return{
id:'js-libraries',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
requiredArtifacts:['Stacks']};

}





static audit(artifacts){
const libDetails=artifacts.Stacks.
filter(stack=>stack.detector==='js').
map(stack=>({
name:stack.name,
version:stack.version,
npm:stack.npm}));



const headings=[
{key:'name',itemType:'text',text:str_(i18n.UIStrings.columnName)},
{key:'version',itemType:'text',text:str_(UIStrings.columnVersion)}];

const details=Audit.makeTableDetails(headings,libDetails,{});

return{
score:1,
details};

}}


module.exports=JsLibrariesAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/js-libraries.js");
},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/no-document-write":[function(require,module,exports){
(function(__filename){




























'use strict';

const ViolationAudit=require('../violation-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Avoids `document.write()`',

failureTitle:'Uses `document.write()`',

description:'For users on slow connections, external scripts dynamically injected via '+
'`document.write()` can delay page load by tens of seconds. '+
'[Learn more](https://web.dev/no-document-write).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class NoDocWriteAudit extends ViolationAudit{



static get meta(){
return{
id:'no-document-write',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ConsoleMessages']};

}





static audit(artifacts){
const results=ViolationAudit.getViolationResults(artifacts,/document\.write/);


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];


const details=ViolationAudit.makeTableDetails(headings,results);

return{
score:Number(results.length===0),
extendedInfo:{
value:results},

details};

}}


module.exports=NoDocWriteAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/no-document-write.js");
},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/no-vulnerable-libraries":[function(require,module,exports){
(function(__filename){












'use strict';

const Audit=require('../audit.js');
const Sentry=require('../../lib/sentry.js');
const semver=require('semver');
const snykDatabase=require('../../../third-party/snyk/snapshot.json');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Avoids front-end JavaScript libraries'+
' with known security vulnerabilities',

failureTitle:'Includes front-end JavaScript libraries'+
' with known security vulnerabilities',

description:'Some third-party scripts may contain known security vulnerabilities '+
'that are easily identified and exploited by attackers. '+
'[Learn more](https://web.dev/no-vulnerable-libraries).',

displayValue:`{itemCount, plural,
    =1 {1 vulnerability detected}
    other {# vulnerabilities detected}
    }`,

columnVersion:'Library Version',

columnVuln:'Vulnerability Count',

columnSeverity:'Highest Severity',

rowSeverityLow:'Low',

rowSeverityMedium:'Medium',

rowSeverityHigh:'High'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const SEMVER_REGEX=/^(\d+\.\d+\.\d+)[^-0-9]+/;


const rowMap={
'low':str_(UIStrings.rowSeverityLow),
'medium':str_(UIStrings.rowSeverityMedium),
'high':str_(UIStrings.rowSeverityHigh)};





class NoVulnerableLibrariesAudit extends Audit{



static get meta(){
return{
id:'no-vulnerable-libraries',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Stacks']};

}




static get snykDB(){
return snykDatabase;
}




static get severityMap(){
return{
high:3,
medium:2,
low:1};

}






static normalizeVersion(version){
if(!version)return version;
if(semver.valid(version))return version;


if(/^\d+\.\d+$/.test(version))return`${version}.0`;

const versionMatch=version.match(SEMVER_REGEX);
if(versionMatch)return versionMatch[1];

return version;
}







static getVulnerabilities(normalizedVersion,lib,snykDB){
if(!lib.npm||!snykDB.npm[lib.npm]){
return[];
}


try{
semver.satisfies(normalizedVersion,'*');
}catch(err){
err.pkgName=lib.npm;

Sentry.captureException(err,{level:'warning'});
return[];
}


const vulnCandidatesForLib=snykDB.npm[lib.npm];
const matchingVulns=vulnCandidatesForLib.filter(vulnCandidate=>{


const hasMatchingVersion=vulnCandidate.semver.vulnerable.some(vulnSemverRange=>
semver.satisfies(normalizedVersion,vulnSemverRange));

return hasMatchingVersion;
});

const vulns=matchingVulns.map(vuln=>{
return{
severity:rowMap[vuln.severity],
numericSeverity:this.severityMap[vuln.severity],
library:`${lib.name}@${normalizedVersion}`,
url:'https://snyk.io/vuln/'+vuln.id};

});

return vulns;
}





static highestSeverity(vulnerabilities){
const sortedVulns=vulnerabilities.
sort((a,b)=>b.numericSeverity-a.numericSeverity);
return sortedVulns[0].severity;
}





static audit(artifacts){
const foundLibraries=artifacts.Stacks.filter(stack=>stack.detector==='js');
const snykDB=NoVulnerableLibrariesAudit.snykDB;

if(!foundLibraries.length){
return{
score:1};

}

let totalVulns=0;

const vulnerabilityResults=[];

const libraryVulns=foundLibraries.map(lib=>{
const version=this.normalizeVersion(lib.version)||'';
const vulns=this.getVulnerabilities(version,lib,snykDB);
const vulnCount=vulns.length;
totalVulns+=vulnCount;

let highestSeverity;
if(vulns.length>0){
highestSeverity=this.highestSeverity(vulns);

vulnerabilityResults.push({
highestSeverity,
vulnCount,
detectedLib:{
text:lib.name+'@'+version,
url:`https://snyk.io/vuln/npm:${lib.npm}?lh=${version}&utm_source=lighthouse&utm_medium=ref&utm_campaign=audit`,
type:'link'}});


}

return{
name:lib.name,
npmPkgName:lib.npm,
version,
vulns,
highestSeverity};

});

let displayValue='';
if(totalVulns>0){
displayValue=str_(UIStrings.displayValue,{itemCount:totalVulns});
}


const headings=[
{key:'detectedLib',itemType:'link',text:str_(UIStrings.columnVersion)},
{key:'vulnCount',itemType:'text',text:str_(UIStrings.columnVuln)},
{key:'highestSeverity',itemType:'text',text:str_(UIStrings.columnSeverity)}];

const details=Audit.makeTableDetails(headings,vulnerabilityResults,{});

return{
score:Number(totalVulns===0),
displayValue,
extendedInfo:{
jsLibs:libraryVulns,
vulnerabilities:vulnerabilityResults},

details};

}}


module.exports=NoVulnerableLibrariesAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/no-vulnerable-libraries.js");
},{"../../../third-party/snyk/snapshot.json":199,"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../audit.js":3,"semver":179}],"../audits/dobetterweb/notification-on-start":[function(require,module,exports){
(function(__filename){











'use strict';

const ViolationAudit=require('../violation-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Avoids requesting the notification permission on page load',

failureTitle:'Requests the notification permission on page load',

description:'Users are mistrustful of or confused by sites that request to send '+
'notifications without context. Consider tying the request to user gestures '+
'instead. [Learn more](https://web.dev/notification-on-start).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class NotificationOnStart extends ViolationAudit{



static get meta(){
return{
id:'notification-on-start',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ConsoleMessages']};

}





static audit(artifacts){
const results=ViolationAudit.getViolationResults(artifacts,/notification permission/);


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];


const details=ViolationAudit.makeTableDetails(headings,results);

return{
score:Number(results.length===0),
extendedInfo:{
value:results},

details};

}}


module.exports=NotificationOnStart;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/notification-on-start.js");
},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/password-inputs-can-be-pasted-into":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Allows users to paste into password fields',

failureTitle:'Prevents users to paste into password fields',

description:'Preventing password pasting undermines good security policy. '+
'[Learn more](https://web.dev/password-inputs-can-be-pasted-into).',

columnFailingElem:'Failing Elements'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class PasswordInputsCanBePastedIntoAudit extends Audit{



static get meta(){
return{
id:'password-inputs-can-be-pasted-into',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['PasswordInputsWithPreventedPaste']};

}





static audit(artifacts){
const passwordInputsWithPreventedPaste=artifacts.PasswordInputsWithPreventedPaste;


const items=[];
passwordInputsWithPreventedPaste.forEach(input=>{
items.push({
node:{type:'node',snippet:input.snippet}});

});


const headings=[
{key:'node',itemType:'node',text:str_(UIStrings.columnFailingElem)}];


return{
score:Number(passwordInputsWithPreventedPaste.length===0),
extendedInfo:{
value:passwordInputsWithPreventedPaste},

details:Audit.makeTableDetails(headings,items)};

}}


module.exports=PasswordInputsCanBePastedIntoAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/password-inputs-can-be-pasted-into.js");
},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/uses-http2":[function(require,module,exports){
(function(__filename){











'use strict';

const URL=require('../../lib/url-shim.js');
const Audit=require('../audit.js');
const NetworkRecords=require('../../computed/network-records.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Uses HTTP/2 for its own resources',

failureTitle:'Does not use HTTP/2 for all of its resources',

description:'HTTP/2 offers many benefits over HTTP/1.1, including binary headers, '+
'multiplexing, and server push. [Learn more](https://web.dev/uses-http2).',

displayValue:`{itemCount, plural,
    =1 {1 request not served via HTTP/2}
    other {# requests not served via HTTP/2}
    }`,

columnProtocol:'Protocol'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class UsesHTTP2Audit extends Audit{



static get meta(){
return{
id:'uses-http2',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['URL','devtoolsLogs']};

}






static audit(artifacts,context){
const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
return NetworkRecords.request(devtoolsLogs,context).then(networkRecords=>{
const finalHost=new URL(artifacts.URL.finalUrl).host;

const seenURLs=new Set();

const resources=networkRecords.filter(record=>{


if(record.fetchedViaServiceWorker)return false;

const isOldHttp=/HTTP\/[01][.\d]?/i.test(record.protocol);
if(!isOldHttp)return false;
const requestHost=new URL(record.url).host;
return requestHost===finalHost;
}).map(record=>{
return{
protocol:record.protocol,
url:record.url};

}).filter(record=>{
if(seenURLs.has(record.url))return false;
seenURLs.add(record.url);
return true;
});

let displayValue='';
if(resources.length>0){
displayValue=str_(UIStrings.displayValue,{itemCount:resources.length});
}


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'protocol',itemType:'text',text:str_(UIStrings.columnProtocol)}];

const details=Audit.makeTableDetails(headings,resources);

return{
score:Number(resources.length===0),
displayValue:displayValue,
extendedInfo:{
value:{
results:resources}},


details};

});
}}


module.exports=UsesHTTP2Audit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/uses-http2.js");
},{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/dobetterweb/uses-passive-event-listeners":[function(require,module,exports){
(function(__filename){











'use strict';

const ViolationAudit=require('../violation-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Uses passive listeners to improve scrolling performance',

failureTitle:'Does not use passive listeners to improve scrolling performance',

description:'Consider marking your touch and wheel event listeners as `passive` '+
'to improve your page\'s scroll performance. '+
'[Learn more](https://web.dev/uses-passive-event-listeners).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class PassiveEventsAudit extends ViolationAudit{



static get meta(){
return{
id:'uses-passive-event-listeners',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ConsoleMessages']};

}





static audit(artifacts){
const results=ViolationAudit.getViolationResults(artifacts,/passive event listener/);


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];


const details=ViolationAudit.makeTableDetails(headings,results);

return{
score:Number(results.length===0),
extendedInfo:{
value:results},

details};

}}


module.exports=PassiveEventsAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js");
},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/errors-in-console":[function(require,module,exports){
(function(__filename){





'use strict';






const log=require('lighthouse-logger');
const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'No browser errors logged to the console',

failureTitle:'Browser errors were logged to the console',

description:'Errors logged to the console indicate unresolved problems. '+
'They can come from network request failures and other browser concerns. '+
'[Learn more](https://web.dev/errors-in-console)',

columnDesc:'Description'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);



class ErrorLogs extends Audit{



static get meta(){
return{
id:'errors-in-console',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ConsoleMessages','RuntimeExceptions']};

}


static defaultOptions(){
return{};
}








static filterAccordingToOptions(items,options){
const{ignoredPatterns,...restOfOptions}=options;
const otherOptionKeys=Object.keys(restOfOptions);
if(otherOptionKeys.length)log.warn(this.meta.id,'Unrecognized options',otherOptionKeys);
if(!ignoredPatterns)return items;

return items.filter(({description})=>{
if(!description)return true;
for(const pattern of ignoredPatterns){
if(pattern instanceof RegExp&&pattern.test(description))return false;
if(typeof pattern==='string'&&description.includes(pattern))return false;
}

return true;
});
}






static audit(artifacts,context){
const auditOptions=context.options;

const consoleEntries=artifacts.ConsoleMessages;
const runtimeExceptions=artifacts.RuntimeExceptions;

const consoleRows=
consoleEntries.filter(log=>log.entry&&log.entry.level==='error').
map(item=>{
return{
source:item.entry.source,
description:item.entry.text,
url:item.entry.url};

});

const runtimeExRows=
runtimeExceptions.filter(entry=>entry.exceptionDetails!==undefined).
map(entry=>{
const description=entry.exceptionDetails.exception?
entry.exceptionDetails.exception.description:entry.exceptionDetails.text;

return{
source:'Runtime.exception',
description,
url:entry.exceptionDetails.url};

});

const tableRows=ErrorLogs.filterAccordingToOptions(
consoleRows.concat(runtimeExRows),
auditOptions).
sort((a,b)=>(a.description||'').localeCompare(b.description||''));


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'description',itemType:'code',text:str_(UIStrings.columnDesc)}];


const details=Audit.makeTableDetails(headings,tableRows);
const numErrors=tableRows.length;

return{
score:Number(numErrors===0),
numericValue:numErrors,
details};

}}


module.exports=ErrorLogs;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/errors-in-console.js");
},{"../lib/i18n/i18n.js":66,"./audit.js":3,"lighthouse-logger":125}],"../audits/final-screenshot":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const LHError=require('../lib/lh-error.js');
const TraceOfTab=require('../computed/trace-of-tab.js');
const Screenshots=require('../computed/screenshots.js');

class FinalScreenshot extends Audit{



static get meta(){
return{
id:'final-screenshot',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:'Final Screenshot',
description:'The last screenshot captured of the pageload.',
requiredArtifacts:['traces']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const traceOfTab=await TraceOfTab.request(trace,context);
const screenshots=await Screenshots.request(trace,context);
const{navigationStart}=traceOfTab.timestamps;
const finalScreenshot=screenshots[screenshots.length-1];

if(!finalScreenshot){
throw new LHError(LHError.errors.NO_SCREENSHOTS);
}

return{
score:1,
details:{
type:'screenshot',
timing:Math.round((finalScreenshot.timestamp-navigationStart)/1000),
timestamp:finalScreenshot.timestamp,
data:finalScreenshot.datauri}};


}}


module.exports=FinalScreenshot;

},{"../computed/screenshots.js":37,"../computed/trace-of-tab.js":39,"../lib/lh-error.js":71,"./audit.js":3}],"../audits/font-display":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const URL=require('../lib/url-shim.js');
const PASSING_FONT_DISPLAY_REGEX=/^(block|fallback|optional|swap)$/;
const CSS_URL_REGEX=/url\((.*?)\)/;
const CSS_URL_GLOBAL_REGEX=new RegExp(CSS_URL_REGEX,'g');
const i18n=require('../lib/i18n/i18n.js');
const Sentry=require('../lib/sentry.js');
const NetworkRecords=require('../computed/network-records.js');

const UIStrings={

title:'All text remains visible during webfont loads',

failureTitle:'Ensure text remains visible during webfont load',

description:
'Leverage the font-display CSS feature to ensure text is user-visible while '+
'webfonts are loading. '+
'[Learn more](https://web.dev/font-display).',




undeclaredFontURLWarning:'Lighthouse was unable to automatically check the font-display value '+
'for the following URL: {fontURL}.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class FontDisplay extends Audit{



static get meta(){
return{
id:'font-display',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','CSSUsage','URL']};

}





static findFontDisplayDeclarations(artifacts){

const passingURLs=new Set();

const failingURLs=new Set();


for(const stylesheet of artifacts.CSSUsage.stylesheets){

const newlinesStripped=stylesheet.content.replace(/(\r|\n)+/g,' ');

const fontFaceDeclarations=newlinesStripped.match(/@font-face\s*{(.*?)}/g)||[];

for(const declaration of fontFaceDeclarations){

const rawFontURLs=declaration.match(CSS_URL_GLOBAL_REGEX);

if(!rawFontURLs)continue;


const fontDisplayMatch=declaration.match(/font-display\s*:\s*(\w+)\s*(;|\})/);
const rawFontDisplay=fontDisplayMatch&&fontDisplayMatch[1]||'';
const hasPassingFontDisplay=PASSING_FONT_DISPLAY_REGEX.test(rawFontDisplay);
const targetURLSet=hasPassingFontDisplay?passingURLs:failingURLs;


const relativeURLs=rawFontURLs.

map(s=>s.match(CSS_URL_REGEX)[1].trim()).
map(s=>{

if(/^('|").*\1$/.test(s)){
return s.substr(1,s.length-2);
}

return s;
});


for(const relativeURL of relativeURLs){
try{
const relativeRoot=URL.isValid(stylesheet.header.sourceURL)?
stylesheet.header.sourceURL:artifacts.URL.finalUrl;
const absoluteURL=new URL(relativeURL,relativeRoot);
targetURLSet.add(absoluteURL.href);
}catch(err){
Sentry.captureException(err,{tags:{audit:this.meta.id}});
}
}
}
}

return{passingURLs,failingURLs};
}






static async audit(artifacts,context){
const devtoolsLogs=artifacts.devtoolsLogs[this.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
const{passingURLs,failingURLs}=FontDisplay.findFontDisplayDeclarations(artifacts);

const warningURLs=[];

const results=networkRecords.

filter(record=>record.resourceType==='Font').

filter(record=>!/^data:/.test(record.url)).
filter(record=>!/^blob:/.test(record.url)).

filter(record=>{

if(failingURLs.has(record.url))return true;

if(!passingURLs.has(record.url))warningURLs.push(record.url);
return false;
}).
map(record=>{


const wastedMs=Math.min((record.endTime-record.startTime)*1000,3000);

return{
url:record.url,
wastedMs};

});


const headings=[
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'wastedMs',itemType:'ms',text:str_(i18n.UIStrings.columnWastedMs)}];


const details=Audit.makeTableDetails(headings,results);

return{
score:Number(results.length===0),
details,
warnings:warningURLs.map(fontURL=>str_(UIStrings.undeclaredFontURLWarning,{fontURL}))};

}}


module.exports=FontDisplay;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/font-display.js");
},{"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/sentry.js":78,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/image-aspect-ratio":[function(require,module,exports){
(function(__filename){











'use strict';

const Audit=require('./audit.js');
const URL=require('../lib/url-shim.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Displays images with correct aspect ratio',

failureTitle:'Displays images with incorrect aspect ratio',

description:'Image display dimensions should match natural aspect ratio. '+
'[Learn more](https://web.dev/image-aspect-ratio).',




warningCompute:'Invalid image sizing information {url}',

columnDisplayed:'Aspect Ratio (Displayed)',

columnActual:'Aspect Ratio (Actual)'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const THRESHOLD_PX=2;



class ImageAspectRatio extends Audit{



static get meta(){
return{
id:'image-aspect-ratio',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ImageElements']};

}





static computeAspectRatios(image){
const url=URL.elideDataURI(image.src);
const actualAspectRatio=image.naturalWidth/image.naturalHeight;
const displayedAspectRatio=image.displayedWidth/image.displayedHeight;

const targetDisplayHeight=image.displayedWidth/actualAspectRatio;
const doRatiosMatch=Math.abs(targetDisplayHeight-image.displayedHeight)<THRESHOLD_PX;

if(!Number.isFinite(actualAspectRatio)||
!Number.isFinite(displayedAspectRatio)){
return new Error(str_(UIStrings.warningCompute,{url}));
}

return{
url,
displayedAspectRatio:`${image.displayedWidth} x ${image.displayedHeight}
        (${displayedAspectRatio.toFixed(2)})`,
actualAspectRatio:`${image.naturalWidth} x ${image.naturalHeight}
        (${actualAspectRatio.toFixed(2)})`,
doRatiosMatch};

}





static audit(artifacts){
const images=artifacts.ImageElements;


const warnings=[];

const results=[];
images.filter(image=>{





return!image.isCss&&
image.mimeType&&
image.mimeType!=='image/svg+xml'&&
image.naturalHeight>5&&
image.naturalWidth>5&&
image.displayedWidth&&
image.displayedHeight&&
!image.usesObjectFit;
}).forEach(image=>{
const wellDefinedImage=image;
const processed=ImageAspectRatio.computeAspectRatios(wellDefinedImage);
if(processed instanceof Error){
warnings.push(processed.message);
return;
}

if(!processed.doRatiosMatch)results.push(processed);
});


const headings=[
{key:'url',itemType:'thumbnail',text:''},
{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
{key:'displayedAspectRatio',itemType:'text',text:str_(UIStrings.columnDisplayed)},
{key:'actualAspectRatio',itemType:'text',text:str_(UIStrings.columnActual)}];


return{
score:Number(results.length===0),
warnings,
details:Audit.makeTableDetails(headings,results)};

}}


module.exports=ImageAspectRatio;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/image-aspect-ratio.js");
},{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/installable-manifest":[function(require,module,exports){
(function(__filename){





'use strict';

const MultiCheckAudit=require('./multi-check-audit.js');
const ManifestValues=require('../computed/manifest-values.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Web app manifest meets the installability requirements',

failureTitle:'Web app manifest does not meet the installability requirements',

description:'Browsers can proactively prompt users to add your app to their homescreen, '+
'which can lead to higher engagement. '+
'[Learn more](https://web.dev/installable-manifest).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);















class InstallableManifest extends MultiCheckAudit{



static get meta(){
return{
id:'installable-manifest',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['URL','WebAppManifest']};

}





static assessManifest(manifestValues){
if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
return[manifestValues.parseFailureReason];
}


const failures=[];
const bannerCheckIds=[
'hasName',






'hasShortName',
'hasStartUrl',
'hasPWADisplayValue',
'hasIconsAtLeast192px'];

manifestValues.allChecks.
filter(item=>bannerCheckIds.includes(item.id)).
forEach(item=>{
if(!item.passing){
failures.push(item.failureText);
}
});

return failures;
}






static async audit_(artifacts,context){
const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
const manifestFailures=InstallableManifest.assessManifest(manifestValues);

return{
failures:[
...manifestFailures],

manifestValues};

}}


module.exports=InstallableManifest;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/installable-manifest.js");
},{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6}],"../audits/is-on-https":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const URL=require('../lib/url-shim.js');
const NetworkRecords=require('../computed/network-records.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Uses HTTPS',

failureTitle:'Does not use HTTPS',

description:'All sites should be protected with HTTPS, even ones that don\'t handle '+
'sensitive data. HTTPS prevents intruders from tampering with or passively listening '+
'in on the communications between your app and your users, and is a prerequisite for '+
'HTTP/2 and many new web platform APIs. '+
'[Learn more](https://web.dev/is-on-https).',

displayValue:`{itemCount, plural,
    =1 {1 insecure request found}
    other {# insecure requests found}
    }`,

columnInsecureURL:'Insecure URL'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];
const SECURE_DOMAINS=['localhost','127.0.0.1'];

class HTTPS extends Audit{



static get meta(){
return{
id:'is-on-https',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs']};

}





static isSecureRecord(record){
return SECURE_SCHEMES.includes(record.parsedURL.scheme)||
SECURE_SCHEMES.includes(record.protocol)||
SECURE_DOMAINS.includes(record.parsedURL.host);
}






static audit(artifacts,context){
const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
return NetworkRecords.request(devtoolsLogs,context).then(networkRecords=>{
const insecureURLs=networkRecords.
filter(record=>!HTTPS.isSecureRecord(record)).
map(record=>URL.elideDataURI(record.url));

const items=Array.from(new Set(insecureURLs)).map(url=>({url}));

let displayValue='';
if(items.length>0){
displayValue=str_(UIStrings.displayValue,{itemCount:items.length});
}


const headings=[
{key:'url',itemType:'url',text:str_(UIStrings.columnInsecureURL)}];


return{
score:Number(items.length===0),
displayValue,
extendedInfo:{
value:items},

details:Audit.makeTableDetails(headings,items)};

});
}}


module.exports=HTTPS;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/is-on-https.js");
},{"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/load-fast-enough-for-pwa":[function(require,module,exports){
(function(__filename){





'use strict';







const isDeepEqual=require('lodash.isequal');
const Audit=require('./audit.js');
const mobileThrottling=require('../config/constants.js').throttling.mobileSlow4G;
const Interactive=require('../computed/metrics/interactive.js');
const i18n=require('../lib/i18n/i18n.js');



const MAXIMUM_TTI=10*1000;

const UIStrings={

title:'Page load is fast enough on mobile networks',

failureTitle:'Page load is not fast enough on mobile networks',

description:'A fast page load over a cellular network ensures a good mobile user experience. [Learn more](https://web.dev/load-fast-enough-for-pwa).',

displayValueText:'Interactive at {timeInMs, number, seconds}\xa0s',

displayValueTextWithOverride:'Interactive on simulated mobile network at '+
'{timeInMs, number, seconds}\xa0s',

explanationLoadSlow:'Your page loads too slowly and is not interactive within 10 seconds. '+
'Look at the opportunities and diagnostics in the "Performance" section to learn how to '+
'improve.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class LoadFastEnough4Pwa extends Audit{



static get meta(){
return{
id:'load-fast-enough-for-pwa',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['traces','devtoolsLogs']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];



const settingOverrides={throttlingMethod:'simulate',throttling:mobileThrottling};



const override=context.settings.throttlingMethod==='provided'||
!isDeepEqual(context.settings.throttling,mobileThrottling);

const displayValueTemplate=override?
UIStrings.displayValueTextWithOverride:UIStrings.displayValueText;

const settings=override?Object.assign({},context.settings,settingOverrides):
context.settings;

const metricComputationData={trace,devtoolsLog,settings};
const tti=await Interactive.request(metricComputationData,context);

const score=Number(tti.timing<MAXIMUM_TTI);


let displayValue;

let explanation;
if(!score){
displayValue=str_(displayValueTemplate,{timeInMs:tti.timing});
explanation=str_(UIStrings.explanationLoadSlow);
}

return{
score,
displayValue,
explanation,
numericValue:tti.timing};

}}


module.exports=LoadFastEnough4Pwa;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/load-fast-enough-for-pwa.js");
},{"../computed/metrics/interactive.js":18,"../config/constants.js":46,"../lib/i18n/i18n.js":66,"./audit.js":3,"lodash.isequal":142}],"../audits/main-thread-tasks":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const MainThreadTasksComputed=require('../computed/main-thread-tasks.js');

class MainThreadTasks extends Audit{



static get meta(){
return{
id:'main-thread-tasks',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:'Tasks',
description:'Lists the toplevel main thread tasks that executed during page load.',
requiredArtifacts:['traces']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const tasks=await MainThreadTasksComputed.request(trace,context);

const results=tasks.

filter(task=>task.duration>5&&!task.parent).
map(task=>{
return{
duration:task.duration,
startTime:task.startTime};

});


const headings=[
{key:'startTime',itemType:'ms',granularity:1,text:'Start Time'},
{key:'duration',itemType:'ms',granularity:1,text:'End Time'}];


const tableDetails=Audit.makeTableDetails(headings,results);

return{
score:1,
numericValue:results.length,
details:tableDetails};

}}


module.exports=MainThreadTasks;

},{"../computed/main-thread-tasks.js":12,"./audit.js":3}],"../audits/mainthread-work-breakdown":[function(require,module,exports){
(function(__filename){










'use strict';

const Audit=require('./audit.js');
const{taskGroups}=require('../lib/tracehouse/task-groups.js');
const i18n=require('../lib/i18n/i18n.js');
const MainThreadTasks=require('../computed/main-thread-tasks.js');

const UIStrings={

title:'Minimizes main-thread work',

failureTitle:'Minimize main-thread work',

description:'Consider reducing the time spent parsing, compiling and executing JS. '+
'You may find delivering smaller JS payloads helps with this. '+
'[Learn more](https://web.dev/mainthread-work-breakdown)',

columnCategory:'Category'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);



class MainThreadWorkBreakdown extends Audit{



static get meta(){
return{
id:'mainthread-work-breakdown',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces']};

}




static get defaultOptions(){
return{

scorePODR:1500,
scoreMedian:4000};

}





static getExecutionTimingsByGroup(tasks){

const result=new Map();

for(const task of tasks){
const originalTime=result.get(task.group.id)||0;
result.set(task.group.id,originalTime+task.selfTime);
}

return result;
}






static async audit(artifacts,context){
const settings=context.settings||{};
const trace=artifacts.traces[MainThreadWorkBreakdown.DEFAULT_PASS];

const tasks=await MainThreadTasks.request(trace,context);
const multiplier=settings.throttlingMethod==='simulate'?
settings.throttling.cpuSlowdownMultiplier:1;

const executionTimings=MainThreadWorkBreakdown.getExecutionTimingsByGroup(tasks);

let totalExecutionTime=0;

const categoryTotals={};
const results=Array.from(executionTimings).map(([groupId,rawDuration])=>{
const duration=rawDuration*multiplier;
totalExecutionTime+=duration;

const categoryTotal=categoryTotals[groupId]||0;
categoryTotals[groupId]=categoryTotal+duration;

return{
group:groupId,
groupLabel:taskGroups[groupId].label,
duration:duration};

});


const headings=[
{key:'groupLabel',itemType:'text',text:str_(UIStrings.columnCategory)},
{key:'duration',itemType:'ms',granularity:1,text:str_(i18n.UIStrings.columnTimeSpent)}];


results.sort((a,b)=>categoryTotals[b.group]-categoryTotals[a.group]);
const tableDetails=MainThreadWorkBreakdown.makeTableDetails(headings,results);

const score=Audit.computeLogNormalScore(
totalExecutionTime,
context.options.scorePODR,
context.options.scoreMedian);


return{
score,
numericValue:totalExecutionTime,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:totalExecutionTime}),
details:tableDetails};

}}


module.exports=MainThreadWorkBreakdown;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/mainthread-work-breakdown.js");
},{"../computed/main-thread-tasks.js":12,"../lib/i18n/i18n.js":66,"../lib/tracehouse/task-groups.js":84,"./audit.js":3}],"../audits/manual/pwa-cross-browser":[function(require,module,exports){
(function(__filename){






'use strict';

const ManualAudit=require('./manual-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Site works cross-browser',

description:'To reach the most number of users, sites should work across '+
'every major browser. [Learn more](https://web.dev/pwa-cross-browser).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





class PWACrossBrowser extends ManualAudit{



static get meta(){
return Object.assign({
id:'pwa-cross-browser',
title:str_(UIStrings.title),
description:str_(UIStrings.description)},
super.partialMeta);
}}


module.exports=PWACrossBrowser;
module.exports.UIStrings=UIStrings;


}).call(this,"/lighthouse-core/audits/manual/pwa-cross-browser.js");
},{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/manual/pwa-each-page-has-url":[function(require,module,exports){
(function(__filename){





'use strict';

const ManualAudit=require('./manual-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Each page has a URL',

description:'Ensure individual pages are deep linkable via URL and that URLs are '+
'unique for the purpose of shareability on social media. [Learn more](https://web.dev/pwa-each-page-has-url).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





class PWAEachPageHasURL extends ManualAudit{



static get meta(){
return Object.assign({
id:'pwa-each-page-has-url',
title:str_(UIStrings.title),
description:str_(UIStrings.description)},
super.partialMeta);
}}


module.exports=PWAEachPageHasURL;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/manual/pwa-each-page-has-url.js");
},{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/manual/pwa-page-transitions":[function(require,module,exports){
(function(__filename){





'use strict';

const ManualAudit=require('./manual-audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Page transitions don\'t feel like they block on the network',

description:'Transitions should feel snappy as you tap around, even on a slow network. '+
'This experience is key to a user\'s perception of performance. [Learn more](https://web.dev/pwa-page-transitions).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





class PWAPageTransitions extends ManualAudit{



static get meta(){
return Object.assign({
id:'pwa-page-transitions',
title:str_(UIStrings.title),
description:str_(UIStrings.description)},
super.partialMeta);
}}


module.exports=PWAPageTransitions;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/manual/pwa-page-transitions.js");
},{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/metrics/estimated-input-latency":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedEil=require('../../computed/metrics/estimated-input-latency.js');

const UIStrings={

title:'Estimated Input Latency',

description:'Estimated Input Latency is an estimate of how long your app takes to respond to '+
'user input, in milliseconds, during the busiest 5s window of page load. If your '+
'latency is higher than 50 ms, users may perceive your app as laggy. '+
'[Learn more](https://web.dev/estimated-input-latency).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class EstimatedInputLatency extends Audit{



static get meta(){
return{
id:'estimated-input-latency',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{

scorePODR:50,
scoreMedian:100};

}









static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await ComputedEil.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};

}}


module.exports=EstimatedInputLatency;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/estimated-input-latency.js");
},{"../../computed/metrics/estimated-input-latency.js":14,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-contentful-paint-3g":[function(require,module,exports){





'use strict';

const Audit=require('../audit.js');
const regular3G=require('../../config/constants.js').throttling.mobileRegluar3G;
const ComputedFcp=require('../../computed/metrics/first-contentful-paint.js');

class FirstContentfulPaint3G extends Audit{



static get meta(){
return{
id:'first-contentful-paint-3g',
title:'First Contentful Paint (3G)',
description:'First Contentful Paint 3G marks the time at which the first text or image is '+
`painted while on a 3G network. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint).`,
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{


scorePODR:3000,
scoreMedian:6000};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];

const settings={...context.settings,throttlingMethod:'simulate',throttling:regular3G};
const metricComputationData={trace,devtoolsLog,settings};
const metricResult=await ComputedFcp.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:`${metricResult.timing}\xa0ms`};

}}


module.exports=FirstContentfulPaint3G;

},{"../../computed/metrics/first-contentful-paint.js":15,"../../config/constants.js":46,"../audit.js":3}],"../audits/metrics/first-contentful-paint":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedFcp=require('../../computed/metrics/first-contentful-paint.js');

const UIStrings={

title:'First Contentful Paint',

description:'First Contentful Paint marks the time at which the first text or image is '+
`painted. [Learn more](https://web.dev/first-contentful-paint).`};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class FirstContentfulPaint extends Audit{



static get meta(){
return{
id:'first-contentful-paint',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{



scorePODR:2000,
scoreMedian:4000};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await ComputedFcp.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};

}}


module.exports=FirstContentfulPaint;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/first-contentful-paint.js");
},{"../../computed/metrics/first-contentful-paint.js":15,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-cpu-idle":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedFci=require('../../computed/metrics/first-cpu-idle.js');

const UIStrings={

title:'First CPU Idle',

description:'First CPU Idle marks the first time at which the page\'s main thread is '+
'quiet enough to handle input.  [Learn more](https://web.dev/first-cpu-idle).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class FirstCPUIdle extends Audit{



static get meta(){
return{
id:'first-cpu-idle',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{



scorePODR:2900,
scoreMedian:6500};

}









static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await ComputedFci.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};

}}


module.exports=FirstCPUIdle;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/first-cpu-idle.js");
},{"../../computed/metrics/first-cpu-idle.js":16,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-meaningful-paint":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedFmp=require('../../computed/metrics/first-meaningful-paint.js');

const UIStrings={

title:'First Meaningful Paint',

description:'First Meaningful Paint measures when the primary content of a page is '+
'visible. [Learn more](https://web.dev/first-meaningful-paint).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class FirstMeaningfulPaint extends Audit{



static get meta(){
return{
id:'first-meaningful-paint',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{



scorePODR:2000,
scoreMedian:4000};

}









static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await ComputedFmp.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};

}}


module.exports=FirstMeaningfulPaint;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/first-meaningful-paint.js");
},{"../../computed/metrics/first-meaningful-paint.js":17,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/interactive":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const Interactive=require('../../computed/metrics/interactive.js');

const UIStrings={

title:'Time to Interactive',

description:'Time to interactive is the amount of time it takes for the page to become fully '+
'interactive. [Learn more](https://web.dev/interactive).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);







class InteractiveMetric extends Audit{



static get meta(){
return{
id:'interactive',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{



scorePODR:2900,
scoreMedian:7300};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await Interactive.request(metricComputationData,context);
const timeInMs=metricResult.timing;
const extendedInfo={
timeInMs,
timestamp:metricResult.timestamp,

optimistic:metricResult.optimisticEstimate&&metricResult.optimisticEstimate.timeInMs,

pessimistic:metricResult.pessimisticEstimate&&metricResult.pessimisticEstimate.timeInMs};


return{
score:Audit.computeLogNormalScore(
timeInMs,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:timeInMs,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs}),
extendedInfo:{
value:extendedInfo}};


}}


module.exports=InteractiveMetric;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/interactive.js");
},{"../../computed/metrics/interactive.js":18,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/max-potential-fid":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const ComputedFid=require('../../computed/metrics/max-potential-fid.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Max Potential First Input Delay',

description:'The maximum potential First Input Delay that your users could experience is the '+
'duration, in milliseconds, of the longest task. [Learn more](https://developers.google.com/web/updates/2018/05/first-input-delay).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);






class MaxPotentialFID extends Audit{



static get meta(){
return{
id:'max-potential-fid',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{

scorePODR:100,
scoreMedian:250};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await ComputedFid.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};

}}


module.exports=MaxPotentialFID;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/max-potential-fid.js");
},{"../../computed/metrics/max-potential-fid.js":29,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/speed-index":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedSi=require('../../computed/metrics/speed-index.js');

const UIStrings={

title:'Speed Index',

description:'Speed Index shows how quickly the contents of a page are visibly populated. '+
'[Learn more](https://web.dev/speed-index).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class SpeedIndex extends Audit{



static get meta(){
return{
id:'speed-index',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{



scorePODR:2900,
scoreMedian:5800};

}








static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await ComputedSi.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};

}}


module.exports=SpeedIndex;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/speed-index.js");
},{"../../computed/metrics/speed-index.js":31,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/total-blocking-time":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const ComputedTBT=require('../../computed/metrics/total-blocking-time.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Total Blocking Time',

description:'Sum of all time periods between FCP and Time to Interactive, '+
'when task length exceeded 50ms, expressed in milliseconds.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class TotalBlockingTime extends Audit{



static get meta(){
return{
id:'total-blocking-time',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}




static get defaultOptions(){
return{






scoreMedian:600,
scorePODR:200};

}













static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const metricResult=await ComputedTBT.request(metricComputationData,context);

return{
score:Audit.computeLogNormalScore(
metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),

numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};

}}


module.exports=TotalBlockingTime;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/metrics/total-blocking-time.js");
},{"../../computed/metrics/total-blocking-time.js":32,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const TraceOfTab=require('../computed/trace-of-tab.js');
const Speedline=require('../computed/speedline.js');
const FirstContentfulPaint=require('../computed/metrics/first-contentful-paint.js');
const FirstMeaningfulPaint=require('../computed/metrics/first-meaningful-paint.js');
const LargestContentfulPaint=require('../computed/metrics/largest-contentful-paint.js');
const FirstCPUIdle=require('../computed/metrics/first-cpu-idle.js');
const Interactive=require('../computed/metrics/interactive.js');
const SpeedIndex=require('../computed/metrics/speed-index.js');
const EstimatedInputLatency=require('../computed/metrics/estimated-input-latency.js');
const TotalBlockingTime=require('../computed/metrics/total-blocking-time.js');

class Metrics extends Audit{



static get meta(){
return{
id:'metrics',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:'Metrics',
description:'Collects all available metrics.',
requiredArtifacts:['traces','devtoolsLogs']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};








const requestOrUndefined=(Artifact,artifact)=>{
return Artifact.request(artifact,context).catch(_=>undefined);
};

const traceOfTab=await TraceOfTab.request(trace,context);
const speedline=await Speedline.request(trace,context);
const firstContentfulPaint=await FirstContentfulPaint.request(metricComputationData,context);
const firstMeaningfulPaint=await FirstMeaningfulPaint.request(metricComputationData,context);
const largestContentfulPaint=await requestOrUndefined(LargestContentfulPaint,metricComputationData);
const firstCPUIdle=await requestOrUndefined(FirstCPUIdle,metricComputationData);
const interactive=await requestOrUndefined(Interactive,metricComputationData);
const speedIndex=await requestOrUndefined(SpeedIndex,metricComputationData);
const estimatedInputLatency=await EstimatedInputLatency.request(metricComputationData,context);
const totalBlockingTime=await TotalBlockingTime.request(metricComputationData,context);


const metrics={

firstContentfulPaint:firstContentfulPaint.timing,
firstContentfulPaintTs:firstContentfulPaint.timestamp,
firstMeaningfulPaint:firstMeaningfulPaint.timing,
firstMeaningfulPaintTs:firstMeaningfulPaint.timestamp,
largestContentfulPaint:largestContentfulPaint&&largestContentfulPaint.timing,
largestContentfulPaintTs:largestContentfulPaint&&largestContentfulPaint.timestamp,
firstCPUIdle:firstCPUIdle&&firstCPUIdle.timing,
firstCPUIdleTs:firstCPUIdle&&firstCPUIdle.timestamp,
interactive:interactive&&interactive.timing,
interactiveTs:interactive&&interactive.timestamp,
speedIndex:speedIndex&&speedIndex.timing,
speedIndexTs:speedIndex&&speedIndex.timestamp,
estimatedInputLatency:estimatedInputLatency.timing,
estimatedInputLatencyTs:estimatedInputLatency.timestamp,
totalBlockingTime:totalBlockingTime.timing,


observedNavigationStart:traceOfTab.timings.navigationStart,
observedNavigationStartTs:traceOfTab.timestamps.navigationStart,
observedFirstPaint:traceOfTab.timings.firstPaint,
observedFirstPaintTs:traceOfTab.timestamps.firstPaint,
observedFirstContentfulPaint:traceOfTab.timings.firstContentfulPaint,
observedFirstContentfulPaintTs:traceOfTab.timestamps.firstContentfulPaint,
observedFirstMeaningfulPaint:traceOfTab.timings.firstMeaningfulPaint,
observedFirstMeaningfulPaintTs:traceOfTab.timestamps.firstMeaningfulPaint,
observedLargestContentfulPaint:traceOfTab.timings.largestContentfulPaint,
observedLargestContentfulPaintTs:traceOfTab.timestamps.largestContentfulPaint,
observedTraceEnd:traceOfTab.timings.traceEnd,
observedTraceEndTs:traceOfTab.timestamps.traceEnd,
observedLoad:traceOfTab.timings.load,
observedLoadTs:traceOfTab.timestamps.load,
observedDomContentLoaded:traceOfTab.timings.domContentLoaded,
observedDomContentLoadedTs:traceOfTab.timestamps.domContentLoaded,


observedFirstVisualChange:speedline.first,
observedFirstVisualChangeTs:(speedline.first+speedline.beginning)*1000,
observedLastVisualChange:speedline.complete,
observedLastVisualChangeTs:(speedline.complete+speedline.beginning)*1000,
observedSpeedIndex:speedline.speedIndex,
observedSpeedIndexTs:(speedline.speedIndex+speedline.beginning)*1000};


for(const[name,value]of Object.entries(metrics)){
const key=name;
if(typeof value!=='undefined'){
metrics[key]=Math.round(value);
}
}


const details={
type:'debugdata',

items:[metrics,{lcpInvalidated:traceOfTab.lcpInvalidated}]};


return{
score:1,
numericValue:interactive&&interactive.timing||0,
details};

}}











































module.exports=Metrics;

},{"../computed/metrics/estimated-input-latency.js":14,"../computed/metrics/first-contentful-paint.js":15,"../computed/metrics/first-cpu-idle.js":16,"../computed/metrics/first-meaningful-paint.js":17,"../computed/metrics/interactive.js":18,"../computed/metrics/largest-contentful-paint.js":28,"../computed/metrics/speed-index.js":31,"../computed/metrics/total-blocking-time.js":32,"../computed/speedline.js":38,"../computed/trace-of-tab.js":39,"./audit.js":3}],"../audits/mixed-content":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const URL=require('../lib/url-shim.js');
const Util=require('../report/html/renderer/util.js');
const NetworkRecords=require('../computed/network-records.js');







class MixedContent extends Audit{



static get meta(){
return{
id:'mixed-content',
title:'All resources loaded are secure',
failureTitle:'Some insecure resources can be upgraded to HTTPS',
description:`Mixed content warnings can prevent you from upgrading to HTTPS.
      This audit shows which insecure resources this page uses that can be
      upgraded to HTTPS. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/mixed-content)`,
requiredArtifacts:['devtoolsLogs','MixedContent']};

}







static upgradeURL(url){
const parsedURL=new URL(url);
parsedURL.protocol='https:';
return parsedURL.href;
}







static simplifyURL(url){
const parsedURL=new URL(url);
parsedURL.hash='';
parsedURL.search='';
return parsedURL.href;
}







static displayURL(url=''){
const displayOptions={
numPathParts:4,
preserveQuery:false,
preserveHost:true};

return URL.getURLDisplayName(url,displayOptions);
}






static audit(artifacts,context){
const defaultLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const upgradeLogs=artifacts.devtoolsLogs['mixedContentPass'];
const baseHostname=new URL(artifacts.MixedContent.url).host;

const computedArtifacts=[
NetworkRecords.request(defaultLogs,context),
NetworkRecords.request(upgradeLogs,context)];


return Promise.all(computedArtifacts).then(([defaultRecords,upgradedRecords])=>{
const insecureRecords=defaultRecords.filter(
record=>!record.isSecure);
const secureRecords=defaultRecords.filter(
record=>record.isSecure);

const upgradePassHosts=new Set();
const upgradePassSecureHosts=new Set();
upgradedRecords.forEach(record=>{
upgradePassHosts.add(new URL(record.url).hostname);
if(record.isSecure&&record.finished&&!record.failed){
upgradePassSecureHosts.add(new URL(record.url).hostname);
}
});




const seen=new Set();
const upgradeableResources=[];

for(const record of insecureRecords){
const simpleUrl=this.simplifyURL(record.url);
if(seen.has(simpleUrl))continue;
seen.add(simpleUrl);

const resource={
host:new URL(record.url).hostname,
fullUrl:record.url,
referrerDocUrl:this.displayURL(record.documentURL)};


if(!upgradePassSecureHosts.has(resource.host))continue;

if(!resource.referrerDocUrl.includes(baseHostname))continue;

upgradeableResources.push(resource);
}

const displayValue=`${Util.formatNumber(upgradeableResources.length)}
          ${upgradeableResources.length===1?'request':'requests'}`;


const headings=[
{key:'fullUrl',itemType:'url',text:'URL'}];

const details=Audit.makeTableDetails(headings,upgradeableResources);

const totalRecords=defaultRecords.length;
const score=(secureRecords.length+0.5*upgradeableResources.length)/totalRecords;

return{
score,
displayValue:displayValue,
details};

});
}}


module.exports=MixedContent;

},{"../computed/network-records.js":34,"../lib/url-shim.js":"url","../report/html/renderer/util.js":87,"./audit.js":3}],"../audits/network-requests":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const URL=require('../lib/url-shim.js');
const NetworkRecords=require('../computed/network-records.js');

class NetworkRequests extends Audit{



static get meta(){
return{
id:'network-requests',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:'Network Requests',
description:'Lists the network requests that were made during page load.',
requiredArtifacts:['devtoolsLogs']};

}






static audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
return NetworkRecords.request(devtoolsLog,context).then(records=>{
const earliestStartTime=records.reduce(
(min,record)=>Math.min(min,record.startTime),
Infinity);



const timeToMs=time=>time<earliestStartTime||!Number.isFinite(time)?
undefined:(time-earliestStartTime)*1000;

const results=records.map(record=>{
const endTimeDeltaMs=record.lrStatistics&&record.lrStatistics.endTimeDeltaMs;
const TCPMs=record.lrStatistics&&record.lrStatistics.TCPMs;
const requestMs=record.lrStatistics&&record.lrStatistics.requestMs;
const responseMs=record.lrStatistics&&record.lrStatistics.responseMs;

return{
url:URL.elideDataURI(record.url),
startTime:timeToMs(record.startTime),
endTime:timeToMs(record.endTime),
transferSize:record.transferSize,
resourceSize:record.resourceSize,
statusCode:record.statusCode,
mimeType:record.mimeType,
resourceType:record.resourceType,
lrEndTimeDeltaMs:endTimeDeltaMs,
lrTCPMs:TCPMs,
lrRequestMs:requestMs,
lrResponseMs:responseMs};

});


const headings=[
{key:'url',itemType:'url',text:'URL'},
{key:'startTime',itemType:'ms',granularity:1,text:'Start Time'},
{key:'endTime',itemType:'ms',granularity:1,text:'End Time'},
{
key:'transferSize',
itemType:'bytes',
displayUnit:'kb',
granularity:1,
text:'Transfer Size'},

{
key:'resourceSize',
itemType:'bytes',
displayUnit:'kb',
granularity:1,
text:'Resource Size'},

{key:'statusCode',itemType:'text',text:'Status Code'},
{key:'mimeType',itemType:'text',text:'MIME Type'},
{key:'resourceType',itemType:'text',text:'Resource Type'}];


const tableDetails=Audit.makeTableDetails(headings,results);

return{
score:1,
numericValue:results.length,
details:tableDetails};

});
}}


module.exports=NetworkRequests;

},{"../computed/network-records.js":34,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/network-rtt":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkAnalysisComputed=require('../computed/network-analysis.js');

const UIStrings={

title:'Network Round Trip Times',

description:'Network round trip times (RTT) have a large impact on performance. '+
'If the RTT to an origin is high, it\'s an indication that servers closer to the user could '+
'improve performance. [Learn more](https://hpbn.co/primer-on-latency-and-bandwidth/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class NetworkRTT extends Audit{



static get meta(){
return{
id:'network-rtt',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:str_(UIStrings.title),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);


let maxRtt=0;
const baseRtt=analysis.rtt;

const results=[];
for(const[origin,additionalRtt]of analysis.additionalRttByOrigin.entries()){

if(!origin.startsWith('http'))continue;

const rtt=additionalRtt+baseRtt;
results.push({origin,rtt});
maxRtt=Number.isFinite(rtt)?Math.max(rtt,maxRtt):maxRtt;
}

results.sort((a,b)=>b.rtt-a.rtt);


const headings=[
{key:'origin',itemType:'text',text:str_(i18n.UIStrings.columnURL)},
{key:'rtt',itemType:'ms',granularity:1,text:str_(i18n.UIStrings.columnTimeSpent)}];


const tableDetails=Audit.makeTableDetails(headings,results);

return{
score:1,
numericValue:maxRtt,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxRtt}),
details:tableDetails};

}}


module.exports=NetworkRTT;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/network-rtt.js");
},{"../computed/network-analysis.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/network-server-latency":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkAnalysisComputed=require('../computed/network-analysis.js');

const UIStrings={

title:'Server Backend Latencies',

description:'Server latencies can impact web performance. '+
'If the server latency of an origin is high, it\'s an indication the server is overloaded '+
'or has poor backend performance. [Learn more](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class NetworkServerLatency extends Audit{



static get meta(){
return{
id:'network-server-latency',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:str_(UIStrings.title),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);


let maxLatency=0;

const results=[];
for(const[origin,serverResponseTime]of analysis.serverResponseTimeByOrigin.entries()){

if(!origin.startsWith('http'))continue;

maxLatency=Math.max(serverResponseTime,maxLatency);
results.push({origin,serverResponseTime});
}

results.sort((a,b)=>b.serverResponseTime-a.serverResponseTime);


const headings=[
{key:'origin',itemType:'text',text:str_(i18n.UIStrings.columnURL)},
{key:'serverResponseTime',itemType:'ms',granularity:1,
text:str_(i18n.UIStrings.columnTimeSpent)}];


const tableDetails=Audit.makeTableDetails(headings,results);

return{
score:Math.max(1-maxLatency/500,0),
numericValue:maxLatency,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxLatency}),
details:tableDetails};

}}


module.exports=NetworkServerLatency;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/network-server-latency.js");
},{"../computed/network-analysis.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/offline-start-url":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'`start_url` responds with a 200 when offline',

failureTitle:'`start_url` does not respond with a 200 when offline',

description:'A service worker enables your web app to be reliable in unpredictable '+
'network conditions. [Learn more](https://web.dev/offline-start-url).',




warningCantStart:'Lighthouse couldn\'t read the `start_url` from the manifest. As a result, '+
'the `start_url` was assumed to be the document\'s URL. Error message: \'{manifestWarning}\'.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class OfflineStartUrl extends Audit{



static get meta(){
return{
id:'offline-start-url',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['WebAppManifest','StartUrl']};

}





static audit(artifacts){


const warnings=[];
const manifest=artifacts.WebAppManifest;
if(manifest&&manifest.value&&manifest.value.start_url.warning){
const manifestWarning=manifest.value.start_url.warning;
warnings.push(str_(UIStrings.warningCantStart,{manifestWarning}));
}

const hasOfflineStartUrl=artifacts.StartUrl.statusCode===200;

return{
score:Number(hasOfflineStartUrl),
explanation:artifacts.StartUrl.explanation,
warnings};

}}


module.exports=OfflineStartUrl;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/offline-start-url.js");
},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/performance-budget":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const ResourceSummary=require('../computed/resource-summary.js');
const MainResource=require('../computed/main-resource.js');
const Budget=require('../config/budget.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Performance budget',

description:'Keep the quantity and size of network requests under the targets '+
'set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',

requestCountOverBudget:`{count, plural,
    =1 {1 request}
    other {# requests}
   }`,

columnOverBudget:'Over Budget'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);




class ResourceBudget extends Audit{



static get meta(){
return{
id:'performance-budget',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
requiredArtifacts:['devtoolsLogs','URL']};

}





static getRowLabel(resourceType){

const strMappings={
'total':i18n.UIStrings.totalResourceType,
'document':i18n.UIStrings.documentResourceType,
'script':i18n.UIStrings.scriptResourceType,
'stylesheet':i18n.UIStrings.stylesheetResourceType,
'image':i18n.UIStrings.imageResourceType,
'media':i18n.UIStrings.mediaResourceType,
'font':i18n.UIStrings.fontResourceType,
'other':i18n.UIStrings.otherResourceType,
'third-party':i18n.UIStrings.thirdPartyResourceType};

return strMappings[resourceType];
}






static tableItems(budget,summary){
const resourceTypes=Object.keys(summary);
return resourceTypes.map(resourceType=>{
const label=str_(this.getRowLabel(resourceType));
const requestCount=summary[resourceType].count;
const size=summary[resourceType].size;

let sizeOverBudget;
let countOverBudget;

if(budget.resourceSizes){
const sizeBudget=budget.resourceSizes.find(b=>b.resourceType===resourceType);
if(sizeBudget&&size>sizeBudget.budget*1024){
sizeOverBudget=size-sizeBudget.budget*1024;
}
}
if(budget.resourceCounts){
const countBudget=budget.resourceCounts.find(b=>b.resourceType===resourceType);
if(countBudget&&requestCount>countBudget.budget){
const requestDifference=requestCount-countBudget.budget;
countOverBudget=str_(UIStrings.requestCountOverBudget,{count:requestDifference});
}
}
return{
resourceType,
label,
requestCount,
size,
countOverBudget,
sizeOverBudget};

}).filter(row=>{

if(budget.resourceSizes){
if(budget.resourceSizes.some(b=>b.resourceType===row.resourceType))return true;
}
if(budget.resourceCounts){
if(budget.resourceCounts.some(b=>b.resourceType===row.resourceType))return true;
}
return false;
}).sort((a,b)=>{
return(b.sizeOverBudget||0)-(a.sizeOverBudget||0);
});
}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const summary=await ResourceSummary.request({devtoolsLog,URL:artifacts.URL},context);
const mainResource=await MainResource.request({URL:artifacts.URL,devtoolsLog},context);


const budgets=Array.from(context.settings.budgets||[]);

const budget=budgets?budgets.reverse().find(b=>{
return Budget.urlMatchesPattern(mainResource.url,b.path);
}):undefined;

if(!budget){
return{
score:0,
notApplicable:true};

}


const headers=[
{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnResourceType)},
{key:'requestCount',itemType:'numeric',text:str_(i18n.UIStrings.columnRequests)},
{key:'size',itemType:'bytes',text:str_(i18n.UIStrings.columnTransferSize)},
{key:'countOverBudget',itemType:'text',text:''},
{key:'sizeOverBudget',itemType:'bytes',text:str_(UIStrings.columnOverBudget)}];


return{
details:Audit.makeTableDetails(headers,this.tableItems(budget,summary)),
score:1};

}}


module.exports=ResourceBudget;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/performance-budget.js");
},{"../computed/main-resource.js":11,"../computed/resource-summary.js":36,"../config/budget.js":42,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/predictive-perf":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const Util=require('../report/html/renderer/util.js');

const LanternFcp=require('../computed/metrics/lantern-first-contentful-paint.js');
const LanternFmp=require('../computed/metrics/lantern-first-meaningful-paint.js');
const LanternInteractive=require('../computed/metrics/lantern-interactive.js');
const LanternFirstCPUIdle=require('../computed/metrics/lantern-first-cpu-idle.js');
const LanternSpeedIndex=require('../computed/metrics/lantern-speed-index.js');
const LanternEil=require('../computed/metrics/lantern-estimated-input-latency.js');



const SCORING_POINT_OF_DIMINISHING_RETURNS=1700;
const SCORING_MEDIAN=10000;

class PredictivePerf extends Audit{



static get meta(){
return{
id:'predictive-perf',
title:'Predicted Performance (beta)',
description:
'Predicted performance evaluates how your site will perform under '+
'a cellular connection on a mobile device.',
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['traces','devtoolsLogs']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];


const settings={};
const fcp=await LanternFcp.request({trace,devtoolsLog,settings},context);
const fmp=await LanternFmp.request({trace,devtoolsLog,settings},context);
const tti=await LanternInteractive.request({trace,devtoolsLog,settings},context);
const ttfcpui=await LanternFirstCPUIdle.request({trace,devtoolsLog,settings},context);
const si=await LanternSpeedIndex.request({trace,devtoolsLog,settings},context);
const eil=await LanternEil.request({trace,devtoolsLog,settings},context);

const values={
roughEstimateOfFCP:fcp.timing,
optimisticFCP:fcp.optimisticEstimate.timeInMs,
pessimisticFCP:fcp.pessimisticEstimate.timeInMs,

roughEstimateOfFMP:fmp.timing,
optimisticFMP:fmp.optimisticEstimate.timeInMs,
pessimisticFMP:fmp.pessimisticEstimate.timeInMs,

roughEstimateOfTTI:tti.timing,
optimisticTTI:tti.optimisticEstimate.timeInMs,
pessimisticTTI:tti.pessimisticEstimate.timeInMs,

roughEstimateOfTTFCPUI:ttfcpui.timing,
optimisticTTFCPUI:ttfcpui.optimisticEstimate.timeInMs,
pessimisticTTFCPUI:ttfcpui.pessimisticEstimate.timeInMs,

roughEstimateOfSI:si.timing,
optimisticSI:si.optimisticEstimate.timeInMs,
pessimisticSI:si.pessimisticEstimate.timeInMs,

roughEstimateOfEIL:eil.timing,
optimisticEIL:eil.optimisticEstimate.timeInMs,
pessimisticEIL:eil.pessimisticEstimate.timeInMs};


const score=Audit.computeLogNormalScore(
values.roughEstimateOfTTI,
SCORING_POINT_OF_DIMINISHING_RETURNS,
SCORING_MEDIAN);


return{
score,
numericValue:values.roughEstimateOfTTI,
displayValue:Util.formatMilliseconds(values.roughEstimateOfTTI),
details:{
type:'debugdata',

items:[values]}};


}}


module.exports=PredictivePerf;

},{"../computed/metrics/lantern-estimated-input-latency.js":19,"../computed/metrics/lantern-first-contentful-paint.js":20,"../computed/metrics/lantern-first-cpu-idle.js":21,"../computed/metrics/lantern-first-meaningful-paint.js":22,"../computed/metrics/lantern-interactive.js":23,"../computed/metrics/lantern-speed-index.js":26,"../report/html/renderer/util.js":87,"./audit.js":3}],"../audits/redirects-http":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Redirects HTTP traffic to HTTPS',

failureTitle:'Does not redirect HTTP traffic to HTTPS',

description:'If you\'ve already set up HTTPS, make sure that you redirect all HTTP '+
'traffic to HTTPS in order to enable secure web features for all your users. [Learn more](https://web.dev/redirects-http).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class RedirectsHTTP extends Audit{



static get meta(){
return{
id:'redirects-http',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['HTTPRedirect']};

}





static audit(artifacts){
return{
score:Number(artifacts.HTTPRedirect.value)};

}}


module.exports=RedirectsHTTP;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/redirects-http.js");
},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/redirects":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
const i18n=require('../lib/i18n/i18n.js');
const TraceOfTab=require('../computed/trace-of-tab.js');
const NetworkRecords=require('../computed/network-records.js');
const MainResource=require('../computed/main-resource.js');
const LanternInteractive=require('../computed/metrics/lantern-interactive.js');

const UIStrings={

title:'Avoid multiple page redirects',

description:'Redirects introduce additional delays before the page can be loaded. [Learn more](https://web.dev/redirects).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Redirects extends Audit{



static get meta(){
return{
id:'redirects',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['URL','devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const settings=context.settings;
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];

const traceOfTab=await TraceOfTab.request(trace,context);
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const mainResource=await MainResource.request({URL:artifacts.URL,devtoolsLog},context);

const metricComputationData={trace,devtoolsLog,traceOfTab,networkRecords,settings};
const metricResult=await LanternInteractive.request(metricComputationData,context);


const nodeTimingsByUrl=new Map();
for(const[node,timing]of metricResult.pessimisticEstimate.nodeTimings.entries()){
if(node.type==='network'){
const networkNode=node;
nodeTimingsByUrl.set(networkNode.record.url,timing);
}
}


const redirectRequests=Array.from(mainResource.redirects||[]);


redirectRequests.push(mainResource);

let totalWastedMs=0;
const pageRedirects=[];


if(redirectRequests.length>1){
pageRedirects.push({
url:`(Initial: ${redirectRequests[0].url})`,
wastedMs:0});

}

for(let i=1;i<redirectRequests.length;i++){
const initialRequest=redirectRequests[i-1];
const redirectedRequest=redirectRequests[i];

const initialTiming=nodeTimingsByUrl.get(initialRequest.url);
const redirectedTiming=nodeTimingsByUrl.get(redirectedRequest.url);
if(!initialTiming||!redirectedTiming){
throw new Error('Could not find redirects in graph');
}

const wastedMs=redirectedTiming.startTime-initialTiming.startTime;
totalWastedMs+=wastedMs;

pageRedirects.push({
url:redirectedRequest.url,
wastedMs});

}


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnTimeSpent)}];

const details=Audit.makeOpportunityDetails(headings,pageRedirects,totalWastedMs);

return{

score:redirectRequests.length<=2?1:UnusedBytes.scoreForWastedMs(totalWastedMs),
numericValue:totalWastedMs,
displayValue:totalWastedMs?
str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:totalWastedMs}):
'',
extendedInfo:{
value:{
wastedMs:totalWastedMs}},


details};

}}


module.exports=Redirects;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/redirects.js");
},{"../computed/main-resource.js":11,"../computed/metrics/lantern-interactive.js":23,"../computed/network-records.js":34,"../computed/trace-of-tab.js":39,"../lib/i18n/i18n.js":66,"./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/resource-summary":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const ComputedResourceSummary=require('../computed/resource-summary.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Keep request counts low and transfer sizes small',

description:'To set budgets for the quantity and size of page resources,'+
' add a budget.json file. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',

displayValue:`{requestCount, plural, `+
`=1 {1 request • {byteCount, number, bytes} KB} `+
`other {# requests • {byteCount, number, bytes} KB}}`};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ResourceSummary extends Audit{



static get meta(){
return{
id:'resource-summary',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
requiredArtifacts:['devtoolsLogs','URL']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const summary=await ComputedResourceSummary.
request({devtoolsLog,URL:artifacts.URL},context);


const headings=[
{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnResourceType)},
{key:'requestCount',itemType:'numeric',text:str_(i18n.UIStrings.columnRequests)},
{key:'size',itemType:'bytes',text:str_(i18n.UIStrings.columnTransferSize)}];




const strMappings={
'total':str_(i18n.UIStrings.totalResourceType),
'document':str_(i18n.UIStrings.documentResourceType),
'script':str_(i18n.UIStrings.scriptResourceType),
'stylesheet':str_(i18n.UIStrings.stylesheetResourceType),
'image':str_(i18n.UIStrings.imageResourceType),
'media':str_(i18n.UIStrings.mediaResourceType),
'font':str_(i18n.UIStrings.fontResourceType),
'other':str_(i18n.UIStrings.otherResourceType),
'third-party':str_(i18n.UIStrings.thirdPartyResourceType)};


const types=Object.keys(summary);
const rows=types.map(type=>{
return{


resourceType:type,
label:strMappings[type],
requestCount:summary[type].count,
size:summary[type].size};

});

const thirdPartyRow=rows.find(r=>r.resourceType==='third-party')||[];
const otherRows=rows.filter(r=>r.resourceType!=='third-party').
sort((a,b)=>{
return b.size-a.size;
});
const tableItems=otherRows.concat(thirdPartyRow);

const tableDetails=Audit.makeTableDetails(headings,tableItems);

return{
details:tableDetails,
score:1,
displayValue:str_(UIStrings.displayValue,{
requestCount:summary.total.count,
byteCount:summary.total.size})};


}}


module.exports=ResourceSummary;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/resource-summary.js");
},{"../computed/resource-summary.js":36,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/screenshot-thumbnails":[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');
const LHError=require('../lib/lh-error.js');
const jpeg=require('jpeg-js');
const Speedline=require('../computed/speedline.js');
const Interactive=require('../computed/metrics/interactive.js');

const NUMBER_OF_THUMBNAILS=10;
const THUMBNAIL_WIDTH=120;



class ScreenshotThumbnails extends Audit{



static get meta(){
return{
id:'screenshot-thumbnails',
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
title:'Screenshot Thumbnails',
description:'This is what the load of your site looked like.',
requiredArtifacts:['traces','devtoolsLogs']};

}








static scaleImageToThumbnail(imageData){
const scaledWidth=THUMBNAIL_WIDTH;
const scaleFactor=imageData.width/scaledWidth;
const scaledHeight=Math.floor(imageData.height/scaleFactor);

const outPixels=new Uint8Array(scaledWidth*scaledHeight*4);

for(let i=0;i<scaledWidth;i++){
for(let j=0;j<scaledHeight;j++){
const origX=Math.floor(i*scaleFactor);
const origY=Math.floor(j*scaleFactor);

const origPos=(origY*imageData.width+origX)*4;
const outPos=(j*scaledWidth+i)*4;

outPixels[outPos]=imageData.data[origPos];
outPixels[outPos+1]=imageData.data[origPos+1];
outPixels[outPos+2]=imageData.data[origPos+2];
outPixels[outPos+3]=imageData.data[origPos+3];
}
}

return{
width:scaledWidth,
height:scaledHeight,
data:outPixels};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];

const cachedThumbnails=new Map();

const speedline=await Speedline.request(trace,context);


let minimumTimelineDuration=context.options.minimumTimelineDuration||3000;

if(context.settings.throttlingMethod!=='simulate'){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricComputationData={trace,devtoolsLog,settings:context.settings};
const tti=Interactive.request(metricComputationData,context);
try{
minimumTimelineDuration=Math.max((await tti).timing,minimumTimelineDuration);
}catch(_){}
}

const thumbnails=[];
const analyzedFrames=speedline.frames.filter(frame=>!frame.isProgressInterpolated());
const maxFrameTime=
speedline.complete||
Math.max(...speedline.frames.map(frame=>frame.getTimeStamp()-speedline.beginning));
const timelineEnd=Math.max(maxFrameTime,minimumTimelineDuration);

if(!analyzedFrames.length||!Number.isFinite(timelineEnd)){
throw new LHError(LHError.errors.INVALID_SPEEDLINE);
}

for(let i=1;i<=NUMBER_OF_THUMBNAILS;i++){
const targetTimestamp=speedline.beginning+timelineEnd*i/NUMBER_OF_THUMBNAILS;



let frameForTimestamp=null;
if(i===NUMBER_OF_THUMBNAILS){
frameForTimestamp=analyzedFrames[analyzedFrames.length-1];
}else{
analyzedFrames.forEach(frame=>{
if(frame.getTimeStamp()<=targetTimestamp){
frameForTimestamp=frame;
}
});
}

let base64Data;
const cachedThumbnail=cachedThumbnails.get(frameForTimestamp);
if(cachedThumbnail){
base64Data=cachedThumbnail;
}else{
const imageData=frameForTimestamp.getParsedImage();
const thumbnailImageData=ScreenshotThumbnails.scaleImageToThumbnail(imageData);
base64Data=jpeg.encode(thumbnailImageData,90).data.toString('base64');
cachedThumbnails.set(frameForTimestamp,base64Data);
}
thumbnails.push({
timing:Math.round(targetTimestamp-speedline.beginning),
timestamp:targetTimestamp*1000,
data:`data:image/jpeg;base64,${base64Data}`});

}

return{
score:1,
details:{
type:'filmstrip',
scale:timelineEnd,
items:thumbnails}};


}}


module.exports=ScreenshotThumbnails;

},{"../computed/metrics/interactive.js":18,"../computed/speedline.js":38,"../lib/lh-error.js":71,"./audit.js":3,"jpeg-js":122}],"../audits/seo/canonical":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const URL=require('../../lib/url-shim.js');
const MainResource=require('../../computed/main-resource.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Document has a valid `rel=canonical`',

failureTitle:'Document does not have a valid `rel=canonical`',

description:'Canonical links suggest which URL to show in search results. '+
'[Learn more](https://web.dev/canonical).',




explanationConflict:'Multiple conflicting URLs ({urlList})',




explanationInvalid:'Invalid URL ({url})',




explanationRelative:'Relative URL ({url})',




explanationPointsElsewhere:'Points to another `hreflang` location ({url})',




explanationDifferentDomain:'Points to a different domain ({url})',

explanationRoot:'Points to the domain\'s root URL (the homepage), '+
'instead of an equivalent page of content'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);









class Canonical extends Audit{



static get meta(){
return{
id:'canonical',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['LinkElements','URL','devtoolsLogs']};

}





static collectCanonicalURLs(linkElements){

const uniqueCanonicalURLs=new Set();

const hreflangURLs=new Set();


let invalidCanonicalLink;

let relativeCanonicallink;
for(const link of linkElements){


if(link.source==='body')continue;

if(link.rel==='canonical'){

if(!link.hrefRaw)continue;


if(!link.href)invalidCanonicalLink=link;else

if(!URL.isValid(link.hrefRaw))relativeCanonicallink=link;else

uniqueCanonicalURLs.add(link.href);
}else if(link.rel==='alternate'){
if(link.href&&link.hreflang)hreflangURLs.add(link.href);
}
}

return{uniqueCanonicalURLs,hreflangURLs,invalidCanonicalLink,relativeCanonicallink};
}





static findInvalidCanonicalURLReason(canonicalURLData){
const{uniqueCanonicalURLs,invalidCanonicalLink,relativeCanonicallink}=canonicalURLData;


if(invalidCanonicalLink){
return{
score:0,
explanation:str_(UIStrings.explanationInvalid,{url:invalidCanonicalLink.hrefRaw})};

}


if(relativeCanonicallink){
return{
score:0,
explanation:str_(UIStrings.explanationRelative,{url:relativeCanonicallink.hrefRaw})};

}


const canonicalURLs=Array.from(uniqueCanonicalURLs);


if(canonicalURLs.length===0){
return{
score:1,
notApplicable:true};

}


if(canonicalURLs.length>1){
return{
score:0,
explanation:str_(UIStrings.explanationConflict,{urlList:canonicalURLs.join(', ')})};

}
}







static findCommonCanonicalURLMistakes(canonicalURLData,canonicalURL,baseURL){
const{hreflangURLs}=canonicalURLData;


if(
hreflangURLs.has(baseURL.href)&&
hreflangURLs.has(canonicalURL.href)&&
baseURL.href!==canonicalURL.href)
{
return{
score:0,
explanation:str_(UIStrings.explanationPointsElsewhere,{url:baseURL.href})};

}



if(!URL.rootDomainsMatch(canonicalURL,baseURL)){
return{
score:0,
explanation:str_(UIStrings.explanationDifferentDomain,{url:canonicalURL.href})};

}


if(
canonicalURL.origin===baseURL.origin&&
canonicalURL.pathname==='/'&&
baseURL.pathname!=='/')
{
return{
score:0,
explanation:str_(UIStrings.explanationRoot)};

}
}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];

const mainResource=await MainResource.request({devtoolsLog,URL:artifacts.URL},context);
const baseURL=new URL(mainResource.url);
const canonicalURLData=Canonical.collectCanonicalURLs(artifacts.LinkElements);


const invalidURLAuditProduct=Canonical.findInvalidCanonicalURLReason(canonicalURLData);
if(invalidURLAuditProduct)return invalidURLAuditProduct;


const canonicalURL=new URL([...canonicalURLData.uniqueCanonicalURLs][0]);
const mistakeAuditProduct=Canonical.findCommonCanonicalURLMistakes(
canonicalURLData,
canonicalURL,
baseURL);


if(mistakeAuditProduct)return mistakeAuditProduct;

return{
score:1};

}}


module.exports=Canonical;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/canonical.js");
},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/font-size":[function(require,module,exports){
(function(__filename){





'use strict';



const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
const Audit=require('../audit.js');
const ComputedViewportMeta=require('../../computed/viewport-meta.js');
const MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT=60;

const UIStrings={

title:'Document uses legible font sizes',

failureTitle:'Document doesn\'t use legible font sizes',

description:'Font sizes less than 12px are too small to be legible and require mobile visitors to “pinch to zoom” in order to read. Strive to have >60% of page text ≥12px. [Learn more](https://web.dev/font-size).',

displayValue:'{decimalProportion, number, extendedPercent} legible text',

explanationViewport:'Text is illegible because there\'s no viewport meta tag optimized '+
'for mobile screens.',

explanationWithDisclaimer:'{decimalProportion, number, extendedPercent} of text is too '+
'small (based on {decimalProportionVisited, number, extendedPercent} sample).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





function getUniqueFailingRules(fontSizeArtifact){

const failingRules=new Map();

fontSizeArtifact.forEach(({cssRule,fontSize,textLength,node})=>{
const artifactId=getFontArtifactId(cssRule,node);
const failingRule=failingRules.get(artifactId);

if(!failingRule){
failingRules.set(artifactId,{
node,
cssRule,
fontSize,
textLength});

}else{
failingRule.textLength+=textLength;
}
});

return[...failingRules.values()];
}





function getAttributeMap(attributes=[]){
const map=new Map();

for(let i=0;i<attributes.length;i+=2){
const name=attributes[i].toLowerCase();
const value=attributes[i+1].trim();

if(value){
map.set(name,value);
}
}

return map;
}






function getSelector(node){
const attributeMap=getAttributeMap(node.attributes);

if(attributeMap.has('id')){
return'#'+attributeMap.get('id');
}else{
const attrClass=attributeMap.get('class');
if(attrClass){
return'.'+attrClass.split(/\s+/).join('.');
}
}

return node.localName.toLowerCase();
}





function nodeToTableNode(node){
const attributes=node.attributes||[];
const attributesString=attributes.map((value,idx)=>
idx%2===0?` ${value}`:`="${value}"`).
join('');

return{
type:'node',
selector:node.parentNode?getSelector(node.parentNode):'',
snippet:`<${node.localName}${attributesString}>`};

}







function findStyleRuleSource(baseURL,styleDeclaration,node){
if(
!styleDeclaration||
styleDeclaration.type==='Attributes'||
styleDeclaration.type==='Inline')
{
return{
selector:nodeToTableNode(node),
source:baseURL};

}

if(styleDeclaration.parentRule&&
styleDeclaration.parentRule.origin==='user-agent'){
return{
selector:styleDeclaration.parentRule.selectors.map(item=>item.text).join(', '),
source:'User Agent Stylesheet'};

}

if(styleDeclaration.type==='Regular'&&styleDeclaration.parentRule){
const rule=styleDeclaration.parentRule;
const stylesheet=styleDeclaration.stylesheet;

if(stylesheet){
let source;
const selector=rule.selectors.map(item=>item.text).join(', ');

if(stylesheet.sourceURL){
const url=new URL(stylesheet.sourceURL,baseURL);
const range=styleDeclaration.range;
source=`${url.href}`;


if(range){
let line=range.startLine+1;
let column=range.startColumn;







const addHtmlLocationOffset=stylesheet.isInline&&!stylesheet.hasSourceURL;
if(addHtmlLocationOffset){
line+=stylesheet.startLine;

if(range.startLine===0){
column+=stylesheet.startColumn;
}
}

source+=`:${line}:${column}`;
}
}else{

source='dynamic';
}

return{
selector,
source};

}
}



return{
selector:'',
source:'Unknown'};

}






function getFontArtifactId(styleDeclaration,node){
if(styleDeclaration&&styleDeclaration.type==='Regular'){
const startLine=styleDeclaration.range?styleDeclaration.range.startLine:0;
const startColumn=styleDeclaration.range?styleDeclaration.range.startColumn:0;
return`${styleDeclaration.styleSheetId}@${startLine}:${startColumn}`;
}else{
return`node_${node.nodeId}`;
}
}

class FontSize extends Audit{



static get meta(){
return{
id:'font-size',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['FontSize','URL','MetaElements','TestedAsMobileDevice']};

}






static async audit(artifacts,context){
if(!artifacts.TestedAsMobileDevice){

return{
score:1,
notApplicable:true};

}

const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
if(!viewportMeta.isMobileOptimized){
return{
score:0,
explanation:str_(UIStrings.explanationViewport)};

}

const{
analyzedFailingNodesData,
analyzedFailingTextLength,
failingTextLength,
visitedTextLength,
totalTextLength}=
artifacts.FontSize;

if(totalTextLength===0){
return{
score:1};

}

const failingRules=getUniqueFailingRules(analyzedFailingNodesData);
const percentageOfPassingText=
(visitedTextLength-failingTextLength)/visitedTextLength*100;
const pageUrl=artifacts.URL.finalUrl;


const headings=[
{key:'source',itemType:'url',text:'Source'},
{key:'selector',itemType:'code',text:'Selector'},
{key:'coverage',itemType:'text',text:'% of Page Text'},
{key:'fontSize',itemType:'text',text:'Font Size'}];


const tableData=failingRules.sort((a,b)=>b.textLength-a.textLength).
map(({cssRule,textLength,fontSize,node})=>{
const percentageOfAffectedText=textLength/visitedTextLength*100;
const origin=findStyleRuleSource(pageUrl,cssRule,node);

return{
source:origin.source,
selector:origin.selector,
coverage:`${percentageOfAffectedText.toFixed(2)}%`,
fontSize:`${fontSize}px`};

});


if(analyzedFailingTextLength<failingTextLength){
const percentageOfUnanalyzedFailingText=
(failingTextLength-analyzedFailingTextLength)/visitedTextLength*100;

tableData.push({
source:'Add\'l illegible text',
selector:'',
coverage:`${percentageOfUnanalyzedFailingText.toFixed(2)}%`,
fontSize:'< 12px'});

}

if(percentageOfPassingText>0){
tableData.push({
source:'Legible text',
selector:'',
coverage:`${percentageOfPassingText.toFixed(2)}%`,
fontSize:'≥ 12px'});

}

const decimalProportion=percentageOfPassingText/100;
const displayValue=str_(UIStrings.displayValue,{decimalProportion});
const details=Audit.makeTableDetails(headings,tableData);
const passed=percentageOfPassingText>=MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT;

let explanation;
if(!passed){
const percentageOfFailingText=(100-percentageOfPassingText)/100;


if(visitedTextLength<totalTextLength){
const percentageOfVisitedText=visitedTextLength/totalTextLength;
explanation=str_(UIStrings.explanationWithDisclaimer,
{
decimalProportion:percentageOfFailingText,
decimalProportionVisited:percentageOfVisitedText});

}
}

return{
score:Number(passed),
details,
displayValue,
explanation};

}}


module.exports=FontSize;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/font-size.js");
},{"../../computed/viewport-meta.js":41,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/hreflang":[function(require,module,exports){
(function(global,__filename){





'use strict';

const Audit=require('../audit.js');
const VALID_LANGS=importValidLangs();
const NO_LANGUAGE='x-default';
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Document has a valid `hreflang`',

failureTitle:'Document doesn\'t have a valid `hreflang`',

description:'hreflang links tell search engines what version of a page they should '+
'list in search results for a given language or region. [Learn more]'+
'(https://web.dev/hreflang).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);







function importValidLangs(){

const axeCache=global.axe;

global.axe={utils:{}};

require('axe-core/lib/core/utils/valid-langs.js');

const validLangs=global.axe.utils.validLangs();

global.axe=axeCache;

return validLangs;
}





function isValidHreflang(hreflang){
if(hreflang.toLowerCase()===NO_LANGUAGE){
return true;
}


const[lang]=hreflang.split('-');
return VALID_LANGS.includes(lang.toLowerCase());
}

class Hreflang extends Audit{



static get meta(){
return{
id:'hreflang',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['LinkElements','URL']};

}





static audit(artifacts){

const invalidHreflangs=[];

for(const link of artifacts.LinkElements){
if(link.rel!=='alternate')continue;
if(!link.hreflang||isValidHreflang(link.hreflang))continue;
if(link.source==='body')continue;

if(link.source==='head'){
invalidHreflangs.push({
source:{
type:'node',
snippet:`<link rel="alternate" hreflang="${link.hreflang}" href="${link.href}" />`}});


}else if(link.source==='headers'){
invalidHreflangs.push({
source:`Link: <${link.href}>; rel="alternate"; hreflang="${link.hreflang}"`});

}
}


const headings=[
{key:'source',itemType:'code',text:'Source'}];

const details=Audit.makeTableDetails(headings,invalidHreflangs);

return{
score:Number(invalidHreflangs.length===0),
details};

}}


module.exports=Hreflang;
module.exports.UIStrings=UIStrings;

}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/audits/seo/hreflang.js");
},{"../../lib/i18n/i18n.js":66,"../audit.js":3,"axe-core/lib/core/utils/valid-langs.js":96}],"../audits/seo/http-status-code":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const MainResource=require('../../computed/main-resource.js');
const HTTP_UNSUCCESSFUL_CODE_LOW=400;
const HTTP_UNSUCCESSFUL_CODE_HIGH=599;
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Page has successful HTTP status code',

failureTitle:'Page has unsuccessful HTTP status code',

description:'Pages with unsuccessful HTTP status codes may not be indexed properly. '+
'[Learn more](https://web.dev/http-status-code).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class HTTPStatusCode extends Audit{



static get meta(){
return{
id:'http-status-code',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','URL']};

}






static audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const URL=artifacts.URL;

return MainResource.request({devtoolsLog,URL},context).
then(mainResource=>{
const statusCode=mainResource.statusCode;

if(statusCode>=HTTP_UNSUCCESSFUL_CODE_LOW&&
statusCode<=HTTP_UNSUCCESSFUL_CODE_HIGH){
return{
score:0,
displayValue:`${statusCode}`};

}

return{
score:1};

});
}}


module.exports=HTTPStatusCode;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/http-status-code.js");
},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/is-crawlable":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const robotsParser=require('robots-parser');
const URL=require('../../lib/url-shim.js');
const MainResource=require('../../computed/main-resource.js');
const BLOCKLIST=new Set([
'noindex',
'none']);

const ROBOTS_HEADER='x-robots-tag';
const UNAVAILABLE_AFTER='unavailable_after';
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Page isn’t blocked from indexing',

failureTitle:'Page is blocked from indexing',

description:'Search engines are unable to include your pages in search results '+
'if they don\'t have permission to crawl them. [Learn more](https://web.dev/is-crawable).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);






function isUnavailable(directive){
const parts=directive.split(':');

if(parts.length<=1||parts[0]!==UNAVAILABLE_AFTER){
return false;
}

const date=Date.parse(parts.slice(1).join(':'));

return!isNaN(date)&&date<Date.now();
}






function hasBlockingDirective(directives){
return directives.split(',').
map(d=>d.toLowerCase().trim()).
some(d=>BLOCKLIST.has(d)||isUnavailable(d));
}






function hasUserAgent(directives){
const parts=directives.match(/^([^,:]+):/);



return!!parts&&parts[1].toLowerCase()!==UNAVAILABLE_AFTER;
}

class IsCrawlable extends Audit{



static get meta(){
return{
id:'is-crawlable',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['MetaElements','RobotsTxt','URL','devtoolsLogs']};

}






static audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metaRobots=artifacts.MetaElements.find(meta=>meta.name==='robots');

return MainResource.request({devtoolsLog,URL:artifacts.URL},context).
then(mainResource=>{

const blockingDirectives=[];

if(metaRobots){
const metaRobotsContent=metaRobots.content||'';
const isBlocking=hasBlockingDirective(metaRobotsContent);

if(isBlocking){
blockingDirectives.push({
source:{
type:'node',
snippet:`<meta name="robots" content="${metaRobotsContent}" />`}});


}
}

mainResource.responseHeaders&&mainResource.responseHeaders.
filter(h=>h.name.toLowerCase()===ROBOTS_HEADER&&!hasUserAgent(h.value)&&
hasBlockingDirective(h.value)).
forEach(h=>blockingDirectives.push({source:`${h.name}: ${h.value}`}));

if(artifacts.RobotsTxt.content){
const robotsFileUrl=new URL('/robots.txt',mainResource.url);
const robotsTxt=robotsParser(robotsFileUrl.href,artifacts.RobotsTxt.content);

if(!robotsTxt.isAllowed(mainResource.url)){
blockingDirectives.push({
source:{
type:'url',
value:robotsFileUrl.href}});


}
}


const headings=[
{key:'source',itemType:'code',text:'Blocking Directive Source'}];

const details=Audit.makeTableDetails(headings,blockingDirectives);

return{
score:Number(blockingDirectives.length===0),
details};

});
}}


module.exports=IsCrawlable;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/is-crawlable.js");
},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3,"robots-parser":177}],"../audits/seo/link-text":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const URL=require('../../lib/url-shim.js');
const BLOCKLIST=new Set([

'click here',
'click this',
'go',
'here',
'this',
'start',
'right here',
'more',
'learn more',

'ここをクリック',
'こちらをクリック',
'リンク',
'続きを読む',
'続く',
'全文表示',

'click aquí',
'click aqui',
'clicka aquí',
'clicka aqui',
'pincha aquí',
'pincha aqui',
'aquí',
'aqui',
'más',
'mas',
'más información',
'más informacion',
'mas información',
'mas informacion',
'este',
'enlace',
'este enlace',
'empezar',

'clique aqui',
'inicio',
'início',
'ir',
'mais informação',
'mais informações',
'mais',
'veja mais',

'여기',
'여기를 클릭',
'클릭',
'링크',
'자세히',
'자세히 보기',
'계속',
'이동',
'전체 보기']);

const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Links have descriptive text',

failureTitle:'Links do not have descriptive text',

description:'Descriptive link text helps search engines understand your content. '+
'[Learn more](https://web.dev/link-text).',

displayValue:`{itemCount, plural,
    =1 {1 link found}
    other {# links found}
    }`};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class LinkText extends Audit{



static get meta(){
return{
id:'link-text',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['URL','AnchorElements']};

}





static audit(artifacts){
const failingLinks=artifacts.AnchorElements.
filter(link=>link.href&&!link.rel.includes('nofollow')).
filter(link=>{
const href=link.href.toLowerCase();
if(
href.startsWith('javascript:')||
href.startsWith('mailto:')||
URL.equalWithExcludedFragments(link.href,artifacts.URL.finalUrl))
{
return false;
}

return BLOCKLIST.has(link.text.trim().toLowerCase());
}).
map(link=>{
return{
href:link.href,
text:link.text.trim()};

});


const headings=[
{key:'href',itemType:'url',text:'Link destination'},
{key:'text',itemType:'text',text:'Link Text'}];


const details=Audit.makeTableDetails(headings,failingLinks,{});
let displayValue;

if(failingLinks.length){
displayValue=str_(UIStrings.displayValue,{itemCount:failingLinks.length});
}

return{
score:Number(failingLinks.length===0),
details,
displayValue};

}}


module.exports=LinkText;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/link-text.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/manual/structured-data":[function(require,module,exports){
(function(__filename){





'use strict';

const ManualAudit=require('../../manual/manual-audit.js');
const i18n=require('../../../lib/i18n/i18n.js');

const UIStrings={

description:'Run the [Structured Data Testing Tool](https://search.google.com/structured-data/testing-tool/) and the [Structured Data Linter](http://linter.structured-data.org/) to validate structured data. [Learn more](https://web.dev/structured-data).',

title:'Structured data is valid'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





class StructuredData extends ManualAudit{



static get meta(){
return Object.assign({
id:'structured-data',
description:str_(UIStrings.description),
title:str_(UIStrings.title)},
super.partialMeta);
}}


module.exports=StructuredData;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/manual/structured-data.js");
},{"../../../lib/i18n/i18n.js":66,"../../manual/manual-audit.js":5}],"../audits/seo/meta-description":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Document has a meta description',

failureTitle:'Document does not have a meta description',

description:'Meta descriptions may be included in search results to concisely summarize '+
'page content. '+
'[Learn more](https://web.dev/meta-description).',

explanation:'Description text is empty.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Description extends Audit{



static get meta(){
return{
id:'meta-description',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['MetaElements']};

}





static audit(artifacts){
const metaDescription=artifacts.MetaElements.find(meta=>meta.name==='description');
if(!metaDescription){
return{
score:0};

}

const description=metaDescription.content||'';
if(description.trim().length===0){
return{
score:0,
explanation:str_(UIStrings.explanation)};

}

return{
score:1};

}}


module.exports=Description;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/meta-description.js");
},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/plugins":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const URL=require('../../lib/url-shim.js');

const JAVA_APPLET_TYPE='application/x-java-applet';
const JAVA_BEAN_TYPE='application/x-java-bean';
const TYPE_BLOCKLIST=new Set([
'application/x-shockwave-flash',

JAVA_APPLET_TYPE,
JAVA_BEAN_TYPE,

'application/x-silverlight',
'application/x-silverlight-2']);

const FILE_EXTENSION_BLOCKLIST=new Set([
'swf',
'flv',
'class',
'xap']);

const SOURCE_PARAMS=new Set([
'code',
'movie',
'source',
'src']);

const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Document avoids plugins',

failureTitle:'Document uses plugins',

description:'Search engines can\'t index plugin content, and '+
'many devices restrict plugins or don\'t support them. '+
'[Learn more](https://web.dev/plugins).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);






function isPluginType(type){
type=type.trim().toLowerCase();

return TYPE_BLOCKLIST.has(type)||
type.startsWith(JAVA_APPLET_TYPE)||
type.startsWith(JAVA_BEAN_TYPE);
}






function isPluginURL(url){
try{

const filePath=new URL(url,'http://example.com').pathname;
const parts=filePath.split('.');

if(parts.length<2){
return false;
}
const part=parts.pop();
return FILE_EXTENSION_BLOCKLIST.has(part.trim().toLowerCase());
}catch(e){
return false;
}
}

class Plugins extends Audit{



static get meta(){
return{
id:'plugins',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['EmbeddedContent']};

}





static audit(artifacts){
const plugins=artifacts.EmbeddedContent.
filter(item=>{
if(item.tagName==='APPLET'){
return true;
}

if(
(item.tagName==='EMBED'||item.tagName==='OBJECT')&&
item.type&&
isPluginType(item.type))
{
return true;
}

const embedSrc=item.src||item.code;
if(item.tagName==='EMBED'&&embedSrc&&isPluginURL(embedSrc)){
return true;
}

if(item.tagName==='OBJECT'&&item.data&&isPluginURL(item.data)){
return true;
}

const failingParams=item.params.filter(param=>
SOURCE_PARAMS.has(param.name.trim().toLowerCase())&&isPluginURL(param.value));


return failingParams.length>0;
}).
map(plugin=>{
const tagName=plugin.tagName.toLowerCase();

const attributeKeys=['src','data','code','type'];
const attributes=attributeKeys.
reduce((result,attr)=>{
if(plugin[attr]!==null){
result+=` ${attr}="${plugin[attr]}"`;
}
return result;
},'');
const params=plugin.params.
filter(param=>SOURCE_PARAMS.has(param.name.trim().toLowerCase())).
map(param=>`<param ${param.name}="${param.value}" />`).
join('');

return{
source:{
type:'node',
snippet:`<${tagName}${attributes}>${params}</${tagName}>`}};


});


const headings=[
{key:'source',itemType:'code',text:'Element source'}];


const details=Audit.makeTableDetails(headings,plugins);

return{
score:Number(plugins.length===0),
details};

}}


module.exports=Plugins;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/plugins.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/robots-txt":[function(require,module,exports){
(function(__filename){





'use strict';








const Audit=require('../audit.js');
const URL=require('../../lib/url-shim.js');

const HTTP_CLIENT_ERROR_CODE_LOW=400;
const HTTP_SERVER_ERROR_CODE_LOW=500;

const DIRECTIVE_SITEMAP='sitemap';
const DIRECTIVE_USER_AGENT='user-agent';
const DIRECTIVE_ALLOW='allow';
const DIRECTIVE_DISALLOW='disallow';
const DIRECTIVES_GROUP_MEMBERS=new Set([DIRECTIVE_ALLOW,DIRECTIVE_DISALLOW]);
const DIRECTIVE_SAFELIST=new Set([
DIRECTIVE_USER_AGENT,DIRECTIVE_DISALLOW,
DIRECTIVE_ALLOW,DIRECTIVE_SITEMAP,
'crawl-delay',
'clean-param','host',
'request-rate','visit-time','noindex']);

const SITEMAP_VALID_PROTOCOLS=new Set(['https:','http:','ftp:']);
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'robots.txt is valid',

failureTitle:'robots.txt is not valid',

description:'If your robots.txt file is malformed, crawlers may not be able to understand '+
'how you want your website to be crawled or indexed. [Learn more](https://web.dev/robots-txt).',




displayValueHttpBadCode:'Request for robots.txt returned HTTP status: {statusCode}',

displayValueValidationError:`{itemCount, plural,
    =1 {1 error found}
    other {# errors found}
    }`,

explanation:'Lighthouse was unable to download a robots.txt file'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);






function verifyDirective(directiveName,directiveValue){
if(!DIRECTIVE_SAFELIST.has(directiveName)){
throw new Error('Unknown directive');
}

if(directiveName===DIRECTIVE_SITEMAP){
let sitemapUrl;

try{
sitemapUrl=new URL(directiveValue);
}catch(e){
throw new Error('Invalid sitemap URL');
}

if(!SITEMAP_VALID_PROTOCOLS.has(sitemapUrl.protocol)){
throw new Error('Invalid sitemap URL protocol');
}
}

if(directiveName===DIRECTIVE_USER_AGENT&&!directiveValue){
throw new Error('No user-agent specified');
}

if(directiveName===DIRECTIVE_ALLOW||directiveName===DIRECTIVE_DISALLOW){
if(directiveValue!==''&&directiveValue[0]!=='/'&&directiveValue[0]!=='*'){
throw new Error('Pattern should either be empty, start with "/" or "*"');
}

const dollarIndex=directiveValue.indexOf('$');

if(dollarIndex!==-1&&dollarIndex!==directiveValue.length-1){
throw new Error('"$" should only be used at the end of the pattern');
}
}
}






function parseLine(line){
const hashIndex=line.indexOf('#');

if(hashIndex!==-1){
line=line.substr(0,hashIndex);
}

line=line.trim();

if(line.length===0){
return null;
}

const colonIndex=line.indexOf(':');

if(colonIndex===-1){
throw new Error('Syntax not understood');
}

const directiveName=line.slice(0,colonIndex).trim().toLowerCase();
const directiveValue=line.slice(colonIndex+1).trim();

verifyDirective(directiveName,directiveValue);

return{
directive:directiveName,
value:directiveValue};

}





function validateRobots(content){



const errors=[];
let inGroup=false;

content.
split(/\r\n|\r|\n/).
forEach((line,index)=>{
let parsedLine;

try{
parsedLine=parseLine(line);
}catch(e){
errors.push({
index:(index+1).toString(),
line:line,
message:e.message.toString()});

}

if(!parsedLine){
return;
}



if(parsedLine.directive===DIRECTIVE_USER_AGENT){
inGroup=true;
}else if(!inGroup&&DIRECTIVES_GROUP_MEMBERS.has(parsedLine.directive)){
errors.push({
index:(index+1).toString(),
line:line,
message:'No user-agent specified'});

}
});

return errors;
}

class RobotsTxt extends Audit{



static get meta(){
return{
id:'robots-txt',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['RobotsTxt']};

}





static audit(artifacts){
const{
status,
content}=
artifacts.RobotsTxt;

if(!status){
return{
score:0,
explanation:str_(UIStrings.explanation)};

}

if(status>=HTTP_SERVER_ERROR_CODE_LOW){
return{
score:0,
displayValue:str_(UIStrings.displayValueHttpBadCode,{statusCode:status})};

}else if(status>=HTTP_CLIENT_ERROR_CODE_LOW||content===''){
return{
score:1,
notApplicable:true};

}


if(content===null){
throw new Error(`Status ${status} was valid, but content was null`);
}

const validationErrors=validateRobots(content);


const headings=[
{key:'index',itemType:'text',text:'Line #'},
{key:'line',itemType:'code',text:'Content'},
{key:'message',itemType:'code',text:'Error'}];


const details=Audit.makeTableDetails(headings,validationErrors,{});
let displayValue;

if(validationErrors.length){
displayValue=
str_(UIStrings.displayValueValidationError,{itemCount:validationErrors.length});
}

return{
score:Number(validationErrors.length===0),
details,
displayValue};

}}


module.exports=RobotsTxt;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/seo/robots-txt.js");
},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/tap-targets":[function(require,module,exports){
(function(__filename){





'use strict';





const Audit=require('../audit.js');
const ComputedViewportMeta=require('../../computed/viewport-meta.js');
const{
rectsTouchOrOverlap,
getRectOverlapArea,
getRectAtCenter,
allRectsContainedWithinEachOther,
getLargestRect,
getBoundingRectWithPadding}=
require('../../lib/rect-helpers.js');
const{getTappableRectsFromClientRects}=require('../../lib/tappable-rects.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

title:'Tap targets are sized appropriately',

failureTitle:'Tap targets are not sized appropriately',

description:'Interactive elements like buttons and links should be large enough (48x48px), and have enough space around them, to be easy enough to tap without overlapping onto other elements. [Learn more](https://web.dev/tap-targets).',

tapTargetHeader:'Tap Target',

overlappingTargetHeader:'Overlapping Target',


explanationViewportMetaNotOptimized:'Tap targets are too small because there\'s no viewport meta tag optimized for mobile screens',

displayValue:'{decimalProportion, number, percent} appropriately sized tap targets'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const FINGER_SIZE_PX=48;


const MAX_ACCEPTABLE_OVERLAP_SCORE_RATIO=0.25;







function getBoundedTapTargets(targets){
return targets.map(tapTarget=>{
return{
tapTarget,
paddedBoundsRect:getBoundingRectWithPadding(tapTarget.clientRects,FINGER_SIZE_PX)};

});
}




function clientRectBelowMinimumSize(cr){
return cr.width<FINGER_SIZE_PX||cr.height<FINGER_SIZE_PX;
}






function getTooSmallTargets(targets){
return targets.filter(target=>{
return target.tapTarget.clientRects.every(clientRectBelowMinimumSize);
});
}






function getAllOverlapFailures(tooSmallTargets,allTargets){

const failures=[];

tooSmallTargets.forEach(target=>{

const tappableRects=getTappableRectsFromClientRects(target.tapTarget.clientRects);

for(const maybeOverlappingTarget of allTargets){
if(maybeOverlappingTarget===target){

continue;
}

if(!rectsTouchOrOverlap(target.paddedBoundsRect,maybeOverlappingTarget.paddedBoundsRect)){

continue;
}

if(target.tapTarget.href===maybeOverlappingTarget.tapTarget.href){
const isHttpOrHttpsLink=/https?:\/\//.test(target.tapTarget.href);
if(isHttpOrHttpsLink){

continue;
}
}

const maybeOverlappingRects=maybeOverlappingTarget.tapTarget.clientRects;
if(allRectsContainedWithinEachOther(tappableRects,maybeOverlappingRects)){




continue;
}

const rectFailure=getOverlapFailureForTargetPair(tappableRects,maybeOverlappingRects);
if(rectFailure){
failures.push({
...rectFailure,
tapTarget:target.tapTarget,
overlappingTarget:maybeOverlappingTarget.tapTarget});

}
}
});

return failures;
}






function getOverlapFailureForTargetPair(tappableRects,maybeOverlappingRects){

let greatestFailure=null;

for(const targetCR of tappableRects){
const fingerRect=getRectAtCenter(targetCR,FINGER_SIZE_PX);


const tapTargetScore=getRectOverlapArea(fingerRect,targetCR);

for(const maybeOverlappingCR of maybeOverlappingRects){
const overlappingTargetScore=getRectOverlapArea(fingerRect,maybeOverlappingCR);

const overlapScoreRatio=overlappingTargetScore/tapTargetScore;
if(overlapScoreRatio<MAX_ACCEPTABLE_OVERLAP_SCORE_RATIO){


continue;
}


if(!greatestFailure||overlapScoreRatio>greatestFailure.overlapScoreRatio){
greatestFailure={
overlapScoreRatio,
tapTargetScore,
overlappingTargetScore};

}
}
}
return greatestFailure;
}






function mergeSymmetricFailures(overlapFailures){

const failuresAfterMerging=[];

overlapFailures.forEach((failure,overlapFailureIndex)=>{
const symmetricFailure=overlapFailures.find(f=>
f.tapTarget===failure.overlappingTarget&&
f.overlappingTarget===failure.tapTarget);


if(!symmetricFailure){
failuresAfterMerging.push(failure);
return;
}

const{overlapScoreRatio:failureOSR}=failure;
const{overlapScoreRatio:symmetricOSR}=symmetricFailure;




if(failureOSR>symmetricOSR||
failureOSR===symmetricOSR&&
overlapFailureIndex<overlapFailures.indexOf(symmetricFailure))
{
failuresAfterMerging.push(failure);
}
});

return failuresAfterMerging;
}





function getTableItems(overlapFailures){
const tableItems=overlapFailures.map(failure=>{
const largestCR=getLargestRect(failure.tapTarget.clientRects);
const width=Math.floor(largestCR.width);
const height=Math.floor(largestCR.height);
const size=width+'x'+height;
return{
tapTarget:targetToTableNode(failure.tapTarget),
overlappingTarget:targetToTableNode(failure.overlappingTarget),
tapTargetScore:failure.tapTargetScore,
overlappingTargetScore:failure.overlappingTargetScore,
overlapScoreRatio:failure.overlapScoreRatio,
size,
width,
height};

});

tableItems.sort((a,b)=>{
return b.overlapScoreRatio-a.overlapScoreRatio;
});

return tableItems;
}





function targetToTableNode(target){
return{
type:'node',
snippet:target.snippet,
path:target.path,
selector:target.selector,
nodeLabel:target.nodeLabel};

}

class TapTargets extends Audit{



static get meta(){
return{
id:'tap-targets',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['MetaElements','TapTargets','TestedAsMobileDevice']};

}






static async audit(artifacts,context){
if(!artifacts.TestedAsMobileDevice){


return{
score:1,
notApplicable:true};

}

const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
if(!viewportMeta.isMobileOptimized){
return{
score:0,
explanation:str_(UIStrings.explanationViewportMetaNotOptimized)};

}


const boundedTapTargets=getBoundedTapTargets(artifacts.TapTargets);

const tooSmallTargets=getTooSmallTargets(boundedTapTargets);
const overlapFailures=getAllOverlapFailures(tooSmallTargets,boundedTapTargets);
const overlapFailuresForDisplay=mergeSymmetricFailures(overlapFailures);
const tableItems=getTableItems(overlapFailuresForDisplay);


const headings=[
{key:'tapTarget',itemType:'node',text:str_(UIStrings.tapTargetHeader)},
{key:'size',itemType:'text',text:str_(i18n.UIStrings.columnSize)},
{key:'overlappingTarget',itemType:'node',text:str_(UIStrings.overlappingTargetHeader)}];


const details=Audit.makeTableDetails(headings,tableItems);

const tapTargetCount=artifacts.TapTargets.length;
const failingTapTargetCount=new Set(overlapFailures.map(f=>f.tapTarget)).size;
const passingTapTargetCount=tapTargetCount-failingTapTargetCount;

let score=1;
let passingTapTargetRatio=1;
if(failingTapTargetCount>0){
passingTapTargetRatio=passingTapTargetCount/tapTargetCount;


score=passingTapTargetRatio*0.89;
}
const displayValue=str_(UIStrings.displayValue,{decimalProportion:passingTapTargetRatio});

return{
score,
details,
displayValue};

}}


TapTargets.FINGER_SIZE_PX=FINGER_SIZE_PX;

module.exports=TapTargets;
module.exports.UIStrings=UIStrings;
































}).call(this,"/lighthouse-core/audits/seo/tap-targets.js");
},{"../../computed/viewport-meta.js":41,"../../lib/i18n/i18n.js":66,"../../lib/rect-helpers.js":77,"../../lib/tappable-rects.js":82,"../audit.js":3}],"../audits/service-worker":[function(require,module,exports){
(function(__filename){





'use strict';

const URL=require('../lib/url-shim.js');
const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Registers a service worker that controls page and `start_url`',

failureTitle:'Does not register a service worker that controls page and `start_url`',

description:'The service worker is the technology that enables your app to use many '+
'Progressive Web App features, such as offline, add to homescreen, and push '+
'notifications. [Learn more](https://web.dev/service-worker).',




explanationOutOfScope:'This origin has one or more service workers, however the page '+
'({pageUrl}) is not in scope.',

explanationNoManifest:'This page is controlled by a service worker, however '+
'no `start_url` was found because no manifest was fetched.',

explanationBadManifest:'This page is controlled by a service worker, however '+
'no `start_url` was found because manifest failed to parse as valid JSON',





explanationBadStartUrl:'This page is controlled by a service worker, however '+
'the `start_url` ({startUrl}) is not in the service worker\'s scope ({scopeUrl})'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class ServiceWorker extends Audit{



static get meta(){
return{
id:'service-worker',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['URL','ServiceWorker','WebAppManifest']};

}







static getVersionsForOrigin(versions,pageUrl){
return versions.
filter(v=>v.status==='activated').
filter(v=>new URL(v.scriptURL).origin===pageUrl.origin);
}









static getControllingScopeUrl(matchingSWVersions,registrations,pageUrl){

const matchingScopeUrls=matchingSWVersions.
map(v=>registrations.find(r=>r.registrationId===v.registrationId)).
filter(r=>!!r).
map(r=>new URL(r.scopeURL).href);



const pageControllingScope=matchingScopeUrls.
filter(scopeUrl=>pageUrl.href.startsWith(scopeUrl)).
sort((scopeA,scopeB)=>scopeA.length-scopeB.length).
pop();

return pageControllingScope;
}








static checkStartUrl(manifest,scopeUrl){
if(!manifest){
return str_(UIStrings.explanationNoManifest);
}
if(!manifest.value){
return str_(UIStrings.explanationBadManifest);
}

const startUrl=manifest.value.start_url.value;
if(!startUrl.startsWith(scopeUrl)){
return str_(UIStrings.explanationBadStartUrl,{startUrl,scopeUrl});
}
}





static audit(artifacts){

const pageUrl=new URL(artifacts.URL.finalUrl);
const{versions,registrations}=artifacts.ServiceWorker;

const versionsForOrigin=ServiceWorker.getVersionsForOrigin(versions,pageUrl);
if(versionsForOrigin.length===0){
return{
score:0};

}

const controllingScopeUrl=ServiceWorker.getControllingScopeUrl(versionsForOrigin,
registrations,pageUrl);
if(!controllingScopeUrl){
return{
score:0,
explanation:str_(UIStrings.explanationOutOfScope,{pageUrl:pageUrl.href})};

}

const startUrlFailure=ServiceWorker.checkStartUrl(artifacts.WebAppManifest,
controllingScopeUrl);
if(startUrlFailure){
return{
score:0,
explanation:startUrlFailure};

}


return{
score:1};

}}


module.exports=ServiceWorker;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/service-worker.js");
},{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/splash-screen":[function(require,module,exports){
(function(__filename){





'use strict';

const MultiCheckAudit=require('./multi-check-audit.js');
const ManifestValues=require('../computed/manifest-values.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Configured for a custom splash screen',

failureTitle:'Is not configured for a custom splash screen',

description:'A themed splash screen ensures a high-quality experience when '+
'users launch your app from their homescreens. [Learn '+
'more](https://web.dev/splash-screen).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);














class SplashScreen extends MultiCheckAudit{



static get meta(){
return{
id:'splash-screen',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['WebAppManifest']};

}





static assessManifest(manifestValues,failures){
if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
failures.push(manifestValues.parseFailureReason);
return;
}

const splashScreenCheckIds=[
'hasName',
'hasBackgroundColor',
'hasThemeColor',
'hasIconsAtLeast512px'];


manifestValues.allChecks.
filter(item=>splashScreenCheckIds.includes(item.id)).
forEach(item=>{
if(!item.passing){
failures.push(item.failureText);
}
});
}






static async audit_(artifacts,context){

const failures=[];

const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
SplashScreen.assessManifest(manifestValues,failures);

return{
failures,
manifestValues};

}}


module.exports=SplashScreen;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/splash-screen.js");
},{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6}],"../audits/themed-omnibox":[function(require,module,exports){
(function(__filename){





'use strict';

const MultiCheckAudit=require('./multi-check-audit.js');
const ManifestValues=require('../computed/manifest-values.js');
const cssParsers=require('cssstyle/lib/parsers');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Sets a theme color for the address bar.',

failureTitle:'Does not set a theme color for the address bar.',

description:'The browser address bar can be themed to match your site. '+
'[Learn more](https://web.dev/themed-omnibox).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);











class ThemedOmnibox extends MultiCheckAudit{



static get meta(){
return{
id:'themed-omnibox',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['WebAppManifest','MetaElements']};

}





static isValidColor(color){
return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
}





static assessMetaThemecolor(themeColorMeta,failures){
if(!themeColorMeta){

failures.push('No `<meta name="theme-color">` tag found');
}else if(!ThemedOmnibox.isValidColor(themeColorMeta.content||'')){
failures.push('The theme-color meta tag did not contain a valid CSS color');
}
}





static assessManifest(manifestValues,failures){
if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
failures.push(manifestValues.parseFailureReason);
return;
}

const themeColorCheck=manifestValues.allChecks.find(i=>i.id==='hasThemeColor');
if(themeColorCheck&&!themeColorCheck.passing){
failures.push(themeColorCheck.failureText);
}
}






static async audit_(artifacts,context){

const failures=[];

const themeColorMeta=artifacts.MetaElements.find(meta=>meta.name==='theme-color');
const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
ThemedOmnibox.assessManifest(manifestValues,failures);
ThemedOmnibox.assessMetaThemecolor(themeColorMeta,failures);

return{
failures,
manifestValues,
themeColor:themeColorMeta&&themeColorMeta.content||null};

}}


module.exports=ThemedOmnibox;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/themed-omnibox.js");
},{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6,"cssstyle/lib/parsers":105}],"../audits/third-party-summary":[function(require,module,exports){
(function(__filename){





'use strict';

const thirdPartyWeb=require('third-party-web/httparchive-nostats-subset');

const Audit=require('./audit.js');
const BootupTime=require('./bootup-time.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkRecords=require('../computed/network-records.js');
const MainThreadTasks=require('../computed/main-thread-tasks.js');

const UIStrings={

title:'Minimize third-party usage',

failureTitle:'Reduce the impact of third-party code',

description:'Third-party code can significantly impact load performance. '+
'Limit the number of redundant third-party providers and try to load third-party code after '+
'your page has primarily finished loading. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/).',

columnThirdParty:'Third-Party',

columnBlockingTime:'Main-Thread Blocking Time',

displayValue:'Third-party code blocked the main thread for '+
`{timeInMs, number, milliseconds}\xa0ms`};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const PASS_THRESHOLD_IN_MS=250;



class ThirdPartySummary extends Audit{



static get meta(){
return{
id:'third-party-summary',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['traces','devtoolsLogs']};

}







static getEntitySafe(url){
try{
return thirdPartyWeb.getEntity(url);
}catch(_){
return undefined;
}
}









static getSummaryByEntity(networkRecords,mainThreadTasks,cpuMultiplier){

const entities=new Map();
const defaultEntityStat={mainThreadTime:0,blockingTime:0,transferSize:0};

for(const request of networkRecords){
const entity=ThirdPartySummary.getEntitySafe(request.url);
if(!entity)continue;

const entityStats=entities.get(entity)||{...defaultEntityStat};
entityStats.transferSize+=request.transferSize;
entities.set(entity,entityStats);
}

const jsURLs=BootupTime.getJavaScriptURLs(networkRecords);

for(const task of mainThreadTasks){
const attributeableURL=BootupTime.getAttributableURLForTask(task,jsURLs);
const entity=ThirdPartySummary.getEntitySafe(attributeableURL);
if(!entity)continue;

const entityStats=entities.get(entity)||{...defaultEntityStat};
const taskDuration=task.selfTime*cpuMultiplier;

entityStats.mainThreadTime+=taskDuration;



entityStats.blockingTime+=Math.max(taskDuration-50,0);
entities.set(entity,entityStats);
}

return entities;
}






static async audit(artifacts,context){
const settings=context.settings||{};
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const tasks=await MainThreadTasks.request(trace,context);
const multiplier=settings.throttlingMethod==='simulate'?
settings.throttling.cpuSlowdownMultiplier:1;

const summaryByEntity=ThirdPartySummary.getSummaryByEntity(networkRecords,tasks,multiplier);

const summary={wastedBytes:0,wastedMs:0};

const results=Array.from(summaryByEntity.entries()).
map(([entity,stats])=>{
summary.wastedBytes+=stats.transferSize;
summary.wastedMs+=stats.blockingTime;

return{
entity:{
type:'link',
text:entity.name,
url:entity.homepage||''},

transferSize:stats.transferSize,
mainThreadTime:stats.mainThreadTime,
blockingTime:stats.blockingTime};

}).

sort((a,b)=>b.blockingTime-a.blockingTime||b.transferSize-a.transferSize);


const headings=[
{key:'entity',itemType:'link',text:str_(UIStrings.columnThirdParty)},
{key:'transferSize',granularity:1,itemType:'bytes',
text:str_(i18n.UIStrings.columnSize)},
{key:'blockingTime',granularity:1,itemType:'ms',
text:str_(UIStrings.columnBlockingTime)}];


if(!results.length){
return{
score:1,
notApplicable:true};

}

return{
score:Number(summary.wastedMs<=PASS_THRESHOLD_IN_MS),
displayValue:str_(UIStrings.displayValue,{
timeInMs:summary.wastedMs}),

details:Audit.makeTableDetails(headings,results,summary)};

}}


module.exports=ThirdPartySummary;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/third-party-summary.js");
},{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"./audit.js":3,"./bootup-time.js":"../audits/bootup-time","third-party-web/httparchive-nostats-subset":185}],"../audits/time-to-first-byte":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const MainResource=require('../computed/main-resource.js');

const UIStrings={

title:'Server response times are low (TTFB)',

failureTitle:'Reduce server response times (TTFB)',

description:'Time To First Byte identifies the time at which your server sends a response.'+
' [Learn more](https://web.dev/time-to-first-byte).',

displayValue:`Root document took {timeInMs, number, milliseconds}\xa0ms`};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const TTFB_THRESHOLD=600;

class TTFBMetric extends Audit{



static get meta(){
return{
id:'time-to-first-byte',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','URL']};

}




static caclulateTTFB(record){
const timing=record.timing;
return timing?timing.receiveHeadersEnd-timing.sendEnd:0;
}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const mainResource=await MainResource.request({devtoolsLog,URL:artifacts.URL},context);

const ttfb=TTFBMetric.caclulateTTFB(mainResource);
const passed=ttfb<TTFB_THRESHOLD;
const displayValue=str_(UIStrings.displayValue,{timeInMs:ttfb});


const details={
type:'opportunity',
overallSavingsMs:ttfb-TTFB_THRESHOLD,
headings:[],
items:[]};


return{
numericValue:ttfb,
score:Number(passed),
displayValue,
details,
extendedInfo:{
value:{
wastedMs:ttfb-TTFB_THRESHOLD}}};



}}


module.exports=TTFBMetric;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/time-to-first-byte.js");
},{"../computed/main-resource.js":11,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/user-timings":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const ComputedUserTimings=require('../computed/user-timings.js');

const UIStrings={

title:'User Timing marks and measures',

description:'Consider instrumenting your app with the User Timing API to measure your '+
'app\'s real-world performance during key user experiences. '+
'[Learn more](https://web.dev/user-timings).',

displayValue:`{itemCount, plural,
    =1 {1 user timing}
    other {# user timings}
    }`,

columnType:'Type',

columnStartTime:'Start Time',

columnDuration:'Duration'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);




class UserTimings extends Audit{



static get meta(){
return{
id:'user-timings',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
requiredArtifacts:['traces']};

}




static get blacklistedPrefixes(){
return['goog_'];
}






static excludeBlacklisted(evt){
return UserTimings.blacklistedPrefixes.every(prefix=>!evt.name.startsWith(prefix));
}






static audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
return ComputedUserTimings.request(trace,context).then(computedUserTimings=>{
const userTimings=computedUserTimings.filter(UserTimings.excludeBlacklisted);
const tableRows=userTimings.map(item=>{
return{
name:item.name,
startTime:item.startTime,
duration:item.isMark?undefined:item.duration,
timingType:item.isMark?'Mark':'Measure'};

}).sort((itemA,itemB)=>{
if(itemA.timingType===itemB.timingType){

return itemA.startTime-itemB.startTime;
}else if(itemA.timingType==='Measure'){

return-1;
}else{
return 1;
}
});


const headings=[
{key:'name',itemType:'text',text:str_(i18n.UIStrings.columnName)},
{key:'timingType',itemType:'text',text:str_(UIStrings.columnType)},
{key:'startTime',itemType:'ms',granularity:0.01,
text:str_(UIStrings.columnStartTime)},
{key:'duration',itemType:'ms',granularity:0.01,text:str_(UIStrings.columnDuration)}];


const details=Audit.makeTableDetails(headings,tableRows);


let displayValue;
if(userTimings.length){
displayValue=str_(UIStrings.displayValue,{itemCount:userTimings.length});
}

return{

score:Number(userTimings.length===0),
notApplicable:userTimings.length===0,
displayValue,
extendedInfo:{
value:userTimings},

details};

});
}}


module.exports=UserTimings;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/user-timings.js");
},{"../computed/user-timings.js":40,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/uses-rel-preconnect":[function(require,module,exports){
(function(__filename){






'use strict';

const Audit=require('./audit.js');
const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
const URL=require('../lib/url-shim.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkRecords=require('../computed/network-records.js');
const MainResource=require('../computed/main-resource.js');
const LoadSimulator=require('../computed/load-simulator.js');





const PRECONNECT_SOCKET_MAX_IDLE=15;

const IGNORE_THRESHOLD_IN_MS=50;

const UIStrings={

title:'Preconnect to required origins',

description:
'Consider adding `preconnect` or `dns-prefetch` resource hints to establish early '+
`connections to important third-party origins. [Learn more](https://web.dev/uses-rel-preconnect).`,




crossoriginWarning:'A preconnect <link> was found for "{securityOrigin}" but was not used '+
'by the browser. Check that you are using the `crossorigin` attribute properly.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class UsesRelPreconnectAudit extends Audit{



static get meta(){
return{
id:'uses-rel-preconnect',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','URL','LinkElements'],
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};

}






static hasValidTiming(record){
return!!record.timing&&record.timing.connectEnd>0&&record.timing.connectStart>0;
}






static hasAlreadyConnectedToOrigin(record){
return(
!!record.timing&&
record.timing.dnsEnd-record.timing.dnsStart===0&&
record.timing.connectEnd-record.timing.connectStart===0);

}







static socketStartTimeIsBelowThreshold(record,mainResource){
return Math.max(0,record.startTime-mainResource.endTime)<PRECONNECT_SOCKET_MAX_IDLE;
}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[UsesRelPreconnectAudit.DEFAULT_PASS];
const settings=context.settings;
let maxWasted=0;

const warnings=[];

const[networkRecords,mainResource,loadSimulator]=await Promise.all([
NetworkRecords.request(devtoolsLog,context),
MainResource.request({devtoolsLog,URL:artifacts.URL},context),
LoadSimulator.request({devtoolsLog,settings},context)]);


const{rtt,additionalRttByOrigin}=loadSimulator.getOptions();


const origins=new Map();
networkRecords.
forEach(record=>{
if(

!UsesRelPreconnectAudit.hasValidTiming(record)||

record.initiator.url===mainResource.url||

!record.parsedURL||!record.parsedURL.securityOrigin||

mainResource.parsedURL.securityOrigin===record.parsedURL.securityOrigin||

UsesRelPreconnectAudit.hasAlreadyConnectedToOrigin(record)||

!UsesRelPreconnectAudit.socketStartTimeIsBelowThreshold(record,mainResource))
{
return;
}

const securityOrigin=record.parsedURL.securityOrigin;
const records=origins.get(securityOrigin)||[];
records.push(record);
origins.set(securityOrigin,records);
});

const preconnectLinks=artifacts.LinkElements.filter(el=>el.rel==='preconnect');
const preconnectOrigins=new Set(preconnectLinks.map(link=>URL.getOrigin(link.href||'')));


let results=[];
origins.forEach(records=>{


const firstRecordOfOrigin=records.reduce((firstRecord,record)=>{
return record.startTime<firstRecord.startTime?record:firstRecord;
});


if(!firstRecordOfOrigin.timing)return;

const securityOrigin=firstRecordOfOrigin.parsedURL.securityOrigin;




const additionalRtt=additionalRttByOrigin.get(securityOrigin)||0;
let connectionTime=rtt+additionalRtt;

if(firstRecordOfOrigin.parsedURL.scheme==='https')connectionTime=connectionTime*2;

const timeBetweenMainResourceAndDnsStart=
firstRecordOfOrigin.startTime*1000-
mainResource.endTime*1000+
firstRecordOfOrigin.timing.dnsStart;

const wastedMs=Math.min(connectionTime,timeBetweenMainResourceAndDnsStart);
if(wastedMs<IGNORE_THRESHOLD_IN_MS)return;

if(preconnectOrigins.has(securityOrigin)){

warnings.push(str_(UIStrings.crossoriginWarning,{securityOrigin}));
return;
}

maxWasted=Math.max(wastedMs,maxWasted);
results.push({
url:securityOrigin,
wastedMs:wastedMs});

});

results=results.
sort((a,b)=>b.wastedMs-a.wastedMs);


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];


const details=Audit.makeOpportunityDetails(headings,results,maxWasted);

return{
score:UnusedBytes.scoreForWastedMs(maxWasted),
numericValue:maxWasted,
displayValue:maxWasted?
str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:maxWasted}):
'',
extendedInfo:{
value:results},

warnings,
details};

}}


module.exports=UsesRelPreconnectAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/uses-rel-preconnect.js");
},{"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/uses-rel-preload":[function(require,module,exports){
(function(__filename){





'use strict';

const URL=require('../lib/url-shim.js');
const Audit=require('./audit.js');
const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
const CriticalRequestChains=require('../computed/critical-request-chains.js');
const i18n=require('../lib/i18n/i18n.js');
const MainResource=require('../computed/main-resource.js');
const PageDependencyGraph=require('../computed/page-dependency-graph.js');
const LoadSimulator=require('../computed/load-simulator.js');

const UIStrings={

title:'Preload key requests',

description:'Consider using `<link rel=preload>` to prioritize fetching resources that are '+
'currently requested later in page load. [Learn more](https://web.dev/uses-rel-preload).',




crossoriginWarning:'A preload <link> was found for "{preloadURL}" but was not used '+
'by the browser. Check that you are using the `crossorigin` attribute properly.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const THRESHOLD_IN_MS=100;

class UsesRelPreloadAudit extends Audit{



static get meta(){
return{
id:'uses-rel-preload',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','traces','URL'],
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};

}






static getURLsToPreload(mainResource,graph){

const urls=new Set();

graph.traverse((node,traversalPath)=>{
if(node.type!=='network')return;

const path=traversalPath.slice(1).filter(initiator=>initiator.type==='network');
if(!UsesRelPreloadAudit.shouldPreloadRequest(node.record,mainResource,path))return;
urls.add(node.record.url);
});

return urls;
}







static getURLsFailedToPreload(graph){

const requests=[];
graph.traverse(node=>node.type==='network'&&requests.push(node.record));

const preloadRequests=requests.filter(req=>req.isLinkPreload);
const preloadURLs=new Set(preloadRequests.map(req=>req.url));


const failedRequests=requests.filter(req=>preloadURLs.has(req.url)&&!req.isLinkPreload);
return new Set(failedRequests.map(req=>req.url));
}













static shouldPreloadRequest(request,mainResource,initiatorPath){
const mainResourceDepth=mainResource.redirects?mainResource.redirects.length:0;


if(request.isLinkPreload)return false;

if(!CriticalRequestChains.isCritical(request,mainResource))return false;

if(URL.NON_NETWORK_PROTOCOLS.includes(request.protocol))return false;

if(initiatorPath.length!==mainResourceDepth+2)return false;

return URL.rootDomainsMatch(request.url,mainResource.url);
}








static computeWasteWithGraph(urls,graph,simulator){
if(!urls.size){
return{wastedMs:0,results:[]};
}



const simulationBeforeChanges=simulator.simulate(graph,{flexibleOrdering:true});
const modifiedGraph=graph.cloneWithRelationships();


const nodesToPreload=[];

let mainDocumentNode=null;
modifiedGraph.traverse(node=>{
if(node.type!=='network')return;

const networkNode=node;
if(node.isMainDocument()){
mainDocumentNode=networkNode;
}else if(networkNode.record&&urls.has(networkNode.record.url)){
nodesToPreload.push(networkNode);
}
});

if(!mainDocumentNode){

throw new Error('Could not find main document node');
}



for(const node of nodesToPreload){
node.removeAllDependencies();
node.addDependency(mainDocumentNode);
}


const simulationAfterChanges=simulator.simulate(modifiedGraph,{flexibleOrdering:true});
const originalNodesByRecord=Array.from(simulationBeforeChanges.nodeTimings.keys()).

reduce((map,node)=>map.set(node.record,node),new Map());

const results=[];
for(const node of nodesToPreload){
const originalNode=originalNodesByRecord.get(node.record);
const timingAfter=simulationAfterChanges.nodeTimings.get(node);
const timingBefore=simulationBeforeChanges.nodeTimings.get(originalNode);
if(!timingBefore||!timingAfter)throw new Error('Missing preload node');

const wastedMs=Math.round(timingBefore.endTime-timingAfter.endTime);
if(wastedMs<THRESHOLD_IN_MS)continue;
results.push({url:node.record.url,wastedMs});
}

if(!results.length){
return{wastedMs:0,results};
}

return{


wastedMs:Math.max(...results.map(item=>item.wastedMs)),
results};

}






static async audit(artifacts,context){
const trace=artifacts.traces[UsesRelPreloadAudit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS];
const URL=artifacts.URL;
const simulatorOptions={trace,devtoolsLog,settings:context.settings};

const[mainResource,graph,simulator]=await Promise.all([
MainResource.request({devtoolsLog,URL},context),
PageDependencyGraph.request({trace,devtoolsLog},context),
LoadSimulator.request(simulatorOptions,context)]);


const urls=UsesRelPreloadAudit.getURLsToPreload(mainResource,graph);
const{results,wastedMs}=UsesRelPreloadAudit.computeWasteWithGraph(urls,graph,simulator);

results.sort((a,b)=>b.wastedMs-a.wastedMs);


let warnings;
const failedURLs=UsesRelPreloadAudit.getURLsFailedToPreload(graph);
if(failedURLs.size){
warnings=Array.from(failedURLs).
map(preloadURL=>str_(UIStrings.crossoriginWarning,{preloadURL}));
}


const headings=[
{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];

const details=Audit.makeOpportunityDetails(headings,results,wastedMs);

return{
score:UnusedBytes.scoreForWastedMs(wastedMs),
numericValue:wastedMs,
displayValue:wastedMs?
str_(i18n.UIStrings.displayValueMsSavings,{wastedMs}):
'',
extendedInfo:{
value:results},

details,
warnings};

}}


module.exports=UsesRelPreloadAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/uses-rel-preload.js");
},{"../computed/critical-request-chains.js":9,"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/page-dependency-graph.js":35,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/viewport":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const ComputedViewportMeta=require('../computed/viewport-meta.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Has a `<meta name="viewport">` tag with `width` or `initial-scale`',

failureTitle:'Does not have a `<meta name="viewport">` tag with `width` '+
'or `initial-scale`',

description:'Add a `<meta name="viewport">` tag to optimize your app for mobile screens. '+
'[Learn more](https://web.dev/viewport).',

explanationNoTag:'No `<meta name="viewport">` tag found'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class Viewport extends Audit{



static get meta(){
return{
id:'viewport',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['MetaElements']};

}






static async audit(artifacts,context){
const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);

if(!viewportMeta.hasViewportTag){
return{
score:0,
explanation:str_(UIStrings.explanationNoTag)};

}

return{
score:Number(viewportMeta.isMobileOptimized),
warnings:viewportMeta.parserWarnings};

}}


module.exports=Viewport;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/viewport.js");
},{"../computed/viewport-meta.js":41,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/without-javascript":[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Contains some content when JavaScript is not available',

failureTitle:'Does not provide fallback content when JavaScript is not available',

description:'Your app should display some content when JavaScript is disabled, even if '+
'it\'s just a warning to the user that JavaScript is required to use the app. '+
'[Learn more](https://web.dev/without-javascript).',

explanation:'The page body should render some content if its scripts are not available.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class WithoutJavaScript extends Audit{



static get meta(){
return{
id:'without-javascript',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['HTMLWithoutJavaScript']};

}





static audit(artifacts){
const artifact=artifacts.HTMLWithoutJavaScript;


if(artifact.bodyText.trim()===''&&!artifact.hasNoScript){
return{
score:0,
explanation:str_(UIStrings.explanation)};

}

return{
score:1};

}}


module.exports=WithoutJavaScript;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/without-javascript.js");
},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/works-offline":[function(require,module,exports){
(function(__filename){





'use strict';

const URL=require('../lib/url-shim.js');
const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

title:'Current page responds with a 200 when offline',

failureTitle:'Current page does not respond with a 200 when offline',

description:'If you\'re building a Progressive Web App, consider using a service worker '+
'so that your app can work offline. '+
'[Learn more](https://web.dev/works-offline).',





warningNoLoad:'The page may not be loading offline because your test URL '+
`({requested}) was redirected to "{final}". `+
'Try testing the second URL directly.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class WorksOffline extends Audit{



static get meta(){
return{
id:'works-offline',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['Offline','URL']};

}





static audit(artifacts){
const warnings=[];
const passed=artifacts.Offline===200;
if(!passed&&
!URL.equalWithExcludedFragments(artifacts.URL.requestedUrl,artifacts.URL.finalUrl)){
warnings.push(str_(UIStrings.warningNoLoad,
{requested:artifacts.URL.requestedUrl,final:artifacts.URL.finalUrl}));
}

return{
score:Number(passed),
warnings};

}}


module.exports=WorksOffline;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/works-offline.js");
},{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../gather/gatherers/accessibility":[function(require,module,exports){





'use strict';



const Gatherer=require('./gatherer.js');

const axeLibSource="/*! axe v3.3.0\n * Copyright (c) 2019 Deque Systems, Inc.\n *\n * Your use of this Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * This entire copyright notice must appear in every copy of this file you\n * distribute or in any file that contains substantial portions of this source\n * code.\n */\n!function e(window){var a=window,document=window.document;function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function l(e){this.name=\"SupportError\",this.cause=e.cause,this.message=\"`\".concat(e.cause,\"` - feature unsupported in your environment.\"),e.ruleId&&(this.ruleId=e.ruleId,this.message+=\" Skipping \".concat(this.ruleId,\" rule.\")),this.stack=(new Error).stack}(axe=axe||{}).version=\"3.3.0\",\"function\"==typeof define&&define.amd&&define(\"axe-core\",[],function(){\"use strict\";return axe}),\"object\"===(\"undefined\"==typeof module?\"undefined\":S(module))&&module.exports&&\"function\"==typeof e.toString&&(axe.source=\"(\"+e.toString()+')(typeof window === \"object\" ? window : this);',module.exports=axe),\"function\"==typeof window.getComputedStyle&&(window.axe=axe),(l.prototype=Object.create(Error.prototype)).constructor=l,function o(i,u,s){function l(t,e){if(!u[t]){if(!i[t]){var n=\"function\"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error(\"Cannot find module '\"+t+\"'\");throw r.code=\"MODULE_NOT_FOUND\",r}var a=u[t]={exports:{}};i[t][0].call(a.exports,function(e){return l(i[t][1][e]||e)},a,a.exports,o,i,u,s)}return u[t].exports}for(var c=\"function\"==typeof require&&require,e=0;e<s.length;e++)l(s[e]);return l}({1:[function(e,t,n){\"Promise\"in window||e(\"es6-promise\").polyfill(),e(\"weakmap-polyfill\"),axe.imports={axios:e(\"axios\"),CssSelectorParser:e(\"css-selector-parser\").CssSelectorParser,doT:e(\"dot\"),emojiRegexText:e(\"emoji-regex\")}},{axios:2,\"css-selector-parser\":28,dot:30,\"emoji-regex\":31,\"es6-promise\":32,\"weakmap-polyfill\":34}],2:[function(e,t,n){t.exports=e(\"./lib/axios\")},{\"./lib/axios\":4}],3:[function(c,e,t){\"use strict\";var utils=c(\"./../utils\"),d=c(\"./../core/settle\"),m=c(\"./../helpers/buildURL\"),p=c(\"./../helpers/parseHeaders\"),f=c(\"./../helpers/isURLSameOrigin\"),h=c(\"../core/createError\");e.exports=function(l){return new Promise(function(n,r){var a=l.data,o=l.headers;utils.isFormData(a)&&delete o[\"Content-Type\"];var i=new XMLHttpRequest;if(l.auth){var e=l.auth.username||\"\",t=l.auth.password||\"\";o.Authorization=\"Basic \"+btoa(e+\":\"+t)}if(i.open(l.method.toUpperCase(),m(l.url,l.params,l.paramsSerializer),!0),i.timeout=l.timeout,i.onreadystatechange=function(){if(i&&4===i.readyState&&(0!==i.status||i.responseURL&&0===i.responseURL.indexOf(\"file:\"))){var e=\"getAllResponseHeaders\"in i?p(i.getAllResponseHeaders()):null,t={data:l.responseType&&\"text\"!==l.responseType?i.response:i.responseText,status:i.status,statusText:i.statusText,headers:e,config:l,request:i};d(n,r,t),i=null}},i.onabort=function(){i&&(r(h(\"Request aborted\",l,\"ECONNABORTED\",i)),i=null)},i.onerror=function(){r(h(\"Network Error\",l,null,i)),i=null},i.ontimeout=function(){r(h(\"timeout of \"+l.timeout+\"ms exceeded\",l,\"ECONNABORTED\",i)),i=null},utils.isStandardBrowserEnv()){var u=c(\"./../helpers/cookies\"),s=(l.withCredentials||f(l.url))&&l.xsrfCookieName?u.read(l.xsrfCookieName):void 0;s&&(o[l.xsrfHeaderName]=s)}if(\"setRequestHeader\"in i&&utils.forEach(o,function(e,t){void 0===a&&\"content-type\"===t.toLowerCase()?delete o[t]:i.setRequestHeader(t,e)}),l.withCredentials&&(i.withCredentials=!0),l.responseType)try{i.responseType=l.responseType}catch(e){if(\"json\"!==l.responseType)throw e}\"function\"==typeof l.onDownloadProgress&&i.addEventListener(\"progress\",l.onDownloadProgress),\"function\"==typeof l.onUploadProgress&&i.upload&&i.upload.addEventListener(\"progress\",l.onUploadProgress),l.cancelToken&&l.cancelToken.promise.then(function(e){i&&(i.abort(),r(e),i=null)}),void 0===a&&(a=null),i.send(a)})}},{\"../core/createError\":10,\"./../core/settle\":14,\"./../helpers/buildURL\":18,\"./../helpers/cookies\":20,\"./../helpers/isURLSameOrigin\":22,\"./../helpers/parseHeaders\":24,\"./../utils\":26}],4:[function(e,t,n){\"use strict\";var utils=e(\"./utils\"),r=e(\"./helpers/bind\"),a=e(\"./core/Axios\"),o=e(\"./core/mergeConfig\");function i(e){var t=new a(e),n=r(a.prototype.request,t);return utils.extend(n,a.prototype,t),utils.extend(n,t),n}var u=i(e(\"./defaults\"));u.Axios=a,u.create=function(e){return i(o(u.defaults,e))},u.Cancel=e(\"./cancel/Cancel\"),u.CancelToken=e(\"./cancel/CancelToken\"),u.isCancel=e(\"./cancel/isCancel\"),u.all=function(e){return Promise.all(e)},u.spread=e(\"./helpers/spread\"),t.exports=u,t.exports.default=u},{\"./cancel/Cancel\":5,\"./cancel/CancelToken\":6,\"./cancel/isCancel\":7,\"./core/Axios\":8,\"./core/mergeConfig\":13,\"./defaults\":16,\"./helpers/bind\":17,\"./helpers/spread\":25,\"./utils\":26}],5:[function(e,t,n){\"use strict\";function r(e){this.message=e}r.prototype.toString=function(){return\"Cancel\"+(this.message?\": \"+this.message:\"\")},r.prototype.__CANCEL__=!0,t.exports=r},{}],6:[function(e,t,n){\"use strict\";var r=e(\"./Cancel\");function a(e){if(\"function\"!=typeof e)throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new r(e),t(n.reason))})}a.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},a.source=function(){var t;return{token:new a(function(e){t=e}),cancel:t}},t.exports=a},{\"./Cancel\":5}],7:[function(e,t,n){\"use strict\";t.exports=function(e){return!(!e||!e.__CANCEL__)}},{}],8:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),r=e(\"../helpers/buildURL\"),a=e(\"./InterceptorManager\"),o=e(\"./dispatchRequest\"),i=e(\"./mergeConfig\");function u(e){this.defaults=e,this.interceptors={request:new a,response:new a}}u.prototype.request=function(e,t){\"string\"==typeof e?(e=t||{}).url=arguments[0]:e=e||{},(e=i(this.defaults,e)).method=e.method?e.method.toLowerCase():\"get\";var n=[o,void 0],r=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){n.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){n.push(e.fulfilled,e.rejected)});n.length;)r=r.then(n.shift(),n.shift());return r},u.prototype.getUri=function(e){return e=i(this.defaults,e),r(e.url,e.params,e.paramsSerializer).replace(/^\\?/,\"\")},utils.forEach([\"delete\",\"get\",\"head\",\"options\"],function(n){u.prototype[n]=function(e,t){return this.request(utils.merge(t||{},{method:n,url:e}))}}),utils.forEach([\"post\",\"put\",\"patch\"],function(r){u.prototype[r]=function(e,t,n){return this.request(utils.merge(n||{},{method:r,url:e,data:t}))}}),t.exports=u},{\"../helpers/buildURL\":18,\"./../utils\":26,\"./InterceptorManager\":9,\"./dispatchRequest\":11,\"./mergeConfig\":13}],9:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");function r(){this.handlers=[]}r.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(t){utils.forEach(this.handlers,function(e){null!==e&&t(e)})},t.exports=r},{\"./../utils\":26}],10:[function(e,t,n){\"use strict\";var i=e(\"./enhanceError\");t.exports=function(e,t,n,r,a){var o=new Error(e);return i(o,t,n,r,a)}},{\"./enhanceError\":12}],11:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),r=e(\"./transformData\"),a=e(\"../cancel/isCancel\"),o=e(\"../defaults\"),i=e(\"./../helpers/isAbsoluteURL\"),u=e(\"./../helpers/combineURLs\");function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}t.exports=function(t){return s(t),t.baseURL&&!i(t.url)&&(t.url=u(t.baseURL,t.url)),t.headers=t.headers||{},t.data=r(t.data,t.headers,t.transformRequest),t.headers=utils.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),utils.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(e){delete t.headers[e]}),(t.adapter||o.adapter)(t).then(function(e){return s(t),e.data=r(e.data,e.headers,t.transformResponse),e},function(e){return a(e)||(s(t),e&&e.response&&(e.response.data=r(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},{\"../cancel/isCancel\":7,\"../defaults\":16,\"./../helpers/combineURLs\":19,\"./../helpers/isAbsoluteURL\":21,\"./../utils\":26,\"./transformData\":15}],12:[function(e,t,n){\"use strict\";t.exports=function(e,t,n,r,a){return e.config=t,n&&(e.code=n),e.request=r,e.response=a,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},{}],13:[function(e,t,n){\"use strict\";var utils=e(\"../utils\");t.exports=function(t,n){n=n||{};var r={};return utils.forEach([\"url\",\"method\",\"params\",\"data\"],function(e){void 0!==n[e]&&(r[e]=n[e])}),utils.forEach([\"headers\",\"auth\",\"proxy\"],function(e){utils.isObject(n[e])?r[e]=utils.deepMerge(t[e],n[e]):void 0!==n[e]?r[e]=n[e]:utils.isObject(t[e])?r[e]=utils.deepMerge(t[e]):void 0!==t[e]&&(r[e]=t[e])}),utils.forEach([\"baseURL\",\"transformRequest\",\"transformResponse\",\"paramsSerializer\",\"timeout\",\"withCredentials\",\"adapter\",\"responseType\",\"xsrfCookieName\",\"xsrfHeaderName\",\"onUploadProgress\",\"onDownloadProgress\",\"maxContentLength\",\"validateStatus\",\"maxRedirects\",\"httpAgent\",\"httpsAgent\",\"cancelToken\",\"socketPath\"],function(e){void 0!==n[e]?r[e]=n[e]:void 0!==t[e]&&(r[e]=t[e])}),r}},{\"../utils\":26}],14:[function(e,t,n){\"use strict\";var a=e(\"./createError\");t.exports=function(e,t,n){var r=n.config.validateStatus;!r||r(n.status)?e(n):t(a(\"Request failed with status code \"+n.status,n.config,null,n.request,n))}},{\"./createError\":10}],15:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");t.exports=function(t,n,e){return utils.forEach(e,function(e){t=e(t,n)}),t}},{\"./../utils\":26}],16:[function(i,u,e){(function(e){\"use strict\";var utils=i(\"./utils\"),n=i(\"./helpers/normalizeHeaderName\"),t={\"Content-Type\":\"application/x-www-form-urlencoded\"};function r(e,t){!utils.isUndefined(e)&&utils.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}var a,o={adapter:(void 0!==e&&\"[object process]\"===Object.prototype.toString.call(e)?a=i(\"./adapters/http\"):\"undefined\"!=typeof XMLHttpRequest&&(a=i(\"./adapters/xhr\")),a),transformRequest:[function(e,t){return n(t,\"Accept\"),n(t,\"Content-Type\"),utils.isFormData(e)||utils.isArrayBuffer(e)||utils.isBuffer(e)||utils.isStream(e)||utils.isFile(e)||utils.isBlob(e)?e:utils.isArrayBufferView(e)?e.buffer:utils.isURLSearchParams(e)?(r(t,\"application/x-www-form-urlencoded;charset=utf-8\"),e.toString()):utils.isObject(e)?(r(t,\"application/json;charset=utf-8\"),JSON.stringify(e)):e}],transformResponse:[function(e){if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,validateStatus:function(e){return 200<=e&&e<300}};o.headers={common:{Accept:\"application/json, text/plain, */*\"}},utils.forEach([\"delete\",\"get\",\"head\"],function(e){o.headers[e]={}}),utils.forEach([\"post\",\"put\",\"patch\"],function(e){o.headers[e]=utils.merge(t)}),u.exports=o}).call(this,i(\"_process\"))},{\"./adapters/http\":3,\"./adapters/xhr\":3,\"./helpers/normalizeHeaderName\":23,\"./utils\":26,_process:33}],17:[function(e,t,n){\"use strict\";t.exports=function(n,r){return function(){for(var e=new Array(arguments.length),t=0;t<e.length;t++)e[t]=arguments[t];return n.apply(r,e)}}},{}],18:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");function i(e){return encodeURIComponent(e).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}t.exports=function(e,t,n){if(!t)return e;var r;if(n)r=n(t);else if(utils.isURLSearchParams(t))r=t.toString();else{var a=[];utils.forEach(t,function(e,t){null!=e&&(utils.isArray(e)?t+=\"[]\":e=[e],utils.forEach(e,function(e){utils.isDate(e)?e=e.toISOString():utils.isObject(e)&&(e=JSON.stringify(e)),a.push(i(t)+\"=\"+i(e))}))}),r=a.join(\"&\")}if(r){var o=e.indexOf(\"#\");-1!==o&&(e=e.slice(0,o)),e+=(-1===e.indexOf(\"?\")?\"?\":\"&\")+r}return e}},{\"./../utils\":26}],19:[function(e,t,n){\"use strict\";t.exports=function(e,t){return t?e.replace(/\\/+$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}},{}],20:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");t.exports=utils.isStandardBrowserEnv()?{write:function(e,t,n,r,a,o){var i=[];i.push(e+\"=\"+encodeURIComponent(t)),utils.isNumber(n)&&i.push(\"expires=\"+new Date(n).toGMTString()),utils.isString(r)&&i.push(\"path=\"+r),utils.isString(a)&&i.push(\"domain=\"+a),!0===o&&i.push(\"secure\"),document.cookie=i.join(\"; \")},read:function(e){var t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,\"\",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},{\"./../utils\":26}],21:[function(e,t,n){\"use strict\";t.exports=function(e){return/^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(e)}},{}],22:[function(e,t,n){\"use strict\";var r,a,o,utils=e(\"./../utils\");function i(e){var t=e;return a&&(o.setAttribute(\"href\",t),t=o.href),o.setAttribute(\"href\",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,\"\"):\"\",host:o.host,search:o.search?o.search.replace(/^\\?/,\"\"):\"\",hash:o.hash?o.hash.replace(/^#/,\"\"):\"\",hostname:o.hostname,port:o.port,pathname:\"/\"===o.pathname.charAt(0)?o.pathname:\"/\"+o.pathname}}t.exports=utils.isStandardBrowserEnv()?(a=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement(\"a\"),r=i(window.location.href),function(e){var t=utils.isString(e)?i(e):e;return t.protocol===r.protocol&&t.host===r.host}):function(){return!0}},{\"./../utils\":26}],23:[function(e,t,n){\"use strict\";var utils=e(\"../utils\");t.exports=function(n,r){utils.forEach(n,function(e,t){t!==r&&t.toUpperCase()===r.toUpperCase()&&(n[r]=e,delete n[t])})}},{\"../utils\":26}],24:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),o=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"];t.exports=function(e){var t,n,r,a={};return e&&utils.forEach(e.split(\"\\n\"),function(e){if(r=e.indexOf(\":\"),t=utils.trim(e.substr(0,r)).toLowerCase(),n=utils.trim(e.substr(r+1)),t){if(a[t]&&0<=o.indexOf(t))return;a[t]=\"set-cookie\"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+\", \"+n:n}}),a}},{\"./../utils\":26}],25:[function(e,t,n){\"use strict\";t.exports=function(t){return function(e){return t.apply(null,e)}}},{}],26:[function(e,t,n){\"use strict\";var a=e(\"./helpers/bind\"),r=e(\"is-buffer\"),o=Object.prototype.toString;function i(e){return\"[object Array]\"===o.call(e)}function u(e){return null!==e&&\"object\"==typeof e}function s(e){return\"[object Function]\"===o.call(e)}function l(e,t){if(null!=e)if(\"object\"!=typeof e&&(e=[e]),i(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.call(null,e[a],a,e)}t.exports={isArray:i,isArrayBuffer:function(e){return\"[object ArrayBuffer]\"===o.call(e)},isBuffer:r,isFormData:function(e){return\"undefined\"!=typeof FormData&&e instanceof FormData},isArrayBufferView:function(e){return\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer},isString:function(e){return\"string\"==typeof e},isNumber:function(e){return\"number\"==typeof e},isObject:u,isUndefined:function(e){return void 0===e},isDate:function(e){return\"[object Date]\"===o.call(e)},isFile:function(e){return\"[object File]\"===o.call(e)},isBlob:function(e){return\"[object Blob]\"===o.call(e)},isFunction:s,isStream:function(e){return u(e)&&s(e.pipe)},isURLSearchParams:function(e){return\"undefined\"!=typeof URLSearchParams&&e instanceof URLSearchParams},isStandardBrowserEnv:function(){return(\"undefined\"==typeof navigator||\"ReactNative\"!==navigator.product&&\"NativeScript\"!==navigator.product&&\"NS\"!==navigator.product)&&(void 0!==window&&void 0!==document)},forEach:l,merge:function n(){var r={};function e(e,t){\"object\"==typeof r[t]&&\"object\"==typeof e?r[t]=n(r[t],e):r[t]=e}for(var t=0,a=arguments.length;t<a;t++)l(arguments[t],e);return r},deepMerge:function n(){var r={};function e(e,t){\"object\"==typeof r[t]&&\"object\"==typeof e?r[t]=n(r[t],e):r[t]=\"object\"==typeof e?n({},e):e}for(var t=0,a=arguments.length;t<a;t++)l(arguments[t],e);return r},extend:function(n,e,r){return l(e,function(e,t){n[t]=r&&\"function\"==typeof e?a(e,r):e}),n},trim:function(e){return e.replace(/^\\s*/,\"\").replace(/\\s*$/,\"\")}}},{\"./helpers/bind\":17,\"is-buffer\":27}],27:[function(e,t,n){t.exports=function(e){return null!=e&&null!=e.constructor&&\"function\"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}},{}],28:[function(e,t,n){t.exports={CssSelectorParser:e(\"./lib/css-selector-parser.js\").CssSelectorParser}},{\"./lib/css-selector-parser.js\":29}],29:[function(e,t,n){function r(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function o(e){return\"a\"<=e&&e<=\"f\"||\"A\"<=e&&e<=\"F\"||\"0\"<=e&&e<=\"9\"}r.prototype.registerSelectorPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.pseudos[e]=\"selector\";return this},r.prototype.unregisterSelectorPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.pseudos[e];return this},r.prototype.registerNumericPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.pseudos[e]=\"numeric\";return this},r.prototype.unregisterNumericPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.pseudos[e];return this},r.prototype.registerNestingOperators=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.ruleNestingOperators[e]=!0;return this},r.prototype.unregisterNestingOperators=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.ruleNestingOperators[e];return this},r.prototype.registerAttrEqualityMods=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.attrEqualityMods[e]=!0;return this},r.prototype.unregisterAttrEqualityMods=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.attrEqualityMods[e];return this},r.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},r.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var u={\"!\":!0,'\"':!0,\"#\":!0,$:!0,\"%\":!0,\"&\":!0,\"'\":!0,\"(\":!0,\")\":!0,\"*\":!0,\"+\":!0,\",\":!0,\".\":!0,\"/\":!0,\";\":!0,\"<\":!0,\"=\":!0,\">\":!0,\"?\":!0,\"@\":!0,\"[\":!0,\"\\\\\":!0,\"]\":!0,\"^\":!0,\"`\":!0,\"{\":!0,\"|\":!0,\"}\":!0,\"~\":!0},i={\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\f\":\"\\\\f\",\"\\v\":\"\\\\v\"},y={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",\"'\":\"'\"},v={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",'\"':'\"'};function a(s,l,c,d,a,m){var p,f,h,b,g;return b=s.length,p=null,h=function(e,t){var n,r,a;for(a=\"\",l++,p=s.charAt(l);l<b;){if(p===e)return l++,a;if(\"\\\\\"===p)if(l++,(p=s.charAt(l))===e)a+=e;else if(n=t[p])a+=n;else{if(o(p)){for(r=p,l++,p=s.charAt(l);o(p);)r+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),a+=String.fromCharCode(parseInt(r,16));continue}a+=p}else a+=p;l++,p=s.charAt(l)}return a},f=function(){var e,t=\"\";for(p=s.charAt(l);l<b;){if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"0\"<=e&&e<=\"9\"||\"-\"===e||\"_\"===e)t+=p;else{if(\"\\\\\"!==p)return t;if(b<=++l)throw Error(\"Expected symbol but end of file reached.\");if(p=s.charAt(l),u[p])t+=p;else{if(o(p)){var n=p;for(l++,p=s.charAt(l);o(p);)n+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),t+=String.fromCharCode(parseInt(n,16));continue}t+=p}}l++,p=s.charAt(l)}return t},g=function(){p=s.charAt(l);for(var e=!1;\" \"===p||\"\\t\"===p||\"\\n\"===p||\"\\r\"===p||\"\\f\"===p;)e=!0,l++,p=s.charAt(l);return e},this.parse=function(){var e=this.parseSelector();if(l<b)throw Error('Rule expected but \"'+s.charAt(l)+'\" found.');return e},this.parseSelector=function(){var e,t=e=this.parseSingleSelector();for(p=s.charAt(l);\",\"===p;){if(l++,g(),\"selectors\"!==e.type&&(e={type:\"selectors\",selectors:[t]}),!(t=this.parseSingleSelector()))throw Error('Rule expected after \",\".');e.selectors.push(t)}return e},this.parseSingleSelector=function(){g();var e={type:\"ruleSet\"},t=this.parseRule();if(!t)return null;for(var n=e;t&&(t.type=\"rule\",n.rule=t,n=t,g(),p=s.charAt(l),!(b<=l||\",\"===p||\")\"===p));)if(a[p]){var r=p;if(l++,g(),!(t=this.parseRule()))throw Error('Rule expected after \"'+r+'\".');t.nestingOperator=r}else(t=this.parseRule())&&(t.nestingOperator=null);return e},this.parseRule=function(){for(var e,t=null;l<b;)if(\"*\"===(p=s.charAt(l)))l++,(t=t||{}).tagName=\"*\";else if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"-\"===e||\"_\"===e||\"\\\\\"===p)(t=t||{}).tagName=f();else if(\".\"===p)l++,((t=t||{}).classNames=t.classNames||[]).push(f());else if(\"#\"===p)l++,(t=t||{}).id=f();else if(\"[\"===p){l++,g();var n={name:f()};if(g(),\"]\"===p)l++;else{var r=\"\";if(d[p]&&(r=p,l++,p=s.charAt(l)),b<=l)throw Error('Expected \"=\" but end of file reached.');if(\"=\"!==p)throw Error('Expected \"=\" but \"'+p+'\" found.');n.operator=r+\"=\",l++,g();var a=\"\";if(n.valueType=\"string\",'\"'===p)a=h('\"',v);else if(\"'\"===p)a=h(\"'\",y);else if(m&&\"$\"===p)l++,a=f(),n.valueType=\"substitute\";else{for(;l<b&&\"]\"!==p;)a+=p,l++,p=s.charAt(l);a=a.trim()}if(g(),b<=l)throw Error('Expected \"]\" but end of file reached.');if(\"]\"!==p)throw Error('Expected \"]\" but \"'+p+'\" found.');l++,n.value=a}((t=t||{}).attrs=t.attrs||[]).push(n)}else{if(\":\"!==p)break;l++;var o=f(),i={name:o};if(\"(\"===p){l++;var u=\"\";if(g(),\"selector\"===c[o])i.valueType=\"selector\",u=this.parseSelector();else{if(i.valueType=c[o]||\"string\",'\"'===p)u=h('\"',v);else if(\"'\"===p)u=h(\"'\",y);else if(m&&\"$\"===p)l++,u=f(),i.valueType=\"substitute\";else{for(;l<b&&\")\"!==p;)u+=p,l++,p=s.charAt(l);u=u.trim()}g()}if(b<=l)throw Error('Expected \")\" but end of file reached.');if(\")\"!==p)throw Error('Expected \")\" but \"'+p+'\" found.');l++,i.value=u}((t=t||{}).pseudos=t.pseudos||[]).push(i)}return t},this}r.prototype.parse=function(e){return new a(e,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},r.prototype.escapeIdentifier=function(e){for(var t=\"\",n=0,r=e.length;n<r;){var a=e.charAt(n);if(u[a])t+=\"\\\\\"+a;else if(\"_\"===a||\"-\"===a||\"A\"<=a&&a<=\"Z\"||\"a\"<=a&&a<=\"z\"||0!==n&&\"0\"<=a&&a<=\"9\")t+=a;else{var o=a.charCodeAt(0);if(55296==(63488&o)){var i=e.charCodeAt(n++);if(55296!=(64512&o)||56320!=(64512&i))throw Error(\"UCS-2(decode): illegal sequence\");o=((1023&o)<<10)+(1023&i)+65536}t+=\"\\\\\"+o.toString(16)+\" \"}n++}return t},r.prototype.escapeStr=function(e){for(var t,n,r=\"\",a=0,o=e.length;a<o;)'\"'===(t=e.charAt(a))?t='\\\\\"':\"\\\\\"===t?t=\"\\\\\\\\\":(n=i[t])&&(t=n),r+=t,a++;return'\"'+r+'\"'},r.prototype.render=function(e){return this._renderEntity(e).trim()},r.prototype._renderEntity=function(e){var t,n,r;switch(r=\"\",e.type){case\"ruleSet\":for(t=e.rule,n=[];t;)t.nestingOperator&&n.push(t.nestingOperator),n.push(this._renderEntity(t)),t=t.rule;r=n.join(\" \");break;case\"selectors\":r=e.selectors.map(this._renderEntity,this).join(\", \");break;case\"rule\":e.tagName&&(r=\"*\"===e.tagName?\"*\":this.escapeIdentifier(e.tagName)),e.id&&(r+=\"#\"+this.escapeIdentifier(e.id)),e.classNames&&(r+=e.classNames.map(function(e){return\".\"+this.escapeIdentifier(e)},this).join(\"\")),e.attrs&&(r+=e.attrs.map(function(e){return e.operator?\"substitute\"===e.valueType?\"[\"+this.escapeIdentifier(e.name)+e.operator+\"$\"+e.value+\"]\":\"[\"+this.escapeIdentifier(e.name)+e.operator+this.escapeStr(e.value)+\"]\":\"[\"+this.escapeIdentifier(e.name)+\"]\"},this).join(\"\")),e.pseudos&&(r+=e.pseudos.map(function(e){return e.valueType?\"selector\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+this._renderEntity(e.value)+\")\":\"substitute\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"($\"+e.value+\")\":\"numeric\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+e.value+\")\":\":\"+this.escapeIdentifier(e.name)+\"(\"+this.escapeIdentifier(e.value)+\")\":\":\"+this.escapeIdentifier(e.name)},this).join(\"\"));break;default:throw Error('Unknown entity type: \"'+e.type(NaN))}return r},n.CssSelectorParser=r},{}],30:[function(e,t,n){!function(){\"use strict\";var s,l={name:\"doT\",version:\"1.1.1\",templateSettings:{evaluate:/\\{\\{([\\s\\S]+?(\\}?)+)\\}\\}/g,interpolate:/\\{\\{=([\\s\\S]+?)\\}\\}/g,encode:/\\{\\{!([\\s\\S]+?)\\}\\}/g,use:/\\{\\{#([\\s\\S]+?)\\}\\}/g,useParams:/(^|[^\\w$])def(?:\\.|\\[[\\'\\\"])([\\w$\\.]+)(?:[\\'\\\"]\\])?\\s*\\:\\s*([\\w$\\.]+|\\\"[^\\\"]+\\\"|\\'[^\\']+\\'|\\{[^\\}]+\\})/g,define:/\\{\\{##\\s*([\\w\\.$]+)\\s*(\\:|=)([\\s\\S]+?)#\\}\\}/g,defineParams:/^\\s*([\\w$]+):([\\s\\S]+)/,conditional:/\\{\\{\\?(\\?)?\\s*([\\s\\S]*?)\\s*\\}\\}/g,iterate:/\\{\\{~\\s*(?:\\}\\}|([\\s\\S]+?)\\s*\\:\\s*([\\w$]+)\\s*(?:\\:\\s*([\\w$]+))?\\s*\\}\\})/g,varname:\"it\",strip:!0,append:!0,selfcontained:!1,doNotSkipEncoded:!1},template:void 0,compile:void 0,log:!0};l.encodeHTMLSource=function(e){var t={\"&\":\"&#38;\",\"<\":\"&#60;\",\">\":\"&#62;\",'\"':\"&#34;\",\"'\":\"&#39;\",\"/\":\"&#47;\"},n=e?/[&<>\"'\\/]/g:/&(?!#?\\w+;)|<|>|\"|'|\\//g;return function(e){return e?e.toString().replace(n,function(e){return t[e]||e}):\"\"}},s=function(){return this||(0,eval)(\"this\")}(),void 0!==t&&t.exports?t.exports=l:\"function\"==typeof define&&define.amd?define(function(){return l}):s.doT=l;var c={append:{start:\"'+(\",end:\")+'\",startencode:\"'+encodeHTML(\"},split:{start:\"';out+=(\",end:\");out+='\",startencode:\"';out+=encodeHTML(\"}},d=/$^/;function m(e){return e.replace(/\\\\('|\\\\)/g,\"$1\").replace(/[\\r\\t\\n]/g,\" \")}l.template=function(e,t,n){var r,a,o=(t=t||l.templateSettings).append?c.append:c.split,i=0,u=t.use||t.define?function r(a,e,o){return(\"string\"==typeof e?e:e.toString()).replace(a.define||d,function(e,r,t,n){return 0===r.indexOf(\"def.\")&&(r=r.substring(4)),r in o||(\":\"===t?(a.defineParams&&n.replace(a.defineParams,function(e,t,n){o[r]={arg:t,text:n}}),r in o||(o[r]=n)):new Function(\"def\",\"def['\"+r+\"']=\"+n)(o)),\"\"}).replace(a.use||d,function(e,t){a.useParams&&(t=t.replace(a.useParams,function(e,t,n,r){if(o[n]&&o[n].arg&&r){var a=(n+\":\"+r).replace(/'|\\\\/g,\"_\");return o.__exp=o.__exp||{},o.__exp[a]=o[n].text.replace(new RegExp(\"(^|[^\\\\w$])\"+o[n].arg+\"([^\\\\w$])\",\"g\"),\"$1\"+r+\"$2\"),t+\"def.__exp['\"+a+\"']\"}}));var n=new Function(\"def\",\"return \"+t)(o);return n?r(a,n,o):n})}(t,e,n||{}):e;u=(\"var out='\"+(t.strip?u.replace(/(^|\\r|\\n)\\t* +| +\\t*(\\r|\\n|$)/g,\" \").replace(/\\r|\\n|\\t|\\/\\*[\\s\\S]*?\\*\\//g,\"\"):u).replace(/'|\\\\/g,\"\\\\$&\").replace(t.interpolate||d,function(e,t){return o.start+m(t)+o.end}).replace(t.encode||d,function(e,t){return r=!0,o.startencode+m(t)+o.end}).replace(t.conditional||d,function(e,t,n){return t?n?\"';}else if(\"+m(n)+\"){out+='\":\"';}else{out+='\":n?\"';if(\"+m(n)+\"){out+='\":\"';}out+='\"}).replace(t.iterate||d,function(e,t,n,r){return t?(i+=1,a=r||\"i\"+i,t=m(t),\"';var arr\"+i+\"=\"+t+\";if(arr\"+i+\"){var \"+n+\",\"+a+\"=-1,l\"+i+\"=arr\"+i+\".length-1;while(\"+a+\"<l\"+i+\"){\"+n+\"=arr\"+i+\"[\"+a+\"+=1];out+='\"):\"';} } out+='\"}).replace(t.evaluate||d,function(e,t){return\"';\"+m(t)+\"out+='\"})+\"';return out;\").replace(/\\n/g,\"\\\\n\").replace(/\\t/g,\"\\\\t\").replace(/\\r/g,\"\\\\r\").replace(/(\\s|;|\\}|^|\\{)out\\+='';/g,\"$1\").replace(/\\+''/g,\"\"),r&&(t.selfcontained||!s||s._encodeHTML||(s._encodeHTML=l.encodeHTMLSource(t.doNotSkipEncoded)),u=\"var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : (\"+l.encodeHTMLSource.toString()+\"(\"+(t.doNotSkipEncoded||\"\")+\"));\"+u);try{return new Function(t.varname,u)}catch(e){throw\"undefined\"!=typeof console&&console.log(\"Could not create a template function: \"+u),e}},l.compile=function(e,t){return l.template(e,null,t)}}()},{}],31:[function(e,t,n){\"use strict\";t.exports=function(){return/\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g}},{}],32:[function(V,n,r){(function(P,U){var e,t;e=this,t=function(){\"use strict\";function s(e){return\"function\"==typeof e}var n=Array.isArray?Array.isArray:function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},r=0,t=void 0,a=void 0,i=function(e,t){m[r]=e,m[r+1]=t,2===(r+=2)&&(a?a(p):y())};var e=void 0!==window?window:void 0,o=e||{},u=o.MutationObserver||o.WebKitMutationObserver,l=\"undefined\"==typeof self&&void 0!==P&&\"[object process]\"==={}.toString.call(P),c=\"undefined\"!=typeof Uint8ClampedArray&&\"undefined\"!=typeof importScripts&&\"undefined\"!=typeof MessageChannel;function d(){var e=setTimeout;return function(){return e(p,1)}}var m=new Array(1e3);function p(){for(var e=0;e<r;e+=2){(0,m[e])(m[e+1]),m[e]=void 0,m[e+1]=void 0}r=0}var f,h,b,g,y=void 0;function v(e,t){var n=this,r=new this.constructor(k);void 0===r[w]&&O(r);var a=n._state;if(a){var o=arguments[a-1];i(function(){return S(a,r,o,n._result)})}else N(n,r,e,t);return r}function D(e){if(e&&\"object\"==typeof e&&e.constructor===this)return e;var t=new this(k);return F(t,e),t}y=l?function(){return P.nextTick(p)}:u?(h=0,b=new u(p),g=document.createTextNode(\"\"),b.observe(g,{characterData:!0}),function(){g.data=h=++h%2}):c?((f=new MessageChannel).port1.onmessage=p,function(){return f.port2.postMessage(0)}):void 0===e&&\"function\"==typeof V?function(){try{var e=Function(\"return this\")().require(\"vertx\");return void 0!==(t=e.runOnLoop||e.runOnContext)?function(){t(p)}:d()}catch(e){return d()}}():d();var w=Math.random().toString(36).substring(2);function k(){}var x=void 0,E=1,C=2;function A(e,t,n){t.constructor===e.constructor&&n===v&&t.constructor.resolve===D?function(t,e){e._state===E?z(t,e._result):e._state===C?q(t,e._result):N(e,void 0,function(e){return F(t,e)},function(e){return q(t,e)})}(e,t):void 0===n?z(e,t):s(n)?function(e,r,a){i(function(t){var n=!1,e=function(e,t,n,r){try{e.call(t,n,r)}catch(e){return e}}(a,r,function(e){n||(n=!0,r!==e?F(t,e):z(t,e))},function(e){n||(n=!0,q(t,e))},t._label);!n&&e&&(n=!0,q(t,e))},e)}(e,t,n):z(e,t)}function F(t,e){if(t===e)q(t,new TypeError(\"You cannot resolve a promise with itself\"));else if(function(e){var t=typeof e;return null!==e&&(\"object\"==t||\"function\"==t)}(e)){var n=void 0;try{n=e.then}catch(e){return void q(t,e)}A(t,e,n)}else z(t,e)}function j(e){e._onerror&&e._onerror(e._result),T(e)}function z(e,t){e._state===x&&(e._result=t,e._state=E,0!==e._subscribers.length&&i(T,e))}function q(e,t){e._state===x&&(e._state=C,e._result=t,i(j,e))}function N(e,t,n,r){var a=e._subscribers,o=a.length;e._onerror=null,a[o]=t,a[o+E]=n,a[o+C]=r,0===o&&e._state&&i(T,e)}function T(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var r=void 0,a=void 0,o=e._result,i=0;i<t.length;i+=3)r=t[i],a=t[i+n],r?S(n,r,a,o):a(o);e._subscribers.length=0}}function S(e,t,n,r){var a=s(n),o=void 0,i=void 0,u=!0;if(a){try{o=n(r)}catch(e){u=!1,i=e}if(t===o)return void q(t,new TypeError(\"A promises callback cannot return that same promise.\"))}else o=r;t._state!==x||(a&&u?F(t,o):!1===u?q(t,i):e===E?z(t,o):e===C&&q(t,o))}var R=0;function O(e){e[w]=R++,e._state=void 0,e._result=void 0,e._subscribers=[]}var _=(B.prototype._enumerate=function(e){for(var t=0;this._state===x&&t<e.length;t++)this._eachEntry(e[t],t)},B.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===D){var a=void 0,o=void 0,i=!1;try{a=t.then}catch(e){i=!0,o=e}if(a===v&&t._state!==x)this._settledAt(t._state,e,t._result);else if(\"function\"!=typeof a)this._remaining--,this._result[e]=t;else if(n===L){var u=new n(k);i?q(u,o):A(u,t,a),this._willSettleAt(u,e)}else this._willSettleAt(new n(function(e){return e(t)}),e)}else this._willSettleAt(r(t),e)},B.prototype._settledAt=function(e,t,n){var r=this.promise;r._state===x&&(this._remaining--,e===C?q(r,n):this._result[t]=n),0===this._remaining&&z(r,this._result)},B.prototype._willSettleAt=function(e,t){var n=this;N(e,void 0,function(e){return n._settledAt(E,t,e)},function(e){return n._settledAt(C,t,e)})},B);function B(e,t){this._instanceConstructor=e,this.promise=new e(k),this.promise[w]||O(this.promise),n(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?z(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&z(this.promise,this._result))):q(this.promise,new Error(\"Array Methods must be provided an Array\"))}var L=(I.prototype.catch=function(e){return this.then(null,e)},I.prototype.finally=function(t){var n=this.constructor;return s(t)?this.then(function(e){return n.resolve(t()).then(function(){return e})},function(e){return n.resolve(t()).then(function(){throw e})}):this.then(t,t)},I);function I(e){this[w]=R++,this._result=this._state=void 0,this._subscribers=[],k!==e&&(\"function\"!=typeof e&&function(){throw new TypeError(\"You must pass a resolver function as the first argument to the promise constructor\")}(),this instanceof I?function(t,e){try{e(function(e){F(t,e)},function(e){q(t,e)})}catch(e){q(t,e)}}(this,e):function(){throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\")}())}return L.prototype.then=v,L.all=function(e){return new _(this,e).promise},L.race=function(a){var o=this;return n(a)?new o(function(e,t){for(var n=a.length,r=0;r<n;r++)o.resolve(a[r]).then(e,t)}):new o(function(e,t){return t(new TypeError(\"You must pass an array to race.\"))})},L.resolve=D,L.reject=function(e){var t=new this(k);return q(t,e),t},L._setScheduler=function(e){a=e},L._setAsap=function(e){i=e},L._asap=i,L.polyfill=function(){var e=void 0;if(void 0!==U)e=U;else if(\"undefined\"!=typeof self)e=self;else try{e=Function(\"return this\")()}catch(e){throw new Error(\"polyfill failed because global object is unavailable in this environment\")}var t=e.Promise;if(t){var n=null;try{n=Object.prototype.toString.call(t.resolve())}catch(e){}if(\"[object Promise]\"===n&&!t.cast)return}e.Promise=L},L.Promise=L},\"object\"==typeof r&&void 0!==n?n.exports=t():\"function\"==typeof define&&define.amd?define(t):e.ES6Promise=t()}).call(this,V(\"_process\"),void 0!==a?a:\"undefined\"!=typeof self?self:void 0!==window?window:{})},{_process:33}],33:[function(e,t,n){var r,a,o=t.exports={};function i(){throw new Error(\"setTimeout has not been defined\")}function u(){throw new Error(\"clearTimeout has not been defined\")}function s(t){if(r===setTimeout)return setTimeout(t,0);if((r===i||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r=\"function\"==typeof setTimeout?setTimeout:i}catch(e){r=i}try{a=\"function\"==typeof clearTimeout?clearTimeout:u}catch(e){a=u}}();var l,c=[],d=!1,m=-1;function p(){d&&l&&(d=!1,l.length?c=l.concat(c):m=-1,c.length&&f())}function f(){if(!d){var e=s(p);d=!0;for(var t=c.length;t;){for(l=c,c=[];++m<t;)l&&l[m].run();m=-1,t=c.length}l=null,d=!1,function(t){if(a===clearTimeout)return clearTimeout(t);if((a===u||!a)&&clearTimeout)return a=clearTimeout,clearTimeout(t);try{a(t)}catch(e){try{return a.call(null,t)}catch(e){return a.call(this,t)}}}(e)}}function h(e,t){this.fun=e,this.array=t}function b(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(1<arguments.length)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];c.push(new h(e,t)),1!==c.length||d||s(f)},h.prototype.run=function(){this.fun.apply(null,this.array)},o.title=\"browser\",o.browser=!0,o.env={},o.argv=[],o.version=\"\",o.versions={},o.on=b,o.addListener=b,o.once=b,o.off=b,o.removeListener=b,o.removeAllListeners=b,o.emit=b,o.prependListener=b,o.prependOnceListener=b,o.listeners=function(e){return[]},o.binding=function(e){throw new Error(\"process.binding is not supported\")},o.cwd=function(){return\"/\"},o.chdir=function(e){throw new Error(\"process.chdir is not supported\")},o.umask=function(){return 0}},{}],34:[function(e,t,n){(function(e){!function(e){\"use strict\";if(!e.WeakMap){var n=Object.prototype.hasOwnProperty,r=function(e,t,n){Object.defineProperty?Object.defineProperty(e,t,{configurable:!0,writable:!0,value:n}):e[t]=n};e.WeakMap=(r(t.prototype,\"delete\",function(e){if(a(this,\"delete\"),!i(e))return!1;var t=e[this._id];return!(!t||t[0]!==e||(delete e[this._id],0))}),r(t.prototype,\"get\",function(e){if(a(this,\"get\"),i(e)){var t=e[this._id];return t&&t[0]===e?t[1]:void 0}}),r(t.prototype,\"has\",function(e){if(a(this,\"has\"),!i(e))return!1;var t=e[this._id];return!(!t||t[0]!==e)}),r(t.prototype,\"set\",function(e,t){if(a(this,\"set\"),!i(e))throw new TypeError(\"Invalid value used as weak map key\");var n=e[this._id];return n&&n[0]===e?n[1]=t:r(e,this._id,[e,t]),this}),r(t,\"_polyfill\",!0),t)}function t(){if(void 0===this)throw new TypeError(\"Constructor WeakMap requires 'new'\");if(r(this,\"_id\",function(e){return e+\"_\"+o()+\".\"+o()}(\"_WeakMap\")),0<arguments.length)throw new TypeError(\"WeakMap iterable is not supported\")}function a(e,t){if(!i(e)||!n.call(e,\"_id\"))throw new TypeError(t+\" method called on incompatible receiver \"+typeof e)}function o(){return Math.random().toString().substring(2)}function i(e){return Object(e)===e}}(\"undefined\"!=typeof self?self:void 0!==window?window:void 0!==e?e:this)}).call(this,void 0!==a?a:\"undefined\"!=typeof self?self:void 0!==window?window:{})},{}]},{},[1]);var utils=axe.utils={},u={};function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function t(e,t,n){\"use strict\";var r,a;for(r=0,a=e.length;r<a;r++)t[n](e[r])}function n(e){this.brand=\"axe\",this.application=\"axeAPI\",this.tagExclude=[\"experimental\"],this.defaultConfig=e,this._init(),this._defaultLocale=null}n.prototype._setDefaultLocale=function(){if(!this._defaultLocale){for(var e={checks:{},rules:{}},t=Object.keys(this.data.checks),n=0;n<t.length;n++){var r=t[n],a=this.data.checks[r].messages,o=a.pass,i=a.fail,u=a.incomplete;e.checks[r]={pass:o,fail:i,incomplete:u}}for(var s=Object.keys(this.data.rules),l=0;l<s.length;l++){var c=s[l],d=this.data.rules[c],m=d.description,p=d.help;e.rules[c]={description:m,help:p}}this._defaultLocale=e}},n.prototype._resetLocale=function(){var e=this._defaultLocale;e&&this.applyLocale(e)};function c(a,e,o){return o.performanceTimer&&axe.utils.performanceTimer.mark(\"mark_rule_start_\"+a.id),function(n,r){a.run(e,o,function(e){n(e)},function(e){if(o.debug)r(e);else{var t=Object.assign(new f(a),{result:axe.constants.CANTTELL,description:\"An error occured while running this rule\",message:e.message,stack:e.stack,error:e,errorNode:e.errorNode});n(t)}})}}function o(e,t,n){var r=e.brand,a=e.application;return axe.constants.helpUrlBase+r+\"/\"+(n||axe.version.substring(0,axe.version.lastIndexOf(\".\")))+\"/\"+t+\"?application=\"+a}function d(e){\"use strict\";this.id=e.id,this.data=null,this.relatedNodes=[],this.result=null}function r(e){\"use strict\";return\"string\"==typeof e?new Function(\"return \"+e+\";\")():e}function i(e){e&&(this.id=e.id,this.configure(e))}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function s(e,t,n){\"use strict\";var r,a;e.frames=e.frames||[];var o=document.querySelectorAll(n.shift());e:for(var i=0,u=o.length;i<u;i++){a=o[i];for(var s=0,l=e.frames.length;s<l;s++)if(e.frames[s].node===a){e.frames[s][t].push(n);break e}r={node:a,include:[],exclude:[]},n&&r[t].push(n),e.frames.push(r)}}function m(e,t){\"use strict\";for(var n,r,a=[],o=0,i=e[t].length;o<i;o++){if(\"string\"==typeof(n=e[t][o])){r=Array.from(document.querySelectorAll(n)),a=a.concat(r.map(function(e){return axe.utils.getNodeFromTree(e)}));break}!n||!n.length||n instanceof Node?n instanceof Node&&(n.documentElement instanceof Node?a.push(e.flatTree[0]):a.push(axe.utils.getNodeFromTree(n))):1<n.length?s(e,t,n):(r=Array.from(document.querySelectorAll(n[0])),a=a.concat(r.map(function(e){return axe.utils.getNodeFromTree(e)})))}return a.filter(function(e){return e})}function p(e){\"use strict\";var t=this;this.frames=[],this.initiator=!e||\"boolean\"!=typeof e.initiator||e.initiator,this.page=!1,e=function(e){\"use strict\";if(e&&\"object\"===S(e)||e instanceof NodeList){if(e instanceof Node)return{include:[e],exclude:[]};if(e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\"))return{include:e.include&&+e.include.length?e.include:[document],exclude:e.exclude||[]};if(e.length===+e.length)return{include:e,exclude:[]}}return\"string\"==typeof e?{include:[e],exclude:[]}:{include:[document],exclude:[]}}(e),this.flatTree=axe.utils.getFlattenedTree(function(e){var t=e.include,n=e.exclude;return(Array.from(t).concat(Array.from(n)).reduce(function(e,t){return e||(t instanceof Element?t.ownerDocument:t instanceof Document?t:void 0)},null)||document).documentElement}(e)),this.exclude=e.exclude,this.include=e.include,this.include=m(this,\"include\"),this.exclude=m(this,\"exclude\"),axe.utils.select(\"frame, iframe\",this).forEach(function(e){Be(e,t)&&function(e,t){\"use strict\";axe.utils.isHidden(t)||axe.utils.findBy(e,\"node\",t)||e.push({node:t,include:[],exclude:[]})}(t.frames,e.actualNode)}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var n=function(e){\"use strict\";if(0===e.include.length){if(0===e.frames.length){var t=axe.utils.respondable.isInFrame()?\"frame\":\"page\";return new Error(\"No elements found for include in \"+t+\" Context\")}e.frames.forEach(function(e,t){if(0===e.include.length)return new Error(\"No elements found for include in Context of frame \"+t)})}}(this);if(n instanceof Error)throw n;Array.isArray(this.include)||(this.include=Array.from(this.include)),this.include.sort(axe.utils.nodeSorter)}function f(e){\"use strict\";this.id=e.id,this.result=axe.constants.NA,this.pageLevel=e.pageLevel,this.impact=null,this.nodes=[]}function h(e,t){\"use strict\";this._audit=t,this.id=e.id,this.selector=e.selector||\"*\",this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden,this.enabled=\"boolean\"!=typeof e.enabled||e.enabled,this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel,this.any=e.any||[],this.all=e.all||[],this.none=e.none||[],this.tags=e.tags||[],this.preload=!!e.preload,e.matches&&(this.matches=r(e.matches))}function b(e){if(e.length){var n=!1,r={};return e.forEach(function(e){var t=e.results.filter(function(e){return e});(r[e.type]=t).length&&(n=!0)}),n?r:null}}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function y(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function v(e,t){return(v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function D(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function w(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function k(e,t,n){return t&&w(e.prototype,t),n&&w(e,n),e}n.prototype._applyCheckLocale=function(e){for(var t,n,r,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.checks[u])throw new Error('Locale provided for unknown check: \"'.concat(u,'\"'));this.data.checks[u]=(t=this.data.checks[u],n=e[u],a=r=void 0,r=n.pass,a=n.fail,\"string\"==typeof r&&(r=axe.imports.doT.compile(r)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),R({},t,{messages:{pass:r||t.messages.pass,fail:a||t.messages.fail,incomplete:\"object\"===S(t.messages.incomplete)?R({},t.messages.incomplete,n.incomplete):n.incomplete}}))}},n.prototype._applyRuleLocale=function(e){for(var t,n,r,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.rules[u])throw new Error('Locale provided for unknown rule: \"'.concat(u,'\"'));this.data.rules[u]=(t=this.data.rules[u],n=e[u],a=r=void 0,r=n.help,a=n.description,\"string\"==typeof r&&(r=axe.imports.doT.compile(r)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),R({},t,{help:r||t.help,description:a||t.description}))}},n.prototype.applyLocale=function(e){this._setDefaultLocale(),e.checks&&this._applyCheckLocale(e.checks),e.rules&&this._applyRuleLocale(e.rules)},n.prototype._init=function(){var e=function(e){\"use strict\";var t;return e?(t=axe.utils.clone(e)).commons=e.commons:t={},t.reporter=t.reporter||null,t.rules=t.rules||[],t.checks=t.checks||[],t.data=R({checks:{},rules:{}},t.data),t}(this.defaultConfig);axe.commons=e.commons,this.reporter=e.reporter,this.commands={},this.rules=[],this.checks={},t(e.rules,this,\"addRule\"),t(e.checks,this,\"addCheck\"),this.data={},this.data.checks=e.data&&e.data.checks||{},this.data.rules=e.data&&e.data.rules||{},this.data.failureSummaries=e.data&&e.data.failureSummaries||{},this.data.incompleteFallbackMessage=e.data&&e.data.incompleteFallbackMessage||\"\",this._constructHelpUrls()},n.prototype.registerCommand=function(e){\"use strict\";this.commands[e.id]=e.callback},n.prototype.addRule=function(e){\"use strict\";e.metadata&&(this.data.rules[e.id]=e.metadata);var t=this.getRule(e.id);t?t.configure(e):this.rules.push(new h(e,this))},n.prototype.addCheck=function(e){\"use strict\";var t=e.metadata;\"object\"===S(t)&&(this.data.checks[e.id]=t,\"object\"===S(t.messages)&&Object.keys(t.messages).filter(function(e){return t.messages.hasOwnProperty(e)&&\"string\"==typeof t.messages[e]}).forEach(function(e){0===t.messages[e].indexOf(\"function\")&&(t.messages[e]=new Function(\"return \"+t.messages[e]+\";\")())})),this.checks[e.id]?this.checks[e.id].configure(e):this.checks[e.id]=new i(e)},n.prototype.run=function(o,i,u,s){\"use strict\";this.normalizeOptions(i),axe._selectCache=[];var e=function(e,n,r){return e.reduce(function(e,t){return axe.utils.ruleShouldRun(t,n,r)&&(t.preload?e.later.push(t):e.now.push(t)),e},{now:[],later:[]})}(this.rules,o,i),t=e.now,l=e.later,n=axe.utils.queue();t.forEach(function(e){n.defer(c(e,o,i))});var r=axe.utils.queue();l.length&&r.defer(function(t){axe.utils.preload(i).then(function(e){return t(e)}).catch(function(e){console.warn(\"Couldn't load preload assets: \",e),t(void 0)})});var a=axe.utils.queue();a.defer(n),a.defer(r),a.then(function(e){var t=e.pop();if(t&&t.length){var n=t[0];n&&(o=R({},o,n))}var r=e[0];if(!l.length)return axe._selectCache=void 0,void u(r.filter(function(e){return!!e}));var a=axe.utils.queue();l.forEach(function(e){var t=c(e,o,i);a.defer(t)}),a.then(function(e){axe._selectCache=void 0,u(r.concat(e).filter(function(e){return!!e}))}).catch(s)}).catch(s)},n.prototype.after=function(e,n){\"use strict\";var r=this.rules;return e.map(function(e){var t=axe.utils.findBy(r,\"id\",e.id);if(!t)throw new Error(\"Result for unknown rule. You may be running mismatch axe-core versions\");return t.after(e,n)})},n.prototype.getRule=function(t){return this.rules.find(function(e){return e.id===t})},n.prototype.normalizeOptions=function(e){\"use strict\";var t=this;if(\"object\"===S(e.runOnly)){Array.isArray(e.runOnly)&&(e.runOnly={type:\"tag\",values:e.runOnly});var n=e.runOnly;if(n.value&&!n.values&&(n.values=n.value,delete n.value),!Array.isArray(n.values)||0===n.values.length)throw new Error(\"runOnly.values must be a non-empty array\");if([\"rule\",\"rules\"].includes(n.type))n.type=\"rule\",n.values.forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.runOnly\")});else{if(![\"tag\",\"tags\",void 0].includes(n.type))throw new Error(\"Unknown runOnly type '\".concat(n.type,\"'\"));n.type=\"tag\";var r=t.rules.reduce(function(e,t){return e.length?e.filter(function(e){return!t.tags.includes(e)}):e},n.values);0!==r.length&&axe.log(\"Could not find tags `\"+r.join(\"`, `\")+\"`\")}}return\"object\"===S(e.rules)&&Object.keys(e.rules).forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.rules\")}),e},n.prototype.setBranding=function(e){\"use strict\";var t={brand:this.brand,application:this.application};e&&e.hasOwnProperty(\"brand\")&&e.brand&&\"string\"==typeof e.brand&&(this.brand=e.brand),e&&e.hasOwnProperty(\"application\")&&e.application&&\"string\"==typeof e.application&&(this.application=e.application),this._constructHelpUrls(t)},n.prototype._constructHelpUrls=function(){var n=this,r=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,a=(axe.version.match(/^[1-9][0-9]*\\.[0-9]+/)||[\"x.y\"])[0];this.rules.forEach(function(e){n.data.rules[e.id]||(n.data.rules[e.id]={});var t=n.data.rules[e.id];(\"string\"!=typeof t.helpUrl||r&&t.helpUrl===o(r,e.id,a))&&(t.helpUrl=o(n,e.id,a))})},n.prototype.resetRulesAndChecks=function(){\"use strict\";this._init(),this._resetLocale()},function(){\"use strict\";var n={},e={set:function(e,t){n[e]=t},get:function(e){return n[e]},clear:function(){n={}}};axe._cache=e}(),i.prototype.enabled=!0,i.prototype.run=function(t,e,n,r,a){\"use strict\";var o=(e=e||{}).hasOwnProperty(\"enabled\")?e.enabled:this.enabled,i=e.options||this.options;if(o){var u,s=new d(this),l=axe.utils.checkHelper(s,e,r,a);try{u=this.evaluate.call(l,t.actualNode,i,t,n)}catch(e){return t&&t.actualNode&&(e.errorNode=new X(t.actualNode).toJSON()),void a(e)}l.isAsync||(s.result=u,r(s))}else r(null)},i.prototype.runSync=function(t,e,n){var r=(e=e||{}).enabled;if(!(void 0===r?this.enabled:r))return null;var a,o=e.options||this.options,i=new d(this),u=axe.utils.checkHelper(i,e);u.async=function(){throw new Error(\"Cannot run async check while in a synchronous run\")};try{a=this.evaluate.call(u,t.actualNode,o,t,n)}catch(e){throw t&&t.actualNode&&(e.errorNode=new X(t.actualNode).toJSON()),e}return i.result=a,i},i.prototype.configure=function(t){var n=this;[\"options\",\"enabled\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return n[e]=t[e]}),[\"evaluate\",\"after\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return n[e]=r(t[e])})},h.prototype.matches=function(){\"use strict\";return!0},h.prototype.gather=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=\"mark_gather_start_\"+this.id,r=\"mark_gather_end_\"+this.id,a=\"mark_isHidden_start_\"+this.id,o=\"mark_isHidden_end_\"+this.id;t.performanceTimer&&axe.utils.performanceTimer.mark(n);var i=axe.utils.select(this.selector,e);return this.excludeHidden&&(t.performanceTimer&&axe.utils.performanceTimer.mark(a),i=i.filter(function(e){return!axe.utils.isHidden(e.actualNode)}),t.performanceTimer&&(axe.utils.performanceTimer.mark(o),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#gather_axe.utils.isHidden\",a,o))),t.performanceTimer&&(axe.utils.performanceTimer.mark(r),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#gather\",n,r)),i},h.prototype.runChecks=function(t,a,o,i,n,e){\"use strict\";var u=this,s=axe.utils.queue();this[t].forEach(function(e){var n=u._audit.checks[e.id||e],r=axe.utils.getCheckOption(n,u.id,o);s.defer(function(e,t){n.run(a,r,i,e,t)})}),s.then(function(e){e=e.filter(function(e){return e}),n({type:t,results:e})}).catch(e)},h.prototype.runChecksSync=function(e,r,a,o){\"use strict\";var i=this,u=[];return this[e].forEach(function(e){var t=i._audit.checks[e.id||e],n=axe.utils.getCheckOption(t,i.id,a);u.push(t.runSync(r,n,o))}),{type:e,results:u=u.filter(function(e){return e})}},h.prototype.run=function(a){var o=this,i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=2<arguments.length?arguments[2]:void 0,t=3<arguments.length?arguments[3]:void 0;i.performanceTimer&&this._trackPerformance();var n,u=axe.utils.queue(),s=new f(this);try{n=this.gatherAndMatchNodes(a,i)}catch(e){return void t(new l({cause:e,ruleId:this.id}))}i.performanceTimer&&this._logGatherPerformance(n),n.forEach(function(r){u.defer(function(n,t){var e=axe.utils.queue();[\"any\",\"all\",\"none\"].forEach(function(n){e.defer(function(e,t){o.runChecks(n,r,i,a,e,t)})}),e.then(function(e){var t=b(e);t&&(t.node=new axe.utils.DqElement(r.actualNode,i),s.nodes.push(t)),n()}).catch(function(e){return t(e)})})}),u.defer(function(e){return setTimeout(e,0)}),i.performanceTimer&&this._logRulePerformance(),u.then(function(){return e(s)}).catch(function(e){return t(e)})},h.prototype.runSync=function(r){var a=this,o=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};o.performanceTimer&&this._trackPerformance();var e,i=new f(this);try{e=this.gatherAndMatchNodes(r,o)}catch(e){throw new l({cause:e,ruleId:this.id})}return o.performanceTimer&&this._logGatherPerformance(e),e.forEach(function(t){var n=[];[\"any\",\"all\",\"none\"].forEach(function(e){n.push(a.runChecksSync(e,t,o,r))});var e=b(n);e&&(e.node=t.actualNode?new axe.utils.DqElement(t.actualNode,o):null,i.nodes.push(e))}),o.performanceTimer&&this._logRulePerformance(),i},h.prototype._trackPerformance=function(){this._markStart=\"mark_rule_start_\"+this.id,this._markEnd=\"mark_rule_end_\"+this.id,this._markChecksStart=\"mark_runchecks_start_\"+this.id,this._markChecksEnd=\"mark_runchecks_end_\"+this.id},h.prototype._logGatherPerformance=function(e){axe.log(\"gather (\",e.length,\"):\",axe.utils.performanceTimer.timeElapsed()+\"ms\"),axe.utils.performanceTimer.mark(this._markChecksStart)},h.prototype._logRulePerformance=function(){axe.utils.performanceTimer.mark(this._markChecksEnd),axe.utils.performanceTimer.mark(this._markEnd),axe.utils.performanceTimer.measure(\"runchecks_\"+this.id,this._markChecksStart,this._markChecksEnd),axe.utils.performanceTimer.measure(\"rule_\"+this.id,this._markStart,this._markEnd)},h.prototype.gatherAndMatchNodes=function(t,e){var n=this,r=\"mark_matches_start_\"+this.id,a=\"mark_matches_end_\"+this.id,o=this.gather(t,e);return e.performanceTimer&&axe.utils.performanceTimer.mark(r),o=o.filter(function(e){return n.matches(e.actualNode,e,t)}),e.performanceTimer&&(axe.utils.performanceTimer.mark(a),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#matches\",r,a)),o},h.prototype.after=function(a,o){\"use strict\";var e=function(n){\"use strict\";return axe.utils.getAllChecks(n).map(function(e){var t=n._audit.checks[e.id||e];return t&&\"function\"==typeof t.after?t:null}).filter(Boolean)}(this),i=this.id;return e.forEach(function(e){var t=function(e,t){\"use strict\";var n=[];return e.forEach(function(e){axe.utils.getAllChecks(e).forEach(function(e){e.id===t&&n.push(e)})}),n}(a.nodes,e.id),n=axe.utils.getCheckOption(e,i,o),r=e.after(t,n);t.forEach(function(e){-1===r.indexOf(e)&&(e.filtered=!0)})}),a.nodes=function(e){\"use strict\";var r=[\"any\",\"all\",\"none\"],t=e.nodes.filter(function(t){var n=0;return r.forEach(function(e){t[e]=function(e){\"use strict\";return e.filter(function(e){return!0!==e.filtered})}(t[e]),n+=t[e].length}),0<n});return e.pageLevel&&t.length&&(t=[t.reduce(function(t,n){if(t)return r.forEach(function(e){t[e].push.apply(t[e],n[e])}),t})]),t}(a),a},h.prototype.configure=function(e){\"use strict\";e.hasOwnProperty(\"selector\")&&(this.selector=e.selector),e.hasOwnProperty(\"excludeHidden\")&&(this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden),e.hasOwnProperty(\"enabled\")&&(this.enabled=\"boolean\"!=typeof e.enabled||e.enabled),e.hasOwnProperty(\"pageLevel\")&&(this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel),e.hasOwnProperty(\"any\")&&(this.any=e.any),e.hasOwnProperty(\"all\")&&(this.all=e.all),e.hasOwnProperty(\"none\")&&(this.none=e.none),e.hasOwnProperty(\"tags\")&&(this.tags=e.tags),e.hasOwnProperty(\"matches\")&&(\"string\"==typeof e.matches?this.matches=new Function(\"return \"+e.matches+\";\")():this.matches=e.matches)};var x=/[\\t\\r\\n\\f]/g,E=(k(C,[{key:\"hasClass\",value:function(){throw new Error('VirtualNode class must have a \"hasClass\" function')}},{key:\"attr\",value:function(){throw new Error('VirtualNode class must have a \"attr\" function')}},{key:\"hasAttr\",value:function(){throw new Error('VirtualNode class must have a \"hasAttr\" function')}},{key:\"props\",get:function(){throw new Error('VirtualNode class must have a \"props\" object consisting of \"nodeType\" and \"nodeName\" properties')}}]),C);function C(){D(this,C),this.children=[],this.parent=null}var A=(function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(F,E),k(F,[{key:\"hasClass\",value:function(e){var t=this.attr(\"class\");if(!t)return!1;var n=\" \"+e+\" \";return 0<=(\" \"+t+\" \").replace(x,\" \").indexOf(n)}},{key:\"attr\",value:function(e){return\"function\"!=typeof this.actualNode.getAttribute?null:this.actualNode.getAttribute(e)}},{key:\"hasAttr\",value:function(e){return\"function\"==typeof this.actualNode.hasAttribute&&this.actualNode.hasAttribute(e)}},{key:\"props\",get:function(){var e=this.actualNode,t=e.nodeType,n=e.nodeName,r=e.id,a=e.type;return{nodeType:t,nodeName:n.toLowerCase(),id:r,type:a}}},{key:\"isFocusable\",get:function(){return this._cache.hasOwnProperty(\"isFocusable\")||(this._cache.isFocusable=axe.commons.dom.isFocusable(this.actualNode)),this._cache.isFocusable}},{key:\"tabbableElements\",get:function(){return this._cache.hasOwnProperty(\"tabbableElements\")||(this._cache.tabbableElements=axe.commons.dom.getTabbableElements(this)),this._cache.tabbableElements}}]),F);function F(e,t,n){var r;return D(this,F),(r=function(e,t){return!t||\"object\"!==S(t)&&\"function\"!=typeof t?y(e):t}(this,g(F).call(this))).shadowId=n,r.children=[],r.actualNode=e,r.parent=t,r._isHidden=null,r._cache={},axe._cache.get(\"nodeMap\")&&axe._cache.get(\"nodeMap\").set(e,y(r)),r}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function j(t,n){\"use strict\";if(t=t||function(){},n=n||axe.log,!axe._audit)throw new Error(\"No audit configured\");var r=axe.utils.queue(),a=[];Object.keys(axe.plugins).forEach(function(e){r.defer(function(t){function n(e){a.push(e),t()}try{axe.plugins[e].cleanup(t,n)}catch(e){n(e)}})});var e=axe.utils.getFlattenedTree(document.body);axe.utils.querySelectorAll(e,\"iframe, frame\").forEach(function(n){r.defer(function(e,t){return axe.utils.sendCommandToFrame(n.actualNode,{command:\"cleanup-plugin\"},e,t)})}),r.then(function(e){0===a.length?t(e):n(a)}).catch(n)}function z(e,t,n){\"use strict\";function r(e){e instanceof Error==!1&&(e=new Error(e)),n(e)}var a=n,o=e&&e.context||{};o.hasOwnProperty(\"include\")&&!o.include.length&&(o.include=[document]);var i=e&&e.options||{};switch(e.command){case\"rules\":return _(o,i,function(e,t){a(e),t()},r);case\"cleanup-plugin\":return j(a,r);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[e.command])return axe._audit.commands[e.command](e,n)}}function q(e){\"use strict\";this._run=e.run,this._collect=e.collect,this._registry={},e.commands.forEach(function(e){axe._audit.registerCommand(e)})}axe.AbstractVirtualNode=E,function(axe){var o={helpUrlBase:\"https://dequeuniversity.com/rules/\",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze([\"minor\",\"moderate\",\"serious\",\"critical\"]),preload:Object.freeze({assets:[\"cssom\"],timeout:1e4})};[{name:\"NA\",value:\"inapplicable\",priority:0,group:\"inapplicable\"},{name:\"PASS\",value:\"passed\",priority:1,group:\"passes\"},{name:\"CANTTELL\",value:\"cantTell\",priority:2,group:\"incomplete\"},{name:\"FAIL\",value:\"failed\",priority:3,group:\"violations\"}].forEach(function(e){var t=e.name,n=e.value,r=e.priority,a=e.group;o[t]=n,o[t+\"_PRIO\"]=r,o[t+\"_GROUP\"]=a,o.results[r]=n,o.resultGroups[r]=a,o.resultGroupMap[n]=a}),Object.freeze(o.results),Object.freeze(o.resultGroups),Object.freeze(o.resultGroupMap),Object.freeze(o),Object.defineProperty(axe,\"constants\",{value:o,enumerable:!0,configurable:!1,writable:!1})}(axe),axe.log=function(){\"use strict\";\"object\"===(\"undefined\"==typeof console?\"undefined\":S(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},axe.cleanup=j,axe.configure=function(e){\"use strict\";var t;if(!(t=axe._audit))throw new Error(\"No audit configured\");e.reporter&&(\"function\"==typeof e.reporter||T[e.reporter])&&(t.reporter=e.reporter),e.checks&&e.checks.forEach(function(e){t.addCheck(e)});var n=[];e.rules&&e.rules.forEach(function(e){n.push(e.id),t.addRule(e)}),e.disableOtherRules&&t.rules.forEach(function(e){!1===n.includes(e.id)&&(e.enabled=!1)}),void 0!==e.branding?t.setBranding(e.branding):t._constructHelpUrls(),e.tagExclude&&(t.tagExclude=e.tagExclude),e.locale&&t.applyLocale(e.locale)},axe.getRules=function(e){\"use strict\";var t=(e=e||[]).length?axe._audit.rules.filter(function(t){return!!e.filter(function(e){return-1!==t.tags.indexOf(e)}).length}):axe._audit.rules,n=axe._audit.data.rules||{};return t.map(function(e){var t=n[e.id]||{};return{ruleId:e.id,description:t.description,help:t.help,helpUrl:t.helpUrl,tags:e.tags}})},axe._load=function(e){\"use strict\";axe.utils.respondable.subscribe(\"axe.ping\",function(e,t,n){n({axe:!0})}),axe.utils.respondable.subscribe(\"axe.start\",z),axe._audit=new n(e)},(axe=axe||{}).plugins={},q.prototype.run=function(){\"use strict\";return this._run.apply(this,arguments)},q.prototype.collect=function(){\"use strict\";return this._collect.apply(this,arguments)},q.prototype.cleanup=function(e){\"use strict\";var n=axe.utils.queue(),r=this;Object.keys(this._registry).forEach(function(t){n.defer(function(e){r._registry[t].cleanup(e)})}),n.then(function(){e()})},q.prototype.add=function(e){\"use strict\";this._registry[e.id]=e},axe.registerPlugin=function(e){\"use strict\";axe.plugins[e.id]=new q(e)};var N,T={};function O(){axe._cache.clear(),axe._tree=void 0,axe._selectorData=void 0}function _(n,r,a,o){\"use strict\";try{n=new p(n),axe._tree=n.flatTree,axe._selectorData=axe.utils.getSelectorData(n.flatTree)}catch(e){return O(),o(e)}var i,e=axe.utils.queue(),u=axe._audit;r.performanceTimer&&axe.utils.performanceTimer.auditStart(),n.frames.length&&!1!==r.iframes&&e.defer(function(e,t){axe.utils.collectResultsFromFrames(n,r,\"rules\",null,e,t)}),e.defer(function(e,t){r.restoreScroll&&(i=axe.utils.getScrollState()),u.run(n,r,e,t)}),e.then(function(e){try{i&&axe.utils.setScrollState(i),r.performanceTimer&&axe.utils.performanceTimer.auditEnd();var t=axe.utils.mergeResults(e.map(function(e){return{results:e}}));n.initiator&&((t=u.after(t,r)).forEach(axe.utils.publishMetaData),t=t.map(axe.utils.finalizeRuleResult));try{a(t,O)}catch(e){O(),axe.log(e)}}catch(e){O(),o(e)}}).catch(function(e){O(),o(e)})}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.getReporter=function(e){\"use strict\";return\"string\"==typeof e&&T[e]?T[e]:\"function\"==typeof e?e:N},axe.addReporter=function(e,t,n){\"use strict\";T[e]=t,n&&(N=t)},axe.reset=function(){\"use strict\";var e=axe._audit;if(!e)throw new Error(\"No audit configured\");e.resetRulesAndChecks()},axe._runRules=_,axe.runVirtualRule=function(t,e){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};n.reporter=n.reporter||axe._audit.reporter||\"v1\",axe._selectorData={};var r=axe._audit.rules.find(function(e){return e.id===t});if(!r)throw new Error(\"unknown rule `\"+t+\"`\");var a={include:[e]},o=(r=Object.create(r,{excludeHidden:{value:!1}})).runSync(a,n);axe.utils.publishMetaData(o),axe.utils.finalizeRuleResult(o);var i=axe.utils.aggregateResult([o]);return i.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=u.failureSummary(e)})}),R({},u.getEnvironmentData(),i,{toolOptions:n})};function B(){}function L(e,t,n){\"use strict\";var r=new TypeError(\"axe.run arguments are invalid\");if(!function(e){\"use strict\";switch(!0){case\"string\"==typeof e:case Array.isArray(e):case Node&&e instanceof Node:case NodeList&&e instanceof NodeList:return!0;case\"object\"!==S(e):return!1;case void 0!==e.include:case void 0!==e.exclude:case\"number\"==typeof e.length:return!0;default:return!1}}(e)){if(void 0!==n)throw r;n=t,t=e,e=document}if(\"object\"!==S(t)){if(void 0!==n)throw r;n=t,t={}}if(\"function\"!=typeof n&&void 0!==n)throw r;return{context:e,options:t,callback:n||B}}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.run=function(e,a,o){\"use strict\";if(!axe._audit)throw new Error(\"No audit configured\");var t,n=L(e,a,o);e=n.context,a=n.options,o=n.callback,a.reporter=a.reporter||axe._audit.reporter||\"v1\",a.performanceTimer&&axe.utils.performanceTimer.start();var i=B,u=B;return\"function\"==typeof Promise&&o===B&&(t=new Promise(function(e,t){i=t,u=e})),axe._runRules(e,a,function(e,t){function n(e){t();try{o(null,e)}catch(e){axe.log(e)}u(e)}a.performanceTimer&&axe.utils.performanceTimer.end();try{var r=axe.getReporter(a.reporter)(e,a,n);void 0!==r&&n(r)}catch(e){t(),o(e),i(e)}},function(e){o(e),i(e)}),t},u.failureSummary=function(e){\"use strict\";var n={};return n.none=e.none.concat(e.all),n.any=e.any,Object.keys(n).map(function(e){if(n[e].length){var t=axe._audit.data.failureSummaries[e];return t&&\"function\"==typeof t.failureMessage?t.failureMessage(n[e].map(function(e){return e.message||\"\"})):void 0}}).filter(function(e){return void 0!==e}).join(\"\\n\\n\")},u.getEnvironmentData=function(e){var t=0<arguments.length&&void 0!==e?e:window,n=t.screen,r=void 0===n?{}:n,a=t.navigator,o=void 0===a?{}:a,i=t.location,u=void 0===i?{}:i,s=t.innerHeight,l=t.innerWidth,c=r.msOrientation||r.orientation||r.mozOrientation||{};return{testEngine:{name:\"axe-core\",version:axe.version},testRunner:{name:axe._audit.brand},testEnvironment:{userAgent:o.userAgent,windowWidth:l,windowHeight:s,orientationAngle:c.angle,orientationType:c.type},timestamp:(new Date).toISOString(),url:u.href}},u.incompleteFallbackMessage=function(){\"use strict\";return axe._audit.data.incompleteFallbackMessage()};var I=axe.constants.resultGroups;function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}u.processAggregate=function(e,n){var t=axe.utils.aggregateResult(e);return I.forEach(function(e){n.resultTypes&&!n.resultTypes.includes(e)&&(t[e]||[]).forEach(function(e){Array.isArray(e.nodes)&&0<e.nodes.length&&(e.nodes=[e.nodes[0]])}),t[e]=(t[e]||[]).map(function(t){return t=Object.assign({},t),Array.isArray(t.nodes)&&0<t.nodes.length&&(t.nodes=t.nodes.map(function(e){return\"object\"===S(e.node)&&(e.html=e.node.source,n.elementRef&&!e.node.fromFrame&&(e.element=e.node.element),!1===n.selectors&&!e.node.fromFrame||(e.target=e.node.selector),n.xpath&&(e.xpath=e.node.xpath)),delete e.result,delete e.node,function(t,n){\"use strict\";[\"any\",\"all\",\"none\"].forEach(function(e){Array.isArray(t[e])&&t[e].filter(function(e){return Array.isArray(e.relatedNodes)}).forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){var t={html:e.source};return n.elementRef&&!e.fromFrame&&(t.element=e.element),!1===n.selectors&&!e.fromFrame||(t.target=e.selector),n.xpath&&(t.xpath=e.xpath),t})})})}(e,n),e})),I.forEach(function(e){return delete t[e]}),delete t.pageLevel,delete t.result,t})}),t},axe.addReporter(\"na\",function(e,t,n){\"use strict\";console.warn('\"na\" reporter will be deprecated in axe v4.0. Use the \"v2\" reporter instead.'),\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))}),axe.addReporter(\"no-passes\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={}),t.resultTypes=[\"violations\"];var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations}))}),axe.addReporter(\"rawEnv\",function(e,t,n){\"function\"==typeof t&&(n=t,t={}),axe.getReporter(\"raw\")(e,t,function(e){var t=u.getEnvironmentData();n({raw:e,env:t})})}),axe.addReporter(\"raw\",function(e,t,n){\"use strict\";if(\"function\"==typeof t&&(n=t,t={}),!e||!Array.isArray(e))return n(e);n(e.map(function(e){for(var t=R({},e),n=0,r=[\"passes\",\"violations\",\"incomplete\",\"inapplicable\"];n<r.length;n++){var a=r[n];t[a]&&Array.isArray(t[a])&&(t[a]=t[a].map(function(e){return R({},e,{node:e.node.toJSON()})}))}return t}))}),axe.addReporter(\"v1\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);r.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=u.failureSummary(e)})}),n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))}),axe.addReporter(\"v2\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))},!0),axe.utils.aggregate=function(t,e,n){e=e.slice(),n&&e.push(n);var r=e.map(function(e){return t.indexOf(e)}).sort();return t[r.pop()]};var P=axe.constants,U=P.CANTTELL_PRIO,V=P.FAIL_PRIO,M=[];M[axe.constants.PASS_PRIO]=!0,M[axe.constants.CANTTELL_PRIO]=null,M[axe.constants.FAIL_PRIO]=!1;var axe,H=[\"any\",\"all\",\"none\"];function G(n,r){return H.reduce(function(e,t){return e[t]=(n[t]||[]).map(function(e){return r(e,t)}),e},{})}function W(e,t,n){var r=Object.assign({},t);r.nodes=(r[n]||[]).concat(),axe.constants.resultGroups.forEach(function(e){delete r[e]}),e[n].push(r)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function $(e,t){\"use strict\";var n;return axe._tree&&(n=axe.utils.getSelector(t)),new Error(e+\": \"+(n||t))}function X(e,t,n){this._fromFrame=!!n,this.spec=n||{},t&&t.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:function(e){var t=e.outerHTML;return t||\"function\"!=typeof XMLSerializer||(t=(new XMLSerializer).serializeToString(e)),function(e,t){if(t=t||300,e.length>t){var n=e.indexOf(\">\");e=e.substring(0,n+1)}return e}(t||\"\")}(e),this._element=e}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],r=!0,a=!1,o=void 0;try{for(var i,u=e[Symbol.iterator]();!(r=(i=u.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(e){a=!0,o=e}finally{try{r||null==u.return||u.return()}finally{if(a)throw o}}return n}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}()}function J(e,t){return[e.substring(0,t),e.substring(t)]}function K(e){return e.replace(/\\s+$/,\"\")}axe.utils.aggregateChecks=function(e){var n=Object.assign({},e);G(n,function(e,t){var n=void 0===e.result?-1:M.indexOf(e.result);e.priority=-1!==n?n:axe.constants.CANTTELL_PRIO,\"none\"===t&&(e.priority===axe.constants.PASS_PRIO?e.priority=axe.constants.FAIL_PRIO:e.priority===axe.constants.FAIL_PRIO&&(e.priority=axe.constants.PASS_PRIO))});var r={all:n.all.reduce(function(e,t){return Math.max(e,t.priority)},0),none:n.none.reduce(function(e,t){return Math.max(e,t.priority)},0),any:n.any.reduce(function(e,t){return Math.min(e,t.priority)},4)%4};n.priority=Math.max(r.all,r.none,r.any);var a=[];return H.forEach(function(t){n[t]=n[t].filter(function(e){return e.priority===n.priority&&e.priority===r[t]}),n[t].forEach(function(e){return a.push(e.impact)})}),[U,V].includes(n.priority)?n.impact=axe.utils.aggregate(axe.constants.impact,a):n.impact=null,G(n,function(e){delete e.result,delete e.priority}),n.result=axe.constants.results[n.priority],delete n.priority,n},axe.utils.aggregateNodeResults=function(e){var n={};if((e=e.map(function(e){if(e.any&&e.all&&e.none)return axe.utils.aggregateChecks(e);if(Array.isArray(e.node))return axe.utils.finalizeRuleResult(e);throw new TypeError(\"Invalid Result type\")}))&&e.length){var t=e.map(function(e){return e.result});n.result=axe.utils.aggregate(axe.constants.results,t,n.result)}else n.result=\"inapplicable\";axe.constants.resultGroups.forEach(function(e){return n[e]=[]}),e.forEach(function(e){var t=axe.constants.resultGroupMap[e.result];n[t].push(e)});var r=axe.constants.FAIL_GROUP;if(0===n[r].length&&(r=axe.constants.CANTTELL_GROUP),0<n[r].length){var a=n[r].map(function(e){return e.impact});n.impact=axe.utils.aggregate(axe.constants.impact,a)||null}else n.impact=null;return n},axe.utils.aggregateResult=function(e){var n={};return axe.constants.resultGroups.forEach(function(e){return n[e]=[]}),e.forEach(function(t){t.error?W(n,t,axe.constants.CANTTELL_GROUP):t.result===axe.constants.NA?W(n,t,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(e){Array.isArray(t[e])&&0<t[e].length&&W(n,t,e)})}),n},axe.utils.areStylesSet=function e(t,n,r){\"use strict\";var a=window.getComputedStyle(t,null),o=!1;return!!a&&(n.forEach(function(e){a.getPropertyValue(e.property)===e.value&&(o=!0)}),!!o||!(t.nodeName.toUpperCase()===r.toUpperCase()||!t.parentNode)&&e(t.parentNode,n,r))},axe.utils.checkHelper=function(t,n,r,a){\"use strict\";return{isAsync:!1,async:function(){return this.isAsync=!0,function(e){e instanceof Error==!1?(t.result=e,r(t)):a(e)}},data:function(e){t.data=e},relatedNodes:function(e){e=e instanceof Node?[e]:axe.utils.toArray(e),t.relatedNodes=e.map(function(e){return new axe.utils.DqElement(e,n)})}}},axe.utils.clone=function(e){\"use strict\";var t,n,r=e;if(null!==e&&\"object\"===S(e))if(Array.isArray(e))for(r=[],t=0,n=e.length;t<n;t++)r[t]=axe.utils.clone(e[t]);else for(t in r={},e)r[t]=axe.utils.clone(e[t]);return r},axe.utils.sendCommandToFrame=function(t,n,r,a){\"use strict\";var o=t.contentWindow;if(!o)return axe.log(\"Frame does not have a content window\",t),void r(null);var i=setTimeout(function(){i=setTimeout(function(){n.debug?a($(\"No response from frame\",t)):r(null)},0)},500);axe.utils.respondable(o,\"axe.ping\",null,void 0,function(){clearTimeout(i);var e=n.options&&n.options.frameWaitTime||6e4;i=setTimeout(function(){a($(\"Axe in frame timed out\",t))},e),axe.utils.respondable(o,\"axe.start\",n,void 0,function(e){clearTimeout(i),e instanceof Error==!1?r(e):a(e)})})},axe.utils.collectResultsFromFrames=function(e,t,n,o,r,a){\"use strict\";var i=axe.utils.queue();e.frames.forEach(function(r){var a={options:t,command:n,parameter:o,context:{initiator:!1,page:e.page,include:r.include||[],exclude:r.exclude||[]}};i.defer(function(t,e){var n=r.node;axe.utils.sendCommandToFrame(n,a,function(e){if(e)return t({results:e,frameElement:n,frame:axe.utils.getSelector(n)});t(null)},e)})}),i.then(function(e){r(axe.utils.mergeResults(e,t))}).catch(a)},axe.utils.contains=function(e,t){\"use strict\";if(e.shadowId||t.shadowId)return function t(e,n){return e.shadowId===n.shadowId||!!e.children.find(function(e){return t(e,n)})}(e,t);if(e.actualNode)return\"function\"==typeof e.actualNode.contains?e.actualNode.contains(t.actualNode):!!(16&e.actualNode.compareDocumentPosition(t.actualNode));do{if(t===e)return!0}while(t=t&&t.parent);return!1},function(axe){var e=new axe.imports.CssSelectorParser;e.registerSelectorPseudos(\"not\"),e.registerNestingOperators(\">\"),e.registerAttrEqualityMods(\"^\",\"$\",\"*\"),axe.utils.cssParser=e}(axe),X.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){\"use strict\";return{selector:this.selector,source:this.source,xpath:this.xpath}}},X.fromFrame=function(e,t,n){return e.selector.unshift(n.selector),e.xpath.unshift(n.xpath),new axe.utils.DqElement(n.element,t,e)},axe.utils.DqElement=X,axe.utils.matchesSelector=function(){\"use strict\";var n;return function(e,t){return n&&e[n]||(n=function(e){var t,n,r=[\"matches\",\"matchesSelector\",\"mozMatchesSelector\",\"webkitMatchesSelector\",\"msMatchesSelector\"],a=r.length;for(t=0;t<a;t++)if(e[n=r[t]])return n}(e)),!!e[n]&&e[n](t)}}(),axe.utils.escapeSelector=function(e){\"use strict\";for(var t,n=String(e),r=n.length,a=-1,o=\"\",i=n.charCodeAt(0);++a<r;)0!=(t=n.charCodeAt(a))?o+=1<=t&&t<=31||127==t||0==a&&48<=t&&t<=57||1==a&&48<=t&&t<=57&&45==i?\"\\\\\"+t.toString(16)+\" \":(0!=a||1!=r||45!=t)&&(128<=t||45==t||95==t||48<=t&&t<=57||65<=t&&t<=90||97<=t&&t<=122)?n.charAt(a):\"\\\\\"+n.charAt(a):o+=\"�\";return o},axe.utils.extendMetaData=function(t,n){Object.assign(t,n),Object.keys(n).filter(function(e){return\"function\"==typeof n[e]}).forEach(function(e){t[e]=null;try{t[e]=n[e](t)}catch(e){}})},axe.utils.finalizeRuleResult=function(e){return Object.assign(e,axe.utils.aggregateNodeResults(e.nodes)),delete e.nodes,e},axe.utils.findBy=function(e,t,n){if(Array.isArray(e))return e.find(function(e){return\"object\"===S(e)&&e[t]===n})},(axe=axe||{utils:{}}).utils.getFlattenedTree=function(e,t){return axe._cache.set(\"nodeMap\",new WeakMap),function a(e,o,n){var r,t,i;function u(e,t,n){var r=a(t,o,n);return r&&(e=e.concat(r)),e}if(e.documentElement&&(e=e.documentElement),i=e.nodeName.toLowerCase(),axe.utils.isShadowRoot(e))return r=new A(e,n,o),o=\"a\"+Math.random().toString().substring(2),t=Array.from(e.shadowRoot.childNodes),r.children=t.reduce(function(e,t){return u(e,t,r)},[]),[r];if(\"content\"===i)return(t=Array.from(e.getDistributedNodes())).reduce(function(e,t){return u(e,t,n)},[]);if(\"slot\"!==i||\"function\"!=typeof e.assignedNodes)return 1===e.nodeType?(r=new A(e,n,o),t=Array.from(e.childNodes),r.children=t.reduce(function(e,t){return u(e,t,r)},[]),[r]):3===e.nodeType?[new A(e,n)]:void 0;(t=Array.from(e.assignedNodes())).length||(t=function(e){var t=[];for(e=e.firstChild;e;)t.push(e),e=e.nextSibling;return t}(e));window.getComputedStyle(e);return t.reduce(function(e,t){return u(e,t,n)},[])}(e,t)},axe.utils.getNodeFromTree=function(e,t){var n=t||e;return axe._cache.get(\"nodeMap\")?axe._cache.get(\"nodeMap\").get(n):null},axe.utils.getAllChecks=function(e){\"use strict\";return[].concat(e.any||[]).concat(e.all||[]).concat(e.none||[])},axe.utils.getBaseLang=function(e){return e?e.trim().split(\"-\")[0].toLowerCase():\"\"},axe.utils.getCheckOption=function(e,t,n){var r=((n.rules&&n.rules[t]||{}).checks||{})[e.id],a=(n.checks||{})[e.id],o=e.enabled,i=e.options;return a&&(a.hasOwnProperty(\"enabled\")&&(o=a.enabled),a.hasOwnProperty(\"options\")&&(i=a.options)),r&&(r.hasOwnProperty(\"enabled\")&&(o=r.enabled),r.hasOwnProperty(\"options\")&&(i=r.options)),{enabled:o,options:i,absolutePaths:n.absolutePaths}},axe.utils.getFriendlyUriEnd=function(e,t){var n=0<arguments.length&&void 0!==e?e:\"\",r=1<arguments.length&&void 0!==t?t:{};if(!(n.length<=1||\"data:\"===n.substr(0,5)||\"javascript:\"===n.substr(0,11)||n.includes(\"?\"))){var a=r.currentDomain,o=r.maxLength,i=void 0===o?25:o,u=function(e){var t=e,n=\"\",r=\"\",a=\"\",o=\"\",i=\"\";if(e.includes(\"#\")){var u=Y(J(e,e.indexOf(\"#\")),2);e=u[0],i=u[1]}if(e.includes(\"?\")){var s=Y(J(e,e.indexOf(\"?\")),2);e=s[0],o=s[1]}if(e.includes(\"://\")){var l=Y(e.split(\"://\"),2);n=l[0];var c=Y(J(e=l[1],e.indexOf(\"/\")),2);r=c[0],e=c[1]}else if(\"//\"===e.substr(0,2)){var d=Y(J(e=e.substr(2),e.indexOf(\"/\")),2);r=d[0],e=d[1]}if(\"www.\"===r.substr(0,4)&&(r=r.substr(4)),r&&r.includes(\":\")){var m=Y(J(r,r.indexOf(\":\")),2);r=m[0],a=m[1]}return{original:t,protocol:n,domain:r,port:a,path:e,query:o,hash:i}}(n),s=u.path,l=u.domain,c=u.hash,d=s.substr(s.substr(0,s.length-2).lastIndexOf(\"/\")+1);if(c)return d&&(d+c).length<=i?K(d+c):d.length<2&&2<c.length&&c.length<=i?K(c):void 0;if(l&&l.length<i&&s.length<=1)return K(l+s);if(s===\"/\"+d&&l&&a&&l!==a&&(l+s).length<=i)return K(l+s);var m=d.lastIndexOf(\".\");return(-1===m||1<m)&&(-1!==m||2<d.length)&&d.length<=i&&!d.match(/index(\\.[a-zA-Z]{2-4})?/)&&!function(e){var t=0<arguments.length&&void 0!==e?e:\"\";return 0!==t.length&&(t.match(/[0-9]/g)||\"\").length>=t.length/2}(d)?K(d):void 0}},axe.utils.getNodeAttributes=function(e){return e.attributes instanceof window.NamedNodeMap?e.attributes:e.cloneNode(!1).attributes},axe.utils.getRootNode=function(e){var t=e.getRootNode&&e.getRootNode()||document;return t===e&&(t=document),t},axe.utils.getScroll=function(e,t){var n=1<arguments.length&&void 0!==t?t:0,r=e.scrollWidth>e.clientWidth+n,a=e.scrollHeight>e.clientHeight+n;if(r||a){var o=window.getComputedStyle(e),i=o.getPropertyValue(\"overflow-x\"),u=o.getPropertyValue(\"overflow-y\");return r&&(\"visible\"!==i&&\"hidden\"!==i)||a&&(\"visible\"!==u&&\"hidden\"!==u)?{elm:e,top:e.scrollTop,left:e.scrollLeft}:void 0}};var Z,Q,ee=axe.utils.escapeSelector,te=[\"class\",\"style\",\"id\",\"selected\",\"checked\",\"disabled\",\"tabindex\",\"aria-checked\",\"aria-selected\",\"aria-invalid\",\"aria-activedescendant\",\"aria-busy\",\"aria-disabled\",\"aria-expanded\",\"aria-grabbed\",\"aria-pressed\",\"aria-valuenow\"],ne=31;function re(e,t){var n,r=t.name;if(-1!==r.indexOf(\"href\")||-1!==r.indexOf(\"src\")){var a=axe.utils.getFriendlyUriEnd(e.getAttribute(r));if(a){var o=encodeURI(a);if(!o)return;n=ee(t.name)+'$=\"'+ee(o)+'\"'}else n=ee(t.name)+'=\"'+ee(e.getAttribute(r))+'\"'}else n=ee(r)+'=\"'+ee(t.value)+'\"';return n}function ae(e,t){return e.count<t.count?-1:e.count===t.count?0:1}function oe(e){return!te.includes(e.name)&&-1===e.name.indexOf(\":\")&&(!e.value||e.value.length<ne)}function ie(t,n){var e=t.parentNode&&Array.from(t.parentNode.children||\"\")||[];return e.find(function(e){return e!==t&&axe.utils.matchesSelector(e,n)})?\":nth-child(\"+(1+e.indexOf(t))+\")\":\"\"}function ue(e){if(e.getAttribute(\"id\")){var t=e.getRootNode&&e.getRootNode()||document,n=\"#\"+ee(e.getAttribute(\"id\")||\"\");return n.match(/player_uid_/)||1!==t.querySelectorAll(n).length?void 0:n}}function se(e){return void 0===Z&&(Z=axe.utils.isXHTML(document)),ee(Z?e.localName:e.nodeName.toLowerCase())}function le(e,t){var n,r=\"\",a=function(n,e){var r=[],a=e.classes,o=e.tags;return n.classList&&Array.from(n.classList).forEach(function(e){var t=ee(e);a[t]<o[n.nodeName]&&r.push({name:t,count:a[t],species:\"class\"})}),r.sort(ae)}(e,t),o=function(n,e){var r=[],a=e.attributes,o=e.tags;return n.hasAttributes()&&Array.from(axe.utils.getNodeAttributes(n)).filter(oe).forEach(function(e){var t=re(n,e);t&&a[t]<o[n.nodeName]&&r.push({name:t,count:a[t],species:\"attribute\"})}),r.sort(ae)}(e,t);return a.length&&1===a[0].count?n=[a[0]]:o.length&&1===o[0].count?(n=[o[0]],r=se(e)):((n=a.concat(o)).sort(ae),(n=n.slice(0,3)).some(function(e){return\"class\"===e.species})?n.sort(function(e,t){return e.species!==t.species&&\"class\"===e.species?-1:e.species===t.species?0:1}):r=se(e)),r+n.reduce(function(e,t){switch(t.species){case\"class\":return e+\".\"+t.name;case\"attribute\":return e+\"[\"+t.name+\"]\"}return e},\"\")}function ce(e,t,n){if(!axe._selectorData)throw new Error(\"Expect axe._selectorData to be set up\");var r,a,o=t.toRoot,i=void 0!==o&&o;do{var u=ue(e);u||(u=le(e,axe._selectorData),u+=ie(e,u)),r=r?u+\" > \"+r:u,a=a?a.filter(function(e){return axe.utils.matchesSelector(e,r)}):Array.from(n.querySelectorAll(r)),e=e.parentElement}while((1<a.length||i)&&e&&11!==e.nodeType);return 1===a.length?r:-1!==r.indexOf(\" > \")?\":root\"+r.substring(r.indexOf(\" > \")):\":root\"}axe.utils.getSelectorData=function(e){function t(){var e=a.pop(),n=e.actualNode;if(n.querySelectorAll){var t=n.nodeName;r.tags[t]?r.tags[t]++:r.tags[t]=1,n.classList&&Array.from(n.classList).forEach(function(e){var t=ee(e);r.classes[t]?r.classes[t]++:r.classes[t]=1}),n.hasAttributes()&&Array.from(axe.utils.getNodeAttributes(n)).filter(oe).forEach(function(e){var t=re(n,e);t&&(r.attributes[t]?r.attributes[t]++:r.attributes[t]=1)})}for(e.children.length&&(o.push(a),a=e.children.slice());!a.length&&o.length;)a=o.pop()}for(var r={classes:{},tags:{},attributes:{}},a=(e=Array.isArray(e)?e:[e]).slice(),o=[];a.length;)t();return r},axe.utils.getSelector=function(e,t){var n=1<arguments.length&&void 0!==t?t:{};if(!e)return\"\";var r=e.getRootNode&&e.getRootNode()||document;if(11!==r.nodeType)return ce(e,n,r);for(var a=[];11===r.nodeType;)a.push({elm:e,doc:r}),r=(e=r.host).getRootNode();return a.push({elm:e,doc:r}),a.reverse().map(function(e){return ce(e.elm,n,e.doc)})},axe.utils.getStyleSheetFactory=function(d){if(!d)throw new Error(\"axe.utils.getStyleSheetFactory should be invoked with an argument\");return function(e){var t=e.data,n=e.isCrossOrigin,r=void 0!==n&&n,a=e.shadowId,o=e.root,i=e.priority,u=e.isLink,s=void 0!==u&&u,l=d.createElement(\"style\");if(s){var c=d.createTextNode('@import \"'.concat(t.href,'\"'));l.appendChild(c)}else l.appendChild(d.createTextNode(t));return d.head.appendChild(l),{sheet:l.sheet,isCrossOrigin:r,shadowId:a,root:o,priority:i}}},axe.utils.getXpath=function(e){return function(e){return e.reduce(function(e,t){return t.id?\"/\".concat(t.str,\"[@id='\").concat(t.id,\"']\"):e+\"/\".concat(t.str)+(0<t.count?\"[\".concat(t.count,\"]\"):\"\")},\"\")}(function e(t,n){var r,a;if(!t)return[];if(!n&&9===t.nodeType)return n=[{str:\"html\"}];if(n=n||[],t.parentNode&&t.parentNode!==t&&(n=e(t.parentNode,n)),t.previousSibling){for(a=1,r=t.previousSibling;1===r.nodeType&&r.nodeName===t.nodeName&&a++,r=r.previousSibling;);1===a&&(a=null)}else if(t.nextSibling)for(r=t.nextSibling;r=1===r.nodeType&&r.nodeName===t.nodeName?(a=1,null):(a=null,r.previousSibling););if(1===t.nodeType){var o={};o.str=t.nodeName.toLowerCase();var i=t.getAttribute&&axe.utils.escapeSelector(t.getAttribute(\"id\"));i&&1===t.ownerDocument.querySelectorAll(\"#\"+i).length&&(o.id=t.getAttribute(\"id\")),1<a&&(o.count=a),n.push(o)}return n}(e))},axe.utils.injectStyle=function(e){\"use strict\";if(Q&&Q.parentNode)return void 0===Q.styleSheet?Q.appendChild(document.createTextNode(e)):Q.styleSheet.cssText+=e,Q;if(e){var t=document.head||document.getElementsByTagName(\"head\")[0];return(Q=document.createElement(\"style\")).type=\"text/css\",void 0===Q.styleSheet?Q.appendChild(document.createTextNode(e)):Q.styleSheet.cssText=e,t.appendChild(Q),Q}},axe.utils.isHidden=function(e,t){\"use strict\";var n=axe.utils.getNodeFromTree(e);if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),n&&null!==n._isHidden)return n._isHidden;var r=window.getComputedStyle(e,null);if(!r||!e.parentNode||\"none\"===r.getPropertyValue(\"display\")||!t&&\"hidden\"===r.getPropertyValue(\"visibility\")||\"true\"===e.getAttribute(\"aria-hidden\"))return!0;var a=e.assignedSlot?e.assignedSlot:e.parentNode,o=axe.utils.isHidden(a,!0);return n&&(n._isHidden=o),o};var de=[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"];axe.utils.isHtmlElement=function(e){var t=e.nodeName.toLowerCase();return de.includes(t)&&\"http://www.w3.org/2000/svg\"!==e.namespaceURI};var me,pe,fe=[\"article\",\"aside\",\"blockquote\",\"body\",\"div\",\"footer\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"main\",\"nav\",\"p\",\"section\",\"span\"];function he(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}function be(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function ge(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function ye(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function ve(e){return\"function\"==typeof e||\"[object Function]\"===me.call(e)}function De(e){var t=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t}(e);return Math.min(Math.max(t,0),pe)}function we(e){var t=e.nodeName.toUpperCase(),n=e.getAttribute(\"href\"),r=e.getAttribute(\"rel\"),a=\"LINK\"===t&&n&&r&&e.rel.toUpperCase().includes(\"STYLESHEET\");return\"STYLE\"===t||a&&ke(e.media)}function ke(e){return!e||!e.toUpperCase().includes(\"PRINT\")}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function xe(a,o){\"use strict\";return function(e){var t=a[e.id]||{},n=t.messages||{},r=Object.assign({},t);delete r.messages,void 0===e.result?\"object\"===S(n.incomplete)?r.message=function(){return function(t,n){function r(e){return e.incomplete&&e.incomplete.default?e.incomplete.default:u.incompleteFallbackMessage()}if(!t||!t.missingData)return r(n);try{var e=n.incomplete[t.missingData[0].reason];if(!e)throw new Error;return e}catch(e){return\"string\"==typeof t.missingData?n.incomplete[t.missingData]:r(n)}}(e.data,n)}:r.message=n.incomplete:r.message=e.result===o?n.pass:n.fail,axe.utils.extendMetaData(e,r)}}axe.utils.isShadowRoot=function(e){var t=e.nodeName.toLowerCase();return!(!e.shadowRoot||!/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(t)&&!fe.includes(t))},axe.utils.isXHTML=function(e){\"use strict\";return!!e.createElement&&\"A\"===e.createElement(\"A\").localName},axe.utils.mergeResults=function(e,r){\"use strict\";var a=[];return e.forEach(function(n){var e=function(e){\"use strict\";return e&&e.results?Array.isArray(e.results)?e.results.length?e.results:null:[e.results]:null}(n);e&&e.length&&e.forEach(function(e){e.nodes&&n.frame&&function(e,n,t,r){\"use strict\";var a={element:t,selector:r,xpath:axe.utils.getXpath(t)};e.forEach(function(e){e.node=axe.utils.DqElement.fromFrame(e.node,n,a);var t=axe.utils.getAllChecks(e);t.length&&t.forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){return axe.utils.DqElement.fromFrame(e,n,a)})})})}(e.nodes,r,n.frameElement,n.frame);var t=axe.utils.findBy(a,\"id\",e.id);t?e.nodes.length&&function(e,t){\"use strict\";for(var n,r,a=t[0].node,o=0,i=e.length;o<i;o++)if(r=e[o].node,0<(n=axe.utils.nodeSorter({actualNode:r.element},{actualNode:a.element}))||0===n&&a.selector.length<r.selector.length)return e.splice.apply(e,[o,0].concat(t));e.push.apply(e,t)}(t.nodes,e.nodes):a.push(e)})}),a},axe.utils.nodeSorter=function(e,t){return(e=e.actualNode||e)===(t=t.actualNode||t)?0:4&e.compareDocumentPosition(t)?-1:1},axe.utils.parseCrossOriginStylesheet=function(e,r,a,o,i){var t={method:\"get\",url:e};return o.push(e),axe.imports.axios(t).then(function(e){var t=e.data,n=r.convertDataToStylesheet({data:t,isCrossOrigin:i,priority:a,root:r.rootNode,shadowId:r.shadowId});return axe.utils.parseStylesheet(n.sheet,r,a,o,n.isCrossOrigin)})},axe.utils.parseSameOriginStylesheet=function(e,a,o,i,t){var n=4<arguments.length&&void 0!==t&&t,r=Array.from(e.cssRules);if(!r)return Promise.resolve();var u=r.filter(function(e){return 3===e.type});if(!u.length)return Promise.resolve({isCrossOrigin:n,priority:o,root:a.rootNode,shadowId:a.shadowId,sheet:e});var s=u.filter(function(e){return e.href}).map(function(e){return e.href}).filter(function(e){return!i.includes(e)}).map(function(e,t){var n=[].concat(he(o),[t]),r=/^https?:\\/\\/|^\\/\\//i.test(e);return axe.utils.parseCrossOriginStylesheet(e,a,n,i,r)}),l=r.filter(function(e){return 3!==e.type});return l.length&&s.push(Promise.resolve(a.convertDataToStylesheet({data:l.map(function(e){return e.cssText}).join(),isCrossOrigin:n,priority:o,root:a.rootNode,shadowId:a.shadowId}))),Promise.all(s)},axe.utils.parseStylesheet=function(e,t,n,r,a){var o=4<arguments.length&&void 0!==a&&a;return function(e){try{return!(!e.cssRules&&e.href)}catch(e){return!1}}(e)?axe.utils.parseSameOriginStylesheet(e,t,n,r,o):axe.utils.parseCrossOriginStylesheet(e.href,t,n,r,!0)},utils.performanceTimer=function(){\"use strict\";function e(){if(window.performance&&window.performance)return window.performance.now()}var t=null,n=e();return{start:function(){this.mark(\"mark_axe_start\")},end:function(){this.mark(\"mark_axe_end\"),this.measure(\"axe\",\"mark_axe_start\",\"mark_axe_end\"),this.logMeasures(\"axe\")},auditStart:function(){this.mark(\"mark_audit_start\")},auditEnd:function(){this.mark(\"mark_audit_end\"),this.measure(\"audit_start_to_end\",\"mark_audit_start\",\"mark_audit_end\"),this.logMeasures()},mark:function(e){window.performance&&void 0!==window.performance.mark&&window.performance.mark(e)},measure:function(e,t,n){window.performance&&void 0!==window.performance.measure&&window.performance.measure(e,t,n)},logMeasures:function(e){function t(e){axe.log(\"Measure \"+e.name+\" took \"+e.duration+\"ms\")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var n=window.performance.getEntriesByName(\"mark_axe_start\")[0],r=window.performance.getEntriesByType(\"measure\").filter(function(e){return e.startTime>=n.startTime}),a=0;a<r.length;++a){var o=r[a];if(o.name===e)return void t(o);t(o)}},timeElapsed:function(){return e()-n},reset:function(){t=t||e(),n=e()}}}(),\"function\"!=typeof Object.assign&&(Object.assign=function(e){\"use strict\";if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var t=Object(e),n=1;n<arguments.length;n++){var r=arguments[n];if(null!=r)for(var a in r)r.hasOwnProperty(a)&&(t[a]=r[a])}return t}),Array.prototype.find||Object.defineProperty(Array.prototype,\"find\",{value:function(e){if(null===this)throw new TypeError(\"Array.prototype.find called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var t,n=Object(this),r=n.length>>>0,a=arguments[1],o=0;o<r;o++)if(t=n[o],e.call(a,t,o,n))return t}}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var e,t=((e=document.createElement(\"x\")).style.cssText=\"pointer-events:auto\",\"auto\"===e.style.pointerEvents),u=t?\"pointer-events\":\"visibility\",s=t?\"none\":\"hidden\",l=document.createElement(\"style\");return l.innerHTML=t?\"* { pointer-events: all }\":\"* { visibility: visible }\",function(e,t){var n,r,a,o=[],i=[];for(document.head.appendChild(l);(n=document.elementFromPoint(e,t))&&-1===o.indexOf(n);)o.push(n),i.push({value:n.style.getPropertyValue(u),priority:n.style.getPropertyPriority(u)}),n.style.setProperty(u,s,\"important\");for(o.indexOf(document.documentElement)<o.length-1&&(o.splice(o.indexOf(document.documentElement),1),o.push(document.documentElement)),r=i.length;a=i[--r];)o[r].style.setProperty(u,a.value?a.value:\"\",a.priority);return document.head.removeChild(l),o}},\"function\"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||Object.defineProperty(Array.prototype,\"includes\",{value:function(e,t){\"use strict\";var n=Object(this),r=parseInt(n.length,10)||0;if(0===r)return!1;var a,o,i=parseInt(t,10)||0;for(0<=i?a=i:(a=r+i)<0&&(a=0);a<r;){if(e===(o=n[a])||e!=e&&o!=o)return!0;a++}return!1}}),Array.prototype.some||Object.defineProperty(Array.prototype,\"some\",{value:function(e,t){\"use strict\";if(null==this)throw new TypeError(\"Array.prototype.some called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError;for(var n=Object(this),r=n.length>>>0,a=2<=arguments.length?t:void 0,o=0;o<r;o++)if(o in n&&e.call(a,n[o],o,n))return!0;return!1}}),Array.from||Object.defineProperty(Array,\"from\",{value:(me=Object.prototype.toString,pe=Math.pow(2,53)-1,function(e,t,n){var r=Object(e);if(null==e)throw new TypeError(\"Array.from requires an array-like object - not null or undefined\");var a,o=1<arguments.length?t:void 0;if(void 0!==o){if(!ve(o))throw new TypeError(\"Array.from: when provided, the second argument must be a function\");2<arguments.length&&(a=n)}for(var i,u=De(r.length),s=ve(this)?Object(new this(u)):new Array(u),l=0;l<u;)i=r[l],s[l]=o?void 0===a?o(i,l):o.call(a,i,l):i,l+=1;return s.length=u,s})}),String.prototype.includes||(String.prototype.includes=function(e,t){return\"number\"!=typeof t&&(t=0),!(t+e.length>this.length)&&-1!==this.indexOf(e,t)}),axe.utils.preloadCssom=function(e){var t=e.treeRoot,n=function(e){var t=[],n=axe.utils.querySelectorAllFilter(e,\"*\",function(e){return!t.includes(e.shadowId)&&(t.push(e.shadowId),!0)}).map(function(e){return{shadowId:e.shadowId,rootNode:axe.utils.getRootNode(e.actualNode)}});return axe.utils.uniqueArray(n,[])}(void 0===t?axe._tree[0]:t);if(!n.length)return Promise.resolve();var r=document.implementation.createHTMLDocument(\"Dynamic document for loading cssom\");return function(e,l){var c=[];return e.forEach(function(e,t){var n=e.rootNode,r=e.shadowId,a=function(e,t,n){var r;r=11===e.nodeType&&t?function(o,i){return Array.from(o.children).filter(we).reduce(function(e,t){var n=t.nodeName.toUpperCase(),r=\"STYLE\"===n?t.textContent:t,a=i({data:r,isLink:\"LINK\"===n,root:o});return e.push(a.sheet),e},[])}(e,n):function(e){return Array.from(e.styleSheets).filter(function(e){return ke(e.media.mediaText)})}(e);return function(e){var t=[];return e.filter(function(e){return!e.href||!t.includes(e.href)&&(t.push(e.href),!0)})}(r)}(n,r,l);if(!a)return Promise.all(c);var o=t+1,i={rootNode:n,shadowId:r,convertDataToStylesheet:l,rootIndex:o},u=[],s=Promise.all(a.map(function(e,t){var n=[o,t];return axe.utils.parseStylesheet(e,i,n,u)}));c.push(s)}),Promise.all(c)}(n,axe.utils.getStyleSheetFactory(r)).then(function(e){return function n(e){return e.reduce(function(e,t){return Array.isArray(t)?e.concat(n(t)):e.concat(t)},[])}(e)})},axe.utils.shouldPreload=function(e){return!e||void 0===e.preload||null===e.preload||(\"boolean\"==typeof e.preload?e.preload:function(e){return\"object\"===S(e)&&Array.isArray(e.assets)}(e.preload))},axe.utils.getPreloadConfig=function(e){var t=axe.constants.preload,n=t.assets,r=t.timeout,a={assets:n,timeout:r};if(!e.preload)return a;if(\"boolean\"==typeof e.preload)return a;if(!e.preload.assets.every(function(e){return n.includes(e.toLowerCase())}))throw new Error(\"Requested assets, not supported. \"+\"Supported assets are: \".concat(n.join(\", \"),\".\"));return a.assets=axe.utils.uniqueArray(e.preload.assets.map(function(e){return e.toLowerCase()}),[]),e.preload.timeout&&\"number\"==typeof e.preload.timeout&&!Number.isNaN(e.preload.timeout)&&(a.timeout=e.preload.timeout),a},axe.utils.preload=function(o){var i={cssom:axe.utils.preloadCssom};return axe.utils.shouldPreload(o)?new Promise(function(n,e){var t=axe.utils.getPreloadConfig(o),r=t.assets,a=t.timeout;setTimeout(function(){return e(\"Preload assets timed out.\")},a),Promise.all(r.map(function(t){return i[t](o).then(function(e){return function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},t,e)})})).then(function(e){var t=e.reduce(function(e,t){return R({},e,t)},{});n(t)})}):Promise.resolve()},axe.utils.publishMetaData=function(e){\"use strict\";var t=axe._audit.data.checks||{},n=axe._audit.data.rules||{},r=axe.utils.findBy(axe._audit.rules,\"id\",e.id)||{};e.tags=axe.utils.clone(r.tags||[]);var a=xe(t,!0),o=xe(t,!1);e.nodes.forEach(function(e){e.any.forEach(a),e.all.forEach(a),e.none.forEach(o)}),axe.utils.extendMetaData(e,axe.utils.clone(n[e.id]||{}))};var Ee=function(){},Ce=function(){};var Ae,Fe,je=(Ae=/(?=[\\-\\[\\]{}()*+?.\\\\\\^$|,#\\s])/g,function(e){return e.replace(Ae,\"\\\\\")}),ze=/\\\\/g;function qe(e){if(e)return e.map(function(e){var t,n,r=e.name.replace(ze,\"\"),a=(e.value||\"\").replace(ze,\"\");switch(e.operator){case\"^=\":n=new RegExp(\"^\"+je(a));break;case\"$=\":n=new RegExp(je(a)+\"$\");break;case\"~=\":n=new RegExp(\"(^|\\\\s)\"+je(a)+\"(\\\\s|$)\");break;case\"|=\":n=new RegExp(\"^\"+je(a)+\"(-|$)\");break;case\"=\":t=function(e){return a===e};break;case\"*=\":t=function(e){return e&&e.includes(a)};break;case\"!=\":t=function(e){return a!==e};break;default:t=function(e){return!!e}}return\"\"===a&&/^[*$^]=$/.test(e.operator)&&(t=function(){return!1}),{key:r,value:a,test:t=t||function(e){return e&&n.test(e)}}})}function Ne(e){if(e)return e.map(function(e){return{value:e=e.replace(ze,\"\"),regexp:new RegExp(\"(^|\\\\s)\"+je(e)+\"(\\\\s|$)\")}})}function Te(e){if(e)return e.map(function(e){var t;return\"not\"===e.name&&(t=(t=e.value).selectors?t.selectors:[t],t=Ee(t)),{name:e.name,expressions:t,value:e.value}})}function Se(e,t,n,r){var a={vNodes:e.slice(),anyLevel:t,thisLevel:n,parentShadowId:r};return a.vNodes.reverse(),a}function Re(e,t){return function(e,t){return 1===e.props.nodeType&&(\"*\"===t.tag||e.props.nodeName===t.tag)}(e,t[0])&&function(t,e){return!e.classes||e.classes.every(function(e){return t.hasClass(e.value)})}(e,t[0])&&function(r,e){return!e.attributes||e.attributes.reduce(function(e,t){var n=r.attr(t.key);return e&&null!==n&&(!t.value||t.test(n))},!0)}(e,t[0])&&function(e,t){return!t.id||e.props.id===t.id}(e,t[0])&&function(n,e){return!(e.pseudos&&!e.pseudos.reduce(function(e,t){if(\"not\"===t.name)return e&&!Ce([n],t.expressions,!1).length;throw new Error(\"the pseudo selector \"+t.name+\" has not yet been implemented\")},!0))}(e,t[0])}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Oe(t,e){\"use strict\";var n,r,a=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return r=e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\")?(n=e.include||[],n=Array.isArray(n)?n:[n],r=e.exclude||[],(r=Array.isArray(r)?r:[r]).concat(a.filter(function(e){return-1===n.indexOf(e)}))):(n=Array.isArray(e)?e:[e],a.filter(function(e){return-1===n.indexOf(e)})),!!(n.some(function(e){return-1!==t.tags.indexOf(e)})||0===n.length&&!1!==t.enabled)&&r.every(function(e){return-1===t.tags.indexOf(e)})}function _e(e){\"use strict\";return e.sort(function(e,t){return axe.utils.contains(e,t)?1:-1})[0]}function Be(t,e){\"use strict\";var n=e.include&&_e(e.include.filter(function(e){return axe.utils.contains(e,t)})),r=e.exclude&&_e(e.exclude.filter(function(e){return axe.utils.contains(e,t)}));return!!(!r&&n||r&&axe.utils.contains(r,n))}function Le(e,t){\"use strict\";var n;if(0===e.length)return t;e.length<t.length&&(n=e,e=t,t=n);for(var r=0,a=t.length;r<a;r++)e.includes(t[r])||e.push(t[r]);return e}Ee=function(e){return e.map(function(e){for(var t=[],n=e.rule;n;)t.push({tag:n.tagName?n.tagName.toLowerCase():\"*\",combinator:n.nestingOperator?n.nestingOperator:\" \",id:n.id,attributes:qe(n.attrs),classes:Ne(n.classNames),pseudos:Te(n.pseudos)}),n=n.rule;return t})},Ce=function(e,t,n,r){for(var a=[],o=Se(Array.isArray(e)?e:[e],t,[],e[0].shadowId),i=[];o.vNodes.length;){for(var u=o.vNodes.pop(),s=[],l=[],c=o.anyLevel.slice().concat(o.thisLevel),d=!1,m=0;m<c.length;m++){var p=c[m];if(Re(u,p)&&(!p[0].id||u.shadowId===o.parentShadowId))if(1===p.length)d||r&&!r(u)||(i.push(u),d=!0);else{var f=p.slice(1);if(!1===[\" \",\">\"].includes(f[0].combinator))throw new Error(\"axe.utils.querySelectorAll does not support the combinator: \"+p[1].combinator);\">\"===f[0].combinator?s.push(f):l.push(f)}!o.anyLevel.includes(p)||p[0].id&&u.shadowId!==o.parentShadowId||l.push(p)}for(u.children&&u.children.length&&n&&(a.push(o),o=Se(u.children,l,s,u.shadowId));!o.vNodes.length&&a.length;)o=a.pop()}return i},axe.utils.querySelectorAll=function(e,t){return axe.utils.querySelectorAllFilter(e,t)},axe.utils.querySelectorAllFilter=function(e,t,n){e=Array.isArray(e)?e:[e];var r=axe.utils.cssParser.parse(t);return r=r.selectors?r.selectors:[r],r=Ee(r),Ce(e,r,!0,n)},function(){\"use strict\";function m(){}function p(e){if(\"function\"!=typeof e)throw new TypeError(\"Queue methods require functions as arguments\")}axe.utils.queue=function(){function t(e){r=e,setTimeout(function(){null!=r&&axe.log(\"Uncaught error (of queue)\",r)},1)}var r,a=[],o=0,i=0,n=m,u=!1,s=t;function l(t){return function(e){a[t]=e,(i-=1)||n===m||(u=!0,n(a))}}function c(e){return n=m,s(e),a}var d={defer:function(e){if(\"object\"===S(e)&&e.then&&e.catch){var n=e;e=function(e,t){n.then(e).catch(t)}}if(p(e),void 0===r){if(u)throw new Error(\"Queue already completed\");return a.push(e),++i,function(){for(var e=a.length;o<e;o++){var t=a[o];try{t.call(null,l(o),c)}catch(e){c(e)}}}(),d}},then:function(e){if(p(e),n!==m)throw new Error(\"queue `then` already set\");return r||(n=e,i||(u=!0,n(a))),d},catch:function(e){if(p(e),s!==t)throw new Error(\"queue `catch` already set\");return r?(e(r),r=null):s=e,d},abort:c};return d}}(),function(e){\"use strict\";var s={},i={},a=Object.freeze([\"EvalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function l(){var e=\"axeAPI\",t=\"\";return void 0!==axe&&axe._audit&&axe._audit.application&&(e=axe._audit.application),void 0!==axe&&(t=axe.version),e+\".\"+t}function u(e,t,n,r,a,o){var i;n instanceof Error&&(i={name:n.name,message:n.message,stack:n.stack},n=void 0);var u={uuid:r,topic:t,message:n,error:i,_respondable:!0,_source:l(),_keepalive:a};\"function\"==typeof o&&(s[r]=o),e.postMessage(JSON.stringify(u),\"*\")}function t(e,t,n,r,a){u(e,t,n,Fe.v1(),r,a)}function c(r,a,o){return function(e,t,n){u(r,a,e,o,t,n)}}function o(e){var t;if(\"string\"==typeof e){try{t=JSON.parse(e)}catch(e){}if(function(e){if(\"object\"!==S(e)||\"string\"!=typeof e.uuid||!0!==e._respondable)return!1;var t=l();return e._source===t||\"axeAPI.x.y.z\"===e._source||\"axeAPI.x.y.z\"===t}(t))return\"object\"===S(t.error)?t.error=function(e){var t=e.message||\"Unknown error occurred\",n=a.includes(e.name)?e.name:\"Error\",r=window[n]||Error;return e.stack&&(t+=\"\\n\"+e.stack.replace(e.message,\"\")),new r(t)}(t.error):t.error=void 0,t}}t.subscribe=function(e,t){i[e]=t},t.isInFrame=function(e){return!!(e=e||window).frameElement},\"function\"==typeof window.addEventListener&&window.addEventListener(\"message\",function(t){var n=o(t.data);if(n){var r=n.uuid,e=n._keepalive,a=s[r];if(a)a(n.error||n.message,e,c(t.source,n.topic,r)),e||delete s[r];if(!n.error)try{!function(e,t,n){var r=t.topic,a=i[r];if(a){var o=c(e,null,t.uuid);a(t.message,n,o)}}(t.source,n,e)}catch(e){u(t.source,n.topic,e,r,!1)}}},!1),e.respondable=t}(utils),axe.utils.ruleShouldRun=function(e,t,n){\"use strict\";var r=n.runOnly||{},a=(n.rules||{})[e.id];return!(e.pageLevel&&!t.page)&&(\"rule\"===r.type?-1!==r.values.indexOf(e.id):a&&\"boolean\"==typeof a.enabled?a.enabled:\"tag\"===r.type&&r.values?Oe(e,r.values):Oe(e,[]))},axe.utils.getScrollState=function(e){var t=0<arguments.length&&void 0!==e?e:window,n=t.document.documentElement;return[void 0!==t.pageXOffset?{elm:t,top:t.pageYOffset,left:t.pageXOffset}:{elm:n,top:n.scrollTop,left:n.scrollLeft}].concat(function r(e){return Array.from(e.children).reduce(function(e,t){var n=axe.utils.getScroll(t);return n&&e.push(n),e.concat(r(t))},[])}(document.body))},axe.utils.setScrollState=function(e){e.forEach(function(e){return function(e,t,n){if(e===window)return e.scroll(n,t);e.scrollTop=t,e.scrollLeft=n}(e.elm,e.top,e.left)})},axe.utils.select=function(e,t){\"use strict\";var n,r=[];if(axe._selectCache)for(var a=0,o=axe._selectCache.length;a<o;a++){var i=axe._selectCache[a];if(i.selector===e)return i.result}for(var u,s=(u=t,function(e){return Be(e,u)}),l=function(e){return e.reduce(function(e,t){return e.length&&axe.utils.contains(e[e.length-1],t)||e.push(t),e},[])}(t.include),c=0;c<l.length;c++)n=l[c],r=Le(r,axe.utils.querySelectorAllFilter(n,e,s));return axe._selectCache&&axe._selectCache.push({selector:e,result:r}),r},axe.utils.toArray=function(e){\"use strict\";return Array.prototype.slice.call(e)},axe.utils.uniqueArray=function(e,t){return e.concat(t).filter(function(e,t,n){return n.indexOf(e)===t})},axe.utils.tokenList=function(e){\"use strict\";return e.trim().replace(/\\s{2,}/g,\" \").split(\" \")},function(e){var i,t=e.crypto||e.msCrypto;if(!i&&t&&t.getRandomValues){var n=new Uint8Array(16);i=function(){return t.getRandomValues(n),n}}if(!i){var r=new Array(16);i=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),r[t]=e>>>((3&t)<<3)&255;return r}}for(var u=\"function\"==typeof e.Buffer?e.Buffer:Array,a=[],o={},s=0;s<256;s++)a[s]=(s+256).toString(16).substr(1),o[a[s]]=s;function p(e,t){var n=t||0,r=a;return r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]}var l=i(),f=[1|l[0],l[1],l[2],l[3],l[4],l[5]],h=16383&(l[6]<<8|l[7]),b=0,g=0;function c(e,t,n){var r=t&&n||0;\"string\"==typeof e&&(t=\"binary\"==e?new u(16):null,e=null);var a=(e=e||{}).random||(e.rng||i)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var o=0;o<16;o++)t[r+o]=a[o];return t||p(a)}(Fe=c).v1=function(e,t,n){var r=t&&n||0,a=t||[],o=null!=(e=e||{}).clockseq?e.clockseq:h,i=null!=e.msecs?e.msecs:(new Date).getTime(),u=null!=e.nsecs?e.nsecs:g+1,s=i-b+(u-g)/1e4;if(s<0&&null==e.clockseq&&(o=o+1&16383),(s<0||b<i)&&null==e.nsecs&&(u=0),1e4<=u)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");b=i,h=o;var l=(1e4*(268435455&(i+=122192928e5))+(g=u))%4294967296;a[r++]=l>>>24&255,a[r++]=l>>>16&255,a[r++]=l>>>8&255,a[r++]=255&l;var c=i/4294967296*1e4&268435455;a[r++]=c>>>8&255,a[r++]=255&c,a[r++]=c>>>24&15|16,a[r++]=c>>>16&255,a[r++]=o>>>8|128,a[r++]=255&o;for(var d=e.node||f,m=0;m<6;m++)a[r+m]=d[m];return t||p(a)},Fe.v4=c,Fe.parse=function(e,t,n){var r=t&&n||0,a=0;for(t=t||[],e.toLowerCase().replace(/[0-9a-f]{2}/g,function(e){a<16&&(t[r+a++]=o[e])});a<16;)t[r+a++]=0;return t},Fe.unparse=p,Fe.BufferClass=u}(window),axe.utils.validInputTypes=function(){\"use strict\";return[\"hidden\",\"text\",\"search\",\"tel\",\"url\",\"email\",\"password\",\"date\",\"month\",\"week\",\"time\",\"datetime-local\",\"number\",\"range\",\"color\",\"checkbox\",\"radio\",\"file\",\"submit\",\"image\",\"reset\",\"button\"]};var Ie=[\"aa\",\"ab\",\"ae\",\"af\",\"ak\",\"am\",\"an\",\"ar\",\"as\",\"av\",\"ay\",\"az\",\"ba\",\"be\",\"bg\",\"bh\",\"bi\",\"bm\",\"bn\",\"bo\",\"br\",\"bs\",\"ca\",\"ce\",\"ch\",\"co\",\"cr\",\"cs\",\"cu\",\"cv\",\"cy\",\"da\",\"de\",\"dv\",\"dz\",\"ee\",\"el\",\"en\",\"eo\",\"es\",\"et\",\"eu\",\"fa\",\"ff\",\"fi\",\"fj\",\"fo\",\"fr\",\"fy\",\"ga\",\"gd\",\"gl\",\"gn\",\"gu\",\"gv\",\"ha\",\"he\",\"hi\",\"ho\",\"hr\",\"ht\",\"hu\",\"hy\",\"hz\",\"ia\",\"id\",\"ie\",\"ig\",\"ii\",\"ik\",\"in\",\"io\",\"is\",\"it\",\"iu\",\"iw\",\"ja\",\"ji\",\"jv\",\"jw\",\"ka\",\"kg\",\"ki\",\"kj\",\"kk\",\"kl\",\"km\",\"kn\",\"ko\",\"kr\",\"ks\",\"ku\",\"kv\",\"kw\",\"ky\",\"la\",\"lb\",\"lg\",\"li\",\"ln\",\"lo\",\"lt\",\"lu\",\"lv\",\"mg\",\"mh\",\"mi\",\"mk\",\"ml\",\"mn\",\"mo\",\"mr\",\"ms\",\"mt\",\"my\",\"na\",\"nb\",\"nd\",\"ne\",\"ng\",\"nl\",\"nn\",\"no\",\"nr\",\"nv\",\"ny\",\"oc\",\"oj\",\"om\",\"or\",\"os\",\"pa\",\"pi\",\"pl\",\"ps\",\"pt\",\"qu\",\"rm\",\"rn\",\"ro\",\"ru\",\"rw\",\"sa\",\"sc\",\"sd\",\"se\",\"sg\",\"sh\",\"si\",\"sk\",\"sl\",\"sm\",\"sn\",\"so\",\"sq\",\"sr\",\"ss\",\"st\",\"su\",\"sv\",\"sw\",\"ta\",\"te\",\"tg\",\"th\",\"ti\",\"tk\",\"tl\",\"tn\",\"to\",\"tr\",\"ts\",\"tt\",\"tw\",\"ty\",\"ug\",\"uk\",\"ur\",\"uz\",\"ve\",\"vi\",\"vo\",\"wa\",\"wo\",\"xh\",\"yi\",\"yo\",\"za\",\"zh\",\"zu\",\"aaa\",\"aab\",\"aac\",\"aad\",\"aae\",\"aaf\",\"aag\",\"aah\",\"aai\",\"aak\",\"aal\",\"aam\",\"aan\",\"aao\",\"aap\",\"aaq\",\"aas\",\"aat\",\"aau\",\"aav\",\"aaw\",\"aax\",\"aaz\",\"aba\",\"abb\",\"abc\",\"abd\",\"abe\",\"abf\",\"abg\",\"abh\",\"abi\",\"abj\",\"abl\",\"abm\",\"abn\",\"abo\",\"abp\",\"abq\",\"abr\",\"abs\",\"abt\",\"abu\",\"abv\",\"abw\",\"abx\",\"aby\",\"abz\",\"aca\",\"acb\",\"acd\",\"ace\",\"acf\",\"ach\",\"aci\",\"ack\",\"acl\",\"acm\",\"acn\",\"acp\",\"acq\",\"acr\",\"acs\",\"act\",\"acu\",\"acv\",\"acw\",\"acx\",\"acy\",\"acz\",\"ada\",\"adb\",\"add\",\"ade\",\"adf\",\"adg\",\"adh\",\"adi\",\"adj\",\"adl\",\"adn\",\"ado\",\"adp\",\"adq\",\"adr\",\"ads\",\"adt\",\"adu\",\"adw\",\"adx\",\"ady\",\"adz\",\"aea\",\"aeb\",\"aec\",\"aed\",\"aee\",\"aek\",\"ael\",\"aem\",\"aen\",\"aeq\",\"aer\",\"aes\",\"aeu\",\"aew\",\"aey\",\"aez\",\"afa\",\"afb\",\"afd\",\"afe\",\"afg\",\"afh\",\"afi\",\"afk\",\"afn\",\"afo\",\"afp\",\"afs\",\"aft\",\"afu\",\"afz\",\"aga\",\"agb\",\"agc\",\"agd\",\"age\",\"agf\",\"agg\",\"agh\",\"agi\",\"agj\",\"agk\",\"agl\",\"agm\",\"agn\",\"ago\",\"agp\",\"agq\",\"agr\",\"ags\",\"agt\",\"agu\",\"agv\",\"agw\",\"agx\",\"agy\",\"agz\",\"aha\",\"ahb\",\"ahg\",\"ahh\",\"ahi\",\"ahk\",\"ahl\",\"ahm\",\"ahn\",\"aho\",\"ahp\",\"ahr\",\"ahs\",\"aht\",\"aia\",\"aib\",\"aic\",\"aid\",\"aie\",\"aif\",\"aig\",\"aih\",\"aii\",\"aij\",\"aik\",\"ail\",\"aim\",\"ain\",\"aio\",\"aip\",\"aiq\",\"air\",\"ais\",\"ait\",\"aiw\",\"aix\",\"aiy\",\"aja\",\"ajg\",\"aji\",\"ajn\",\"ajp\",\"ajt\",\"aju\",\"ajw\",\"ajz\",\"akb\",\"akc\",\"akd\",\"ake\",\"akf\",\"akg\",\"akh\",\"aki\",\"akj\",\"akk\",\"akl\",\"akm\",\"ako\",\"akp\",\"akq\",\"akr\",\"aks\",\"akt\",\"aku\",\"akv\",\"akw\",\"akx\",\"aky\",\"akz\",\"ala\",\"alc\",\"ald\",\"ale\",\"alf\",\"alg\",\"alh\",\"ali\",\"alj\",\"alk\",\"all\",\"alm\",\"aln\",\"alo\",\"alp\",\"alq\",\"alr\",\"als\",\"alt\",\"alu\",\"alv\",\"alw\",\"alx\",\"aly\",\"alz\",\"ama\",\"amb\",\"amc\",\"ame\",\"amf\",\"amg\",\"ami\",\"amj\",\"amk\",\"aml\",\"amm\",\"amn\",\"amo\",\"amp\",\"amq\",\"amr\",\"ams\",\"amt\",\"amu\",\"amv\",\"amw\",\"amx\",\"amy\",\"amz\",\"ana\",\"anb\",\"anc\",\"and\",\"ane\",\"anf\",\"ang\",\"anh\",\"ani\",\"anj\",\"ank\",\"anl\",\"anm\",\"ann\",\"ano\",\"anp\",\"anq\",\"anr\",\"ans\",\"ant\",\"anu\",\"anv\",\"anw\",\"anx\",\"any\",\"anz\",\"aoa\",\"aob\",\"aoc\",\"aod\",\"aoe\",\"aof\",\"aog\",\"aoh\",\"aoi\",\"aoj\",\"aok\",\"aol\",\"aom\",\"aon\",\"aor\",\"aos\",\"aot\",\"aou\",\"aox\",\"aoz\",\"apa\",\"apb\",\"apc\",\"apd\",\"ape\",\"apf\",\"apg\",\"aph\",\"api\",\"apj\",\"apk\",\"apl\",\"apm\",\"apn\",\"apo\",\"app\",\"apq\",\"apr\",\"aps\",\"apt\",\"apu\",\"apv\",\"apw\",\"apx\",\"apy\",\"apz\",\"aqa\",\"aqc\",\"aqd\",\"aqg\",\"aql\",\"aqm\",\"aqn\",\"aqp\",\"aqr\",\"aqt\",\"aqz\",\"arb\",\"arc\",\"ard\",\"are\",\"arh\",\"ari\",\"arj\",\"ark\",\"arl\",\"arn\",\"aro\",\"arp\",\"arq\",\"arr\",\"ars\",\"art\",\"aru\",\"arv\",\"arw\",\"arx\",\"ary\",\"arz\",\"asa\",\"asb\",\"asc\",\"asd\",\"ase\",\"asf\",\"asg\",\"ash\",\"asi\",\"asj\",\"ask\",\"asl\",\"asn\",\"aso\",\"asp\",\"asq\",\"asr\",\"ass\",\"ast\",\"asu\",\"asv\",\"asw\",\"asx\",\"asy\",\"asz\",\"ata\",\"atb\",\"atc\",\"atd\",\"ate\",\"atg\",\"ath\",\"ati\",\"atj\",\"atk\",\"atl\",\"atm\",\"atn\",\"ato\",\"atp\",\"atq\",\"atr\",\"ats\",\"att\",\"atu\",\"atv\",\"atw\",\"atx\",\"aty\",\"atz\",\"aua\",\"aub\",\"auc\",\"aud\",\"aue\",\"auf\",\"aug\",\"auh\",\"aui\",\"auj\",\"auk\",\"aul\",\"aum\",\"aun\",\"auo\",\"aup\",\"auq\",\"aur\",\"aus\",\"aut\",\"auu\",\"auw\",\"aux\",\"auy\",\"auz\",\"avb\",\"avd\",\"avi\",\"avk\",\"avl\",\"avm\",\"avn\",\"avo\",\"avs\",\"avt\",\"avu\",\"avv\",\"awa\",\"awb\",\"awc\",\"awd\",\"awe\",\"awg\",\"awh\",\"awi\",\"awk\",\"awm\",\"awn\",\"awo\",\"awr\",\"aws\",\"awt\",\"awu\",\"awv\",\"aww\",\"awx\",\"awy\",\"axb\",\"axe\",\"axg\",\"axk\",\"axl\",\"axm\",\"axx\",\"aya\",\"ayb\",\"ayc\",\"ayd\",\"aye\",\"ayg\",\"ayh\",\"ayi\",\"ayk\",\"ayl\",\"ayn\",\"ayo\",\"ayp\",\"ayq\",\"ayr\",\"ays\",\"ayt\",\"ayu\",\"ayx\",\"ayy\",\"ayz\",\"aza\",\"azb\",\"azc\",\"azd\",\"azg\",\"azj\",\"azm\",\"azn\",\"azo\",\"azt\",\"azz\",\"baa\",\"bab\",\"bac\",\"bad\",\"bae\",\"baf\",\"bag\",\"bah\",\"bai\",\"baj\",\"bal\",\"ban\",\"bao\",\"bap\",\"bar\",\"bas\",\"bat\",\"bau\",\"bav\",\"baw\",\"bax\",\"bay\",\"baz\",\"bba\",\"bbb\",\"bbc\",\"bbd\",\"bbe\",\"bbf\",\"bbg\",\"bbh\",\"bbi\",\"bbj\",\"bbk\",\"bbl\",\"bbm\",\"bbn\",\"bbo\",\"bbp\",\"bbq\",\"bbr\",\"bbs\",\"bbt\",\"bbu\",\"bbv\",\"bbw\",\"bbx\",\"bby\",\"bbz\",\"bca\",\"bcb\",\"bcc\",\"bcd\",\"bce\",\"bcf\",\"bcg\",\"bch\",\"bci\",\"bcj\",\"bck\",\"bcl\",\"bcm\",\"bcn\",\"bco\",\"bcp\",\"bcq\",\"bcr\",\"bcs\",\"bct\",\"bcu\",\"bcv\",\"bcw\",\"bcy\",\"bcz\",\"bda\",\"bdb\",\"bdc\",\"bdd\",\"bde\",\"bdf\",\"bdg\",\"bdh\",\"bdi\",\"bdj\",\"bdk\",\"bdl\",\"bdm\",\"bdn\",\"bdo\",\"bdp\",\"bdq\",\"bdr\",\"bds\",\"bdt\",\"bdu\",\"bdv\",\"bdw\",\"bdx\",\"bdy\",\"bdz\",\"bea\",\"beb\",\"bec\",\"bed\",\"bee\",\"bef\",\"beg\",\"beh\",\"bei\",\"bej\",\"bek\",\"bem\",\"beo\",\"bep\",\"beq\",\"ber\",\"bes\",\"bet\",\"beu\",\"bev\",\"bew\",\"bex\",\"bey\",\"bez\",\"bfa\",\"bfb\",\"bfc\",\"bfd\",\"bfe\",\"bff\",\"bfg\",\"bfh\",\"bfi\",\"bfj\",\"bfk\",\"bfl\",\"bfm\",\"bfn\",\"bfo\",\"bfp\",\"bfq\",\"bfr\",\"bfs\",\"bft\",\"bfu\",\"bfw\",\"bfx\",\"bfy\",\"bfz\",\"bga\",\"bgb\",\"bgc\",\"bgd\",\"bge\",\"bgf\",\"bgg\",\"bgi\",\"bgj\",\"bgk\",\"bgl\",\"bgm\",\"bgn\",\"bgo\",\"bgp\",\"bgq\",\"bgr\",\"bgs\",\"bgt\",\"bgu\",\"bgv\",\"bgw\",\"bgx\",\"bgy\",\"bgz\",\"bha\",\"bhb\",\"bhc\",\"bhd\",\"bhe\",\"bhf\",\"bhg\",\"bhh\",\"bhi\",\"bhj\",\"bhk\",\"bhl\",\"bhm\",\"bhn\",\"bho\",\"bhp\",\"bhq\",\"bhr\",\"bhs\",\"bht\",\"bhu\",\"bhv\",\"bhw\",\"bhx\",\"bhy\",\"bhz\",\"bia\",\"bib\",\"bic\",\"bid\",\"bie\",\"bif\",\"big\",\"bij\",\"bik\",\"bil\",\"bim\",\"bin\",\"bio\",\"bip\",\"biq\",\"bir\",\"bit\",\"biu\",\"biv\",\"biw\",\"bix\",\"biy\",\"biz\",\"bja\",\"bjb\",\"bjc\",\"bjd\",\"bje\",\"bjf\",\"bjg\",\"bjh\",\"bji\",\"bjj\",\"bjk\",\"bjl\",\"bjm\",\"bjn\",\"bjo\",\"bjp\",\"bjq\",\"bjr\",\"bjs\",\"bjt\",\"bju\",\"bjv\",\"bjw\",\"bjx\",\"bjy\",\"bjz\",\"bka\",\"bkb\",\"bkc\",\"bkd\",\"bkf\",\"bkg\",\"bkh\",\"bki\",\"bkj\",\"bkk\",\"bkl\",\"bkm\",\"bkn\",\"bko\",\"bkp\",\"bkq\",\"bkr\",\"bks\",\"bkt\",\"bku\",\"bkv\",\"bkw\",\"bkx\",\"bky\",\"bkz\",\"bla\",\"blb\",\"blc\",\"bld\",\"ble\",\"blf\",\"blg\",\"blh\",\"bli\",\"blj\",\"blk\",\"bll\",\"blm\",\"bln\",\"blo\",\"blp\",\"blq\",\"blr\",\"bls\",\"blt\",\"blv\",\"blw\",\"blx\",\"bly\",\"blz\",\"bma\",\"bmb\",\"bmc\",\"bmd\",\"bme\",\"bmf\",\"bmg\",\"bmh\",\"bmi\",\"bmj\",\"bmk\",\"bml\",\"bmm\",\"bmn\",\"bmo\",\"bmp\",\"bmq\",\"bmr\",\"bms\",\"bmt\",\"bmu\",\"bmv\",\"bmw\",\"bmx\",\"bmy\",\"bmz\",\"bna\",\"bnb\",\"bnc\",\"bnd\",\"bne\",\"bnf\",\"bng\",\"bni\",\"bnj\",\"bnk\",\"bnl\",\"bnm\",\"bnn\",\"bno\",\"bnp\",\"bnq\",\"bnr\",\"bns\",\"bnt\",\"bnu\",\"bnv\",\"bnw\",\"bnx\",\"bny\",\"bnz\",\"boa\",\"bob\",\"boe\",\"bof\",\"bog\",\"boh\",\"boi\",\"boj\",\"bok\",\"bol\",\"bom\",\"bon\",\"boo\",\"bop\",\"boq\",\"bor\",\"bot\",\"bou\",\"bov\",\"bow\",\"box\",\"boy\",\"boz\",\"bpa\",\"bpb\",\"bpd\",\"bpg\",\"bph\",\"bpi\",\"bpj\",\"bpk\",\"bpl\",\"bpm\",\"bpn\",\"bpo\",\"bpp\",\"bpq\",\"bpr\",\"bps\",\"bpt\",\"bpu\",\"bpv\",\"bpw\",\"bpx\",\"bpy\",\"bpz\",\"bqa\",\"bqb\",\"bqc\",\"bqd\",\"bqf\",\"bqg\",\"bqh\",\"bqi\",\"bqj\",\"bqk\",\"bql\",\"bqm\",\"bqn\",\"bqo\",\"bqp\",\"bqq\",\"bqr\",\"bqs\",\"bqt\",\"bqu\",\"bqv\",\"bqw\",\"bqx\",\"bqy\",\"bqz\",\"bra\",\"brb\",\"brc\",\"brd\",\"brf\",\"brg\",\"brh\",\"bri\",\"brj\",\"brk\",\"brl\",\"brm\",\"brn\",\"bro\",\"brp\",\"brq\",\"brr\",\"brs\",\"brt\",\"bru\",\"brv\",\"brw\",\"brx\",\"bry\",\"brz\",\"bsa\",\"bsb\",\"bsc\",\"bse\",\"bsf\",\"bsg\",\"bsh\",\"bsi\",\"bsj\",\"bsk\",\"bsl\",\"bsm\",\"bsn\",\"bso\",\"bsp\",\"bsq\",\"bsr\",\"bss\",\"bst\",\"bsu\",\"bsv\",\"bsw\",\"bsx\",\"bsy\",\"bta\",\"btb\",\"btc\",\"btd\",\"bte\",\"btf\",\"btg\",\"bth\",\"bti\",\"btj\",\"btk\",\"btl\",\"btm\",\"btn\",\"bto\",\"btp\",\"btq\",\"btr\",\"bts\",\"btt\",\"btu\",\"btv\",\"btw\",\"btx\",\"bty\",\"btz\",\"bua\",\"bub\",\"buc\",\"bud\",\"bue\",\"buf\",\"bug\",\"buh\",\"bui\",\"buj\",\"buk\",\"bum\",\"bun\",\"buo\",\"bup\",\"buq\",\"bus\",\"but\",\"buu\",\"buv\",\"buw\",\"bux\",\"buy\",\"buz\",\"bva\",\"bvb\",\"bvc\",\"bvd\",\"bve\",\"bvf\",\"bvg\",\"bvh\",\"bvi\",\"bvj\",\"bvk\",\"bvl\",\"bvm\",\"bvn\",\"bvo\",\"bvp\",\"bvq\",\"bvr\",\"bvt\",\"bvu\",\"bvv\",\"bvw\",\"bvx\",\"bvy\",\"bvz\",\"bwa\",\"bwb\",\"bwc\",\"bwd\",\"bwe\",\"bwf\",\"bwg\",\"bwh\",\"bwi\",\"bwj\",\"bwk\",\"bwl\",\"bwm\",\"bwn\",\"bwo\",\"bwp\",\"bwq\",\"bwr\",\"bws\",\"bwt\",\"bwu\",\"bww\",\"bwx\",\"bwy\",\"bwz\",\"bxa\",\"bxb\",\"bxc\",\"bxd\",\"bxe\",\"bxf\",\"bxg\",\"bxh\",\"bxi\",\"bxj\",\"bxk\",\"bxl\",\"bxm\",\"bxn\",\"bxo\",\"bxp\",\"bxq\",\"bxr\",\"bxs\",\"bxu\",\"bxv\",\"bxw\",\"bxx\",\"bxz\",\"bya\",\"byb\",\"byc\",\"byd\",\"bye\",\"byf\",\"byg\",\"byh\",\"byi\",\"byj\",\"byk\",\"byl\",\"bym\",\"byn\",\"byo\",\"byp\",\"byq\",\"byr\",\"bys\",\"byt\",\"byv\",\"byw\",\"byx\",\"byy\",\"byz\",\"bza\",\"bzb\",\"bzc\",\"bzd\",\"bze\",\"bzf\",\"bzg\",\"bzh\",\"bzi\",\"bzj\",\"bzk\",\"bzl\",\"bzm\",\"bzn\",\"bzo\",\"bzp\",\"bzq\",\"bzr\",\"bzs\",\"bzt\",\"bzu\",\"bzv\",\"bzw\",\"bzx\",\"bzy\",\"bzz\",\"caa\",\"cab\",\"cac\",\"cad\",\"cae\",\"caf\",\"cag\",\"cah\",\"cai\",\"caj\",\"cak\",\"cal\",\"cam\",\"can\",\"cao\",\"cap\",\"caq\",\"car\",\"cas\",\"cau\",\"cav\",\"caw\",\"cax\",\"cay\",\"caz\",\"cba\",\"cbb\",\"cbc\",\"cbd\",\"cbe\",\"cbg\",\"cbh\",\"cbi\",\"cbj\",\"cbk\",\"cbl\",\"cbn\",\"cbo\",\"cbq\",\"cbr\",\"cbs\",\"cbt\",\"cbu\",\"cbv\",\"cbw\",\"cby\",\"cca\",\"ccc\",\"ccd\",\"cce\",\"ccg\",\"cch\",\"ccj\",\"ccl\",\"ccm\",\"ccn\",\"cco\",\"ccp\",\"ccq\",\"ccr\",\"ccs\",\"cda\",\"cdc\",\"cdd\",\"cde\",\"cdf\",\"cdg\",\"cdh\",\"cdi\",\"cdj\",\"cdm\",\"cdn\",\"cdo\",\"cdr\",\"cds\",\"cdy\",\"cdz\",\"cea\",\"ceb\",\"ceg\",\"cek\",\"cel\",\"cen\",\"cet\",\"cfa\",\"cfd\",\"cfg\",\"cfm\",\"cga\",\"cgc\",\"cgg\",\"cgk\",\"chb\",\"chc\",\"chd\",\"chf\",\"chg\",\"chh\",\"chj\",\"chk\",\"chl\",\"chm\",\"chn\",\"cho\",\"chp\",\"chq\",\"chr\",\"cht\",\"chw\",\"chx\",\"chy\",\"chz\",\"cia\",\"cib\",\"cic\",\"cid\",\"cie\",\"cih\",\"cik\",\"cim\",\"cin\",\"cip\",\"cir\",\"ciw\",\"ciy\",\"cja\",\"cje\",\"cjh\",\"cji\",\"cjk\",\"cjm\",\"cjn\",\"cjo\",\"cjp\",\"cjr\",\"cjs\",\"cjv\",\"cjy\",\"cka\",\"ckb\",\"ckh\",\"ckl\",\"ckn\",\"cko\",\"ckq\",\"ckr\",\"cks\",\"ckt\",\"cku\",\"ckv\",\"ckx\",\"cky\",\"ckz\",\"cla\",\"clc\",\"cld\",\"cle\",\"clh\",\"cli\",\"clj\",\"clk\",\"cll\",\"clm\",\"clo\",\"clt\",\"clu\",\"clw\",\"cly\",\"cma\",\"cmc\",\"cme\",\"cmg\",\"cmi\",\"cmk\",\"cml\",\"cmm\",\"cmn\",\"cmo\",\"cmr\",\"cms\",\"cmt\",\"cna\",\"cnb\",\"cnc\",\"cng\",\"cnh\",\"cni\",\"cnk\",\"cnl\",\"cno\",\"cnr\",\"cns\",\"cnt\",\"cnu\",\"cnw\",\"cnx\",\"coa\",\"cob\",\"coc\",\"cod\",\"coe\",\"cof\",\"cog\",\"coh\",\"coj\",\"cok\",\"col\",\"com\",\"con\",\"coo\",\"cop\",\"coq\",\"cot\",\"cou\",\"cov\",\"cow\",\"cox\",\"coy\",\"coz\",\"cpa\",\"cpb\",\"cpc\",\"cpe\",\"cpf\",\"cpg\",\"cpi\",\"cpn\",\"cpo\",\"cpp\",\"cps\",\"cpu\",\"cpx\",\"cpy\",\"cqd\",\"cqu\",\"cra\",\"crb\",\"crc\",\"crd\",\"crf\",\"crg\",\"crh\",\"cri\",\"crj\",\"crk\",\"crl\",\"crm\",\"crn\",\"cro\",\"crp\",\"crq\",\"crr\",\"crs\",\"crt\",\"crv\",\"crw\",\"crx\",\"cry\",\"crz\",\"csa\",\"csb\",\"csc\",\"csd\",\"cse\",\"csf\",\"csg\",\"csh\",\"csi\",\"csj\",\"csk\",\"csl\",\"csm\",\"csn\",\"cso\",\"csq\",\"csr\",\"css\",\"cst\",\"csu\",\"csv\",\"csw\",\"csy\",\"csz\",\"cta\",\"ctc\",\"ctd\",\"cte\",\"ctg\",\"cth\",\"ctl\",\"ctm\",\"ctn\",\"cto\",\"ctp\",\"cts\",\"ctt\",\"ctu\",\"ctz\",\"cua\",\"cub\",\"cuc\",\"cug\",\"cuh\",\"cui\",\"cuj\",\"cuk\",\"cul\",\"cum\",\"cuo\",\"cup\",\"cuq\",\"cur\",\"cus\",\"cut\",\"cuu\",\"cuv\",\"cuw\",\"cux\",\"cuy\",\"cvg\",\"cvn\",\"cwa\",\"cwb\",\"cwd\",\"cwe\",\"cwg\",\"cwt\",\"cya\",\"cyb\",\"cyo\",\"czh\",\"czk\",\"czn\",\"czo\",\"czt\",\"daa\",\"dac\",\"dad\",\"dae\",\"daf\",\"dag\",\"dah\",\"dai\",\"daj\",\"dak\",\"dal\",\"dam\",\"dao\",\"dap\",\"daq\",\"dar\",\"das\",\"dau\",\"dav\",\"daw\",\"dax\",\"day\",\"daz\",\"dba\",\"dbb\",\"dbd\",\"dbe\",\"dbf\",\"dbg\",\"dbi\",\"dbj\",\"dbl\",\"dbm\",\"dbn\",\"dbo\",\"dbp\",\"dbq\",\"dbr\",\"dbt\",\"dbu\",\"dbv\",\"dbw\",\"dby\",\"dcc\",\"dcr\",\"dda\",\"ddd\",\"dde\",\"ddg\",\"ddi\",\"ddj\",\"ddn\",\"ddo\",\"ddr\",\"dds\",\"ddw\",\"dec\",\"ded\",\"dee\",\"def\",\"deg\",\"deh\",\"dei\",\"dek\",\"del\",\"dem\",\"den\",\"dep\",\"deq\",\"der\",\"des\",\"dev\",\"dez\",\"dga\",\"dgb\",\"dgc\",\"dgd\",\"dge\",\"dgg\",\"dgh\",\"dgi\",\"dgk\",\"dgl\",\"dgn\",\"dgo\",\"dgr\",\"dgs\",\"dgt\",\"dgu\",\"dgw\",\"dgx\",\"dgz\",\"dha\",\"dhd\",\"dhg\",\"dhi\",\"dhl\",\"dhm\",\"dhn\",\"dho\",\"dhr\",\"dhs\",\"dhu\",\"dhv\",\"dhw\",\"dhx\",\"dia\",\"dib\",\"dic\",\"did\",\"dif\",\"dig\",\"dih\",\"dii\",\"dij\",\"dik\",\"dil\",\"dim\",\"din\",\"dio\",\"dip\",\"diq\",\"dir\",\"dis\",\"dit\",\"diu\",\"diw\",\"dix\",\"diy\",\"diz\",\"dja\",\"djb\",\"djc\",\"djd\",\"dje\",\"djf\",\"dji\",\"djj\",\"djk\",\"djl\",\"djm\",\"djn\",\"djo\",\"djr\",\"dju\",\"djw\",\"dka\",\"dkk\",\"dkl\",\"dkr\",\"dks\",\"dkx\",\"dlg\",\"dlk\",\"dlm\",\"dln\",\"dma\",\"dmb\",\"dmc\",\"dmd\",\"dme\",\"dmg\",\"dmk\",\"dml\",\"dmm\",\"dmn\",\"dmo\",\"dmr\",\"dms\",\"dmu\",\"dmv\",\"dmw\",\"dmx\",\"dmy\",\"dna\",\"dnd\",\"dne\",\"dng\",\"dni\",\"dnj\",\"dnk\",\"dnn\",\"dnr\",\"dnt\",\"dnu\",\"dnv\",\"dnw\",\"dny\",\"doa\",\"dob\",\"doc\",\"doe\",\"dof\",\"doh\",\"doi\",\"dok\",\"dol\",\"don\",\"doo\",\"dop\",\"doq\",\"dor\",\"dos\",\"dot\",\"dov\",\"dow\",\"dox\",\"doy\",\"doz\",\"dpp\",\"dra\",\"drb\",\"drc\",\"drd\",\"dre\",\"drg\",\"drh\",\"dri\",\"drl\",\"drn\",\"dro\",\"drq\",\"drr\",\"drs\",\"drt\",\"dru\",\"drw\",\"dry\",\"dsb\",\"dse\",\"dsh\",\"dsi\",\"dsl\",\"dsn\",\"dso\",\"dsq\",\"dta\",\"dtb\",\"dtd\",\"dth\",\"dti\",\"dtk\",\"dtm\",\"dtn\",\"dto\",\"dtp\",\"dtr\",\"dts\",\"dtt\",\"dtu\",\"dty\",\"dua\",\"dub\",\"duc\",\"dud\",\"due\",\"duf\",\"dug\",\"duh\",\"dui\",\"duj\",\"duk\",\"dul\",\"dum\",\"dun\",\"duo\",\"dup\",\"duq\",\"dur\",\"dus\",\"duu\",\"duv\",\"duw\",\"dux\",\"duy\",\"duz\",\"dva\",\"dwa\",\"dwl\",\"dwr\",\"dws\",\"dwu\",\"dww\",\"dwy\",\"dya\",\"dyb\",\"dyd\",\"dyg\",\"dyi\",\"dym\",\"dyn\",\"dyo\",\"dyu\",\"dyy\",\"dza\",\"dzd\",\"dze\",\"dzg\",\"dzl\",\"dzn\",\"eaa\",\"ebg\",\"ebk\",\"ebo\",\"ebr\",\"ebu\",\"ecr\",\"ecs\",\"ecy\",\"eee\",\"efa\",\"efe\",\"efi\",\"ega\",\"egl\",\"ego\",\"egx\",\"egy\",\"ehu\",\"eip\",\"eit\",\"eiv\",\"eja\",\"eka\",\"ekc\",\"eke\",\"ekg\",\"eki\",\"ekk\",\"ekl\",\"ekm\",\"eko\",\"ekp\",\"ekr\",\"eky\",\"ele\",\"elh\",\"eli\",\"elk\",\"elm\",\"elo\",\"elp\",\"elu\",\"elx\",\"ema\",\"emb\",\"eme\",\"emg\",\"emi\",\"emk\",\"emm\",\"emn\",\"emo\",\"emp\",\"ems\",\"emu\",\"emw\",\"emx\",\"emy\",\"ena\",\"enb\",\"enc\",\"end\",\"enf\",\"enh\",\"enl\",\"enm\",\"enn\",\"eno\",\"enq\",\"enr\",\"enu\",\"env\",\"enw\",\"enx\",\"eot\",\"epi\",\"era\",\"erg\",\"erh\",\"eri\",\"erk\",\"ero\",\"err\",\"ers\",\"ert\",\"erw\",\"ese\",\"esg\",\"esh\",\"esi\",\"esk\",\"esl\",\"esm\",\"esn\",\"eso\",\"esq\",\"ess\",\"esu\",\"esx\",\"esy\",\"etb\",\"etc\",\"eth\",\"etn\",\"eto\",\"etr\",\"ets\",\"ett\",\"etu\",\"etx\",\"etz\",\"euq\",\"eve\",\"evh\",\"evn\",\"ewo\",\"ext\",\"eya\",\"eyo\",\"eza\",\"eze\",\"faa\",\"fab\",\"fad\",\"faf\",\"fag\",\"fah\",\"fai\",\"faj\",\"fak\",\"fal\",\"fam\",\"fan\",\"fap\",\"far\",\"fat\",\"fau\",\"fax\",\"fay\",\"faz\",\"fbl\",\"fcs\",\"fer\",\"ffi\",\"ffm\",\"fgr\",\"fia\",\"fie\",\"fil\",\"fip\",\"fir\",\"fit\",\"fiu\",\"fiw\",\"fkk\",\"fkv\",\"fla\",\"flh\",\"fli\",\"fll\",\"fln\",\"flr\",\"fly\",\"fmp\",\"fmu\",\"fnb\",\"fng\",\"fni\",\"fod\",\"foi\",\"fom\",\"fon\",\"for\",\"fos\",\"fox\",\"fpe\",\"fqs\",\"frc\",\"frd\",\"frk\",\"frm\",\"fro\",\"frp\",\"frq\",\"frr\",\"frs\",\"frt\",\"fse\",\"fsl\",\"fss\",\"fub\",\"fuc\",\"fud\",\"fue\",\"fuf\",\"fuh\",\"fui\",\"fuj\",\"fum\",\"fun\",\"fuq\",\"fur\",\"fut\",\"fuu\",\"fuv\",\"fuy\",\"fvr\",\"fwa\",\"fwe\",\"gaa\",\"gab\",\"gac\",\"gad\",\"gae\",\"gaf\",\"gag\",\"gah\",\"gai\",\"gaj\",\"gak\",\"gal\",\"gam\",\"gan\",\"gao\",\"gap\",\"gaq\",\"gar\",\"gas\",\"gat\",\"gau\",\"gav\",\"gaw\",\"gax\",\"gay\",\"gaz\",\"gba\",\"gbb\",\"gbc\",\"gbd\",\"gbe\",\"gbf\",\"gbg\",\"gbh\",\"gbi\",\"gbj\",\"gbk\",\"gbl\",\"gbm\",\"gbn\",\"gbo\",\"gbp\",\"gbq\",\"gbr\",\"gbs\",\"gbu\",\"gbv\",\"gbw\",\"gbx\",\"gby\",\"gbz\",\"gcc\",\"gcd\",\"gce\",\"gcf\",\"gcl\",\"gcn\",\"gcr\",\"gct\",\"gda\",\"gdb\",\"gdc\",\"gdd\",\"gde\",\"gdf\",\"gdg\",\"gdh\",\"gdi\",\"gdj\",\"gdk\",\"gdl\",\"gdm\",\"gdn\",\"gdo\",\"gdq\",\"gdr\",\"gds\",\"gdt\",\"gdu\",\"gdx\",\"gea\",\"geb\",\"gec\",\"ged\",\"geg\",\"geh\",\"gei\",\"gej\",\"gek\",\"gel\",\"gem\",\"geq\",\"ges\",\"gev\",\"gew\",\"gex\",\"gey\",\"gez\",\"gfk\",\"gft\",\"gfx\",\"gga\",\"ggb\",\"ggd\",\"gge\",\"ggg\",\"ggk\",\"ggl\",\"ggn\",\"ggo\",\"ggr\",\"ggt\",\"ggu\",\"ggw\",\"gha\",\"ghc\",\"ghe\",\"ghh\",\"ghk\",\"ghl\",\"ghn\",\"gho\",\"ghr\",\"ghs\",\"ght\",\"gia\",\"gib\",\"gic\",\"gid\",\"gie\",\"gig\",\"gih\",\"gil\",\"gim\",\"gin\",\"gio\",\"gip\",\"giq\",\"gir\",\"gis\",\"git\",\"giu\",\"giw\",\"gix\",\"giy\",\"giz\",\"gji\",\"gjk\",\"gjm\",\"gjn\",\"gjr\",\"gju\",\"gka\",\"gkd\",\"gke\",\"gkn\",\"gko\",\"gkp\",\"gku\",\"glc\",\"gld\",\"glh\",\"gli\",\"glj\",\"glk\",\"gll\",\"glo\",\"glr\",\"glu\",\"glw\",\"gly\",\"gma\",\"gmb\",\"gmd\",\"gme\",\"gmg\",\"gmh\",\"gml\",\"gmm\",\"gmn\",\"gmq\",\"gmu\",\"gmv\",\"gmw\",\"gmx\",\"gmy\",\"gmz\",\"gna\",\"gnb\",\"gnc\",\"gnd\",\"gne\",\"gng\",\"gnh\",\"gni\",\"gnj\",\"gnk\",\"gnl\",\"gnm\",\"gnn\",\"gno\",\"gnq\",\"gnr\",\"gnt\",\"gnu\",\"gnw\",\"gnz\",\"goa\",\"gob\",\"goc\",\"god\",\"goe\",\"gof\",\"gog\",\"goh\",\"goi\",\"goj\",\"gok\",\"gol\",\"gom\",\"gon\",\"goo\",\"gop\",\"goq\",\"gor\",\"gos\",\"got\",\"gou\",\"gow\",\"gox\",\"goy\",\"goz\",\"gpa\",\"gpe\",\"gpn\",\"gqa\",\"gqi\",\"gqn\",\"gqr\",\"gqu\",\"gra\",\"grb\",\"grc\",\"grd\",\"grg\",\"grh\",\"gri\",\"grj\",\"grk\",\"grm\",\"gro\",\"grq\",\"grr\",\"grs\",\"grt\",\"gru\",\"grv\",\"grw\",\"grx\",\"gry\",\"grz\",\"gse\",\"gsg\",\"gsl\",\"gsm\",\"gsn\",\"gso\",\"gsp\",\"gss\",\"gsw\",\"gta\",\"gti\",\"gtu\",\"gua\",\"gub\",\"guc\",\"gud\",\"gue\",\"guf\",\"gug\",\"guh\",\"gui\",\"guk\",\"gul\",\"gum\",\"gun\",\"guo\",\"gup\",\"guq\",\"gur\",\"gus\",\"gut\",\"guu\",\"guv\",\"guw\",\"gux\",\"guz\",\"gva\",\"gvc\",\"gve\",\"gvf\",\"gvj\",\"gvl\",\"gvm\",\"gvn\",\"gvo\",\"gvp\",\"gvr\",\"gvs\",\"gvy\",\"gwa\",\"gwb\",\"gwc\",\"gwd\",\"gwe\",\"gwf\",\"gwg\",\"gwi\",\"gwj\",\"gwm\",\"gwn\",\"gwr\",\"gwt\",\"gwu\",\"gww\",\"gwx\",\"gxx\",\"gya\",\"gyb\",\"gyd\",\"gye\",\"gyf\",\"gyg\",\"gyi\",\"gyl\",\"gym\",\"gyn\",\"gyo\",\"gyr\",\"gyy\",\"gza\",\"gzi\",\"gzn\",\"haa\",\"hab\",\"hac\",\"had\",\"hae\",\"haf\",\"hag\",\"hah\",\"hai\",\"haj\",\"hak\",\"hal\",\"ham\",\"han\",\"hao\",\"hap\",\"haq\",\"har\",\"has\",\"hav\",\"haw\",\"hax\",\"hay\",\"haz\",\"hba\",\"hbb\",\"hbn\",\"hbo\",\"hbu\",\"hca\",\"hch\",\"hdn\",\"hds\",\"hdy\",\"hea\",\"hed\",\"heg\",\"heh\",\"hei\",\"hem\",\"hgm\",\"hgw\",\"hhi\",\"hhr\",\"hhy\",\"hia\",\"hib\",\"hid\",\"hif\",\"hig\",\"hih\",\"hii\",\"hij\",\"hik\",\"hil\",\"him\",\"hio\",\"hir\",\"hit\",\"hiw\",\"hix\",\"hji\",\"hka\",\"hke\",\"hkk\",\"hkn\",\"hks\",\"hla\",\"hlb\",\"hld\",\"hle\",\"hlt\",\"hlu\",\"hma\",\"hmb\",\"hmc\",\"hmd\",\"hme\",\"hmf\",\"hmg\",\"hmh\",\"hmi\",\"hmj\",\"hmk\",\"hml\",\"hmm\",\"hmn\",\"hmp\",\"hmq\",\"hmr\",\"hms\",\"hmt\",\"hmu\",\"hmv\",\"hmw\",\"hmx\",\"hmy\",\"hmz\",\"hna\",\"hnd\",\"hne\",\"hnh\",\"hni\",\"hnj\",\"hnn\",\"hno\",\"hns\",\"hnu\",\"hoa\",\"hob\",\"hoc\",\"hod\",\"hoe\",\"hoh\",\"hoi\",\"hoj\",\"hok\",\"hol\",\"hom\",\"hoo\",\"hop\",\"hor\",\"hos\",\"hot\",\"hov\",\"how\",\"hoy\",\"hoz\",\"hpo\",\"hps\",\"hra\",\"hrc\",\"hre\",\"hrk\",\"hrm\",\"hro\",\"hrp\",\"hrr\",\"hrt\",\"hru\",\"hrw\",\"hrx\",\"hrz\",\"hsb\",\"hsh\",\"hsl\",\"hsn\",\"hss\",\"hti\",\"hto\",\"hts\",\"htu\",\"htx\",\"hub\",\"huc\",\"hud\",\"hue\",\"huf\",\"hug\",\"huh\",\"hui\",\"huj\",\"huk\",\"hul\",\"hum\",\"huo\",\"hup\",\"huq\",\"hur\",\"hus\",\"hut\",\"huu\",\"huv\",\"huw\",\"hux\",\"huy\",\"huz\",\"hvc\",\"hve\",\"hvk\",\"hvn\",\"hvv\",\"hwa\",\"hwc\",\"hwo\",\"hya\",\"hyw\",\"hyx\",\"iai\",\"ian\",\"iap\",\"iar\",\"iba\",\"ibb\",\"ibd\",\"ibe\",\"ibg\",\"ibh\",\"ibi\",\"ibl\",\"ibm\",\"ibn\",\"ibr\",\"ibu\",\"iby\",\"ica\",\"ich\",\"icl\",\"icr\",\"ida\",\"idb\",\"idc\",\"idd\",\"ide\",\"idi\",\"idr\",\"ids\",\"idt\",\"idu\",\"ifa\",\"ifb\",\"ife\",\"iff\",\"ifk\",\"ifm\",\"ifu\",\"ify\",\"igb\",\"ige\",\"igg\",\"igl\",\"igm\",\"ign\",\"igo\",\"igs\",\"igw\",\"ihb\",\"ihi\",\"ihp\",\"ihw\",\"iin\",\"iir\",\"ijc\",\"ije\",\"ijj\",\"ijn\",\"ijo\",\"ijs\",\"ike\",\"iki\",\"ikk\",\"ikl\",\"iko\",\"ikp\",\"ikr\",\"iks\",\"ikt\",\"ikv\",\"ikw\",\"ikx\",\"ikz\",\"ila\",\"ilb\",\"ilg\",\"ili\",\"ilk\",\"ill\",\"ilm\",\"ilo\",\"ilp\",\"ils\",\"ilu\",\"ilv\",\"ilw\",\"ima\",\"ime\",\"imi\",\"iml\",\"imn\",\"imo\",\"imr\",\"ims\",\"imy\",\"inb\",\"inc\",\"ine\",\"ing\",\"inh\",\"inj\",\"inl\",\"inm\",\"inn\",\"ino\",\"inp\",\"ins\",\"int\",\"inz\",\"ior\",\"iou\",\"iow\",\"ipi\",\"ipo\",\"iqu\",\"iqw\",\"ira\",\"ire\",\"irh\",\"iri\",\"irk\",\"irn\",\"iro\",\"irr\",\"iru\",\"irx\",\"iry\",\"isa\",\"isc\",\"isd\",\"ise\",\"isg\",\"ish\",\"isi\",\"isk\",\"ism\",\"isn\",\"iso\",\"isr\",\"ist\",\"isu\",\"itb\",\"itc\",\"itd\",\"ite\",\"iti\",\"itk\",\"itl\",\"itm\",\"ito\",\"itr\",\"its\",\"itt\",\"itv\",\"itw\",\"itx\",\"ity\",\"itz\",\"ium\",\"ivb\",\"ivv\",\"iwk\",\"iwm\",\"iwo\",\"iws\",\"ixc\",\"ixl\",\"iya\",\"iyo\",\"iyx\",\"izh\",\"izi\",\"izr\",\"izz\",\"jaa\",\"jab\",\"jac\",\"jad\",\"jae\",\"jaf\",\"jah\",\"jaj\",\"jak\",\"jal\",\"jam\",\"jan\",\"jao\",\"jaq\",\"jar\",\"jas\",\"jat\",\"jau\",\"jax\",\"jay\",\"jaz\",\"jbe\",\"jbi\",\"jbj\",\"jbk\",\"jbn\",\"jbo\",\"jbr\",\"jbt\",\"jbu\",\"jbw\",\"jcs\",\"jct\",\"jda\",\"jdg\",\"jdt\",\"jeb\",\"jee\",\"jeg\",\"jeh\",\"jei\",\"jek\",\"jel\",\"jen\",\"jer\",\"jet\",\"jeu\",\"jgb\",\"jge\",\"jgk\",\"jgo\",\"jhi\",\"jhs\",\"jia\",\"jib\",\"jic\",\"jid\",\"jie\",\"jig\",\"jih\",\"jii\",\"jil\",\"jim\",\"jio\",\"jiq\",\"jit\",\"jiu\",\"jiv\",\"jiy\",\"jje\",\"jjr\",\"jka\",\"jkm\",\"jko\",\"jkp\",\"jkr\",\"jku\",\"jle\",\"jls\",\"jma\",\"jmb\",\"jmc\",\"jmd\",\"jmi\",\"jml\",\"jmn\",\"jmr\",\"jms\",\"jmw\",\"jmx\",\"jna\",\"jnd\",\"jng\",\"jni\",\"jnj\",\"jnl\",\"jns\",\"job\",\"jod\",\"jog\",\"jor\",\"jos\",\"jow\",\"jpa\",\"jpr\",\"jpx\",\"jqr\",\"jra\",\"jrb\",\"jrr\",\"jrt\",\"jru\",\"jsl\",\"jua\",\"jub\",\"juc\",\"jud\",\"juh\",\"jui\",\"juk\",\"jul\",\"jum\",\"jun\",\"juo\",\"jup\",\"jur\",\"jus\",\"jut\",\"juu\",\"juw\",\"juy\",\"jvd\",\"jvn\",\"jwi\",\"jya\",\"jye\",\"jyy\",\"kaa\",\"kab\",\"kac\",\"kad\",\"kae\",\"kaf\",\"kag\",\"kah\",\"kai\",\"kaj\",\"kak\",\"kam\",\"kao\",\"kap\",\"kaq\",\"kar\",\"kav\",\"kaw\",\"kax\",\"kay\",\"kba\",\"kbb\",\"kbc\",\"kbd\",\"kbe\",\"kbf\",\"kbg\",\"kbh\",\"kbi\",\"kbj\",\"kbk\",\"kbl\",\"kbm\",\"kbn\",\"kbo\",\"kbp\",\"kbq\",\"kbr\",\"kbs\",\"kbt\",\"kbu\",\"kbv\",\"kbw\",\"kbx\",\"kby\",\"kbz\",\"kca\",\"kcb\",\"kcc\",\"kcd\",\"kce\",\"kcf\",\"kcg\",\"kch\",\"kci\",\"kcj\",\"kck\",\"kcl\",\"kcm\",\"kcn\",\"kco\",\"kcp\",\"kcq\",\"kcr\",\"kcs\",\"kct\",\"kcu\",\"kcv\",\"kcw\",\"kcx\",\"kcy\",\"kcz\",\"kda\",\"kdc\",\"kdd\",\"kde\",\"kdf\",\"kdg\",\"kdh\",\"kdi\",\"kdj\",\"kdk\",\"kdl\",\"kdm\",\"kdn\",\"kdo\",\"kdp\",\"kdq\",\"kdr\",\"kdt\",\"kdu\",\"kdv\",\"kdw\",\"kdx\",\"kdy\",\"kdz\",\"kea\",\"keb\",\"kec\",\"ked\",\"kee\",\"kef\",\"keg\",\"keh\",\"kei\",\"kej\",\"kek\",\"kel\",\"kem\",\"ken\",\"keo\",\"kep\",\"keq\",\"ker\",\"kes\",\"ket\",\"keu\",\"kev\",\"kew\",\"kex\",\"key\",\"kez\",\"kfa\",\"kfb\",\"kfc\",\"kfd\",\"kfe\",\"kff\",\"kfg\",\"kfh\",\"kfi\",\"kfj\",\"kfk\",\"kfl\",\"kfm\",\"kfn\",\"kfo\",\"kfp\",\"kfq\",\"kfr\",\"kfs\",\"kft\",\"kfu\",\"kfv\",\"kfw\",\"kfx\",\"kfy\",\"kfz\",\"kga\",\"kgb\",\"kgc\",\"kgd\",\"kge\",\"kgf\",\"kgg\",\"kgh\",\"kgi\",\"kgj\",\"kgk\",\"kgl\",\"kgm\",\"kgn\",\"kgo\",\"kgp\",\"kgq\",\"kgr\",\"kgs\",\"kgt\",\"kgu\",\"kgv\",\"kgw\",\"kgx\",\"kgy\",\"kha\",\"khb\",\"khc\",\"khd\",\"khe\",\"khf\",\"khg\",\"khh\",\"khi\",\"khj\",\"khk\",\"khl\",\"khn\",\"kho\",\"khp\",\"khq\",\"khr\",\"khs\",\"kht\",\"khu\",\"khv\",\"khw\",\"khx\",\"khy\",\"khz\",\"kia\",\"kib\",\"kic\",\"kid\",\"kie\",\"kif\",\"kig\",\"kih\",\"kii\",\"kij\",\"kil\",\"kim\",\"kio\",\"kip\",\"kiq\",\"kis\",\"kit\",\"kiu\",\"kiv\",\"kiw\",\"kix\",\"kiy\",\"kiz\",\"kja\",\"kjb\",\"kjc\",\"kjd\",\"kje\",\"kjf\",\"kjg\",\"kjh\",\"kji\",\"kjj\",\"kjk\",\"kjl\",\"kjm\",\"kjn\",\"kjo\",\"kjp\",\"kjq\",\"kjr\",\"kjs\",\"kjt\",\"kju\",\"kjv\",\"kjx\",\"kjy\",\"kjz\",\"kka\",\"kkb\",\"kkc\",\"kkd\",\"kke\",\"kkf\",\"kkg\",\"kkh\",\"kki\",\"kkj\",\"kkk\",\"kkl\",\"kkm\",\"kkn\",\"kko\",\"kkp\",\"kkq\",\"kkr\",\"kks\",\"kkt\",\"kku\",\"kkv\",\"kkw\",\"kkx\",\"kky\",\"kkz\",\"kla\",\"klb\",\"klc\",\"kld\",\"kle\",\"klf\",\"klg\",\"klh\",\"kli\",\"klj\",\"klk\",\"kll\",\"klm\",\"kln\",\"klo\",\"klp\",\"klq\",\"klr\",\"kls\",\"klt\",\"klu\",\"klv\",\"klw\",\"klx\",\"kly\",\"klz\",\"kma\",\"kmb\",\"kmc\",\"kmd\",\"kme\",\"kmf\",\"kmg\",\"kmh\",\"kmi\",\"kmj\",\"kmk\",\"kml\",\"kmm\",\"kmn\",\"kmo\",\"kmp\",\"kmq\",\"kmr\",\"kms\",\"kmt\",\"kmu\",\"kmv\",\"kmw\",\"kmx\",\"kmy\",\"kmz\",\"kna\",\"knb\",\"knc\",\"knd\",\"kne\",\"knf\",\"kng\",\"kni\",\"knj\",\"knk\",\"knl\",\"knm\",\"knn\",\"kno\",\"knp\",\"knq\",\"knr\",\"kns\",\"knt\",\"knu\",\"knv\",\"knw\",\"knx\",\"kny\",\"knz\",\"koa\",\"koc\",\"kod\",\"koe\",\"kof\",\"kog\",\"koh\",\"koi\",\"koj\",\"kok\",\"kol\",\"koo\",\"kop\",\"koq\",\"kos\",\"kot\",\"kou\",\"kov\",\"kow\",\"kox\",\"koy\",\"koz\",\"kpa\",\"kpb\",\"kpc\",\"kpd\",\"kpe\",\"kpf\",\"kpg\",\"kph\",\"kpi\",\"kpj\",\"kpk\",\"kpl\",\"kpm\",\"kpn\",\"kpo\",\"kpp\",\"kpq\",\"kpr\",\"kps\",\"kpt\",\"kpu\",\"kpv\",\"kpw\",\"kpx\",\"kpy\",\"kpz\",\"kqa\",\"kqb\",\"kqc\",\"kqd\",\"kqe\",\"kqf\",\"kqg\",\"kqh\",\"kqi\",\"kqj\",\"kqk\",\"kql\",\"kqm\",\"kqn\",\"kqo\",\"kqp\",\"kqq\",\"kqr\",\"kqs\",\"kqt\",\"kqu\",\"kqv\",\"kqw\",\"kqx\",\"kqy\",\"kqz\",\"kra\",\"krb\",\"krc\",\"krd\",\"kre\",\"krf\",\"krh\",\"kri\",\"krj\",\"krk\",\"krl\",\"krm\",\"krn\",\"kro\",\"krp\",\"krr\",\"krs\",\"krt\",\"kru\",\"krv\",\"krw\",\"krx\",\"kry\",\"krz\",\"ksa\",\"ksb\",\"ksc\",\"ksd\",\"kse\",\"ksf\",\"ksg\",\"ksh\",\"ksi\",\"ksj\",\"ksk\",\"ksl\",\"ksm\",\"ksn\",\"kso\",\"ksp\",\"ksq\",\"ksr\",\"kss\",\"kst\",\"ksu\",\"ksv\",\"ksw\",\"ksx\",\"ksy\",\"ksz\",\"kta\",\"ktb\",\"ktc\",\"ktd\",\"kte\",\"ktf\",\"ktg\",\"kth\",\"kti\",\"ktj\",\"ktk\",\"ktl\",\"ktm\",\"ktn\",\"kto\",\"ktp\",\"ktq\",\"ktr\",\"kts\",\"ktt\",\"ktu\",\"ktv\",\"ktw\",\"ktx\",\"kty\",\"ktz\",\"kub\",\"kuc\",\"kud\",\"kue\",\"kuf\",\"kug\",\"kuh\",\"kui\",\"kuj\",\"kuk\",\"kul\",\"kum\",\"kun\",\"kuo\",\"kup\",\"kuq\",\"kus\",\"kut\",\"kuu\",\"kuv\",\"kuw\",\"kux\",\"kuy\",\"kuz\",\"kva\",\"kvb\",\"kvc\",\"kvd\",\"kve\",\"kvf\",\"kvg\",\"kvh\",\"kvi\",\"kvj\",\"kvk\",\"kvl\",\"kvm\",\"kvn\",\"kvo\",\"kvp\",\"kvq\",\"kvr\",\"kvs\",\"kvt\",\"kvu\",\"kvv\",\"kvw\",\"kvx\",\"kvy\",\"kvz\",\"kwa\",\"kwb\",\"kwc\",\"kwd\",\"kwe\",\"kwf\",\"kwg\",\"kwh\",\"kwi\",\"kwj\",\"kwk\",\"kwl\",\"kwm\",\"kwn\",\"kwo\",\"kwp\",\"kwq\",\"kwr\",\"kws\",\"kwt\",\"kwu\",\"kwv\",\"kww\",\"kwx\",\"kwy\",\"kwz\",\"kxa\",\"kxb\",\"kxc\",\"kxd\",\"kxe\",\"kxf\",\"kxh\",\"kxi\",\"kxj\",\"kxk\",\"kxl\",\"kxm\",\"kxn\",\"kxo\",\"kxp\",\"kxq\",\"kxr\",\"kxs\",\"kxt\",\"kxu\",\"kxv\",\"kxw\",\"kxx\",\"kxy\",\"kxz\",\"kya\",\"kyb\",\"kyc\",\"kyd\",\"kye\",\"kyf\",\"kyg\",\"kyh\",\"kyi\",\"kyj\",\"kyk\",\"kyl\",\"kym\",\"kyn\",\"kyo\",\"kyp\",\"kyq\",\"kyr\",\"kys\",\"kyt\",\"kyu\",\"kyv\",\"kyw\",\"kyx\",\"kyy\",\"kyz\",\"kza\",\"kzb\",\"kzc\",\"kzd\",\"kze\",\"kzf\",\"kzg\",\"kzh\",\"kzi\",\"kzj\",\"kzk\",\"kzl\",\"kzm\",\"kzn\",\"kzo\",\"kzp\",\"kzq\",\"kzr\",\"kzs\",\"kzt\",\"kzu\",\"kzv\",\"kzw\",\"kzx\",\"kzy\",\"kzz\",\"laa\",\"lab\",\"lac\",\"lad\",\"lae\",\"laf\",\"lag\",\"lah\",\"lai\",\"laj\",\"lak\",\"lal\",\"lam\",\"lan\",\"lap\",\"laq\",\"lar\",\"las\",\"lau\",\"law\",\"lax\",\"lay\",\"laz\",\"lba\",\"lbb\",\"lbc\",\"lbe\",\"lbf\",\"lbg\",\"lbi\",\"lbj\",\"lbk\",\"lbl\",\"lbm\",\"lbn\",\"lbo\",\"lbq\",\"lbr\",\"lbs\",\"lbt\",\"lbu\",\"lbv\",\"lbw\",\"lbx\",\"lby\",\"lbz\",\"lcc\",\"lcd\",\"lce\",\"lcf\",\"lch\",\"lcl\",\"lcm\",\"lcp\",\"lcq\",\"lcs\",\"lda\",\"ldb\",\"ldd\",\"ldg\",\"ldh\",\"ldi\",\"ldj\",\"ldk\",\"ldl\",\"ldm\",\"ldn\",\"ldo\",\"ldp\",\"ldq\",\"lea\",\"leb\",\"lec\",\"led\",\"lee\",\"lef\",\"leg\",\"leh\",\"lei\",\"lej\",\"lek\",\"lel\",\"lem\",\"len\",\"leo\",\"lep\",\"leq\",\"ler\",\"les\",\"let\",\"leu\",\"lev\",\"lew\",\"lex\",\"ley\",\"lez\",\"lfa\",\"lfn\",\"lga\",\"lgb\",\"lgg\",\"lgh\",\"lgi\",\"lgk\",\"lgl\",\"lgm\",\"lgn\",\"lgq\",\"lgr\",\"lgt\",\"lgu\",\"lgz\",\"lha\",\"lhh\",\"lhi\",\"lhl\",\"lhm\",\"lhn\",\"lhp\",\"lhs\",\"lht\",\"lhu\",\"lia\",\"lib\",\"lic\",\"lid\",\"lie\",\"lif\",\"lig\",\"lih\",\"lii\",\"lij\",\"lik\",\"lil\",\"lio\",\"lip\",\"liq\",\"lir\",\"lis\",\"liu\",\"liv\",\"liw\",\"lix\",\"liy\",\"liz\",\"lja\",\"lje\",\"lji\",\"ljl\",\"ljp\",\"ljw\",\"ljx\",\"lka\",\"lkb\",\"lkc\",\"lkd\",\"lke\",\"lkh\",\"lki\",\"lkj\",\"lkl\",\"lkm\",\"lkn\",\"lko\",\"lkr\",\"lks\",\"lkt\",\"lku\",\"lky\",\"lla\",\"llb\",\"llc\",\"lld\",\"lle\",\"llf\",\"llg\",\"llh\",\"lli\",\"llj\",\"llk\",\"lll\",\"llm\",\"lln\",\"llo\",\"llp\",\"llq\",\"lls\",\"llu\",\"llx\",\"lma\",\"lmb\",\"lmc\",\"lmd\",\"lme\",\"lmf\",\"lmg\",\"lmh\",\"lmi\",\"lmj\",\"lmk\",\"lml\",\"lmm\",\"lmn\",\"lmo\",\"lmp\",\"lmq\",\"lmr\",\"lmu\",\"lmv\",\"lmw\",\"lmx\",\"lmy\",\"lmz\",\"lna\",\"lnb\",\"lnd\",\"lng\",\"lnh\",\"lni\",\"lnj\",\"lnl\",\"lnm\",\"lnn\",\"lno\",\"lns\",\"lnu\",\"lnw\",\"lnz\",\"loa\",\"lob\",\"loc\",\"loe\",\"lof\",\"log\",\"loh\",\"loi\",\"loj\",\"lok\",\"lol\",\"lom\",\"lon\",\"loo\",\"lop\",\"loq\",\"lor\",\"los\",\"lot\",\"lou\",\"lov\",\"low\",\"lox\",\"loy\",\"loz\",\"lpa\",\"lpe\",\"lpn\",\"lpo\",\"lpx\",\"lra\",\"lrc\",\"lre\",\"lrg\",\"lri\",\"lrk\",\"lrl\",\"lrm\",\"lrn\",\"lro\",\"lrr\",\"lrt\",\"lrv\",\"lrz\",\"lsa\",\"lsd\",\"lse\",\"lsg\",\"lsh\",\"lsi\",\"lsl\",\"lsm\",\"lso\",\"lsp\",\"lsr\",\"lss\",\"lst\",\"lsy\",\"ltc\",\"ltg\",\"lth\",\"lti\",\"ltn\",\"lto\",\"lts\",\"ltu\",\"lua\",\"luc\",\"lud\",\"lue\",\"luf\",\"lui\",\"luj\",\"luk\",\"lul\",\"lum\",\"lun\",\"luo\",\"lup\",\"luq\",\"lur\",\"lus\",\"lut\",\"luu\",\"luv\",\"luw\",\"luy\",\"luz\",\"lva\",\"lvk\",\"lvs\",\"lvu\",\"lwa\",\"lwe\",\"lwg\",\"lwh\",\"lwl\",\"lwm\",\"lwo\",\"lws\",\"lwt\",\"lwu\",\"lww\",\"lya\",\"lyg\",\"lyn\",\"lzh\",\"lzl\",\"lzn\",\"lzz\",\"maa\",\"mab\",\"mad\",\"mae\",\"maf\",\"mag\",\"mai\",\"maj\",\"mak\",\"mam\",\"man\",\"map\",\"maq\",\"mas\",\"mat\",\"mau\",\"mav\",\"maw\",\"max\",\"maz\",\"mba\",\"mbb\",\"mbc\",\"mbd\",\"mbe\",\"mbf\",\"mbh\",\"mbi\",\"mbj\",\"mbk\",\"mbl\",\"mbm\",\"mbn\",\"mbo\",\"mbp\",\"mbq\",\"mbr\",\"mbs\",\"mbt\",\"mbu\",\"mbv\",\"mbw\",\"mbx\",\"mby\",\"mbz\",\"mca\",\"mcb\",\"mcc\",\"mcd\",\"mce\",\"mcf\",\"mcg\",\"mch\",\"mci\",\"mcj\",\"mck\",\"mcl\",\"mcm\",\"mcn\",\"mco\",\"mcp\",\"mcq\",\"mcr\",\"mcs\",\"mct\",\"mcu\",\"mcv\",\"mcw\",\"mcx\",\"mcy\",\"mcz\",\"mda\",\"mdb\",\"mdc\",\"mdd\",\"mde\",\"mdf\",\"mdg\",\"mdh\",\"mdi\",\"mdj\",\"mdk\",\"mdl\",\"mdm\",\"mdn\",\"mdp\",\"mdq\",\"mdr\",\"mds\",\"mdt\",\"mdu\",\"mdv\",\"mdw\",\"mdx\",\"mdy\",\"mdz\",\"mea\",\"meb\",\"mec\",\"med\",\"mee\",\"mef\",\"meg\",\"meh\",\"mei\",\"mej\",\"mek\",\"mel\",\"mem\",\"men\",\"meo\",\"mep\",\"meq\",\"mer\",\"mes\",\"met\",\"meu\",\"mev\",\"mew\",\"mey\",\"mez\",\"mfa\",\"mfb\",\"mfc\",\"mfd\",\"mfe\",\"mff\",\"mfg\",\"mfh\",\"mfi\",\"mfj\",\"mfk\",\"mfl\",\"mfm\",\"mfn\",\"mfo\",\"mfp\",\"mfq\",\"mfr\",\"mfs\",\"mft\",\"mfu\",\"mfv\",\"mfw\",\"mfx\",\"mfy\",\"mfz\",\"mga\",\"mgb\",\"mgc\",\"mgd\",\"mge\",\"mgf\",\"mgg\",\"mgh\",\"mgi\",\"mgj\",\"mgk\",\"mgl\",\"mgm\",\"mgn\",\"mgo\",\"mgp\",\"mgq\",\"mgr\",\"mgs\",\"mgt\",\"mgu\",\"mgv\",\"mgw\",\"mgx\",\"mgy\",\"mgz\",\"mha\",\"mhb\",\"mhc\",\"mhd\",\"mhe\",\"mhf\",\"mhg\",\"mhh\",\"mhi\",\"mhj\",\"mhk\",\"mhl\",\"mhm\",\"mhn\",\"mho\",\"mhp\",\"mhq\",\"mhr\",\"mhs\",\"mht\",\"mhu\",\"mhw\",\"mhx\",\"mhy\",\"mhz\",\"mia\",\"mib\",\"mic\",\"mid\",\"mie\",\"mif\",\"mig\",\"mih\",\"mii\",\"mij\",\"mik\",\"mil\",\"mim\",\"min\",\"mio\",\"mip\",\"miq\",\"mir\",\"mis\",\"mit\",\"miu\",\"miw\",\"mix\",\"miy\",\"miz\",\"mja\",\"mjb\",\"mjc\",\"mjd\",\"mje\",\"mjg\",\"mjh\",\"mji\",\"mjj\",\"mjk\",\"mjl\",\"mjm\",\"mjn\",\"mjo\",\"mjp\",\"mjq\",\"mjr\",\"mjs\",\"mjt\",\"mju\",\"mjv\",\"mjw\",\"mjx\",\"mjy\",\"mjz\",\"mka\",\"mkb\",\"mkc\",\"mke\",\"mkf\",\"mkg\",\"mkh\",\"mki\",\"mkj\",\"mkk\",\"mkl\",\"mkm\",\"mkn\",\"mko\",\"mkp\",\"mkq\",\"mkr\",\"mks\",\"mkt\",\"mku\",\"mkv\",\"mkw\",\"mkx\",\"mky\",\"mkz\",\"mla\",\"mlb\",\"mlc\",\"mld\",\"mle\",\"mlf\",\"mlh\",\"mli\",\"mlj\",\"mlk\",\"mll\",\"mlm\",\"mln\",\"mlo\",\"mlp\",\"mlq\",\"mlr\",\"mls\",\"mlu\",\"mlv\",\"mlw\",\"mlx\",\"mlz\",\"mma\",\"mmb\",\"mmc\",\"mmd\",\"mme\",\"mmf\",\"mmg\",\"mmh\",\"mmi\",\"mmj\",\"mmk\",\"mml\",\"mmm\",\"mmn\",\"mmo\",\"mmp\",\"mmq\",\"mmr\",\"mmt\",\"mmu\",\"mmv\",\"mmw\",\"mmx\",\"mmy\",\"mmz\",\"mna\",\"mnb\",\"mnc\",\"mnd\",\"mne\",\"mnf\",\"mng\",\"mnh\",\"mni\",\"mnj\",\"mnk\",\"mnl\",\"mnm\",\"mnn\",\"mno\",\"mnp\",\"mnq\",\"mnr\",\"mns\",\"mnt\",\"mnu\",\"mnv\",\"mnw\",\"mnx\",\"mny\",\"mnz\",\"moa\",\"moc\",\"mod\",\"moe\",\"mof\",\"mog\",\"moh\",\"moi\",\"moj\",\"mok\",\"mom\",\"moo\",\"mop\",\"moq\",\"mor\",\"mos\",\"mot\",\"mou\",\"mov\",\"mow\",\"mox\",\"moy\",\"moz\",\"mpa\",\"mpb\",\"mpc\",\"mpd\",\"mpe\",\"mpg\",\"mph\",\"mpi\",\"mpj\",\"mpk\",\"mpl\",\"mpm\",\"mpn\",\"mpo\",\"mpp\",\"mpq\",\"mpr\",\"mps\",\"mpt\",\"mpu\",\"mpv\",\"mpw\",\"mpx\",\"mpy\",\"mpz\",\"mqa\",\"mqb\",\"mqc\",\"mqe\",\"mqf\",\"mqg\",\"mqh\",\"mqi\",\"mqj\",\"mqk\",\"mql\",\"mqm\",\"mqn\",\"mqo\",\"mqp\",\"mqq\",\"mqr\",\"mqs\",\"mqt\",\"mqu\",\"mqv\",\"mqw\",\"mqx\",\"mqy\",\"mqz\",\"mra\",\"mrb\",\"mrc\",\"mrd\",\"mre\",\"mrf\",\"mrg\",\"mrh\",\"mrj\",\"mrk\",\"mrl\",\"mrm\",\"mrn\",\"mro\",\"mrp\",\"mrq\",\"mrr\",\"mrs\",\"mrt\",\"mru\",\"mrv\",\"mrw\",\"mrx\",\"mry\",\"mrz\",\"msb\",\"msc\",\"msd\",\"mse\",\"msf\",\"msg\",\"msh\",\"msi\",\"msj\",\"msk\",\"msl\",\"msm\",\"msn\",\"mso\",\"msp\",\"msq\",\"msr\",\"mss\",\"mst\",\"msu\",\"msv\",\"msw\",\"msx\",\"msy\",\"msz\",\"mta\",\"mtb\",\"mtc\",\"mtd\",\"mte\",\"mtf\",\"mtg\",\"mth\",\"mti\",\"mtj\",\"mtk\",\"mtl\",\"mtm\",\"mtn\",\"mto\",\"mtp\",\"mtq\",\"mtr\",\"mts\",\"mtt\",\"mtu\",\"mtv\",\"mtw\",\"mtx\",\"mty\",\"mua\",\"mub\",\"muc\",\"mud\",\"mue\",\"mug\",\"muh\",\"mui\",\"muj\",\"muk\",\"mul\",\"mum\",\"mun\",\"muo\",\"mup\",\"muq\",\"mur\",\"mus\",\"mut\",\"muu\",\"muv\",\"mux\",\"muy\",\"muz\",\"mva\",\"mvb\",\"mvd\",\"mve\",\"mvf\",\"mvg\",\"mvh\",\"mvi\",\"mvk\",\"mvl\",\"mvm\",\"mvn\",\"mvo\",\"mvp\",\"mvq\",\"mvr\",\"mvs\",\"mvt\",\"mvu\",\"mvv\",\"mvw\",\"mvx\",\"mvy\",\"mvz\",\"mwa\",\"mwb\",\"mwc\",\"mwd\",\"mwe\",\"mwf\",\"mwg\",\"mwh\",\"mwi\",\"mwj\",\"mwk\",\"mwl\",\"mwm\",\"mwn\",\"mwo\",\"mwp\",\"mwq\",\"mwr\",\"mws\",\"mwt\",\"mwu\",\"mwv\",\"mww\",\"mwx\",\"mwy\",\"mwz\",\"mxa\",\"mxb\",\"mxc\",\"mxd\",\"mxe\",\"mxf\",\"mxg\",\"mxh\",\"mxi\",\"mxj\",\"mxk\",\"mxl\",\"mxm\",\"mxn\",\"mxo\",\"mxp\",\"mxq\",\"mxr\",\"mxs\",\"mxt\",\"mxu\",\"mxv\",\"mxw\",\"mxx\",\"mxy\",\"mxz\",\"myb\",\"myc\",\"myd\",\"mye\",\"myf\",\"myg\",\"myh\",\"myi\",\"myj\",\"myk\",\"myl\",\"mym\",\"myn\",\"myo\",\"myp\",\"myq\",\"myr\",\"mys\",\"myt\",\"myu\",\"myv\",\"myw\",\"myx\",\"myy\",\"myz\",\"mza\",\"mzb\",\"mzc\",\"mzd\",\"mze\",\"mzg\",\"mzh\",\"mzi\",\"mzj\",\"mzk\",\"mzl\",\"mzm\",\"mzn\",\"mzo\",\"mzp\",\"mzq\",\"mzr\",\"mzs\",\"mzt\",\"mzu\",\"mzv\",\"mzw\",\"mzx\",\"mzy\",\"mzz\",\"naa\",\"nab\",\"nac\",\"nad\",\"nae\",\"naf\",\"nag\",\"nah\",\"nai\",\"naj\",\"nak\",\"nal\",\"nam\",\"nan\",\"nao\",\"nap\",\"naq\",\"nar\",\"nas\",\"nat\",\"naw\",\"nax\",\"nay\",\"naz\",\"nba\",\"nbb\",\"nbc\",\"nbd\",\"nbe\",\"nbf\",\"nbg\",\"nbh\",\"nbi\",\"nbj\",\"nbk\",\"nbm\",\"nbn\",\"nbo\",\"nbp\",\"nbq\",\"nbr\",\"nbs\",\"nbt\",\"nbu\",\"nbv\",\"nbw\",\"nbx\",\"nby\",\"nca\",\"ncb\",\"ncc\",\"ncd\",\"nce\",\"ncf\",\"ncg\",\"nch\",\"nci\",\"ncj\",\"nck\",\"ncl\",\"ncm\",\"ncn\",\"nco\",\"ncp\",\"ncq\",\"ncr\",\"ncs\",\"nct\",\"ncu\",\"ncx\",\"ncz\",\"nda\",\"ndb\",\"ndc\",\"ndd\",\"ndf\",\"ndg\",\"ndh\",\"ndi\",\"ndj\",\"ndk\",\"ndl\",\"ndm\",\"ndn\",\"ndp\",\"ndq\",\"ndr\",\"nds\",\"ndt\",\"ndu\",\"ndv\",\"ndw\",\"ndx\",\"ndy\",\"ndz\",\"nea\",\"neb\",\"nec\",\"ned\",\"nee\",\"nef\",\"neg\",\"neh\",\"nei\",\"nej\",\"nek\",\"nem\",\"nen\",\"neo\",\"neq\",\"ner\",\"nes\",\"net\",\"neu\",\"nev\",\"new\",\"nex\",\"ney\",\"nez\",\"nfa\",\"nfd\",\"nfl\",\"nfr\",\"nfu\",\"nga\",\"ngb\",\"ngc\",\"ngd\",\"nge\",\"ngf\",\"ngg\",\"ngh\",\"ngi\",\"ngj\",\"ngk\",\"ngl\",\"ngm\",\"ngn\",\"ngo\",\"ngp\",\"ngq\",\"ngr\",\"ngs\",\"ngt\",\"ngu\",\"ngv\",\"ngw\",\"ngx\",\"ngy\",\"ngz\",\"nha\",\"nhb\",\"nhc\",\"nhd\",\"nhe\",\"nhf\",\"nhg\",\"nhh\",\"nhi\",\"nhk\",\"nhm\",\"nhn\",\"nho\",\"nhp\",\"nhq\",\"nhr\",\"nht\",\"nhu\",\"nhv\",\"nhw\",\"nhx\",\"nhy\",\"nhz\",\"nia\",\"nib\",\"nic\",\"nid\",\"nie\",\"nif\",\"nig\",\"nih\",\"nii\",\"nij\",\"nik\",\"nil\",\"nim\",\"nin\",\"nio\",\"niq\",\"nir\",\"nis\",\"nit\",\"niu\",\"niv\",\"niw\",\"nix\",\"niy\",\"niz\",\"nja\",\"njb\",\"njd\",\"njh\",\"nji\",\"njj\",\"njl\",\"njm\",\"njn\",\"njo\",\"njr\",\"njs\",\"njt\",\"nju\",\"njx\",\"njy\",\"njz\",\"nka\",\"nkb\",\"nkc\",\"nkd\",\"nke\",\"nkf\",\"nkg\",\"nkh\",\"nki\",\"nkj\",\"nkk\",\"nkm\",\"nkn\",\"nko\",\"nkp\",\"nkq\",\"nkr\",\"nks\",\"nkt\",\"nku\",\"nkv\",\"nkw\",\"nkx\",\"nkz\",\"nla\",\"nlc\",\"nle\",\"nlg\",\"nli\",\"nlj\",\"nlk\",\"nll\",\"nlm\",\"nln\",\"nlo\",\"nlq\",\"nlr\",\"nlu\",\"nlv\",\"nlw\",\"nlx\",\"nly\",\"nlz\",\"nma\",\"nmb\",\"nmc\",\"nmd\",\"nme\",\"nmf\",\"nmg\",\"nmh\",\"nmi\",\"nmj\",\"nmk\",\"nml\",\"nmm\",\"nmn\",\"nmo\",\"nmp\",\"nmq\",\"nmr\",\"nms\",\"nmt\",\"nmu\",\"nmv\",\"nmw\",\"nmx\",\"nmy\",\"nmz\",\"nna\",\"nnb\",\"nnc\",\"nnd\",\"nne\",\"nnf\",\"nng\",\"nnh\",\"nni\",\"nnj\",\"nnk\",\"nnl\",\"nnm\",\"nnn\",\"nnp\",\"nnq\",\"nnr\",\"nns\",\"nnt\",\"nnu\",\"nnv\",\"nnw\",\"nnx\",\"nny\",\"nnz\",\"noa\",\"noc\",\"nod\",\"noe\",\"nof\",\"nog\",\"noh\",\"noi\",\"noj\",\"nok\",\"nol\",\"nom\",\"non\",\"noo\",\"nop\",\"noq\",\"nos\",\"not\",\"nou\",\"nov\",\"now\",\"noy\",\"noz\",\"npa\",\"npb\",\"npg\",\"nph\",\"npi\",\"npl\",\"npn\",\"npo\",\"nps\",\"npu\",\"npx\",\"npy\",\"nqg\",\"nqk\",\"nql\",\"nqm\",\"nqn\",\"nqo\",\"nqq\",\"nqy\",\"nra\",\"nrb\",\"nrc\",\"nre\",\"nrf\",\"nrg\",\"nri\",\"nrk\",\"nrl\",\"nrm\",\"nrn\",\"nrp\",\"nrr\",\"nrt\",\"nru\",\"nrx\",\"nrz\",\"nsa\",\"nsc\",\"nsd\",\"nse\",\"nsf\",\"nsg\",\"nsh\",\"nsi\",\"nsk\",\"nsl\",\"nsm\",\"nsn\",\"nso\",\"nsp\",\"nsq\",\"nsr\",\"nss\",\"nst\",\"nsu\",\"nsv\",\"nsw\",\"nsx\",\"nsy\",\"nsz\",\"ntd\",\"nte\",\"ntg\",\"nti\",\"ntj\",\"ntk\",\"ntm\",\"nto\",\"ntp\",\"ntr\",\"nts\",\"ntu\",\"ntw\",\"ntx\",\"nty\",\"ntz\",\"nua\",\"nub\",\"nuc\",\"nud\",\"nue\",\"nuf\",\"nug\",\"nuh\",\"nui\",\"nuj\",\"nuk\",\"nul\",\"num\",\"nun\",\"nuo\",\"nup\",\"nuq\",\"nur\",\"nus\",\"nut\",\"nuu\",\"nuv\",\"nuw\",\"nux\",\"nuy\",\"nuz\",\"nvh\",\"nvm\",\"nvo\",\"nwa\",\"nwb\",\"nwc\",\"nwe\",\"nwg\",\"nwi\",\"nwm\",\"nwo\",\"nwr\",\"nwx\",\"nwy\",\"nxa\",\"nxd\",\"nxe\",\"nxg\",\"nxi\",\"nxk\",\"nxl\",\"nxm\",\"nxn\",\"nxo\",\"nxq\",\"nxr\",\"nxu\",\"nxx\",\"nyb\",\"nyc\",\"nyd\",\"nye\",\"nyf\",\"nyg\",\"nyh\",\"nyi\",\"nyj\",\"nyk\",\"nyl\",\"nym\",\"nyn\",\"nyo\",\"nyp\",\"nyq\",\"nyr\",\"nys\",\"nyt\",\"nyu\",\"nyv\",\"nyw\",\"nyx\",\"nyy\",\"nza\",\"nzb\",\"nzd\",\"nzi\",\"nzk\",\"nzm\",\"nzs\",\"nzu\",\"nzy\",\"nzz\",\"oaa\",\"oac\",\"oar\",\"oav\",\"obi\",\"obk\",\"obl\",\"obm\",\"obo\",\"obr\",\"obt\",\"obu\",\"oca\",\"och\",\"oco\",\"ocu\",\"oda\",\"odk\",\"odt\",\"odu\",\"ofo\",\"ofs\",\"ofu\",\"ogb\",\"ogc\",\"oge\",\"ogg\",\"ogo\",\"ogu\",\"oht\",\"ohu\",\"oia\",\"oin\",\"ojb\",\"ojc\",\"ojg\",\"ojp\",\"ojs\",\"ojv\",\"ojw\",\"oka\",\"okb\",\"okd\",\"oke\",\"okg\",\"okh\",\"oki\",\"okj\",\"okk\",\"okl\",\"okm\",\"okn\",\"oko\",\"okr\",\"oks\",\"oku\",\"okv\",\"okx\",\"ola\",\"old\",\"ole\",\"olk\",\"olm\",\"olo\",\"olr\",\"olt\",\"olu\",\"oma\",\"omb\",\"omc\",\"ome\",\"omg\",\"omi\",\"omk\",\"oml\",\"omn\",\"omo\",\"omp\",\"omq\",\"omr\",\"omt\",\"omu\",\"omv\",\"omw\",\"omx\",\"ona\",\"onb\",\"one\",\"ong\",\"oni\",\"onj\",\"onk\",\"onn\",\"ono\",\"onp\",\"onr\",\"ons\",\"ont\",\"onu\",\"onw\",\"onx\",\"ood\",\"oog\",\"oon\",\"oor\",\"oos\",\"opa\",\"opk\",\"opm\",\"opo\",\"opt\",\"opy\",\"ora\",\"orc\",\"ore\",\"org\",\"orh\",\"orn\",\"oro\",\"orr\",\"ors\",\"ort\",\"oru\",\"orv\",\"orw\",\"orx\",\"ory\",\"orz\",\"osa\",\"osc\",\"osi\",\"oso\",\"osp\",\"ost\",\"osu\",\"osx\",\"ota\",\"otb\",\"otd\",\"ote\",\"oti\",\"otk\",\"otl\",\"otm\",\"otn\",\"oto\",\"otq\",\"otr\",\"ots\",\"ott\",\"otu\",\"otw\",\"otx\",\"oty\",\"otz\",\"oua\",\"oub\",\"oue\",\"oui\",\"oum\",\"oun\",\"ovd\",\"owi\",\"owl\",\"oyb\",\"oyd\",\"oym\",\"oyy\",\"ozm\",\"paa\",\"pab\",\"pac\",\"pad\",\"pae\",\"paf\",\"pag\",\"pah\",\"pai\",\"pak\",\"pal\",\"pam\",\"pao\",\"pap\",\"paq\",\"par\",\"pas\",\"pat\",\"pau\",\"pav\",\"paw\",\"pax\",\"pay\",\"paz\",\"pbb\",\"pbc\",\"pbe\",\"pbf\",\"pbg\",\"pbh\",\"pbi\",\"pbl\",\"pbm\",\"pbn\",\"pbo\",\"pbp\",\"pbr\",\"pbs\",\"pbt\",\"pbu\",\"pbv\",\"pby\",\"pbz\",\"pca\",\"pcb\",\"pcc\",\"pcd\",\"pce\",\"pcf\",\"pcg\",\"pch\",\"pci\",\"pcj\",\"pck\",\"pcl\",\"pcm\",\"pcn\",\"pcp\",\"pcr\",\"pcw\",\"pda\",\"pdc\",\"pdi\",\"pdn\",\"pdo\",\"pdt\",\"pdu\",\"pea\",\"peb\",\"ped\",\"pee\",\"pef\",\"peg\",\"peh\",\"pei\",\"pej\",\"pek\",\"pel\",\"pem\",\"peo\",\"pep\",\"peq\",\"pes\",\"pev\",\"pex\",\"pey\",\"pez\",\"pfa\",\"pfe\",\"pfl\",\"pga\",\"pgd\",\"pgg\",\"pgi\",\"pgk\",\"pgl\",\"pgn\",\"pgs\",\"pgu\",\"pgy\",\"pgz\",\"pha\",\"phd\",\"phg\",\"phh\",\"phi\",\"phk\",\"phl\",\"phm\",\"phn\",\"pho\",\"phq\",\"phr\",\"pht\",\"phu\",\"phv\",\"phw\",\"pia\",\"pib\",\"pic\",\"pid\",\"pie\",\"pif\",\"pig\",\"pih\",\"pii\",\"pij\",\"pil\",\"pim\",\"pin\",\"pio\",\"pip\",\"pir\",\"pis\",\"pit\",\"piu\",\"piv\",\"piw\",\"pix\",\"piy\",\"piz\",\"pjt\",\"pka\",\"pkb\",\"pkc\",\"pkg\",\"pkh\",\"pkn\",\"pko\",\"pkp\",\"pkr\",\"pks\",\"pkt\",\"pku\",\"pla\",\"plb\",\"plc\",\"pld\",\"ple\",\"plf\",\"plg\",\"plh\",\"plj\",\"plk\",\"pll\",\"pln\",\"plo\",\"plp\",\"plq\",\"plr\",\"pls\",\"plt\",\"plu\",\"plv\",\"plw\",\"ply\",\"plz\",\"pma\",\"pmb\",\"pmc\",\"pmd\",\"pme\",\"pmf\",\"pmh\",\"pmi\",\"pmj\",\"pmk\",\"pml\",\"pmm\",\"pmn\",\"pmo\",\"pmq\",\"pmr\",\"pms\",\"pmt\",\"pmu\",\"pmw\",\"pmx\",\"pmy\",\"pmz\",\"pna\",\"pnb\",\"pnc\",\"pne\",\"png\",\"pnh\",\"pni\",\"pnj\",\"pnk\",\"pnl\",\"pnm\",\"pnn\",\"pno\",\"pnp\",\"pnq\",\"pnr\",\"pns\",\"pnt\",\"pnu\",\"pnv\",\"pnw\",\"pnx\",\"pny\",\"pnz\",\"poc\",\"pod\",\"poe\",\"pof\",\"pog\",\"poh\",\"poi\",\"pok\",\"pom\",\"pon\",\"poo\",\"pop\",\"poq\",\"pos\",\"pot\",\"pov\",\"pow\",\"pox\",\"poy\",\"poz\",\"ppa\",\"ppe\",\"ppi\",\"ppk\",\"ppl\",\"ppm\",\"ppn\",\"ppo\",\"ppp\",\"ppq\",\"ppr\",\"pps\",\"ppt\",\"ppu\",\"pqa\",\"pqe\",\"pqm\",\"pqw\",\"pra\",\"prb\",\"prc\",\"prd\",\"pre\",\"prf\",\"prg\",\"prh\",\"pri\",\"prk\",\"prl\",\"prm\",\"prn\",\"pro\",\"prp\",\"prq\",\"prr\",\"prs\",\"prt\",\"pru\",\"prw\",\"prx\",\"pry\",\"prz\",\"psa\",\"psc\",\"psd\",\"pse\",\"psg\",\"psh\",\"psi\",\"psl\",\"psm\",\"psn\",\"pso\",\"psp\",\"psq\",\"psr\",\"pss\",\"pst\",\"psu\",\"psw\",\"psy\",\"pta\",\"pth\",\"pti\",\"ptn\",\"pto\",\"ptp\",\"ptq\",\"ptr\",\"ptt\",\"ptu\",\"ptv\",\"ptw\",\"pty\",\"pua\",\"pub\",\"puc\",\"pud\",\"pue\",\"puf\",\"pug\",\"pui\",\"puj\",\"puk\",\"pum\",\"puo\",\"pup\",\"puq\",\"pur\",\"put\",\"puu\",\"puw\",\"pux\",\"puy\",\"puz\",\"pwa\",\"pwb\",\"pwg\",\"pwi\",\"pwm\",\"pwn\",\"pwo\",\"pwr\",\"pww\",\"pxm\",\"pye\",\"pym\",\"pyn\",\"pys\",\"pyu\",\"pyx\",\"pyy\",\"pzn\",\"qaa..qtz\",\"qua\",\"qub\",\"quc\",\"qud\",\"quf\",\"qug\",\"quh\",\"qui\",\"quk\",\"qul\",\"qum\",\"qun\",\"qup\",\"quq\",\"qur\",\"qus\",\"quv\",\"quw\",\"qux\",\"quy\",\"quz\",\"qva\",\"qvc\",\"qve\",\"qvh\",\"qvi\",\"qvj\",\"qvl\",\"qvm\",\"qvn\",\"qvo\",\"qvp\",\"qvs\",\"qvw\",\"qvy\",\"qvz\",\"qwa\",\"qwc\",\"qwe\",\"qwh\",\"qwm\",\"qws\",\"qwt\",\"qxa\",\"qxc\",\"qxh\",\"qxl\",\"qxn\",\"qxo\",\"qxp\",\"qxq\",\"qxr\",\"qxs\",\"qxt\",\"qxu\",\"qxw\",\"qya\",\"qyp\",\"raa\",\"rab\",\"rac\",\"rad\",\"raf\",\"rag\",\"rah\",\"rai\",\"raj\",\"rak\",\"ral\",\"ram\",\"ran\",\"rao\",\"rap\",\"raq\",\"rar\",\"ras\",\"rat\",\"rau\",\"rav\",\"raw\",\"rax\",\"ray\",\"raz\",\"rbb\",\"rbk\",\"rbl\",\"rbp\",\"rcf\",\"rdb\",\"rea\",\"reb\",\"ree\",\"reg\",\"rei\",\"rej\",\"rel\",\"rem\",\"ren\",\"rer\",\"res\",\"ret\",\"rey\",\"rga\",\"rge\",\"rgk\",\"rgn\",\"rgr\",\"rgs\",\"rgu\",\"rhg\",\"rhp\",\"ria\",\"rie\",\"rif\",\"ril\",\"rim\",\"rin\",\"rir\",\"rit\",\"riu\",\"rjg\",\"rji\",\"rjs\",\"rka\",\"rkb\",\"rkh\",\"rki\",\"rkm\",\"rkt\",\"rkw\",\"rma\",\"rmb\",\"rmc\",\"rmd\",\"rme\",\"rmf\",\"rmg\",\"rmh\",\"rmi\",\"rmk\",\"rml\",\"rmm\",\"rmn\",\"rmo\",\"rmp\",\"rmq\",\"rmr\",\"rms\",\"rmt\",\"rmu\",\"rmv\",\"rmw\",\"rmx\",\"rmy\",\"rmz\",\"rna\",\"rnd\",\"rng\",\"rnl\",\"rnn\",\"rnp\",\"rnr\",\"rnw\",\"roa\",\"rob\",\"roc\",\"rod\",\"roe\",\"rof\",\"rog\",\"rol\",\"rom\",\"roo\",\"rop\",\"ror\",\"rou\",\"row\",\"rpn\",\"rpt\",\"rri\",\"rro\",\"rrt\",\"rsb\",\"rsi\",\"rsl\",\"rsm\",\"rtc\",\"rth\",\"rtm\",\"rts\",\"rtw\",\"rub\",\"ruc\",\"rue\",\"ruf\",\"rug\",\"ruh\",\"rui\",\"ruk\",\"ruo\",\"rup\",\"ruq\",\"rut\",\"ruu\",\"ruy\",\"ruz\",\"rwa\",\"rwk\",\"rwm\",\"rwo\",\"rwr\",\"rxd\",\"rxw\",\"ryn\",\"rys\",\"ryu\",\"rzh\",\"saa\",\"sab\",\"sac\",\"sad\",\"sae\",\"saf\",\"sah\",\"sai\",\"saj\",\"sak\",\"sal\",\"sam\",\"sao\",\"sap\",\"saq\",\"sar\",\"sas\",\"sat\",\"sau\",\"sav\",\"saw\",\"sax\",\"say\",\"saz\",\"sba\",\"sbb\",\"sbc\",\"sbd\",\"sbe\",\"sbf\",\"sbg\",\"sbh\",\"sbi\",\"sbj\",\"sbk\",\"sbl\",\"sbm\",\"sbn\",\"sbo\",\"sbp\",\"sbq\",\"sbr\",\"sbs\",\"sbt\",\"sbu\",\"sbv\",\"sbw\",\"sbx\",\"sby\",\"sbz\",\"sca\",\"scb\",\"sce\",\"scf\",\"scg\",\"sch\",\"sci\",\"sck\",\"scl\",\"scn\",\"sco\",\"scp\",\"scq\",\"scs\",\"sct\",\"scu\",\"scv\",\"scw\",\"scx\",\"sda\",\"sdb\",\"sdc\",\"sde\",\"sdf\",\"sdg\",\"sdh\",\"sdj\",\"sdk\",\"sdl\",\"sdm\",\"sdn\",\"sdo\",\"sdp\",\"sdr\",\"sds\",\"sdt\",\"sdu\",\"sdv\",\"sdx\",\"sdz\",\"sea\",\"seb\",\"sec\",\"sed\",\"see\",\"sef\",\"seg\",\"seh\",\"sei\",\"sej\",\"sek\",\"sel\",\"sem\",\"sen\",\"seo\",\"sep\",\"seq\",\"ser\",\"ses\",\"set\",\"seu\",\"sev\",\"sew\",\"sey\",\"sez\",\"sfb\",\"sfe\",\"sfm\",\"sfs\",\"sfw\",\"sga\",\"sgb\",\"sgc\",\"sgd\",\"sge\",\"sgg\",\"sgh\",\"sgi\",\"sgj\",\"sgk\",\"sgl\",\"sgm\",\"sgn\",\"sgo\",\"sgp\",\"sgr\",\"sgs\",\"sgt\",\"sgu\",\"sgw\",\"sgx\",\"sgy\",\"sgz\",\"sha\",\"shb\",\"shc\",\"shd\",\"she\",\"shg\",\"shh\",\"shi\",\"shj\",\"shk\",\"shl\",\"shm\",\"shn\",\"sho\",\"shp\",\"shq\",\"shr\",\"shs\",\"sht\",\"shu\",\"shv\",\"shw\",\"shx\",\"shy\",\"shz\",\"sia\",\"sib\",\"sid\",\"sie\",\"sif\",\"sig\",\"sih\",\"sii\",\"sij\",\"sik\",\"sil\",\"sim\",\"sio\",\"sip\",\"siq\",\"sir\",\"sis\",\"sit\",\"siu\",\"siv\",\"siw\",\"six\",\"siy\",\"siz\",\"sja\",\"sjb\",\"sjd\",\"sje\",\"sjg\",\"sjk\",\"sjl\",\"sjm\",\"sjn\",\"sjo\",\"sjp\",\"sjr\",\"sjs\",\"sjt\",\"sju\",\"sjw\",\"ska\",\"skb\",\"skc\",\"skd\",\"ske\",\"skf\",\"skg\",\"skh\",\"ski\",\"skj\",\"skk\",\"skm\",\"skn\",\"sko\",\"skp\",\"skq\",\"skr\",\"sks\",\"skt\",\"sku\",\"skv\",\"skw\",\"skx\",\"sky\",\"skz\",\"sla\",\"slc\",\"sld\",\"sle\",\"slf\",\"slg\",\"slh\",\"sli\",\"slj\",\"sll\",\"slm\",\"sln\",\"slp\",\"slq\",\"slr\",\"sls\",\"slt\",\"slu\",\"slw\",\"slx\",\"sly\",\"slz\",\"sma\",\"smb\",\"smc\",\"smd\",\"smf\",\"smg\",\"smh\",\"smi\",\"smj\",\"smk\",\"sml\",\"smm\",\"smn\",\"smp\",\"smq\",\"smr\",\"sms\",\"smt\",\"smu\",\"smv\",\"smw\",\"smx\",\"smy\",\"smz\",\"snb\",\"snc\",\"sne\",\"snf\",\"sng\",\"snh\",\"sni\",\"snj\",\"snk\",\"snl\",\"snm\",\"snn\",\"sno\",\"snp\",\"snq\",\"snr\",\"sns\",\"snu\",\"snv\",\"snw\",\"snx\",\"sny\",\"snz\",\"soa\",\"sob\",\"soc\",\"sod\",\"soe\",\"sog\",\"soh\",\"soi\",\"soj\",\"sok\",\"sol\",\"son\",\"soo\",\"sop\",\"soq\",\"sor\",\"sos\",\"sou\",\"sov\",\"sow\",\"sox\",\"soy\",\"soz\",\"spb\",\"spc\",\"spd\",\"spe\",\"spg\",\"spi\",\"spk\",\"spl\",\"spm\",\"spn\",\"spo\",\"spp\",\"spq\",\"spr\",\"sps\",\"spt\",\"spu\",\"spv\",\"spx\",\"spy\",\"sqa\",\"sqh\",\"sqj\",\"sqk\",\"sqm\",\"sqn\",\"sqo\",\"sqq\",\"sqr\",\"sqs\",\"sqt\",\"squ\",\"sra\",\"srb\",\"src\",\"sre\",\"srf\",\"srg\",\"srh\",\"sri\",\"srk\",\"srl\",\"srm\",\"srn\",\"sro\",\"srq\",\"srr\",\"srs\",\"srt\",\"sru\",\"srv\",\"srw\",\"srx\",\"sry\",\"srz\",\"ssa\",\"ssb\",\"ssc\",\"ssd\",\"sse\",\"ssf\",\"ssg\",\"ssh\",\"ssi\",\"ssj\",\"ssk\",\"ssl\",\"ssm\",\"ssn\",\"sso\",\"ssp\",\"ssq\",\"ssr\",\"sss\",\"sst\",\"ssu\",\"ssv\",\"ssx\",\"ssy\",\"ssz\",\"sta\",\"stb\",\"std\",\"ste\",\"stf\",\"stg\",\"sth\",\"sti\",\"stj\",\"stk\",\"stl\",\"stm\",\"stn\",\"sto\",\"stp\",\"stq\",\"str\",\"sts\",\"stt\",\"stu\",\"stv\",\"stw\",\"sty\",\"sua\",\"sub\",\"suc\",\"sue\",\"sug\",\"sui\",\"suj\",\"suk\",\"sul\",\"sum\",\"suq\",\"sur\",\"sus\",\"sut\",\"suv\",\"suw\",\"sux\",\"suy\",\"suz\",\"sva\",\"svb\",\"svc\",\"sve\",\"svk\",\"svm\",\"svr\",\"svs\",\"svx\",\"swb\",\"swc\",\"swf\",\"swg\",\"swh\",\"swi\",\"swj\",\"swk\",\"swl\",\"swm\",\"swn\",\"swo\",\"swp\",\"swq\",\"swr\",\"sws\",\"swt\",\"swu\",\"swv\",\"sww\",\"swx\",\"swy\",\"sxb\",\"sxc\",\"sxe\",\"sxg\",\"sxk\",\"sxl\",\"sxm\",\"sxn\",\"sxo\",\"sxr\",\"sxs\",\"sxu\",\"sxw\",\"sya\",\"syb\",\"syc\",\"syd\",\"syi\",\"syk\",\"syl\",\"sym\",\"syn\",\"syo\",\"syr\",\"sys\",\"syw\",\"syx\",\"syy\",\"sza\",\"szb\",\"szc\",\"szd\",\"sze\",\"szg\",\"szl\",\"szn\",\"szp\",\"szs\",\"szv\",\"szw\",\"taa\",\"tab\",\"tac\",\"tad\",\"tae\",\"taf\",\"tag\",\"tai\",\"taj\",\"tak\",\"tal\",\"tan\",\"tao\",\"tap\",\"taq\",\"tar\",\"tas\",\"tau\",\"tav\",\"taw\",\"tax\",\"tay\",\"taz\",\"tba\",\"tbb\",\"tbc\",\"tbd\",\"tbe\",\"tbf\",\"tbg\",\"tbh\",\"tbi\",\"tbj\",\"tbk\",\"tbl\",\"tbm\",\"tbn\",\"tbo\",\"tbp\",\"tbq\",\"tbr\",\"tbs\",\"tbt\",\"tbu\",\"tbv\",\"tbw\",\"tbx\",\"tby\",\"tbz\",\"tca\",\"tcb\",\"tcc\",\"tcd\",\"tce\",\"tcf\",\"tcg\",\"tch\",\"tci\",\"tck\",\"tcl\",\"tcm\",\"tcn\",\"tco\",\"tcp\",\"tcq\",\"tcs\",\"tct\",\"tcu\",\"tcw\",\"tcx\",\"tcy\",\"tcz\",\"tda\",\"tdb\",\"tdc\",\"tdd\",\"tde\",\"tdf\",\"tdg\",\"tdh\",\"tdi\",\"tdj\",\"tdk\",\"tdl\",\"tdm\",\"tdn\",\"tdo\",\"tdq\",\"tdr\",\"tds\",\"tdt\",\"tdu\",\"tdv\",\"tdx\",\"tdy\",\"tea\",\"teb\",\"tec\",\"ted\",\"tee\",\"tef\",\"teg\",\"teh\",\"tei\",\"tek\",\"tem\",\"ten\",\"teo\",\"tep\",\"teq\",\"ter\",\"tes\",\"tet\",\"teu\",\"tev\",\"tew\",\"tex\",\"tey\",\"tez\",\"tfi\",\"tfn\",\"tfo\",\"tfr\",\"tft\",\"tga\",\"tgb\",\"tgc\",\"tgd\",\"tge\",\"tgf\",\"tgg\",\"tgh\",\"tgi\",\"tgj\",\"tgn\",\"tgo\",\"tgp\",\"tgq\",\"tgr\",\"tgs\",\"tgt\",\"tgu\",\"tgv\",\"tgw\",\"tgx\",\"tgy\",\"tgz\",\"thc\",\"thd\",\"the\",\"thf\",\"thh\",\"thi\",\"thk\",\"thl\",\"thm\",\"thn\",\"thp\",\"thq\",\"thr\",\"ths\",\"tht\",\"thu\",\"thv\",\"thw\",\"thx\",\"thy\",\"thz\",\"tia\",\"tic\",\"tid\",\"tie\",\"tif\",\"tig\",\"tih\",\"tii\",\"tij\",\"tik\",\"til\",\"tim\",\"tin\",\"tio\",\"tip\",\"tiq\",\"tis\",\"tit\",\"tiu\",\"tiv\",\"tiw\",\"tix\",\"tiy\",\"tiz\",\"tja\",\"tjg\",\"tji\",\"tjl\",\"tjm\",\"tjn\",\"tjo\",\"tjs\",\"tju\",\"tjw\",\"tka\",\"tkb\",\"tkd\",\"tke\",\"tkf\",\"tkg\",\"tkk\",\"tkl\",\"tkm\",\"tkn\",\"tkp\",\"tkq\",\"tkr\",\"tks\",\"tkt\",\"tku\",\"tkv\",\"tkw\",\"tkx\",\"tkz\",\"tla\",\"tlb\",\"tlc\",\"tld\",\"tlf\",\"tlg\",\"tlh\",\"tli\",\"tlj\",\"tlk\",\"tll\",\"tlm\",\"tln\",\"tlo\",\"tlp\",\"tlq\",\"tlr\",\"tls\",\"tlt\",\"tlu\",\"tlv\",\"tlw\",\"tlx\",\"tly\",\"tma\",\"tmb\",\"tmc\",\"tmd\",\"tme\",\"tmf\",\"tmg\",\"tmh\",\"tmi\",\"tmj\",\"tmk\",\"tml\",\"tmm\",\"tmn\",\"tmo\",\"tmp\",\"tmq\",\"tmr\",\"tms\",\"tmt\",\"tmu\",\"tmv\",\"tmw\",\"tmy\",\"tmz\",\"tna\",\"tnb\",\"tnc\",\"tnd\",\"tne\",\"tnf\",\"tng\",\"tnh\",\"tni\",\"tnk\",\"tnl\",\"tnm\",\"tnn\",\"tno\",\"tnp\",\"tnq\",\"tnr\",\"tns\",\"tnt\",\"tnu\",\"tnv\",\"tnw\",\"tnx\",\"tny\",\"tnz\",\"tob\",\"toc\",\"tod\",\"toe\",\"tof\",\"tog\",\"toh\",\"toi\",\"toj\",\"tol\",\"tom\",\"too\",\"top\",\"toq\",\"tor\",\"tos\",\"tou\",\"tov\",\"tow\",\"tox\",\"toy\",\"toz\",\"tpa\",\"tpc\",\"tpe\",\"tpf\",\"tpg\",\"tpi\",\"tpj\",\"tpk\",\"tpl\",\"tpm\",\"tpn\",\"tpo\",\"tpp\",\"tpq\",\"tpr\",\"tpt\",\"tpu\",\"tpv\",\"tpw\",\"tpx\",\"tpy\",\"tpz\",\"tqb\",\"tql\",\"tqm\",\"tqn\",\"tqo\",\"tqp\",\"tqq\",\"tqr\",\"tqt\",\"tqu\",\"tqw\",\"tra\",\"trb\",\"trc\",\"trd\",\"tre\",\"trf\",\"trg\",\"trh\",\"tri\",\"trj\",\"trk\",\"trl\",\"trm\",\"trn\",\"tro\",\"trp\",\"trq\",\"trr\",\"trs\",\"trt\",\"tru\",\"trv\",\"trw\",\"trx\",\"try\",\"trz\",\"tsa\",\"tsb\",\"tsc\",\"tsd\",\"tse\",\"tsf\",\"tsg\",\"tsh\",\"tsi\",\"tsj\",\"tsk\",\"tsl\",\"tsm\",\"tsp\",\"tsq\",\"tsr\",\"tss\",\"tst\",\"tsu\",\"tsv\",\"tsw\",\"tsx\",\"tsy\",\"tsz\",\"tta\",\"ttb\",\"ttc\",\"ttd\",\"tte\",\"ttf\",\"ttg\",\"tth\",\"tti\",\"ttj\",\"ttk\",\"ttl\",\"ttm\",\"ttn\",\"tto\",\"ttp\",\"ttq\",\"ttr\",\"tts\",\"ttt\",\"ttu\",\"ttv\",\"ttw\",\"tty\",\"ttz\",\"tua\",\"tub\",\"tuc\",\"tud\",\"tue\",\"tuf\",\"tug\",\"tuh\",\"tui\",\"tuj\",\"tul\",\"tum\",\"tun\",\"tuo\",\"tup\",\"tuq\",\"tus\",\"tut\",\"tuu\",\"tuv\",\"tuw\",\"tux\",\"tuy\",\"tuz\",\"tva\",\"tvd\",\"tve\",\"tvk\",\"tvl\",\"tvm\",\"tvn\",\"tvo\",\"tvs\",\"tvt\",\"tvu\",\"tvw\",\"tvy\",\"twa\",\"twb\",\"twc\",\"twd\",\"twe\",\"twf\",\"twg\",\"twh\",\"twl\",\"twm\",\"twn\",\"two\",\"twp\",\"twq\",\"twr\",\"twt\",\"twu\",\"tww\",\"twx\",\"twy\",\"txa\",\"txb\",\"txc\",\"txe\",\"txg\",\"txh\",\"txi\",\"txj\",\"txm\",\"txn\",\"txo\",\"txq\",\"txr\",\"txs\",\"txt\",\"txu\",\"txx\",\"txy\",\"tya\",\"tye\",\"tyh\",\"tyi\",\"tyj\",\"tyl\",\"tyn\",\"typ\",\"tyr\",\"tys\",\"tyt\",\"tyu\",\"tyv\",\"tyx\",\"tyz\",\"tza\",\"tzh\",\"tzj\",\"tzl\",\"tzm\",\"tzn\",\"tzo\",\"tzx\",\"uam\",\"uan\",\"uar\",\"uba\",\"ubi\",\"ubl\",\"ubr\",\"ubu\",\"uby\",\"uda\",\"ude\",\"udg\",\"udi\",\"udj\",\"udl\",\"udm\",\"udu\",\"ues\",\"ufi\",\"uga\",\"ugb\",\"uge\",\"ugn\",\"ugo\",\"ugy\",\"uha\",\"uhn\",\"uis\",\"uiv\",\"uji\",\"uka\",\"ukg\",\"ukh\",\"ukk\",\"ukl\",\"ukp\",\"ukq\",\"uks\",\"uku\",\"ukw\",\"uky\",\"ula\",\"ulb\",\"ulc\",\"ule\",\"ulf\",\"uli\",\"ulk\",\"ull\",\"ulm\",\"uln\",\"ulu\",\"ulw\",\"uma\",\"umb\",\"umc\",\"umd\",\"umg\",\"umi\",\"umm\",\"umn\",\"umo\",\"ump\",\"umr\",\"ums\",\"umu\",\"una\",\"und\",\"une\",\"ung\",\"unk\",\"unm\",\"unn\",\"unp\",\"unr\",\"unu\",\"unx\",\"unz\",\"uok\",\"upi\",\"upv\",\"ura\",\"urb\",\"urc\",\"ure\",\"urf\",\"urg\",\"urh\",\"uri\",\"urj\",\"urk\",\"url\",\"urm\",\"urn\",\"uro\",\"urp\",\"urr\",\"urt\",\"uru\",\"urv\",\"urw\",\"urx\",\"ury\",\"urz\",\"usa\",\"ush\",\"usi\",\"usk\",\"usp\",\"usu\",\"uta\",\"ute\",\"utp\",\"utr\",\"utu\",\"uum\",\"uun\",\"uur\",\"uuu\",\"uve\",\"uvh\",\"uvl\",\"uwa\",\"uya\",\"uzn\",\"uzs\",\"vaa\",\"vae\",\"vaf\",\"vag\",\"vah\",\"vai\",\"vaj\",\"val\",\"vam\",\"van\",\"vao\",\"vap\",\"var\",\"vas\",\"vau\",\"vav\",\"vay\",\"vbb\",\"vbk\",\"vec\",\"ved\",\"vel\",\"vem\",\"veo\",\"vep\",\"ver\",\"vgr\",\"vgt\",\"vic\",\"vid\",\"vif\",\"vig\",\"vil\",\"vin\",\"vis\",\"vit\",\"viv\",\"vka\",\"vki\",\"vkj\",\"vkk\",\"vkl\",\"vkm\",\"vko\",\"vkp\",\"vkt\",\"vku\",\"vlp\",\"vls\",\"vma\",\"vmb\",\"vmc\",\"vmd\",\"vme\",\"vmf\",\"vmg\",\"vmh\",\"vmi\",\"vmj\",\"vmk\",\"vml\",\"vmm\",\"vmp\",\"vmq\",\"vmr\",\"vms\",\"vmu\",\"vmv\",\"vmw\",\"vmx\",\"vmy\",\"vmz\",\"vnk\",\"vnm\",\"vnp\",\"vor\",\"vot\",\"vra\",\"vro\",\"vrs\",\"vrt\",\"vsi\",\"vsl\",\"vsv\",\"vto\",\"vum\",\"vun\",\"vut\",\"vwa\",\"waa\",\"wab\",\"wac\",\"wad\",\"wae\",\"waf\",\"wag\",\"wah\",\"wai\",\"waj\",\"wak\",\"wal\",\"wam\",\"wan\",\"wao\",\"wap\",\"waq\",\"war\",\"was\",\"wat\",\"wau\",\"wav\",\"waw\",\"wax\",\"way\",\"waz\",\"wba\",\"wbb\",\"wbe\",\"wbf\",\"wbh\",\"wbi\",\"wbj\",\"wbk\",\"wbl\",\"wbm\",\"wbp\",\"wbq\",\"wbr\",\"wbs\",\"wbt\",\"wbv\",\"wbw\",\"wca\",\"wci\",\"wdd\",\"wdg\",\"wdj\",\"wdk\",\"wdu\",\"wdy\",\"wea\",\"wec\",\"wed\",\"weg\",\"weh\",\"wei\",\"wem\",\"wen\",\"weo\",\"wep\",\"wer\",\"wes\",\"wet\",\"weu\",\"wew\",\"wfg\",\"wga\",\"wgb\",\"wgg\",\"wgi\",\"wgo\",\"wgu\",\"wgw\",\"wgy\",\"wha\",\"whg\",\"whk\",\"whu\",\"wib\",\"wic\",\"wie\",\"wif\",\"wig\",\"wih\",\"wii\",\"wij\",\"wik\",\"wil\",\"wim\",\"win\",\"wir\",\"wit\",\"wiu\",\"wiv\",\"wiw\",\"wiy\",\"wja\",\"wji\",\"wka\",\"wkb\",\"wkd\",\"wkl\",\"wku\",\"wkw\",\"wky\",\"wla\",\"wlc\",\"wle\",\"wlg\",\"wli\",\"wlk\",\"wll\",\"wlm\",\"wlo\",\"wlr\",\"wls\",\"wlu\",\"wlv\",\"wlw\",\"wlx\",\"wly\",\"wma\",\"wmb\",\"wmc\",\"wmd\",\"wme\",\"wmh\",\"wmi\",\"wmm\",\"wmn\",\"wmo\",\"wms\",\"wmt\",\"wmw\",\"wmx\",\"wnb\",\"wnc\",\"wnd\",\"wne\",\"wng\",\"wni\",\"wnk\",\"wnm\",\"wnn\",\"wno\",\"wnp\",\"wnu\",\"wnw\",\"wny\",\"woa\",\"wob\",\"woc\",\"wod\",\"woe\",\"wof\",\"wog\",\"woi\",\"wok\",\"wom\",\"won\",\"woo\",\"wor\",\"wos\",\"wow\",\"woy\",\"wpc\",\"wra\",\"wrb\",\"wrd\",\"wrg\",\"wrh\",\"wri\",\"wrk\",\"wrl\",\"wrm\",\"wrn\",\"wro\",\"wrp\",\"wrr\",\"wrs\",\"wru\",\"wrv\",\"wrw\",\"wrx\",\"wry\",\"wrz\",\"wsa\",\"wsg\",\"wsi\",\"wsk\",\"wsr\",\"wss\",\"wsu\",\"wsv\",\"wtf\",\"wth\",\"wti\",\"wtk\",\"wtm\",\"wtw\",\"wua\",\"wub\",\"wud\",\"wuh\",\"wul\",\"wum\",\"wun\",\"wur\",\"wut\",\"wuu\",\"wuv\",\"wux\",\"wuy\",\"wwa\",\"wwb\",\"wwo\",\"wwr\",\"www\",\"wxa\",\"wxw\",\"wya\",\"wyb\",\"wyi\",\"wym\",\"wyr\",\"wyy\",\"xaa\",\"xab\",\"xac\",\"xad\",\"xae\",\"xag\",\"xai\",\"xaj\",\"xak\",\"xal\",\"xam\",\"xan\",\"xao\",\"xap\",\"xaq\",\"xar\",\"xas\",\"xat\",\"xau\",\"xav\",\"xaw\",\"xay\",\"xba\",\"xbb\",\"xbc\",\"xbd\",\"xbe\",\"xbg\",\"xbi\",\"xbj\",\"xbm\",\"xbn\",\"xbo\",\"xbp\",\"xbr\",\"xbw\",\"xbx\",\"xby\",\"xcb\",\"xcc\",\"xce\",\"xcg\",\"xch\",\"xcl\",\"xcm\",\"xcn\",\"xco\",\"xcr\",\"xct\",\"xcu\",\"xcv\",\"xcw\",\"xcy\",\"xda\",\"xdc\",\"xdk\",\"xdm\",\"xdo\",\"xdy\",\"xeb\",\"xed\",\"xeg\",\"xel\",\"xem\",\"xep\",\"xer\",\"xes\",\"xet\",\"xeu\",\"xfa\",\"xga\",\"xgb\",\"xgd\",\"xgf\",\"xgg\",\"xgi\",\"xgl\",\"xgm\",\"xgn\",\"xgr\",\"xgu\",\"xgw\",\"xha\",\"xhc\",\"xhd\",\"xhe\",\"xhr\",\"xht\",\"xhu\",\"xhv\",\"xia\",\"xib\",\"xii\",\"xil\",\"xin\",\"xip\",\"xir\",\"xis\",\"xiv\",\"xiy\",\"xjb\",\"xjt\",\"xka\",\"xkb\",\"xkc\",\"xkd\",\"xke\",\"xkf\",\"xkg\",\"xkh\",\"xki\",\"xkj\",\"xkk\",\"xkl\",\"xkn\",\"xko\",\"xkp\",\"xkq\",\"xkr\",\"xks\",\"xkt\",\"xku\",\"xkv\",\"xkw\",\"xkx\",\"xky\",\"xkz\",\"xla\",\"xlb\",\"xlc\",\"xld\",\"xle\",\"xlg\",\"xli\",\"xln\",\"xlo\",\"xlp\",\"xls\",\"xlu\",\"xly\",\"xma\",\"xmb\",\"xmc\",\"xmd\",\"xme\",\"xmf\",\"xmg\",\"xmh\",\"xmj\",\"xmk\",\"xml\",\"xmm\",\"xmn\",\"xmo\",\"xmp\",\"xmq\",\"xmr\",\"xms\",\"xmt\",\"xmu\",\"xmv\",\"xmw\",\"xmx\",\"xmy\",\"xmz\",\"xna\",\"xnb\",\"xnd\",\"xng\",\"xnh\",\"xni\",\"xnk\",\"xnn\",\"xno\",\"xnr\",\"xns\",\"xnt\",\"xnu\",\"xny\",\"xnz\",\"xoc\",\"xod\",\"xog\",\"xoi\",\"xok\",\"xom\",\"xon\",\"xoo\",\"xop\",\"xor\",\"xow\",\"xpa\",\"xpc\",\"xpe\",\"xpg\",\"xpi\",\"xpj\",\"xpk\",\"xpm\",\"xpn\",\"xpo\",\"xpp\",\"xpq\",\"xpr\",\"xps\",\"xpt\",\"xpu\",\"xpy\",\"xqa\",\"xqt\",\"xra\",\"xrb\",\"xrd\",\"xre\",\"xrg\",\"xri\",\"xrm\",\"xrn\",\"xrq\",\"xrr\",\"xrt\",\"xru\",\"xrw\",\"xsa\",\"xsb\",\"xsc\",\"xsd\",\"xse\",\"xsh\",\"xsi\",\"xsj\",\"xsl\",\"xsm\",\"xsn\",\"xso\",\"xsp\",\"xsq\",\"xsr\",\"xss\",\"xsu\",\"xsv\",\"xsy\",\"xta\",\"xtb\",\"xtc\",\"xtd\",\"xte\",\"xtg\",\"xth\",\"xti\",\"xtj\",\"xtl\",\"xtm\",\"xtn\",\"xto\",\"xtp\",\"xtq\",\"xtr\",\"xts\",\"xtt\",\"xtu\",\"xtv\",\"xtw\",\"xty\",\"xtz\",\"xua\",\"xub\",\"xud\",\"xug\",\"xuj\",\"xul\",\"xum\",\"xun\",\"xuo\",\"xup\",\"xur\",\"xut\",\"xuu\",\"xve\",\"xvi\",\"xvn\",\"xvo\",\"xvs\",\"xwa\",\"xwc\",\"xwd\",\"xwe\",\"xwg\",\"xwj\",\"xwk\",\"xwl\",\"xwo\",\"xwr\",\"xwt\",\"xww\",\"xxb\",\"xxk\",\"xxm\",\"xxr\",\"xxt\",\"xya\",\"xyb\",\"xyj\",\"xyk\",\"xyl\",\"xyt\",\"xyy\",\"xzh\",\"xzm\",\"xzp\",\"yaa\",\"yab\",\"yac\",\"yad\",\"yae\",\"yaf\",\"yag\",\"yah\",\"yai\",\"yaj\",\"yak\",\"yal\",\"yam\",\"yan\",\"yao\",\"yap\",\"yaq\",\"yar\",\"yas\",\"yat\",\"yau\",\"yav\",\"yaw\",\"yax\",\"yay\",\"yaz\",\"yba\",\"ybb\",\"ybd\",\"ybe\",\"ybh\",\"ybi\",\"ybj\",\"ybk\",\"ybl\",\"ybm\",\"ybn\",\"ybo\",\"ybx\",\"yby\",\"ych\",\"ycl\",\"ycn\",\"ycp\",\"yda\",\"ydd\",\"yde\",\"ydg\",\"ydk\",\"yds\",\"yea\",\"yec\",\"yee\",\"yei\",\"yej\",\"yel\",\"yen\",\"yer\",\"yes\",\"yet\",\"yeu\",\"yev\",\"yey\",\"yga\",\"ygi\",\"ygl\",\"ygm\",\"ygp\",\"ygr\",\"ygs\",\"ygu\",\"ygw\",\"yha\",\"yhd\",\"yhl\",\"yhs\",\"yia\",\"yif\",\"yig\",\"yih\",\"yii\",\"yij\",\"yik\",\"yil\",\"yim\",\"yin\",\"yip\",\"yiq\",\"yir\",\"yis\",\"yit\",\"yiu\",\"yiv\",\"yix\",\"yiy\",\"yiz\",\"yka\",\"ykg\",\"yki\",\"ykk\",\"ykl\",\"ykm\",\"ykn\",\"yko\",\"ykr\",\"ykt\",\"yku\",\"yky\",\"yla\",\"ylb\",\"yle\",\"ylg\",\"yli\",\"yll\",\"ylm\",\"yln\",\"ylo\",\"ylr\",\"ylu\",\"yly\",\"yma\",\"ymb\",\"ymc\",\"ymd\",\"yme\",\"ymg\",\"ymh\",\"ymi\",\"ymk\",\"yml\",\"ymm\",\"ymn\",\"ymo\",\"ymp\",\"ymq\",\"ymr\",\"yms\",\"ymt\",\"ymx\",\"ymz\",\"yna\",\"ynd\",\"yne\",\"yng\",\"ynh\",\"ynk\",\"ynl\",\"ynn\",\"yno\",\"ynq\",\"yns\",\"ynu\",\"yob\",\"yog\",\"yoi\",\"yok\",\"yol\",\"yom\",\"yon\",\"yos\",\"yot\",\"yox\",\"yoy\",\"ypa\",\"ypb\",\"ypg\",\"yph\",\"ypk\",\"ypm\",\"ypn\",\"ypo\",\"ypp\",\"ypz\",\"yra\",\"yrb\",\"yre\",\"yri\",\"yrk\",\"yrl\",\"yrm\",\"yrn\",\"yro\",\"yrs\",\"yrw\",\"yry\",\"ysc\",\"ysd\",\"ysg\",\"ysl\",\"ysn\",\"yso\",\"ysp\",\"ysr\",\"yss\",\"ysy\",\"yta\",\"ytl\",\"ytp\",\"ytw\",\"yty\",\"yua\",\"yub\",\"yuc\",\"yud\",\"yue\",\"yuf\",\"yug\",\"yui\",\"yuj\",\"yuk\",\"yul\",\"yum\",\"yun\",\"yup\",\"yuq\",\"yur\",\"yut\",\"yuu\",\"yuw\",\"yux\",\"yuy\",\"yuz\",\"yva\",\"yvt\",\"ywa\",\"ywg\",\"ywl\",\"ywn\",\"ywq\",\"ywr\",\"ywt\",\"ywu\",\"yww\",\"yxa\",\"yxg\",\"yxl\",\"yxm\",\"yxu\",\"yxy\",\"yyr\",\"yyu\",\"yyz\",\"yzg\",\"yzk\",\"zaa\",\"zab\",\"zac\",\"zad\",\"zae\",\"zaf\",\"zag\",\"zah\",\"zai\",\"zaj\",\"zak\",\"zal\",\"zam\",\"zao\",\"zap\",\"zaq\",\"zar\",\"zas\",\"zat\",\"zau\",\"zav\",\"zaw\",\"zax\",\"zay\",\"zaz\",\"zbc\",\"zbe\",\"zbl\",\"zbt\",\"zbw\",\"zca\",\"zch\",\"zdj\",\"zea\",\"zeg\",\"zeh\",\"zen\",\"zga\",\"zgb\",\"zgh\",\"zgm\",\"zgn\",\"zgr\",\"zhb\",\"zhd\",\"zhi\",\"zhn\",\"zhw\",\"zhx\",\"zia\",\"zib\",\"zik\",\"zil\",\"zim\",\"zin\",\"zir\",\"ziw\",\"ziz\",\"zka\",\"zkb\",\"zkd\",\"zkg\",\"zkh\",\"zkk\",\"zkn\",\"zko\",\"zkp\",\"zkr\",\"zkt\",\"zku\",\"zkv\",\"zkz\",\"zle\",\"zlj\",\"zlm\",\"zln\",\"zlq\",\"zls\",\"zlw\",\"zma\",\"zmb\",\"zmc\",\"zmd\",\"zme\",\"zmf\",\"zmg\",\"zmh\",\"zmi\",\"zmj\",\"zmk\",\"zml\",\"zmm\",\"zmn\",\"zmo\",\"zmp\",\"zmq\",\"zmr\",\"zms\",\"zmt\",\"zmu\",\"zmv\",\"zmw\",\"zmx\",\"zmy\",\"zmz\",\"zna\",\"znd\",\"zne\",\"zng\",\"znk\",\"zns\",\"zoc\",\"zoh\",\"zom\",\"zoo\",\"zoq\",\"zor\",\"zos\",\"zpa\",\"zpb\",\"zpc\",\"zpd\",\"zpe\",\"zpf\",\"zpg\",\"zph\",\"zpi\",\"zpj\",\"zpk\",\"zpl\",\"zpm\",\"zpn\",\"zpo\",\"zpp\",\"zpq\",\"zpr\",\"zps\",\"zpt\",\"zpu\",\"zpv\",\"zpw\",\"zpx\",\"zpy\",\"zpz\",\"zqe\",\"zra\",\"zrg\",\"zrn\",\"zro\",\"zrp\",\"zrs\",\"zsa\",\"zsk\",\"zsl\",\"zsm\",\"zsr\",\"zsu\",\"zte\",\"ztg\",\"ztl\",\"ztm\",\"ztn\",\"ztp\",\"ztq\",\"zts\",\"ztt\",\"ztu\",\"ztx\",\"zty\",\"zua\",\"zuh\",\"zum\",\"zun\",\"zuy\",\"zwa\",\"zxx\",\"zyb\",\"zyg\",\"zyj\",\"zyn\",\"zyp\",\"zza\",\"zzj\"];function he(e){return ye(e)||ge(e)||be()}function be(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function ge(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function ye(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.utils.validLangs=function(){\"use strict\";return Ie},axe._load({data:{rules:{accesskeys:{description:\"Ensures every accesskey attribute value is unique\",help:\"accesskey attribute value must be unique\"},\"area-alt\":{description:\"Ensures <area> elements of image maps have alternate text\",help:\"Active <area> elements must have alternate text\"},\"aria-allowed-attr\":{description:\"Ensures ARIA attributes are allowed for an element's role\",help:\"Elements must only use allowed ARIA attributes\"},\"aria-allowed-role\":{description:\"Ensures role attribute has an appropriate value for the element\",help:\"ARIA role must be appropriate for the element\"},\"aria-dpub-role-fallback\":{description:\"Ensures unsupported DPUB roles are only used on elements with implicit fallback roles\",help:\"Unsupported DPUB ARIA roles should be used on elements with implicit fallback roles\"},\"aria-hidden-body\":{description:\"Ensures aria-hidden='true' is not present on the document body.\",help:\"aria-hidden='true' must not be present on the document body\"},\"aria-hidden-focus\":{description:\"Ensures aria-hidden elements do not contain focusable elements\",help:\"ARIA hidden element must not contain focusable elements\"},\"aria-input-field-name\":{description:\"Ensures every ARIA input field has an accessible name\",help:\"ARIA input fields have an accessible name\"},\"aria-required-attr\":{description:\"Ensures elements with ARIA roles have all required ARIA attributes\",help:\"Required ARIA attributes must be provided\"},\"aria-required-children\":{description:\"Ensures elements with an ARIA role that require child roles contain them\",help:\"Certain ARIA roles must contain particular children\"},\"aria-required-parent\":{description:\"Ensures elements with an ARIA role that require parent roles are contained by them\",help:\"Certain ARIA roles must be contained by particular parents\"},\"aria-roles\":{description:\"Ensures all elements with a role attribute use a valid value\",help:\"ARIA roles used must conform to valid values\"},\"aria-toggle-field-name\":{description:\"Ensures every ARIA toggle field has an accessible name\",help:\"ARIA toggle fields have an accessible name\"},\"aria-valid-attr-value\":{description:\"Ensures all ARIA attributes have valid values\",help:\"ARIA attributes must conform to valid values\"},\"aria-valid-attr\":{description:\"Ensures attributes that begin with aria- are valid ARIA attributes\",help:\"ARIA attributes must conform to valid names\"},\"audio-caption\":{description:\"Ensures <audio> elements have captions\",help:\"<audio> elements must have a captions track\"},\"autocomplete-valid\":{description:\"Ensure the autocomplete attribute is correct and suitable for the form field\",help:\"autocomplete attribute must be used correctly\"},\"avoid-inline-spacing\":{description:\"Ensure that text spacing set through style attributes can be adjusted with custom stylesheets\",help:\"Inline text spacing must be adjustable with custom stylesheets\"},blink:{description:\"Ensures <blink> elements are not used\",help:\"<blink> elements are deprecated and must not be used\"},\"button-name\":{description:\"Ensures buttons have discernible text\",help:\"Buttons must have discernible text\"},bypass:{description:\"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content\",help:\"Page must have means to bypass repeated blocks\"},checkboxgroup:{description:'Ensures related <input type=\"checkbox\"> elements have a group and that the group designation is consistent',help:\"Checkbox inputs with the same name attribute value must be part of a group\"},\"color-contrast\":{description:\"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds\",help:\"Elements must have sufficient color contrast\"},\"css-orientation-lock\":{description:\"Ensures content is not locked to any specific display orientation, and the content is operable in all display orientations\",help:\"CSS Media queries are not used to lock display orientation\"},\"definition-list\":{description:\"Ensures <dl> elements are structured correctly\",help:\"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements\"},dlitem:{description:\"Ensures <dt> and <dd> elements are contained by a <dl>\",help:\"<dt> and <dd> elements must be contained by a <dl>\"},\"document-title\":{description:\"Ensures each HTML document contains a non-empty <title> element\",help:\"Documents must have <title> element to aid in navigation\"},\"duplicate-id-active\":{description:\"Ensures every id attribute value of active elements is unique\",help:\"IDs of active elements must be unique\"},\"duplicate-id-aria\":{description:\"Ensures every id attribute value used in ARIA and in labels is unique\",help:\"IDs used in ARIA and labels must be unique\"},\"duplicate-id\":{description:\"Ensures every id attribute value is unique\",help:\"id attribute value must be unique\"},\"empty-heading\":{description:\"Ensures headings have discernible text\",help:\"Headings must not be empty\"},\"focus-order-semantics\":{description:\"Ensures elements in the focus order have an appropriate role\",help:\"Elements in the focus order need a role appropriate for interactive content\"},\"form-field-multiple-labels\":{description:\"Ensures form field does not have multiple label elements\",help:\"Form field must not have multiple label elements\"},\"frame-tested\":{description:\"Ensures <iframe> and <frame> elements contain the axe-core script\",help:\"Frames must be tested with axe-core\"},\"frame-title-unique\":{description:\"Ensures <iframe> and <frame> elements contain a unique title attribute\",help:\"Frames must have a unique title attribute\"},\"frame-title\":{description:\"Ensures <iframe> and <frame> elements contain a non-empty title attribute\",help:\"Frames must have title attribute\"},\"heading-order\":{description:\"Ensures the order of headings is semantically correct\",help:\"Heading levels should only increase by one\"},\"hidden-content\":{description:\"Informs users about hidden content.\",help:\"Hidden content on the page cannot be analyzed\"},\"html-has-lang\":{description:\"Ensures every HTML document has a lang attribute\",help:\"<html> element must have a lang attribute\"},\"html-lang-valid\":{description:\"Ensures the lang attribute of the <html> element has a valid value\",help:\"<html> element must have a valid value for the lang attribute\"},\"html-xml-lang-mismatch\":{description:\"Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page\",help:\"HTML elements with lang and xml:lang must have the same base language\"},\"image-alt\":{description:\"Ensures <img> elements have alternate text or a role of none or presentation\",help:\"Images must have alternate text\"},\"image-redundant-alt\":{description:\"Ensure image alternative is not repeated as text\",help:\"Alternative text of images should not be repeated as text\"},\"input-button-name\":{description:\"Ensures input buttons have discernible text\",help:\"Input buttons must have discernible text\"},\"input-image-alt\":{description:'Ensures <input type=\"image\"> elements have alternate text',help:\"Image buttons must have alternate text\"},\"label-content-name-mismatch\":{description:\"Ensures that elements labelled through their content must have their visible text as part of their accessible name\",help:\"Elements must have their visible text as part of their accessible name\"},\"label-title-only\":{description:\"Ensures that every form element is not solely labeled using the title or aria-describedby attributes\",help:\"Form elements should have a visible label\"},label:{description:\"Ensures every form element has a label\",help:\"Form elements must have labels\"},\"landmark-banner-is-top-level\":{description:\"Ensures the banner landmark is at top level\",help:\"Banner landmark must not be contained in another landmark\"},\"landmark-complementary-is-top-level\":{description:\"Ensures the complementary landmark or aside is at top level\",help:\"Aside must not be contained in another landmark\"},\"landmark-contentinfo-is-top-level\":{description:\"Ensures the contentinfo landmark is at top level\",help:\"Contentinfo landmark must not be contained in another landmark\"},\"landmark-main-is-top-level\":{description:\"Ensures the main landmark is at top level\",help:\"Main landmark must not be contained in another landmark\"},\"landmark-no-duplicate-banner\":{description:\"Ensures the document has at most one banner landmark\",help:\"Document must not have more than one banner landmark\"},\"landmark-no-duplicate-contentinfo\":{description:\"Ensures the document has at most one contentinfo landmark\",help:\"Document must not have more than one contentinfo landmark\"},\"landmark-one-main\":{description:\"Ensures the document has only one main landmark and each iframe in the page has at most one main landmark\",help:\"Document must have one main landmark\"},\"landmark-unique\":{help:\"Ensures landmarks are unique\",description:\"Landmarks must have a unique role or role/label/title (i.e. accessible name) combination\"},\"layout-table\":{description:\"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute\",help:\"Layout tables must not use data table elements\"},\"link-in-text-block\":{description:\"Links can be distinguished without relying on color\",help:\"Links must be distinguished from surrounding text in a way that does not rely on color\"},\"link-name\":{description:\"Ensures links have discernible text\",help:\"Links must have discernible text\"},list:{description:\"Ensures that lists are structured correctly\",help:\"<ul> and <ol> must only directly contain <li>, <script> or <template> elements\"},listitem:{description:\"Ensures <li> elements are used semantically\",help:\"<li> elements must be contained in a <ul> or <ol>\"},marquee:{description:\"Ensures <marquee> elements are not used\",help:\"<marquee> elements are deprecated and must not be used\"},\"meta-refresh\":{description:'Ensures <meta http-equiv=\"refresh\"> is not used',help:\"Timed refresh must not exist\"},\"meta-viewport-large\":{description:'Ensures <meta name=\"viewport\"> can scale a significant amount',help:\"Users should be able to zoom and scale the text up to 500%\"},\"meta-viewport\":{description:'Ensures <meta name=\"viewport\"> does not disable text scaling and zooming',help:\"Zooming and scaling must not be disabled\"},\"object-alt\":{description:\"Ensures <object> elements have alternate text\",help:\"<object> elements must have alternate text\"},\"p-as-heading\":{description:\"Ensure p elements are not used to style headings\",help:\"Bold, italic text and font-size are not used to style p elements as a heading\"},\"page-has-heading-one\":{description:\"Ensure that the page, or at least one of its frames contains a level-one heading\",help:\"Page must contain a level-one heading\"},radiogroup:{description:'Ensures related <input type=\"radio\"> elements have a group and that the group designation is consistent',help:\"Radio inputs with the same name attribute value must be part of a group\"},region:{description:\"Ensures all page content is contained by landmarks\",help:\"All page content must be contained by landmarks\"},\"role-img-alt\":{description:\"Ensures [role='img'] elements have alternate text\",help:\"[role='img'] elements have an alternative text\"},\"scope-attr-valid\":{description:\"Ensures the scope attribute is used correctly on tables\",help:\"scope attribute should be used correctly\"},\"scrollable-region-focusable\":{description:\"Elements that have scrollable content should be accessible by keyboard\",help:\"Ensure that scrollable region has keyboard access\"},\"server-side-image-map\":{description:\"Ensures that server-side image maps are not used\",help:\"Server-side image maps must not be used\"},\"skip-link\":{description:\"Ensure all skip links have a focusable target\",help:\"The skip-link target should exist and be focusable\"},tabindex:{description:\"Ensures tabindex attribute values are not greater than 0\",help:\"Elements should not have tabindex greater than zero\"},\"table-duplicate-name\":{description:\"Ensure that tables do not have the same summary and caption\",help:\"The <caption> element should not contain the same text as the summary attribute\"},\"table-fake-caption\":{description:\"Ensure that tables with a caption use the <caption> element.\",help:\"Data or header cells should not be used to give caption to a data table.\"},\"td-has-header\":{description:\"Ensure that each non-empty data cell in a large table has one or more table headers\",help:\"All non-empty td element in table larger than 3 by 3 must have an associated table header\"},\"td-headers-attr\":{description:\"Ensure that each cell in a table using the headers refers to another cell in that table\",help:\"All cells in a table element that use the headers attribute must only refer to other cells of that same table\"},\"th-has-data-cells\":{description:\"Ensure that each table header in a data table refers to data cells\",help:\"All th elements and elements with role=columnheader/rowheader must have data cells they describe\"},\"valid-lang\":{description:\"Ensures lang attributes have valid values\",help:\"lang attribute must have a valid value\"},\"video-caption\":{description:\"Ensures <video> elements have captions\",help:\"<video> elements must have captions\"},\"video-description\":{description:\"Ensures <video> elements have audio descriptions\",help:\"<video> elements must have an audio description track\"}},checks:{accesskeys:{impact:\"serious\",messages:{pass:function(e){return\"Accesskey attribute value is unique\"},fail:function(e){return\"Document has multiple elements with the same accesskey\"}}},\"non-empty-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty alt attribute\"},fail:function(e){return\"Element has no alt attribute or the alt attribute is empty\"}}},\"non-empty-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element has a title attribute\"},fail:function(e){return\"Element has no title attribute or the title attribute is empty\"}}},\"aria-label\":{impact:\"serious\",messages:{pass:function(e){return\"aria-label attribute exists and is not empty\"},fail:function(e){return\"aria-label attribute does not exist or is empty\"}}},\"aria-labelledby\":{impact:\"serious\",messages:{pass:function(e){return\"aria-labelledby attribute exists and references elements that are visible to screen readers\"},fail:function(e){return\"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\"}}},\"aria-allowed-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attributes are used correctly for the defined role\"},fail:function(e){var t=\"ARIA attribute\"+(e.data&&1<e.data.length?\"s are\":\" is\")+\" not allowed:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-unsupported-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute is supported\"},fail:function(e){var t=\"ARIA attribute is not widely supported in screen readers and assistive technologies: \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-allowed-role\":{impact:\"minor\",messages:{pass:function(e){return\"ARIA role is allowed for given element\"},fail:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" \"+(e.data&&1<e.data.length?\"are\":\" is\")+\" not allowed for given element\"},incomplete:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" must be removed when the element is made visible, as \"+(e.data&&1<e.data.length?\"they are\":\"it is\")+\" not allowed for the element\"}}},\"implicit-role-fallback\":{impact:\"moderate\",messages:{pass:function(e){return\"Element’s implicit ARIA role is an appropriate fallback\"},fail:function(e){return\"Element’s implicit ARIA role is not a good fallback for the (unsupported) role\"}}},\"aria-hidden-body\":{impact:\"critical\",messages:{pass:function(e){return\"No aria-hidden attribute is present on document body\"},fail:function(e){return\"aria-hidden=true should not be present on the document body\"}}},\"focusable-disabled\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should be disabled or be removed from the DOM\"}}},\"focusable-not-tabbable\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should have tabindex='-1' or be removed from the DOM\"}}},\"no-implicit-explicit-label\":{impact:\"moderate\",messages:{pass:function(e){return\"There is no mismatch between a <label> and accessible name\"},incomplete:function(e){return\"Check that the <label> does not need be part of the ARIA \"+e.data+\" field's name\"}}},\"aria-required-attr\":{impact:\"critical\",messages:{pass:function(e){return\"All required ARIA attributes are present\"},fail:function(e){var t=\"Required ARIA attribute\"+(e.data&&1<e.data.length?\"s\":\"\")+\" not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-required-children\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA children are present\"},fail:function(e){var t=\"Required ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t},incomplete:function(e){var t=\"Expecting ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role to be added:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-required-parent\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA parent role present\"},fail:function(e){var t=\"Required ARIA parent\"+(e.data&&1<e.data.length?\"s\":\"\")+\" role not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},invalidrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is valid\"},fail:function(e){return\"Role must be one of the valid ARIA roles\"}}},abstractrole:{impact:\"serious\",messages:{pass:function(e){return\"Abstract roles are not used\"},fail:function(e){return\"Abstract roles cannot be directly used\"}}},unsupportedrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is supported\"},fail:function(e){var t=\"The role used is not widely supported in screen readers and assistive technologies: \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"has-visible-text\":{impact:\"minor\",messages:{pass:function(e){return\"Element has text that is visible to screen readers\"},fail:function(e){return\"Element does not have text that is visible to screen readers\"}}},\"aria-valid-attr-value\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute values are valid\"},fail:function(e){var t=\"Invalid ARIA attribute value\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-errormessage\":{impact:\"critical\",messages:{pass:function(e){return\"Uses a supported aria-errormessage technique\"},fail:function(e){var t=\"aria-errormessage value\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" `\"+n[r+=1];return t+=\"` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)\"}}},\"aria-valid-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\" are valid\"},fail:function(e){var t=\"Invalid ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},caption:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has a captions track\"},incomplete:function(e){return\"Check that captions is available for the element\"}}},\"autocomplete-valid\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete attribute is correctly formatted\"},fail:function(e){return\"the autocomplete attribute is incorrectly formatted\"}}},\"autocomplete-appropriate\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete value is on an appropriate element\"},fail:function(e){return\"the autocomplete value is inappropriate for this type of input\"}}},\"avoid-inline-spacing\":{impact:\"serious\",messages:{pass:function(e){return\"No inline styles with '!important' that affect text spacing has been specified\"},fail:function(e){return\"Remove '!important' from inline style\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\", as overriding this is not supported by most browsers\"}}},\"is-on-screen\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not visible\"},fail:function(e){return\"Element is visible\"}}},\"button-has-visible-text\":{impact:\"critical\",messages:{pass:function(e){return\"Element has inner text that is visible to screen readers\"},fail:function(e){return\"Element does not have inner text that is visible to screen readers\"}}},\"role-presentation\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"presentation\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"presentation\"'}}},\"role-none\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"none\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"none\"'}}},\"internal-link-present\":{impact:\"serious\",messages:{pass:function(e){return\"Valid skip link found\"},fail:function(e){return\"No valid skip link found\"}}},\"header-present\":{impact:\"serious\",messages:{pass:function(e){return\"Page has a header\"},fail:function(e){return\"Page does not have a header\"}}},landmark:{impact:\"serious\",messages:{pass:function(e){return\"Page has a landmark region\"},fail:function(e){return\"Page does not have a landmark region\"}}},\"group-labelledby\":{impact:\"critical\",messages:{pass:function(e){return'Elements with the name \"'+e.data.name+'\" have both a shared label, and a unique label, referenced through aria-labelledby'},fail:function(e){var t=\"\",n=e.data&&e.data.failureCode;return t+='Elements with the name \"'+e.data.name+'\" do not all have ',t+=\"no-shared-label\"===n?\"a shared label\":\"no-unique-label\"===n?\"a unique label\":\"both a shared label, and a unique label\",t+=\", referenced through aria-labelledby\"}}},fieldset:{impact:\"critical\",messages:{pass:function(e){return\"Element is contained in a fieldset\"},fail:function(e){var t=\"\",n=e.data&&e.data.failureCode;return t+=\"no-legend\"===n?\"Fieldset does not have a legend as its first child\":\"empty-legend\"===n?\"Legend does not have text that is visible to screen readers\":\"mixed-inputs\"===n?\"Fieldset contains unrelated inputs\":\"no-group-label\"===n?\"ARIA group does not have aria-label or aria-labelledby\":\"group-mixed-inputs\"===n?\"ARIA group contains unrelated inputs\":\"Element does not have a containing fieldset or ARIA group\"}}},\"color-contrast\":{impact:\"serious\",messages:{pass:function(e){return\"Element has sufficient color contrast of \"+e.data.contrastRatio},fail:function(e){return\"Element has insufficient color contrast of \"+e.data.contrastRatio+\" (foreground color: \"+e.data.fgColor+\", background color: \"+e.data.bgColor+\", font size: \"+e.data.fontSize+\", font weight: \"+e.data.fontWeight+\"). Expected contrast ratio of \"+e.data.expectedContrastRatio},incomplete:{bgImage:\"Element's background color could not be determined due to a background image\",bgGradient:\"Element's background color could not be determined due to a background gradient\",imgNode:\"Element's background color could not be determined because element contains an image node\",bgOverlap:\"Element's background color could not be determined because it is overlapped by another element\",fgAlpha:\"Element's foreground color could not be determined because of alpha transparency\",elmPartiallyObscured:\"Element's background color could not be determined because it's partially obscured by another element\",elmPartiallyObscuring:\"Element's background color could not be determined because it partially overlaps other elements\",outsideViewport:\"Element's background color could not be determined because it's outside the viewport\",equalRatio:\"Element has a 1:1 contrast ratio with the background\",shortTextContent:\"Element content is too short to determine if it is actual text content\",default:\"Unable to determine contrast ratio\"}}},\"css-orientation-lock\":{impact:\"serious\",messages:{pass:function(e){return\"Display is operable, and orientation lock does not exist\"},fail:function(e){return\"CSS Orientation lock is applied, and makes display inoperable\"},incomplete:function(e){return\"CSS Orientation lock cannot be determined\"}}},\"structured-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"When not empty, element has both <dt> and <dd> elements\"},fail:function(e){return\"When not empty, element does not have at least one <dt> element followed by at least one <dd> element\"}}},\"only-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <dt> or <dd> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <dt> or <dd> elements\"}}},dlitem:{impact:\"serious\",messages:{pass:function(e){return\"Description list item has a <dl> parent element\"},fail:function(e){return\"Description list item does not have a <dl> parent element\"}}},\"doc-has-title\":{impact:\"serious\",messages:{pass:function(e){return\"Document has a non-empty <title> element\"},fail:function(e){return\"Document does not have a non-empty <title> element\"}}},\"duplicate-id-active\":{impact:\"serious\",messages:{pass:function(e){return\"Document has no active elements that share the same id attribute\"},fail:function(e){return\"Document has active elements with the same id attribute: \"+e.data}}},\"duplicate-id-aria\":{impact:\"critical\",messages:{pass:function(e){return\"Document has no elements referenced with ARIA or labels that share the same id attribute\"},fail:function(e){return\"Document has multiple elements referenced with ARIA with the same id attribute: \"+e.data}}},\"duplicate-id\":{impact:\"minor\",messages:{pass:function(e){return\"Document has no static elements that share the same id attribute\"},fail:function(e){return\"Document has multiple static elements with the same id attribute\"}}},\"has-widget-role\":{impact:\"minor\",messages:{pass:function(e){return\"Element has a widget role.\"},fail:function(e){return\"Element does not have a widget role.\"}}},\"valid-scrollable-semantics\":{impact:\"minor\",messages:{pass:function(e){return\"Element has valid semantics for an element in the focus order.\"},fail:function(e){return\"Element has invalid semantics for an element in the focus order.\"}}},\"multiple-label\":{impact:\"moderate\",messages:{pass:function(e){return\"Form field does not have multiple label elements\"},fail:function(e){return\"Multiple label elements is not widely supported in assistive technologies\"}}},\"frame-tested\":{impact:\"critical\",messages:{pass:function(e){return\"The iframe was tested with axe-core\"},fail:function(e){return\"The iframe could not be tested with axe-core\"},incomplete:function(e){return\"The iframe still has to be tested with axe-core\"}}},\"unique-frame-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element's title attribute is unique\"},fail:function(e){return\"Element's title attribute is not unique\"}}},\"heading-order\":{impact:\"moderate\",messages:{pass:function(e){return\"Heading order valid\"},fail:function(e){return\"Heading order invalid\"}}},\"hidden-content\":{impact:\"minor\",messages:{pass:function(e){return\"All content on the page has been analyzed.\"},fail:function(e){return\"There were problems analyzing the content on this page.\"},incomplete:function(e){return\"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.\"}}},\"has-lang\":{impact:\"serious\",messages:{pass:function(e){return\"The <html> element has a lang attribute\"},fail:function(e){return\"The <html> element does not have a lang attribute\"}}},\"valid-lang\":{impact:\"serious\",messages:{pass:function(e){return\"Value of lang attribute is included in the list of valid languages\"},fail:function(e){return\"Value of lang attribute not included in the list of valid languages\"}}},\"xml-lang-mismatch\":{impact:\"moderate\",messages:{pass:function(e){return\"Lang and xml:lang attributes have the same base language\"},fail:function(e){return\"Lang and xml:lang attributes do not have the same base language\"}}},\"has-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has an alt attribute\"},fail:function(e){return\"Element does not have an alt attribute\"}}},\"alt-space-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a valid alt attribute value\"},fail:function(e){return\"Element has an alt attribute containing only a space character, which is not ignored by all screen readers\"}}},\"duplicate-img-label\":{impact:\"minor\",messages:{pass:function(e){return\"Element does not duplicate existing text in <img> alt text\"},fail:function(e){return\"Element contains <img> element with alt text that duplicates existing text\"}}},\"non-empty-if-present\":{impact:\"critical\",messages:{pass:function(e){var t=\"Element \";return e.data?t+=\"has a non-empty value attribute\":t+=\"does not have a value attribute\",t},fail:function(e){return\"Element has a value attribute and the value attribute is empty\"}}},\"non-empty-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty value attribute\"},fail:function(e){return\"Element has no value attribute or the value attribute is empty\"}}},\"label-content-name-mismatch\":{impact:\"serious\",messages:{pass:function(e){return\"Element contains visible text as part of it's accessible name\"},fail:function(e){return\"Text inside the element is not included in the accessible name\"}}},\"title-only\":{impact:\"serious\",messages:{pass:function(e){return\"Form element does not solely use title attribute for its label\"},fail:function(e){return\"Only title used to generate label for form element\"}}},\"implicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an implicit (wrapped) <label>\"},fail:function(e){return\"Form element does not have an implicit (wrapped) <label>\"}}},\"explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an explicit <label>\"},fail:function(e){return\"Form element does not have an explicit <label>\"}}},\"help-same-as-label\":{impact:\"minor\",messages:{pass:function(e){return\"Help text (title or aria-describedby) does not duplicate label text\"},fail:function(e){return\"Help text (title or aria-describedby) text is the same as the label text\"}}},\"hidden-explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has a visible explicit <label>\"},fail:function(e){return\"Form element has explicit <label> that is hidden\"}}},\"landmark-is-top-level\":{impact:\"moderate\",messages:{pass:function(e){return\"The \"+e.data.role+\" landmark is at the top level.\"},fail:function(e){return\"The \"+e.data.role+\" landmark is contained in another landmark.\"}}},\"page-no-duplicate-banner\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one banner landmark\"},fail:function(e){return\"Document has more than one banner landmark\"}}},\"page-no-duplicate-contentinfo\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one contentinfo landmark\"},fail:function(e){return\"Document has more than one contentinfo landmark\"}}},\"page-has-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document has at least one main landmark\"},fail:function(e){return\"Document does not have a main landmark\"}}},\"page-no-duplicate-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one main landmark\"},fail:function(e){return\"Document has more than one main landmark\"}}},\"landmark-is-unique\":{impact:\"moderate\",messages:{pass:function(e){return\"Landmarks must have a unique role or role/label/title (i.e. accessible name) combination\"},fail:function(e){return\"The landmark must have a unique aria-label, aria-labelledby, or title to make landmarks distinguishable\"}}},\"has-th\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <th> elements\"},fail:function(e){return\"Layout table uses <th> elements\"}}},\"has-caption\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <caption> element\"},fail:function(e){return\"Layout table uses <caption> element\"}}},\"has-summary\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use summary attribute\"},fail:function(e){return\"Layout table uses summary attribute\"}}},\"link-in-text-block\":{impact:\"serious\",messages:{pass:function(e){return\"Links can be distinguished from surrounding text in some way other than by color\"},fail:function(e){return\"Links need to be distinguished from surrounding text in some way other than by color\"},incomplete:{bgContrast:\"Element's contrast ratio could not be determined. Check for a distinct hover/focus style\",bgImage:\"Element's contrast ratio could not be determined due to a background image\",bgGradient:\"Element's contrast ratio could not be determined due to a background gradient\",imgNode:\"Element's contrast ratio could not be determined because element contains an image node\",bgOverlap:\"Element's contrast ratio could not be determined because of element overlap\",default:\"Unable to determine contrast ratio\"}}},\"focusable-no-name\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not in tab order or has accessible text\"},fail:function(e){return\"Element is in tab order and does not have accessible text\"}}},\"only-listitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <li> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <li> elements\"}}},listitem:{impact:\"serious\",messages:{pass:function(e){return'List item has a <ul>, <ol> or role=\"list\" parent element'},fail:function(e){return'List item does not have a <ul>, <ol> or role=\"list\" parent element'}}},\"meta-refresh\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not immediately refresh the page\"},fail:function(e){return\"<meta> tag forces timed refresh of page\"}}},\"meta-viewport-large\":{impact:\"minor\",messages:{pass:function(e){return\"<meta> tag does not prevent significant zooming on mobile devices\"},fail:function(e){return\"<meta> tag limits zooming on mobile devices\"}}},\"meta-viewport\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not disable zooming on mobile devices\"},fail:function(e){return e.data+\" on <meta> tag disables zooming on mobile devices\"}}},\"p-as-heading\":{impact:\"serious\",messages:{pass:function(e){return\"<p> elements are not styled as headings\"},fail:function(e){return\"Heading elements should be used instead of styled p elements\"}}},\"page-has-heading-one\":{impact:\"moderate\",messages:{pass:function(e){return\"Page has at least one level-one heading\"},fail:function(e){return\"Page must have a level-one heading\"}}},region:{impact:\"moderate\",messages:{pass:function(e){return\"All page content is contained by landmarks\"},fail:function(e){return\"Some page content is not contained by landmarks\"}}},\"html5-scope\":{impact:\"moderate\",messages:{pass:function(e){return\"Scope attribute is only used on table header elements (<th>)\"},fail:function(e){return\"In HTML 5, scope attributes may only be used on table header elements (<th>)\"}}},\"scope-value\":{impact:\"critical\",messages:{pass:function(e){return\"Scope attribute is used correctly\"},fail:function(e){return\"The value of the scope attribute may only be 'row' or 'col'\"}}},\"focusable-content\":{impact:\"moderate\",messages:{pass:function(e){return\"Element contains focusable elements\"},fail:function(e){return\"Element should have focusable content\"}}},\"focusable-element\":{impact:\"moderate\",messages:{pass:function(e){return\"Element is focusable\"},fail:function(e){return\"Element should be focusable\"}}},exists:{impact:\"minor\",messages:{pass:function(e){return\"Element does not exist\"},fail:function(e){return\"Element exists\"}}},\"skip-link\":{impact:\"moderate\",messages:{pass:function(e){return\"Skip link target exists\"},incomplete:function(e){return\"Skip link target should become visible on activation\"},fail:function(e){return\"No skip link target\"}}},tabindex:{impact:\"serious\",messages:{pass:function(e){return\"Element does not have a tabindex greater than 0\"},fail:function(e){return\"Element has a tabindex greater than 0\"}}},\"same-caption-summary\":{impact:\"minor\",messages:{pass:function(e){return\"Content of summary attribute and <caption> are not duplicated\"},fail:function(e){return\"Content of summary attribute and <caption> element are identical\"}}},\"caption-faked\":{impact:\"serious\",messages:{pass:function(e){return\"The first row of a table is not used as a caption\"},fail:function(e){return\"The first row of the table should be a caption instead of a table cell\"}}},\"td-has-header\":{impact:\"critical\",messages:{pass:function(e){return\"All non-empty data cells have table headers\"},fail:function(e){return\"Some non-empty data cells do not have table headers\"}}},\"td-headers-attr\":{impact:\"serious\",messages:{pass:function(e){return\"The headers attribute is exclusively used to refer to other cells in the table\"},fail:function(e){return\"The headers attribute is not exclusively used to refer to other cells in the table\"}}},\"th-has-data-cells\":{impact:\"serious\",messages:{pass:function(e){return\"All table header cells refer to data cells\"},fail:function(e){return\"Not all table header cells refer to data cells\"},incomplete:function(e){return\"Table data cells are missing or empty\"}}},description:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has an audio description track\"},incomplete:function(e){return\"Check that audio description is available for the element\"}}}},failureSummaries:{any:{failureMessage:function(e){var t=\"Fix any of the following:\",n=e;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\"\\n  \"+n[r+=1].split(\"\\n\").join(\"\\n  \");return t}},none:{failureMessage:function(e){var t=\"Fix all of the following:\",n=e;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\"\\n  \"+n[r+=1].split(\"\\n\").join(\"\\n  \");return t}}},incompleteFallbackMessage:function(e){return\"axe couldn't tell the reason. Time to break out the element inspector!\"}},rules:[{id:\"accesskeys\",selector:\"[accesskey]\",excludeHidden:!1,tags:[\"best-practice\",\"cat.keyboard\"],all:[],any:[],none:[\"accesskeys\"]},{id:\"area-alt\",selector:\"map area[href]\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"non-empty-title\",\"aria-label\",\"aria-labelledby\"],none:[]},{id:\"aria-allowed-attr\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-allowed-attr\"],none:[\"aria-unsupported-attr\"]},{id:\"aria-allowed-role\",excludeHidden:!1,selector:\"[role]\",matches:function(e,t,n){return null!==axe.commons.aria.getRole(e,{noImplicit:!0,dpub:!0,fallback:!0})},tags:[\"cat.aria\",\"best-practice\"],all:[],any:[{options:{allowImplicit:!0,ignoredTags:[]},id:\"aria-allowed-role\"}],none:[]},{id:\"aria-dpub-role-fallback\",selector:\"[role]\",matches:function(e,t,n){var r=e.getAttribute(\"role\");return[\"doc-backlink\",\"doc-biblioentry\",\"doc-biblioref\",\"doc-cover\",\"doc-endnote\",\"doc-glossref\",\"doc-noteref\"].includes(r)},tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[\"implicit-role-fallback\"],any:[],none:[]},{id:\"aria-hidden-body\",selector:\"body\",excludeHidden:!1,tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-hidden-body\"],none:[]},{id:\"aria-hidden-focus\",selector:'[aria-hidden=\"true\"]',matches:function(e,t,n){var r=axe.commons.dom.getComposedParent;return function e(t){return!t||\"true\"!==t.getAttribute(\"aria-hidden\")&&e(r(t))}(r(e))},excludeHidden:!1,tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag131\"],all:[\"focusable-disabled\",\"focusable-not-tabbable\"],any:[],none:[]},{id:\"aria-input-field-name\",selector:'[role=\"combobox\"], [role=\"listbox\"], [role=\"searchbox\"], [role=\"slider\"], [role=\"spinbutton\"], [role=\"textbox\"]',matches:function(e,t,n){var r=axe.commons.aria,a=e.nodeName.toUpperCase(),o=r.getRole(e,{noImplicit:!0});return(\"AREA\"!==a||!e.getAttribute(\"href\"))&&(![\"INPUT\",\"SELECT\",\"TEXTAREA\"].includes(a)&&(\"IMG\"!==a&&(\"img\"!==o||\"SVG\"===a)&&(\"BUTTON\"!==a&&\"button\"!==o)))},tags:[\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[\"no-implicit-explicit-label\"]},{id:\"aria-required-attr\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-required-attr\"],none:[]},{id:\"aria-required-children\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[{options:{reviewEmpty:[\"doc-bibliography\",\"doc-endnotes\",\"grid\",\"list\",\"listbox\",\"table\",\"tablist\",\"tree\",\"treegrid\",\"rowgroup\"]},id:\"aria-required-children\"}],none:[]},{id:\"aria-required-parent\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[\"aria-required-parent\"],none:[]},{id:\"aria-roles\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[],none:[\"invalidrole\",\"abstractrole\",\"unsupportedrole\"]},{id:\"aria-toggle-field-name\",selector:'[role=\"checkbox\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"], [role=\"radio\"], [role=\"switch\"]',matches:function(e,t,n){var r=axe.commons.aria,a=e.nodeName.toUpperCase(),o=r.getRole(e,{noImplicit:!0});return(\"AREA\"!==a||!e.getAttribute(\"href\"))&&(![\"INPUT\",\"SELECT\",\"TEXTAREA\"].includes(a)&&(\"IMG\"!==a&&(\"img\"!==o||\"SVG\"===a)&&(\"BUTTON\"!==a&&\"button\"!==o)))},tags:[\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"has-visible-text\"],none:[\"no-implicit-explicit-label\"]},{id:\"aria-valid-attr-value\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[{options:[],id:\"aria-valid-attr-value\"},\"aria-errormessage\"],any:[],none:[]},{id:\"aria-valid-attr\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[{options:[],id:\"aria-valid-attr\"}],none:[]},{id:\"audio-caption\",selector:\"audio\",enabled:!1,excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag121\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"autocomplete-valid\",matches:function(e,t,n){var r=axe.commons,a=r.text,o=r.aria,i=r.dom,u=t.attr(\"autocomplete\");if(!u||\"\"===a.sanitize(u))return!1;var s=t.props.nodeName;if(!1===[\"textarea\",\"input\",\"select\"].includes(s))return!1;if(\"input\"===s&&[\"submit\",\"reset\",\"button\",\"hidden\"].includes(t.props.type))return!1;var l=t.attr(\"aria-disabled\")||\"false\";if(t.hasAttr(\"disabled\")||\"true\"===l.toLowerCase())return!1;var c=t.attr(\"role\"),d=t.attr(\"tabindex\");if(\"-1\"===d&&c){var m=o.lookupTable.role[c];if(void 0===m||\"widget\"!==m.type)return!1}return!(\"-1\"===d&&t.actualNode&&!i.isVisible(t.actualNode,!1)&&!i.isVisible(t.actualNode,!0))},tags:[\"cat.forms\",\"wcag21aa\",\"wcag135\"],all:[\"autocomplete-valid\",\"autocomplete-appropriate\"],any:[],none:[]},{id:\"avoid-inline-spacing\",selector:\"[style]\",tags:[\"wcag21\",\"wcag1412\"],all:[\"avoid-inline-spacing\"],any:[],none:[]},{id:\"blink\",selector:\"blink\",excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag222\",\"section508\",\"section508.22.j\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"button-name\",selector:'button, [role=\"button\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"button-has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[]},{id:\"bypass\",selector:\"html\",pageLevel:!0,matches:function(e,t,n){return!!e.querySelector(\"a[href]\")},tags:[\"cat.keyboard\",\"wcag2a\",\"wcag241\",\"section508\",\"section508.22.o\"],all:[],any:[\"internal-link-present\",\"header-present\",\"landmark\"],none:[]},{id:\"checkboxgroup\",selector:\"input[type=checkbox][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"color-contrast\",matches:function(e,t,n){var r=e.nodeName.toUpperCase(),a=e.type;if(\"true\"===e.getAttribute(\"aria-disabled\")||axe.commons.dom.findUpVirtual(t,'[aria-disabled=\"true\"]'))return!1;if(\"INPUT\"===r)return-1===[\"hidden\",\"range\",\"color\",\"checkbox\",\"radio\",\"image\"].indexOf(a)&&!e.disabled;if(\"SELECT\"===r)return!!e.options.length&&!e.disabled;if(\"TEXTAREA\"===r)return!e.disabled;if(\"OPTION\"===r)return!1;if(\"BUTTON\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"button[disabled]\"))return!1;if(\"FIELDSET\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"fieldset[disabled]\"))return!1;var o=axe.commons.dom.findUpVirtual(t,\"label\");if(\"LABEL\"===r||o){var i=e,u=t;o&&(i=o,u=axe.utils.getNodeFromTree(o));var s=axe.commons.dom.getRootNode(i);if((l=i.htmlFor&&s.getElementById(i.htmlFor))&&l.disabled)return!1;if((l=axe.utils.querySelectorAll(u,'input:not([type=\"hidden\"]):not([type=\"image\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), select, textarea')).length&&l[0].actualNode.disabled)return!1}if(e.getAttribute(\"id\")){var l,c=axe.utils.escapeSelector(e.getAttribute(\"id\"));if((l=axe.commons.dom.getRootNode(e).querySelector(\"[aria-labelledby~=\"+c+\"]\"))&&l.disabled)return!1}if(\"\"===axe.commons.text.visibleVirtual(t,!1,!0))return!1;var d,m,p=document.createRange(),f=t.children,h=f.length;for(m=0;m<h;m++)3===(d=f[m]).actualNode.nodeType&&\"\"!==axe.commons.text.sanitize(d.actualNode.nodeValue)&&p.selectNodeContents(d.actualNode);var b=p.getClientRects();for(h=b.length,m=0;m<h;m++)if(axe.commons.dom.visuallyOverlaps(b[m],e))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:[\"cat.color\",\"wcag2aa\",\"wcag143\"],all:[],any:[\"color-contrast\"],none:[]},{id:\"css-orientation-lock\",selector:\"html\",tags:[\"cat.structure\",\"wcag134\",\"wcag21aa\",\"experimental\"],all:[\"css-orientation-lock\"],any:[],none:[],preload:!0},{id:\"definition-list\",selector:\"dl\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"structured-dlitems\",\"only-dlitems\"]},{id:\"dlitem\",selector:\"dd, dt\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"dlitem\"],none:[]},{id:\"document-title\",selector:\"html\",matches:function(e,t,n){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag242\"],all:[],any:[\"doc-has-title\"],none:[]},{id:\"duplicate-id-active\",selector:\"[id]\",matches:function(e,t,n){var r=axe.commons,a=r.dom,o=r.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'.concat(axe.utils.escapeSelector(i),'\"]');return Array.from(a.getRootNode(e).querySelectorAll(u)).some(a.isFocusable)&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-active\"],none:[]},{id:\"duplicate-id-aria\",selector:\"[id]\",matches:function(e,t,n){return axe.commons.aria.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-aria\"],none:[]},{id:\"duplicate-id\",selector:\"[id]\",matches:function(e,t,n){var r=axe.commons,a=r.dom,o=r.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'.concat(axe.utils.escapeSelector(i),'\"]');return Array.from(a.getRootNode(e).querySelectorAll(u)).every(function(e){return!a.isFocusable(e)})&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id\"],none:[]},{id:\"empty-heading\",selector:'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',matches:function(e,t,n){var r;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.name-role-value\",\"best-practice\"],all:[],any:[\"has-visible-text\"],none:[]},{id:\"focus-order-semantics\",selector:\"div, h1, h2, h3, h4, h5, h6, [role=heading], p, span\",matches:function(e,t,n){return axe.commons.dom.insertedIntoFocusOrder(e)},tags:[\"cat.keyboard\",\"best-practice\",\"experimental\"],all:[],any:[{options:[],id:\"has-widget-role\"},{options:[],id:\"valid-scrollable-semantics\"}],none:[]},{id:\"form-field-multiple-labels\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\"],all:[],any:[],none:[\"multiple-label\"]},{id:\"frame-tested\",selector:\"frame, iframe\",tags:[\"cat.structure\",\"review-item\",\"best-practice\"],all:[{options:{isViolation:!1},id:\"frame-tested\"}],any:[],none:[]},{id:\"frame-title-unique\",selector:\"frame[title], iframe[title]\",matches:function(e,t,n){var r=e.getAttribute(\"title\");return!(!r||!axe.commons.text.sanitize(r).trim())},tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"unique-frame-title\"]},{id:\"frame-title\",selector:\"frame, iframe\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag241\",\"wcag412\",\"section508\",\"section508.22.i\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"heading-order\",selector:\"h1, h2, h3, h4, h5, h6, [role=heading]\",matches:function(e,t,n){var r;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"heading-order\"],none:[]},{id:\"hidden-content\",selector:\"*\",excludeHidden:!1,tags:[\"cat.structure\",\"experimental\",\"review-item\",\"best-practice\"],all:[],any:[\"hidden-content\"],none:[]},{id:\"html-has-lang\",selector:\"html\",matches:function(e,t,n){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[\"has-lang\"],none:[]},{id:\"html-lang-valid\",selector:\"html[lang], html[xml\\\\:lang]\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"html-xml-lang-mismatch\",selector:\"html[lang][xml\\\\:lang]\",matches:function(e,t,n){var r=axe.utils.getBaseLang,a=r(e.getAttribute(\"lang\")),o=r(e.getAttribute(\"xml:lang\"));return axe.utils.validLangs().includes(a)&&axe.utils.validLangs().includes(o)},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[\"xml-lang-mismatch\"],any:[],none:[]},{id:\"image-alt\",selector:\"img\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[\"alt-space-value\"]},{id:\"image-redundant-alt\",selector:\"img\",tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"duplicate-img-label\"]},{id:\"input-button-name\",selector:'input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-if-present\",\"non-empty-value\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[]},{id:\"input-image-alt\",selector:'input[type=\"image\"]',tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"label-content-name-mismatch\",matches:function(e,t,n){var r=axe.commons,a=r.aria,o=r.text,i=a.getRole(e);return!!i&&(!!a.lookupTable.rolesOfType.widget.includes(i)&&(!!a.getRolesWithNameFromContents().includes(i)&&(!(!o.sanitize(a.arialabelText(e))&&!o.sanitize(a.arialabelledbyText(e)))&&!!o.sanitize(o.visibleVirtual(t)))))},tags:[\"wcag21a\",\"wcag253\",\"experimental\"],all:[],any:[\"label-content-name-mismatch\"],none:[]},{id:\"label-title-only\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"best-practice\"],all:[],any:[],none:[\"title-only\"]},{id:\"label\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\",\"wcag131\",\"section508\",\"section508.22.n\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"implicit-label\",\"explicit-label\",\"non-empty-title\"],none:[\"help-same-as-label\",\"hidden-explicit-label\"]},{id:\"landmark-banner-is-top-level\",selector:\"header:not([role]), [role=banner]\",matches:function(e,t,n){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-complementary-is-top-level\",selector:\"aside:not([role]), [role=complementary]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-contentinfo-is-top-level\",selector:\"footer:not([role]), [role=contentinfo]\",matches:function(e,t,n){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-main-is-top-level\",selector:\"main:not([role]), [role=main]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-no-duplicate-banner\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-banner\"}],none:[]},{id:\"landmark-no-duplicate-contentinfo\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-contentinfo\"}],none:[]},{id:\"landmark-one-main\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-has-main\"},{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-no-duplicate-main\"}],any:[],none:[]},{id:\"landmark-unique\",selector:\"[role=banner], [role=complementary], [role=contentinfo], [role=main], [role=navigation], [role=region], [role=search], [role=form], form, footer, header, aside, main, nav, section\",tags:[\"cat.semantics\",\"best-practice\"],matches:function(e,t,n){var o=[\"article\",\"aside\",\"main\",\"nav\",\"section\"].join(\",\");return function(e){var t=e.actualNode,n=axe.commons.aria.getRolesByType(\"landmark\"),r=axe.commons.aria.getRole(t);if(!r)return!1;var a=t.nodeName.toUpperCase();return\"HEADER\"===a||\"FOOTER\"===a?function(e){return!axe.commons.dom.findUpVirtual(e,o)}(e):\"SECTION\"!==a&&\"FORM\"!==a?0<=n.indexOf(r)||\"region\"===r:!!axe.commons.text.accessibleTextVirtual(e)}(t)&&axe.commons.dom.isVisible(e,!0)},all:[],any:[\"landmark-is-unique\"],none:[]},{id:\"layout-table\",selector:\"table\",matches:function(e,t,n){var r=(e.getAttribute(\"role\")||\"\").toLowerCase();return!((\"presentation\"===r||\"none\"===r)&&!axe.commons.dom.isFocusable(e)||axe.commons.table.isDataTable(e))},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"has-th\",\"has-caption\",\"has-summary\"]},{id:\"link-in-text-block\",selector:\"a[href], [role=link]\",matches:function(e,t,n){var r=axe.commons.text.sanitize(e.textContent),a=e.getAttribute(\"role\");return(!a||\"link\"===a)&&(!!r&&(!!axe.commons.dom.isVisible(e,!1)&&axe.commons.dom.isInTextBlock(e)))},excludeHidden:!1,tags:[\"cat.color\",\"experimental\",\"wcag2a\",\"wcag141\"],all:[\"link-in-text-block\"],any:[],none:[]},{id:\"link-name\",selector:\"a[href], [role=link][href]\",matches:function(e,t,n){return\"button\"!==e.getAttribute(\"role\")},tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag244\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\"],none:[\"focusable-no-name\"]},{id:\"list\",selector:\"ul, ol\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"only-listitems\"]},{id:\"listitem\",selector:\"li\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"listitem\"],none:[]},{id:\"marquee\",selector:\"marquee\",excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag222\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"meta-refresh\",selector:'meta[http-equiv=\"refresh\"]',excludeHidden:!1,tags:[\"cat.time\",\"wcag2a\",\"wcag2aaa\",\"wcag221\",\"wcag224\",\"wcag325\"],all:[],any:[\"meta-refresh\"],none:[]},{id:\"meta-viewport-large\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"best-practice\"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:\"meta-viewport-large\"}],none:[]},{id:\"meta-viewport\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"wcag2aa\",\"wcag144\"],all:[],any:[{options:{scaleMinimum:2},id:\"meta-viewport\"}],none:[]},{id:\"object-alt\",selector:\"object\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"p-as-heading\",selector:\"p\",matches:function(e,t,n){var r=Array.from(e.parentNode.childNodes),a=e.textContent.trim();return!(0===a.length||2<=(a.match(/[.!?:;](?![.!?:;])/g)||[]).length)&&0!==r.slice(r.indexOf(e)+1).filter(function(e){return\"P\"===e.nodeName.toUpperCase()&&\"\"!==e.textContent.trim()}).length},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\",\"experimental\"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:\"p-as-heading\"}],any:[],none:[]},{id:\"page-has-heading-one\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'},id:\"page-has-heading-one\"}],any:[],none:[]},{id:\"radiogroup\",selector:\"input[type=radio][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"region\",selector:\"html\",pageLevel:!0,tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"region\"],none:[]},{id:\"role-img-alt\",selector:\"[role='img']:not(svg):not(img):not(area):not(input):not(object)\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"scope-attr-valid\",selector:\"td[scope], th[scope]\",tags:[\"cat.tables\",\"best-practice\"],all:[\"html5-scope\",\"scope-value\"],any:[],none:[]},{id:\"scrollable-region-focusable\",matches:function(e,t,n){var r=axe.utils.querySelectorAll,a=axe.commons.dom.hasContentVirtual;return!1!=!!axe.utils.getScroll(e,13)&&!!r(t,\"*\").some(function(e){return a(e,!0,!0)})},tags:[\"wcag2a\",\"wcag211\"],all:[],any:[\"focusable-content\",\"focusable-element\"],none:[]},{id:\"server-side-image-map\",selector:\"img[ismap]\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag211\",\"section508\",\"section508.22.f\"],all:[],any:[],none:[\"exists\"]},{id:\"skip-link\",selector:'a[href^=\"#\"], a[href^=\"/#\"]',matches:function(e,t,n){return axe.commons.dom.isSkipLink(e)},tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"skip-link\"],none:[]},{id:\"tabindex\",selector:\"[tabindex]\",tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"tabindex\"],none:[]},{id:\"table-duplicate-name\",selector:\"table\",tags:[\"cat.tables\",\"best-practice\"],all:[],any:[],none:[\"same-caption-summary\"]},{id:\"table-fake-caption\",selector:\"table\",matches:function(e,t,n){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"caption-faked\"],any:[],none:[]},{id:\"td-has-header\",selector:\"table\",matches:function(e,t,n){if(axe.commons.table.isDataTable(e)){var r=axe.commons.table.toArray(e);return 3<=r.length&&3<=r[0].length&&3<=r[1].length&&3<=r[2].length}return!1},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-has-header\"],any:[],none:[]},{id:\"td-headers-attr\",selector:\"table\",tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-headers-attr\"],any:[],none:[]},{id:\"th-has-data-cells\",selector:\"table\",matches:function(e,t,n){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"th-has-data-cells\"],any:[],none:[]},{id:\"valid-lang\",selector:\"[lang], [xml\\\\:lang]\",matches:function(e,t,n){return\"html\"!==e.nodeName.toLowerCase()},tags:[\"cat.language\",\"wcag2aa\",\"wcag312\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"video-caption\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag122\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"video-description\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2aa\",\"wcag125\",\"section508\",\"section508.22.b\"],all:[],any:[],none:[\"description\"]}],checks:[{id:\"abstractrole\",evaluate:function(e,t,n,r){return\"abstract\"===axe.commons.aria.getRoleType(e.getAttribute(\"role\"))}},{id:\"aria-allowed-attr\",evaluate:function(e,t,n,r){t=t||{};var a,o,i,u=[],s=e.getAttribute(\"role\"),l=axe.utils.getNodeAttributes(e);if(s=s||axe.commons.aria.implicitRole(e),i=axe.commons.aria.allowedAttr(s),Array.isArray(t[s])&&(i=axe.utils.uniqueArray(t[s].concat(i))),s&&i)for(var c=0,d=l.length;c<d;c++)o=(a=l[c]).name,axe.commons.aria.validateAttr(o)&&!i.includes(o)&&u.push(o+'=\"'+a.nodeValue+'\"');return!u.length||(this.data(u),!1)}},{id:\"aria-allowed-role\",evaluate:function(e,t,n,r){var a=axe.commons.dom,o=t||{},i=o.allowImplicit,u=void 0===i||i,s=o.ignoredTags,l=void 0===s?[]:s,c=e.nodeName.toUpperCase();if(l.map(function(e){return e.toUpperCase()}).includes(c))return!0;var d=axe.commons.aria.getElementUnallowedRoles(e,u);if(d.length){if(this.data(d),!a.isVisible(e,!0))return;return!1}return!0},options:{allowImplicit:!0,ignoredTags:[]}},{id:\"aria-hidden-body\",evaluate:function(e,t,n,r){return\"true\"!==e.getAttribute(\"aria-hidden\")}},{id:\"aria-errormessage\",evaluate:function(n,e,t,r){var a=axe.commons,o=a.aria,i=a.dom;e=Array.isArray(e)?e:[];var u=n.getAttribute(\"aria-errormessage\"),s=n.hasAttribute(\"aria-errormessage\"),l=i.getRootNode(n);return!(-1===e.indexOf(u)&&s&&!function(e){if(\"\"===e.trim())return o.lookupTable.attributes[\"aria-errormessage\"].allowEmpty;var t=e&&l.getElementById(e);return t?\"alert\"===t.getAttribute(\"role\")||\"assertive\"===t.getAttribute(\"aria-live\")||-1<axe.utils.tokenList(n.getAttribute(\"aria-describedby\")||\"\").indexOf(e):void 0}(u))||(this.data(axe.utils.tokenList(u)),!1)}},{id:\"has-widget-role\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"role\");if(null===a)return!1;var o=axe.commons.aria.getRoleType(a);return\"widget\"===o||\"composite\"===o},options:[]},{id:\"implicit-role-fallback\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"role\");if(null===a||!axe.commons.aria.isValidRole(a))return!0;var o=axe.commons.aria.getRoleType(a);return axe.commons.aria.implicitRole(e)===o}},{id:\"invalidrole\",evaluate:function(e,t,n,r){return!axe.commons.aria.isValidRole(e.getAttribute(\"role\"),{allowAbstract:!0})}},{id:\"no-implicit-explicit-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.aria,i=a.text,u=o.getRole(e,{noImplicit:!0});this.data(u);var s=i.sanitize(i.labelText(n)).toLowerCase(),l=i.sanitize(i.accessibleText(e)).toLowerCase();return!(!l&&!s)&&(!((l||!s)&&l.includes(s))&&void 0)}},{id:\"aria-required-attr\",evaluate:function(e,t,n,r){t=t||{};var a=[],o=axe.commons.forms,i=o.isNativeTextbox,u=o.isNativeSelect,s=o.isAriaTextbox,l=o.isAriaListbox,c=o.isAriaCombobox,d=o.isAriaRange,m={\"aria-valuenow\":function(){return!(i(e)||u(e)||s(e)||l(e)||c(e)||d(e)&&e.hasAttribute(\"aria-valuenow\"))}};if(e.hasAttributes()){var p=e.getAttribute(\"role\"),f=axe.commons.aria.requiredAttr(p);if(Array.isArray(t[p])&&(f=axe.utils.uniqueArray(t[p],f)),p&&f)for(var h=0,b=f.length;h<b;h++){var g=f[h];e.getAttribute(g)||m[g]&&!m[g]()||a.push(g)}}return!a.length||(this.data(a),!1)}},{id:\"aria-required-children\",evaluate:function(e,t,m,n){var r=axe.commons.aria.requiredOwned,i=axe.commons.aria.implicitNodes,u=axe.utils.matchesSelector,p=axe.commons.dom.idrefs,a=t&&Array.isArray(t.reviewEmpty)?t.reviewEmpty:[];function f(e,t,n,r){if(null===e)return!1;var a=i(n),o=['[role=\"'+n+'\"]'];return a&&(o=o.concat(a)),o=o.join(\",\"),r&&u(e,o)||!!axe.utils.querySelectorAll(t,o)[0]}function h(e,t){var n,r;for(n=0,r=e.length;n<r;n++)if(null!==e[n]){var a=axe.utils.getNodeFromTree(e[n]);if(f(e[n],a,t,!0))return!0}return!1}var o=e.getAttribute(\"role\"),s=r(o);if(!s)return!0;var l=!1,c=s.one;if(!c){l=!0;c=s.all}var d=function(e,t,n,r){var a,o=t.length,i=[],u=p(e,\"aria-owns\");for(a=0;a<o;a++){var s=t[a];if(f(e,m,s)||h(u,s)){if(!n)return null}else n&&i.push(s)}if(\"combobox\"===r){var l=i.indexOf(\"textbox\");0<=l&&\"INPUT\"===e.nodeName.toUpperCase()&&[\"text\",\"search\",\"email\",\"url\",\"tel\"].includes(e.type)&&i.splice(l,1);var c=i.indexOf(\"listbox\"),d=e.getAttribute(\"aria-expanded\");0<=c&&(!d||\"false\"===d)&&i.splice(c,1)}return i.length?i:!n&&t.length?t:null}(e,c,l,o);return!d||(this.data(d),!(!a.includes(o)||0!==e.children.length||0!==p(e,\"aria-owns\").length)&&void 0)},options:{reviewEmpty:[\"doc-bibliography\",\"doc-endnotes\",\"grid\",\"list\",\"listbox\",\"table\",\"tablist\",\"tree\",\"treegrid\",\"rowgroup\"]}},{id:\"aria-required-parent\",evaluate:function(e,t,n,r){function u(e){return(axe.commons.aria.implicitNodes(e)||[]).concat('[role=\"'+e+'\"]').join(\",\")}function a(e,t,n){var r,a,o=e.actualNode.getAttribute(\"role\"),i=[];if(!(t=t||axe.commons.aria.requiredContext(o)))return null;for(r=0,a=t.length;r<a;r++){if(n&&axe.utils.matchesSelector(e.actualNode,u(t[r])))return null;if(axe.commons.dom.findUpVirtual(e,u(t[r])))return null;i.push(t[r])}return i}var o=a(n);if(!o)return!0;var i=function(e){for(var t=[],n=null;e;){if(e.getAttribute(\"id\")){var r=axe.utils.escapeSelector(e.getAttribute(\"id\"));(n=axe.commons.dom.getRootNode(e).querySelector(\"[aria-owns~=\".concat(r,\"]\")))&&t.push(n)}e=e.parentElement}return t.length?t:null}(e);if(i)for(var s=0,l=i.length;s<l;s++)if(!(o=a(axe.utils.getNodeFromTree(i[s]),o,!0)))return!0;return this.data(o),!1}},{id:\"aria-unsupported-attr\",evaluate:function(o,e,t,n){var i=o.nodeName.toUpperCase(),u=axe.commons.aria.lookupTable,s=axe.commons.aria.getRole(o),r=Array.from(axe.utils.getNodeAttributes(o)).filter(function(e){var t=e.name,n=u.attributes[t];if(!axe.commons.aria.validateAttr(t))return!1;var r=n.unsupported;if(\"object\"!==S(r))return!!r;var a=axe.commons.matches(o,r.exceptions);return Object.keys(u.evaluateRoleForElement).includes(i)?!u.evaluateRoleForElement[i]({node:o,role:s,out:a}):!a}).map(function(e){return e.name.toString()});return!!r.length&&(this.data(r),!0)}},{id:\"unsupportedrole\",evaluate:function(e,t,n,r){return axe.commons.aria.isUnsupportedRole(axe.commons.aria.getRole(e))}},{id:\"aria-valid-attr-value\",evaluate:function(e,t,n,r){t=Array.isArray(t)?t:[];for(var a=[],o=/^aria-/,i=axe.utils.getNodeAttributes(e),u=[\"aria-errormessage\"],s={\"aria-controls\":function(){return\"false\"!==e.getAttribute(\"aria-expanded\")&&\"false\"!==e.getAttribute(\"aria-selected\")},\"aria-owns\":function(){return\"false\"!==e.getAttribute(\"aria-expanded\")}},l=0,c=i.length;l<c;l++){var d=i[l],m=d.name;u.includes(m)||-1!==t.indexOf(m)||!o.test(m)||s[m]&&!s[m]()||axe.commons.aria.validateAttrValue(e,m)||a.push(\"\".concat(m,'=\"').concat(d.nodeValue,'\"'))}return!a.length||(this.data(a),!1)},options:[]},{id:\"aria-valid-attr\",evaluate:function(e,t,n,r){t=Array.isArray(t)?t:[];for(var a,o=[],i=/^aria-/,u=axe.utils.getNodeAttributes(e),s=0,l=u.length;s<l;s++)a=u[s].name,-1===t.indexOf(a)&&i.test(a)&&!axe.commons.aria.validateAttr(a)&&o.push(a);return!o.length||(this.data(o),!1)},options:[]},{id:\"valid-scrollable-semantics\",evaluate:function(e,t,n,r){var a,o,i,u={ARTICLE:!0,ASIDE:!0,NAV:!0,SECTION:!0},s={application:!0,banner:!1,complementary:!0,contentinfo:!0,form:!0,main:!0,navigation:!0,region:!0,search:!1};return(o=(i=e).getAttribute(\"role\"))&&s[o.toLowerCase()]||!1||(a=i.nodeName.toUpperCase(),u[a]||!1)},options:[]},{id:\"color-contrast\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.color,u=a.text;if(!o.isVisible(e,!1))return!0;var s,l=!!(t||{}).noScroll,c=[],d=i.getBackgroundColor(e,c,l),m=i.getForegroundColor(e,l),p=window.getComputedStyle(e),f=parseFloat(p.getPropertyValue(\"font-size\")),h=p.getPropertyValue(\"font-weight\"),b=-1!==[\"bold\",\"bolder\",\"600\",\"700\",\"800\",\"900\"].indexOf(h),g=i.hasValidContrastRatio(d,m,f,b),y=Math.floor(100*g.contrastRatio)/100;null===d&&(s=i.incompleteData.get(\"bgColor\"));var v=1==y,D=1===u.visibleVirtual(n,!1,!0).length;v?s=i.incompleteData.set(\"bgColor\",\"equalRatio\"):D&&(s=\"shortTextContent\");var w={fgColor:m?m.toHexString():void 0,bgColor:d?d.toHexString():void 0,contrastRatio:g?y:void 0,fontSize:(72*f/96).toFixed(1)+\"pt\",fontWeight:b?\"bold\":\"normal\",missingData:s,expectedContrastRatio:g.expectedContrastRatio+\":1\"};return this.data(w),null===m||null===d||v||D&&!g.isValid?(s=null,i.incompleteData.clear(),void this.relatedNodes(c)):(g.isValid||this.relatedNodes(c),g.isValid)}},{id:\"link-in-text-block\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.color,i=a.dom;function u(e,t){var n=e.getRelativeLuminance(),r=t.getRelativeLuminance();return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}var s=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function l(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return-1!==s.indexOf(t)||\"table-\"===t.substr(0,6)}if(l(e))return!1;for(var c,d,m=i.getComposedParent(e);1===m.nodeType&&!l(m);)m=i.getComposedParent(m);if(this.relatedNodes([m]),o.elementIsDistinct(e,m))return!0;if(c=o.getForegroundColor(e),d=o.getForegroundColor(m),c&&d){var p,f=u(c,d);return 1===f||(3<=f?(axe.commons.color.incompleteData.set(\"fgColor\",\"bgContrast\"),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear()):(c=o.getBackgroundColor(e),d=o.getBackgroundColor(m),(!c||!d||3<=u(c,d))&&(p=c&&d?\"bgContrast\":axe.commons.color.incompleteData.get(\"bgColor\"),axe.commons.color.incompleteData.set(\"fgColor\",p),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear())))}}},{id:\"autocomplete-appropriate\",evaluate:function(e,t,n,r){if(\"input\"!==n.props.nodeName)return!0;var a=[\"text\",\"search\",\"number\"],o=[\"text\",\"search\",\"url\"],i={bday:[\"text\",\"search\",\"date\"],email:[\"text\",\"search\",\"email\"],\"cc-exp\":[\"text\",\"search\",\"month\"],\"street-address\":[\"text\"],tel:[\"text\",\"search\",\"tel\"],\"cc-exp-month\":a,\"cc-exp-year\":a,\"transaction-amount\":a,\"bday-day\":a,\"bday-month\":a,\"bday-year\":a,\"new-password\":[\"text\",\"search\",\"password\"],\"current-password\":[\"text\",\"search\",\"password\"],url:o,photo:o,impp:o};\"object\"===S(t)&&Object.keys(t).forEach(function(e){i[e]||(i[e]=[]),i[e]=i[e].concat(t[e])});var u=n.attr(\"autocomplete\").split(/\\s+/g).map(function(e){return e.toLowerCase()}),s=u[u.length-1];if(axe.commons.text.autocomplete.stateTerms.includes(s))return!0;var l=i[s],c=n.hasAttr(\"type\")?axe.commons.text.sanitize(n.attr(\"type\")).toLowerCase():\"text\";return c=axe.utils.validInputTypes().includes(c)?c:\"text\",void 0===l?\"text\"===c:l.includes(c)}},{id:\"autocomplete-valid\",evaluate:function(e,t,n,r){var a=n.attr(\"autocomplete\")||\"\";return axe.commons.text.isValidAutocomplete(a,t)}},{id:\"fieldset\",evaluate:function(e,t,n,r){var o,i=this;function u(e,t){return axe.utils.toArray(e.querySelectorAll('select,textarea,button,input:not([name=\"'+t+'\"]):not([type=\"hidden\"])'))}var a={name:e.getAttribute(\"name\"),type:e.getAttribute(\"type\")},s=function(e){var t=axe.utils.escapeSelector(e.actualNode.name),n=axe.commons.dom.getRootNode(e.actualNode).querySelectorAll('input[type=\"'+axe.utils.escapeSelector(e.actualNode.type)+'\"][name=\"'+t+'\"]');if(n.length<2)return!0;var r=axe.commons.dom.findUpVirtual(e,\"fieldset\"),a=axe.commons.dom.findUpVirtual(e,'[role=\"group\"]'+(\"radio\"===e.actualNode.type?',[role=\"radiogroup\"]':\"\"));return a||r?r?function(e,t){var n=e.firstElementChild;if(!n||\"LEGEND\"!==n.nodeName.toUpperCase())return i.relatedNodes([e]),!(o=\"no-legend\");if(!axe.commons.text.accessibleText(n))return i.relatedNodes([n]),!(o=\"empty-legend\");var r=u(e,t);return!r.length||(i.relatedNodes(r),!(o=\"mixed-inputs\"))}(r,t):function(e,t){var n=axe.commons.dom.idrefs(e,\"aria-labelledby\").some(function(e){return e&&axe.commons.text.accessibleText(e)}),r=e.getAttribute(\"aria-label\");if(!(n||r&&axe.commons.text.sanitize(r)))return i.relatedNodes(e),!(o=\"no-group-label\");var a=u(e,t);return!a.length||(i.relatedNodes(a),!(o=\"group-mixed-inputs\"))}(a,t):(o=\"no-group\",i.relatedNodes(function(e,t){return axe.utils.toArray(e).filter(function(e){return e!==t})}(n,e.actualNode)),!1)}(n);return s||(a.failureCode=o),this.data(a),s},after:function(e,t){var r={};return e.filter(function(e){if(e.result)return!0;var t=e.data;if(t){if(r[t.type]=r[t.type]||{},!r[t.type][t.name])return r[t.type][t.name]=[t],!0;var n=r[t.type][t.name].some(function(e){return e.failureCode===t.failureCode});return n||r[t.type][t.name].push(t),!n}return!1})}},{id:\"group-labelledby\",evaluate:function(n,e,t,r){var a=axe.commons,o=a.dom,i=a.text,u=axe.utils.escapeSelector(n.type),s=axe.utils.escapeSelector(n.name),l=o.getRootNode(n),c={name:n.name,type:n.type},d=Array.from(l.querySelectorAll('input[type=\"'.concat(u,'\"][name=\"').concat(s,'\"]')));if(d.length<=1)return this.data(c),!0;var m=o.idrefs(n,\"aria-labelledby\").filter(function(e){return!!e}),p=m.slice();d.forEach(function(e){if(e!==n){var t=o.idrefs(e,\"aria-labelledby\").filter(function(e){return e});m=m.filter(function(e){return t.includes(e)}),p=p.filter(function(e){return!t.includes(e)})}});var f={inLabelledByContext:!0};return p=p.filter(function(e){return i.accessibleText(e,f)}),m=m.filter(function(e){return i.accessibleText(e,f)}),0<p.length&&0<m.length?(this.data(c),!0):(0<p.length&&0===m.length?c.failureCode=\"no-shared-label\":0===p.length&&0<m.length&&(c.failureCode=\"no-unique-label\"),this.data(c),!1)},after:function(e,t){var n={};return e.filter(function(e){var t=e.data;return!(!t||(n[t.type]=n[t.type]||{},n[t.type][t.name]))&&(n[t.type][t.name]=!0)})}},{id:\"accesskeys\",evaluate:function(e,t,n,r){return axe.commons.dom.isVisible(e,!1)&&(this.data(e.getAttribute(\"accesskey\")),this.relatedNodes([e])),!0},after:function(e,t){var n={};return e.filter(function(e){if(!e.data)return!1;var t=e.data.toUpperCase();return n[t]?(n[t].relatedNodes.push(e.relatedNodes[0]),!1):((n[t]=e).relatedNodes=[],!0)}).map(function(e){return e.result=!!e.relatedNodes.length,e})}},{id:\"focusable-content\",evaluate:function(e,t,n,r){var a=n.tabbableElements;return!!a&&0<a.filter(function(e){return e!==n}).length}},{id:\"focusable-disabled\",evaluate:function(e,t,n,r){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=n.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();return a.includes(r)&&e.push(n),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"focusable-element\",evaluate:function(e,t,n,r){var a=n.isFocusable,o=parseInt(n.actualNode.getAttribute(\"tabindex\"),10);return(o=isNaN(o)?null:o)?a&&0<=o:a}},{id:\"focusable-no-name\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"tabindex\");return!!(axe.commons.dom.isFocusable(e)&&-1<a)&&!axe.commons.text.accessibleTextVirtual(n)}},{id:\"focusable-not-tabbable\",evaluate:function(e,t,n,r){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=n.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();return a.includes(r)||e.push(n),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"landmark-is-top-level\",evaluate:function(e,t,n,r){var a=axe.commons.aria.getRolesByType(\"landmark\"),o=axe.commons.dom.getComposedParent(e);for(this.data({role:e.getAttribute(\"role\")||axe.commons.aria.implicitRole(e)});o;){var i=o.getAttribute(\"role\");if(i||\"FORM\"===o.nodeName.toUpperCase()||(i=axe.commons.aria.implicitRole(o)),i&&a.includes(i))return!1;o=axe.commons.dom.getComposedParent(o)}return!0}},{id:\"page-has-heading-one\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'}},{id:\"page-has-main\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"page-no-duplicate-banner\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-contentinfo\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-main\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"tabindex\",evaluate:function(e,t,n,r){return e.tabIndex<=0}},{id:\"alt-space-value\",evaluate:function(e,t,n,r){var a=/^\\s+$/.test(e.getAttribute(\"alt\"));return e.hasAttribute(\"alt\")&&a}},{id:\"duplicate-img-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.aria,i=a.text,u=a.dom;if([\"none\",\"presentation\"].includes(o.getRole(e)))return!1;var s=u.findUpVirtual(n,'button, [role=\"button\"], a[href], p, li, td, th'),l=axe.utils.getNodeFromTree(s),c=i.visibleVirtual(l,!0).toLowerCase();return\"\"!==c&&c===i.accessibleTextVirtual(n).toLowerCase()}},{id:\"explicit-label\",evaluate:function(e,t,n,r){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'.concat(o,'\"]'));if(i)return!axe.commons.dom.isVisible(i)||!!axe.commons.text.accessibleText(i)}return!1}},{id:\"help-same-as-label\",evaluate:function(e,t,n,r){var a=axe.commons.text.labelVirtual(n),o=e.getAttribute(\"title\");if(!a)return!1;o||(o=\"\",e.getAttribute(\"aria-describedby\")&&(o=axe.commons.dom.idrefs(e,\"aria-describedby\").map(function(e){return e?axe.commons.text.accessibleText(e):\"\"}).join(\"\")));return axe.commons.text.sanitize(o)===axe.commons.text.sanitize(a)},enabled:!1},{id:\"hidden-explicit-label\",evaluate:function(e,t,n,r){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'.concat(o,'\"]'));if(i&&!axe.commons.dom.isVisible(i,!0))return\"\"===axe.commons.text.accessibleTextVirtual(n).trim()}return!1}},{id:\"implicit-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.text,u=o.findUpVirtual(n,\"label\");return!!u&&!!i.accessibleText(u,{inControlContext:!0})}},{id:\"label-content-name-mismatch\",evaluate:function(e,t,n,r){var a=axe.commons.text,o=a.accessibleText(e).toLowerCase();if(!(a.isHumanInterpretable(o)<1)){var i=a.sanitize(a.visibleVirtual(n)).toLowerCase();return a.isHumanInterpretable(i)<1?!!u(i,o)||void 0:u(i,o)}function u(e,t){var n=s(t),r=s(e);return!(!n||!r)&&n.includes(r)}function s(e){var t=a.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return a.sanitize(t)}}},{id:\"multiple-label\",evaluate:function(e,t,n,r){var a=axe.utils.escapeSelector(e.getAttribute(\"id\")),o=e.parentNode,i=axe.commons.dom.getRootNode(e);i=i.documentElement||i;var u=Array.from(i.querySelectorAll('label[for=\"'.concat(a,'\"]')));for(u.length&&(u=u.filter(function(e){return axe.commons.dom.isVisible(e)}));o;)\"LABEL\"===o.nodeName.toUpperCase()&&-1===u.indexOf(o)&&u.push(o),o=o.parentNode;if(this.relatedNodes(u),1<u.length){var s=u.filter(function(e){return axe.commons.dom.isVisible(e,!0)});return 1<s.length||!axe.commons.dom.idrefs(e,\"aria-labelledby\").includes(s[0])}return!1}},{id:\"title-only\",evaluate:function(e,t,n,r){return!(axe.commons.text.labelVirtual(n)||!e.getAttribute(\"title\")&&!e.getAttribute(\"aria-describedby\"))}},{id:\"landmark-is-unique\",evaluate:function(e,t,n,r){var a=axe.commons.aria.getRole(e),o=axe.commons.text.accessibleTextVirtual(n);return o=o?o.toLowerCase():null,this.data({role:a,accessibleText:o}),this.relatedNodes([e]),!0},after:function(e,t){var n=[];return e.filter(function(t){var e=n.find(function(e){return t.data.role===e.data.role&&t.data.accessibleText===e.data.accessibleText});return e?(e.result=!1,e.relatedNodes.push(t.relatedNodes[0]),!1):(n.push(t),t.relatedNodes=[],!0)})}},{id:\"has-lang\",evaluate:function(e,t,n,r){return!!(e.getAttribute(\"lang\")||e.getAttribute(\"xml:lang\")||\"\").trim()}},{id:\"valid-lang\",evaluate:function(a,e,t,n){var o,r;return o=(e||axe.utils.validLangs()).map(axe.utils.getBaseLang),!!(r=[\"lang\",\"xml:lang\"].reduce(function(e,t){var n=a.getAttribute(t);if(\"string\"!=typeof n)return e;var r=axe.utils.getBaseLang(n);return\"\"!==r&&-1===o.indexOf(r)&&e.push(t+'=\"'+a.getAttribute(t)+'\"'),e},[])).length&&(this.data(r),!0)}},{id:\"xml-lang-mismatch\",evaluate:function(e,t,n,r){var a=axe.utils.getBaseLang;return a(e.getAttribute(\"lang\"))===a(e.getAttribute(\"xml:lang\"))}},{id:\"dlitem\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getComposedParent(e),o=a.nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0});return\"DIV\"===o&&[\"presentation\",\"none\",null].includes(i)&&(o=(a=axe.commons.dom.getComposedParent(a)).nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0})),\"DL\"===o&&(!i||\"list\"===i)}},{id:\"listitem\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getComposedParent(e);if(a){var o=a.nodeName.toUpperCase(),i=(a.getAttribute(\"role\")||\"\").toLowerCase();return\"list\"===i||(!i||!axe.commons.aria.isValidRole(i))&&[\"UL\",\"OL\"].includes(o)}}},{id:\"only-dlitems\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.aria,u=[\"definition\",\"term\",\"list\"],s=n.children.reduce(function(e,t){var n=t.actualNode;return\"DIV\"===n.nodeName.toUpperCase()&&null===i.getRole(n)?e.concat(t.children):e.concat(t)},[]).reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();if(1===n.nodeType&&o.isVisible(n,!0,!1)){var a=i.getRole(n,{noImplicit:!0});(\"DT\"!==r&&\"DD\"!==r||a)&&(u.includes(a)||e.badNodes.push(n))}else 3===n.nodeType&&\"\"!==n.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0);return e},{badNodes:[],hasNonEmptyTextNode:!1});return s.badNodes.length&&this.relatedNodes(s.badNodes),!!s.badNodes.length||s.hasNonEmptyTextNode}},{id:\"only-listitems\",evaluate:function(e,t,n,r){var o=axe.commons.dom,a=n.children.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();if(1===n.nodeType&&o.isVisible(n,!0,!1)){var a=function(e,t){return\"listitem\"===e||\"LI\"===t&&!e}((n.getAttribute(\"role\")||\"\").toLowerCase(),r);e.hasListItem=function(e,t,n){return e||\"LI\"===t&&n||n}(e.hasListItem,r,a),a&&(e.isEmpty=!1),\"LI\"!==r||a||e.liItemsWithRole++,\"LI\"===r||a||e.badNodes.push(n)}return 3===n.nodeType&&\"\"!==n.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0),e},{badNodes:[],isEmpty:!0,hasNonEmptyTextNode:!1,hasListItem:!1,liItemsWithRole:0}),i=n.children.filter(function(e){return\"LI\"===e.actualNode.nodeName.toUpperCase()}),u=0<a.liItemsWithRole&&i.length===a.liItemsWithRole;return a.badNodes.length&&this.relatedNodes(a.badNodes),!(a.hasListItem||a.isEmpty&&!u)||!!a.badNodes.length||a.hasNonEmptyTextNode}},{id:\"structured-dlitems\",evaluate:function(e,t,n,r){var a=n.children;if(!a||!a.length)return!1;for(var o,i=!1,u=!1,s=0;s<a.length;s++){if(\"DT\"===(o=a[s].actualNode.nodeName.toUpperCase())&&(i=!0),i&&\"DD\"===o)return!1;\"DD\"===o&&(u=!0)}return i||u}},{id:\"caption\",evaluate:function(e,t,n,r){return!axe.utils.querySelectorAll(n,\"track\").some(function(e){return\"captions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"description\",evaluate:function(e,t,n,r){return!axe.utils.querySelectorAll(n,\"track\").some(function(e){return\"descriptions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"frame-tested\",evaluate:function(e,t,n,r){var a=this.async(),o=Object.assign({isViolation:!1,timeout:500},t),i=o.isViolation,u=o.timeout,s=setTimeout(function(){s=setTimeout(function(){s=null,a(!i&&void 0)},0)},u);axe.utils.respondable(e.contentWindow,\"axe.ping\",null,void 0,function(){null!==s&&(clearTimeout(s),a(!0))})},options:{isViolation:!1}},{id:\"css-orientation-lock\",evaluate:function(e,t,n,r){var a=(r||{}).cssom,o=void 0===a?void 0:a;if(o&&o.length){var i=o.reduce(function(e,t){var n=t.sheet,r=t.root,a=t.shadowId,o=a||\"topDocument\";if(e[o]||(e[o]={root:r,rules:[]}),!n||!n.cssRules)return e;var i=Array.from(n.cssRules);return e[o].rules=e[o].rules.concat(i),e},{}),s=!1,l=[];return Object.keys(i).forEach(function(e){var t=i[e],u=t.root,n=t.rules.filter(function(e){return 4===e.type});if(n&&n.length){var r=n.filter(function(e){var t=e.cssText;return/orientation:\\s*landscape/i.test(t)||/orientation:\\s*portrait/i.test(t)});r&&r.length&&r.forEach(function(e){e.cssRules.length&&Array.from(e.cssRules).forEach(function(e){if(e.selectorText&&!(e.style.length<=0)){var t=e.style.transform||e.style.webkitTransform||e.style.msTransform||!1;if(t){var n=t.match(/rotate\\(([^)]+)deg\\)/),r=parseInt(n&&n[1]||0),a=r%90==0&&r%180!=0;if(a&&\"HTML\"!==e.selectorText.toUpperCase()){var o=e.selectorText,i=Array.from(u.querySelectorAll(o));i&&i.length&&(l=l.concat(i))}s=a}}})})}}),s?(l.length&&this.relatedNodes(l),!1):!0}}},{id:\"meta-viewport-large\",evaluate:function(e,t,n,r){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:5,lowerBound:2}},{id:\"meta-viewport\",evaluate:function(e,t,n,r){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:2}},{id:\"header-present\",evaluate:function(e,t,n,r){return!!axe.utils.querySelectorAll(n,'h1, h2, h3, h4, h5, h6, [role=\"heading\"]')[0]}},{id:\"heading-order\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"aria-level\");if(null!==a)return this.data(parseInt(a,10)),!0;var o=e.nodeName.toUpperCase().match(/H(\\d)/);return o&&this.data(parseInt(o[1],10)),!0},after:function(e,t){if(e.length<2)return e;for(var n=e[0].data,r=1;r<e.length;r++)e[r].result&&e[r].data>n+1&&(e[r].result=!1),n=e[r].data;return e}},{id:\"internal-link-present\",evaluate:function(e,t,n,r){return axe.utils.querySelectorAll(n,\"a[href]\").some(function(e){return/^#[^/!]/.test(e.actualNode.getAttribute(\"href\"))})}},{id:\"landmark\",evaluate:function(e,t,n,r){return 0<axe.utils.querySelectorAll(n,'main, [role=\"main\"]').length}},{id:\"meta-refresh\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"content\")||\"\",o=a.split(/[;,]/);return\"\"===a||\"0\"===o[0]}},{id:\"p-as-heading\",evaluate:function(e,t,n,r){var a=Array.from(e.parentNode.children),o=a.indexOf(e),i=(t=t||{}).margins||[],u=a.slice(o+1).find(function(e){return\"P\"===e.nodeName.toUpperCase()}),s=a.slice(0,o).reverse().find(function(e){return\"P\"===e.nodeName.toUpperCase()});function l(e){var t=window.getComputedStyle(function(e){for(var t=e,n=e.textContent.trim(),r=n;r===n&&void 0!==t;){var a=-1;if(0===(e=t).children.length)return e;for(;a++,\"\"===(r=e.children[a].textContent.trim())&&a+1<e.children.length;);t=e.children[a]}return e}(e));return{fontWeight:function(e){switch(e){case\"lighter\":return 100;case\"normal\":return 400;case\"bold\":return 700;case\"bolder\":return 900}return e=parseInt(e),isNaN(e)?400:e}(t.getPropertyValue(\"font-weight\")),fontSize:parseInt(t.getPropertyValue(\"font-size\")),isItalic:\"italic\"===t.getPropertyValue(\"font-style\")}}function c(n,r,e){return e.reduce(function(e,t){return e||(!t.size||n.fontSize/t.size>r.fontSize)&&(!t.weight||n.fontWeight-t.weight>r.fontWeight)&&(!t.italic||n.isItalic&&!r.isItalic)},!1)}var d=l(e),m=u?l(u):null,p=s?l(s):null;if(!m||!c(d,m,i))return!0;var f=axe.commons.dom.findUpVirtual(n,\"blockquote\");return!!(f&&\"BLOCKQUOTE\"===f.nodeName.toUpperCase()||p&&!c(d,p,i))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:\"region\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.aria,u=i.getRolesByType(\"landmark\"),s=u.reduce(function(e,t){return e.concat(i.implicitNodes(t))},[]).filter(function(e){return null!==e});var l=function e(t){var n=t.actualNode;return function(a){var o=a.actualNode,e=axe.commons.aria.getRole(o,{noImplicit:!0}),t=(o.getAttribute(\"aria-live\")||\"\").toLowerCase().trim();return e?\"dialog\"===e||u.includes(e):!![\"assertive\",\"polite\"].includes(t)||s.some(function(e){var t=axe.utils.matchesSelector(o,e);if(\"FORM\"!==o.nodeName.toUpperCase())return t;var n=o.getAttribute(\"title\"),r=n&&\"\"!==n.trim()?axe.commons.text.sanitize(n):null;return t&&(!!i.labelVirtual(a)||!!r)})}(t)||o.isSkipLink(t.actualNode)&&o.getElementByReference(t.actualNode,\"href\")||!o.isVisible(n,!0)?[]:o.hasContent(n,!0)?[n]:t.children.filter(function(e){return 1===e.actualNode.nodeType}).map(e).reduce(function(e,t){return e.concat(t)},[])}(n);return this.relatedNodes(l),0===l.length},after:function(e,t){return[e[0]]}},{id:\"skip-link\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getElementByReference(e,\"href\");return!!a&&(axe.commons.dom.isVisible(a,!0)||void 0)}},{id:\"unique-frame-title\",evaluate:function(e,t,n,r){var a=axe.commons.text.sanitize(e.title).trim().toLowerCase();return this.data(a),!0},after:function(e,t){var n={};return e.forEach(function(e){n[e.data]=void 0!==n[e.data]?++n[e.data]:0}),e.forEach(function(e){e.result=!!n[e.data]}),e}},{id:\"duplicate-id-active\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"duplicate-id-aria\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"duplicate-id\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"aria-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelText(e))}},{id:\"aria-labelledby\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelledbyText(e))}},{id:\"avoid-inline-spacing\",evaluate:function(t,e,n,r){var a=[\"line-height\",\"letter-spacing\",\"word-spacing\"].filter(function(e){if(\"important\"===t.style.getPropertyPriority(e))return e});return!(0<a.length)||(this.data(a),!1)}},{id:\"button-has-visible-text\",evaluate:function(e,t,n,r){var a,o=e.nodeName.toUpperCase(),i=e.getAttribute(\"role\");return(\"BUTTON\"===o||\"button\"===i&&\"INPUT\"!==o)&&(a=axe.commons.text.accessibleTextVirtual(n),this.data(a),!!a)}},{id:\"doc-has-title\",evaluate:function(e,t,n,r){var a=document.title;return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"exists\",evaluate:function(e,t,n,r){return!0}},{id:\"has-alt\",evaluate:function(e,t,n,r){var a=e.nodeName.toLowerCase();return e.hasAttribute(\"alt\")&&(\"img\"===a||\"input\"===a||\"area\"===a)}},{id:\"has-visible-text\",evaluate:function(e,t,n,r){return 0<axe.commons.text.accessibleTextVirtual(n).length}},{id:\"is-on-screen\",evaluate:function(e,t,n,r){return axe.commons.dom.isVisible(e,!1)&&!axe.commons.dom.isOffscreen(e)}},{id:\"non-empty-alt\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"alt\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"non-empty-if-present\",evaluate:function(e,t,n,r){var a=e.nodeName.toUpperCase(),o=(e.getAttribute(\"type\")||\"\").toLowerCase(),i=e.getAttribute(\"value\");return this.data(i),!(\"INPUT\"!==a||![\"submit\",\"reset\"].includes(o))&&null===i}},{id:\"non-empty-title\",evaluate:function(e,t,n,r){var a=axe.commons.text;return!!a.sanitize(a.titleText(e))}},{id:\"non-empty-value\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"value\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"role-none\",evaluate:function(e,t,n,r){return\"none\"===e.getAttribute(\"role\")}},{id:\"role-presentation\",evaluate:function(e,t,n,r){return\"presentation\"===e.getAttribute(\"role\")}},{id:\"caption-faked\",evaluate:function(e,t,n,r){var a=axe.commons.table.toGrid(e),o=a[0];return a.length<=1||o.length<=1||e.rows.length<=1||o.reduce(function(e,t,n){return e||t!==o[n+1]&&void 0!==o[n+1]},!1)}},{id:\"has-caption\",evaluate:function(e,t,n,r){return!!e.caption}},{id:\"has-summary\",evaluate:function(e,t,n,r){return!!e.summary}},{id:\"has-th\",evaluate:function(e,t,n,r){for(var a,o,i=[],u=0,s=e.rows.length;u<s;u++)for(var l=0,c=(a=e.rows[u]).cells.length;l<c;l++)\"TH\"!==(o=a.cells[l]).nodeName.toUpperCase()&&-1===[\"rowheader\",\"columnheader\"].indexOf(o.getAttribute(\"role\"))||i.push(o);return!!i.length&&(this.relatedNodes(i),!0)}},{id:\"html5-scope\",evaluate:function(e,t,n,r){return!axe.commons.dom.isHTML5(document)||\"TH\"===e.nodeName.toUpperCase()}},{id:\"same-caption-summary\",evaluate:function(e,t,n,r){return!(!e.summary||!e.caption)&&e.summary.toLowerCase()===axe.commons.text.accessibleText(e.caption).toLowerCase()}},{id:\"scope-value\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"scope\").toLowerCase();return-1!==[\"row\",\"col\",\"rowgroup\",\"colgroup\"].indexOf(a)}},{id:\"td-has-header\",evaluate:function(e,t,n,r){var a=axe.commons.table,o=[];return a.getAllCells(e).forEach(function(e){axe.commons.dom.hasContent(e)&&a.isDataCell(e)&&!axe.commons.aria.label(e)&&(a.getHeaders(e).some(function(e){return null!==e&&!!axe.commons.dom.hasContent(e)})||o.push(e))}),!o.length||(this.relatedNodes(o),!1)}},{id:\"td-headers-attr\",evaluate:function(e,t,n,r){for(var a=[],o=0,i=e.rows.length;o<i;o++)for(var u=e.rows[o],s=0,l=u.cells.length;s<l;s++)a.push(u.cells[s]);var c=a.reduce(function(e,t){return t.getAttribute(\"id\")&&e.push(t.getAttribute(\"id\")),e},[]),d=a.reduce(function(e,t){var n,r,a=(t.getAttribute(\"headers\")||\"\").split(/\\s/).reduce(function(e,t){return(t=t.trim())&&e.push(t),e},[]);return 0!==a.length&&(t.getAttribute(\"id\")&&(n=-1!==a.indexOf(t.getAttribute(\"id\").trim())),r=a.reduce(function(e,t){return e||-1===c.indexOf(t)},!1),(n||r)&&e.push(t)),e},[]);return!(0<d.length)||(this.relatedNodes(d),!1)}},{id:\"th-has-data-cells\",evaluate:function(e,t,n,r){var a=axe.commons.table,o=a.getAllCells(e),i=this,u=[];o.forEach(function(e){var t=e.getAttribute(\"headers\");t&&(u=u.concat(t.split(/\\s+/)));var n=e.getAttribute(\"aria-labelledby\");n&&(u=u.concat(n.split(/\\s+/)))});var s=o.filter(function(e){return\"\"!==axe.commons.text.sanitize(e.textContent)&&(\"TH\"===e.nodeName.toUpperCase()||-1!==[\"rowheader\",\"columnheader\"].indexOf(e.getAttribute(\"role\")))}),l=a.toGrid(e);return!!s.reduce(function(e,t){if(t.getAttribute(\"id\")&&u.includes(t.getAttribute(\"id\")))return!!e||e;var n=!1,r=a.getCellPosition(t,l);return a.isColumnHeader(t)&&(n=a.traverse(\"down\",r,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isColumnHeader(t)},!1)),!n&&a.isRowHeader(t)&&(n=a.traverse(\"right\",r,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isRowHeader(t)},!1)),n||i.relatedNodes(t),e&&n},!0)||void 0}},{id:\"hidden-content\",evaluate:function(e,t,n,r){if(![\"SCRIPT\",\"HEAD\",\"TITLE\",\"NOSCRIPT\",\"STYLE\",\"TEMPLATE\"].includes(e.nodeName.toUpperCase())&&axe.commons.dom.hasContentVirtual(n)){var a=window.getComputedStyle(e);if(\"none\"===a.getPropertyValue(\"display\"))return;if(\"hidden\"===a.getPropertyValue(\"visibility\")){var o=axe.commons.dom.getComposedParent(e),i=o&&window.getComputedStyle(o);if(!i||\"hidden\"!==i.getPropertyValue(\"visibility\"))return}}return!0}}],commons:function(){function e(e){return null===e}function t(e){return null!==e}var commons={},l=commons.aria={},n=l.lookupTable={};n.attributes={\"aria-activedescendant\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-atomic\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-autocomplete\":{type:\"nmtoken\",values:[\"inline\",\"list\",\"both\",\"none\"],unsupported:!1},\"aria-busy\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-checked\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-colcount\":{type:\"int\",unsupported:!1},\"aria-colindex\":{type:\"int\",unsupported:!1},\"aria-colspan\":{type:\"int\",unsupported:!1},\"aria-controls\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-current\":{type:\"nmtoken\",allowEmpty:!0,values:[\"page\",\"step\",\"location\",\"date\",\"time\",\"true\",\"false\"],unsupported:!1},\"aria-describedby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-describedat\":{unsupported:!0,unstandardized:!0},\"aria-details\":{unsupported:!0},\"aria-disabled\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-dropeffect\":{type:\"nmtokens\",values:[\"copy\",\"move\",\"reference\",\"execute\",\"popup\",\"none\"],unsupported:!1},\"aria-errormessage\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-expanded\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-flowto\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-grabbed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-haspopup\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"menu\",\"listbox\",\"tree\",\"grid\",\"dialog\"],unsupported:!1},\"aria-hidden\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-invalid\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"spelling\",\"grammar\"],unsupported:!1},\"aria-keyshortcuts\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-label\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-labelledby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-level\":{type:\"int\",unsupported:!1},\"aria-live\":{type:\"nmtoken\",values:[\"off\",\"polite\",\"assertive\"],unsupported:!1},\"aria-modal\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiline\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiselectable\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-orientation\":{type:\"nmtoken\",values:[\"horizontal\",\"vertical\"],unsupported:!1},\"aria-owns\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-placeholder\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-posinset\":{type:\"int\",unsupported:!1},\"aria-pressed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-readonly\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-relevant\":{type:\"nmtokens\",values:[\"additions\",\"removals\",\"text\",\"all\"],unsupported:!1},\"aria-required\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-roledescription\":{type:\"string\",allowEmpty:!0,unsupported:{exceptions:[\"button\",{nodeName:\"input\",properties:{type:[\"button\",\"checkbox\",\"image\",\"radio\",\"reset\",\"submit\"]}},\"img\",\"select\",\"summary\"]}},\"aria-rowcount\":{type:\"int\",unsupported:!1},\"aria-rowindex\":{type:\"int\",unsupported:!1},\"aria-rowspan\":{type:\"int\",unsupported:!1},\"aria-selected\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-setsize\":{type:\"int\",unsupported:!1},\"aria-sort\":{type:\"nmtoken\",values:[\"ascending\",\"descending\",\"other\",\"none\"],unsupported:!1},\"aria-valuemax\":{type:\"decimal\",unsupported:!1},\"aria-valuemin\":{type:\"decimal\",unsupported:!1},\"aria-valuenow\":{type:\"decimal\",unsupported:!1},\"aria-valuetext\":{type:\"string\",unsupported:!1}},n.globalAttributes=[\"aria-atomic\",\"aria-busy\",\"aria-controls\",\"aria-current\",\"aria-describedby\",\"aria-disabled\",\"aria-dropeffect\",\"aria-flowto\",\"aria-grabbed\",\"aria-haspopup\",\"aria-hidden\",\"aria-invalid\",\"aria-keyshortcuts\",\"aria-label\",\"aria-labelledby\",\"aria-live\",\"aria-owns\",\"aria-relevant\",\"aria-roledescription\"],n.role={alert:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},alertdialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dialog\",\"section\"]},application:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"audio\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\",\"video\"]},article:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"article\"],unsupported:!1},banner:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"header\"],unsupported:!1,allowedElements:[\"section\"]},button:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-pressed\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"button\",'input[type=\"button\"]','input[type=\"image\"]','input[type=\"reset\"]','input[type=\"submit\"]',\"summary\"],unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},cell:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-rowindex\",\"aria-rowspan\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},checkbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"checkbox\"]'],unsupported:!1,allowedElements:[\"button\"]},columnheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},combobox:{type:\"composite\",attributes:{allowed:[\"aria-autocomplete\",\"aria-required\",\"aria-activedescendant\",\"aria-orientation\",\"aria-errormessage\"],required:[\"aria-expanded\"]},owned:{all:[\"listbox\",\"textbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"input\",properties:{type:\"text\"}}]},command:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},complementary:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"aside\"],unsupported:!1,allowedElements:[\"section\"]},composite:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},contentinfo:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"footer\"],unsupported:!1,allowedElements:[\"section\"]},definition:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dd\",\"dfn\"],unsupported:!1},dialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dialog\"],unsupported:!1,allowedElements:[\"section\"]},directory:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},document:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"body\"],unsupported:!1,allowedElements:[\"article\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\"]},\"doc-abstract\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-acknowledgments\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-afterword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-appendix\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-backlink\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-biblioentry\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:[\"doc-bibliography\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-bibliography\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"doc-biblioentry\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-biblioref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-chapter\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-colophon\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-conclusion\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-cover\":{type:\"img\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-credit\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-credits\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-dedication\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-endnote\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:[\"doc-endnotes\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-endnotes\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"doc-endnote\"]},namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-epigraph\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-epilogue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-errata\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-example\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-footnote\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"footer\",\"header\"]},\"doc-foreword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-glossary\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:[\"term\",\"definition\"],namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dl\"]},\"doc-glossref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-index\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-introduction\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-noteref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-notice\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pagebreak\":{type:\"separator\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"hr\"]},\"doc-pagelist\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-part\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-preface\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-prologue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pullquote\":{type:\"none\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-qna\":{type:\"section\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-subtitle\":{type:\"sectionhead\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"]}},\"doc-tip\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},\"doc-toc\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},feed:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"article\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"aside\",\"section\"]},figure:{type:\"structure\",unsupported:!1},form:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"form\"],unsupported:!1},grid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-colcount\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},gridcell:{type:\"widget\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-selected\",\"aria-readonly\",\"aria-required\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},group:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"details\",\"optgroup\"],unsupported:!1,allowedElements:[\"dl\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"header\",\"ol\",\"ul\"]},heading:{type:\"structure\",attributes:{required:[\"aria-level\"],allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"],unsupported:!1},img:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"img\"],unsupported:!1,allowedElements:[\"embed\",\"iframe\",\"object\",\"svg\"]},input:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},landmark:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},link:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"a[href]\"],unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},list:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"listitem\"]},nameFrom:[\"author\"],context:null,implicit:[\"ol\",\"ul\",\"dl\"],unsupported:!1},listbox:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"option\"]},nameFrom:[\"author\"],context:null,implicit:[\"select\"],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},listitem:{type:\"structure\",attributes:{allowed:[\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"list\"],implicit:[\"li\",\"dt\"],unsupported:!1},log:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},main:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"main\"],unsupported:!1,allowedElements:[\"article\",\"section\"]},marquee:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},math:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"math\"],unsupported:!1},menu:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,implicit:['menu[type=\"context\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menubar:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menuitem:{type:\"widget\",attributes:{allowed:[\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"command\"]'],unsupported:!1,allowedElements:[\"button\",\"li\",{nodeName:\"iput\",properties:{type:[\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},menuitemcheckbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"checkbox\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},menuitemradio:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\",\"radio\"]}},{nodeName:\"a\",attributes:{href:t}}]},navigation:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"nav\"],unsupported:!1,allowedElements:[\"section\"]},none:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:t}}]},note:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},option:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-checked\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"listbox\"],implicit:[\"option\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},presentation:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:t}}]},progressbar:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"progress\"],unsupported:!1},radio:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-required\",\"aria-errormessage\",\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},radiogroup:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-required\",\"aria-expanded\",\"aria-readonly\",\"aria-errormessage\"]},owned:{all:[\"radio\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"ol\",\"ul\"]}},range:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},region:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"section[aria-label]\",\"section[aria-labelledby]\",\"section[title]\"],unsupported:!1,allowedElements:{nodeName:[\"article\",\"aside\"]}},roletype:{type:\"abstract\",unsupported:!1},row:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colindex\",\"aria-expanded\",\"aria-level\",\"aria-selected\",\"aria-rowindex\",\"aria-errormessage\"]},owned:{one:[\"cell\",\"columnheader\",\"rowheader\",\"gridcell\"]},nameFrom:[\"author\",\"contents\"],context:[\"rowgroup\",\"grid\",\"treegrid\",\"table\"],implicit:[\"tr\"],unsupported:!1},rowgroup:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"row\"]},nameFrom:[\"author\",\"contents\"],context:[\"grid\",\"table\",\"treegrid\"],implicit:[\"tbody\",\"thead\",\"tfoot\"],unsupported:!1},rowheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},scrollbar:{type:\"widget\",attributes:{required:[\"aria-controls\",\"aria-valuenow\"],allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},search:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"aside\",\"form\",\"section\"]}},searchbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"search\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},section:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},sectionhead:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},select:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},separator:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-orientation\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-valuetext\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"hr\"],unsupported:!1,allowedElements:[\"li\"]},slider:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-readonly\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"],required:[\"aria-valuenow\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"range\"]'],unsupported:!1},spinbutton:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"],required:[\"aria-valuenow\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"number\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},status:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"output\"],unsupported:!1,allowedElements:[\"section\"]},structure:{type:\"abstract\",unsupported:!1},switch:{type:\"widget\",attributes:{allowed:[\"aria-errormessage\"],required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},tab:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-expanded\",\"aria-setsize\",\"aria-posinset\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"tablist\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"li\"]},{nodeName:\"input\",properties:{type:\"button\"}},{nodeName:\"a\",attributes:{href:t}}]},table:{type:\"structure\",attributes:{allowed:[\"aria-colcount\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},tablist:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"tab\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tabpanel:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},term:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"dt\"],unsupported:!1},textbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"text\"]','input[type=\"email\"]','input[type=\"password\"]','input[type=\"tel\"]','input[type=\"url\"]',\"input:not([type])\",\"textarea\"],unsupported:!1},timer:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},toolbar:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['menu[type=\"toolbar\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tooltip:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1},tree:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"treeitem\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},treegrid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colcount\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-required\",\"aria-rowcount\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,unsupported:!1},treeitem:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"group\",\"tree\"],unsupported:!1,allowedElements:[\"li\",{nodeName:\"a\",attributes:{href:t}}]},widget:{type:\"abstract\",unsupported:!1},window:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1}},n.elementsAllowedNoRole=[{nodeName:[\"base\",\"body\",\"caption\",\"col\",\"colgroup\",\"datalist\",\"dd\",\"details\",\"dt\",\"head\",\"html\",\"keygen\",\"label\",\"legend\",\"main\",\"map\",\"math\",\"meta\",\"meter\",\"noscript\",\"optgroup\",\"param\",\"picture\",\"progress\",\"script\",\"source\",\"style\",\"template\",\"textarea\",\"title\",\"track\"]},{nodeName:\"area\",attributes:{href:t}},{nodeName:\"input\",properties:{type:[\"color\",\"data\",\"datatime\",\"file\",\"hidden\",\"month\",\"number\",\"password\",\"range\",\"reset\",\"submit\",\"time\",\"week\"]}},{nodeName:\"input\",attributes:{list:e},properties:{type:[\"email\",\"search\",\"tel\",\"url\"]}},{nodeName:\"link\",attributes:{href:t}},{nodeName:\"menu\",attributes:{type:\"context\"}},{nodeName:\"menuitem\",attributes:{type:[\"command\",\"checkbox\",\"radio\"]}},{nodeName:\"select\",condition:function(e){return 1<Number(e.getAttribute(\"size\"))},properties:{multiple:!0}},{nodeName:[\"clippath\",\"cursor\",\"defs\",\"desc\",\"feblend\",\"fecolormatrix\",\"fecomponenttransfer\",\"fecomposite\",\"feconvolvematrix\",\"fediffuselighting\",\"fedisplacementmap\",\"fedistantlight\",\"fedropshadow\",\"feflood\",\"fefunca\",\"fefuncb\",\"fefuncg\",\"fefuncr\",\"fegaussianblur\",\"feimage\",\"femerge\",\"femergenode\",\"femorphology\",\"feoffset\",\"fepointlight\",\"fespecularlighting\",\"fespotlight\",\"fetile\",\"feturbulence\",\"filter\",\"hatch\",\"hatchpath\",\"lineargradient\",\"marker\",\"mask\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"metadata\",\"mpath\",\"pattern\",\"radialgradient\",\"solidcolor\",\"stop\",\"switch\",\"view\"]}],n.elementsAllowedAnyRole=[{nodeName:\"a\",attributes:{href:e}},{nodeName:[\"abbr\",\"address\",\"canvas\",\"div\",\"p\",\"pre\",\"blockquote\",\"ins\",\"del\",\"output\",\"span\",\"table\",\"tbody\",\"thead\",\"tfoot\",\"td\",\"em\",\"strong\",\"small\",\"s\",\"cite\",\"q\",\"dfn\",\"abbr\",\"time\",\"code\",\"var\",\"samp\",\"kbd\",\"sub\",\"sup\",\"i\",\"b\",\"u\",\"mark\",\"ruby\",\"rt\",\"rp\",\"bdi\",\"bdo\",\"br\",\"wbr\",\"th\",\"tr\"]}],n.evaluateRoleForElement={A:function(e){var t=e.node,n=e.out;return\"http://www.w3.org/2000/svg\"===t.namespaceURI||(!t.href.length||n)},AREA:function(e){return!e.node.href},BUTTON:function(e){var t=e.node,n=e.role,r=e.out;return\"menu\"===t.getAttribute(\"type\")?\"menuitem\"===n:r},IMG:function(e){var t=e.node,n=e.out;return t.alt?!n:n},INPUT:function(e){var t=e.node,n=e.role,r=e.out;switch(t.type){case\"button\":case\"image\":return r;case\"checkbox\":return!(\"button\"!==n||!t.hasAttribute(\"aria-pressed\"))||r;case\"radio\":return\"menuitemradio\"===n;case\"text\":return\"combobox\"===n||\"searchbox\"===n||\"spinbutton\"===n;default:return!1}},LI:function(e){var t=e.node,n=e.out;return!axe.utils.matchesSelector(t,\"ol li, ul li\")||n},MENU:function(e){return\"context\"!==e.node.getAttribute(\"type\")},OPTION:function(e){var t=e.node;return!axe.utils.matchesSelector(t,\"select > option, datalist > option, optgroup > option\")},SELECT:function(e){var t=e.node,n=e.role;return!t.multiple&&t.size<=1&&\"menu\"===n},SVG:function(e){var t=e.node,n=e.out;return!(!t.parentNode||\"http://www.w3.org/2000/svg\"!==t.parentNode.namespaceURI)||n}},n.rolesOfType={widget:[\"button\",\"checkbox\",\"dialog\",\"gridcell\",\"heading\",\"link\",\"log\",\"marquee\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"progressbar\",\"radio\",\"scrollbar\",\"slider\",\"spinbutton\",\"status\",\"switch\",\"tab\",\"tabpanel\",\"textbox\",\"timer\",\"tooltip\",\"tree\",\"treeitem\"]};var s={};commons.color=s;var h=commons.dom={},r={};function i(e,t){return i.fromDefinition(e,t)}commons.forms=r,commons.matches=i;var o=commons.table={},g=commons.text={EdgeFormDefaults:{}};commons.utils=axe.utils;l.arialabelText=function(e){return 1!==(e=e.actualNode||e).nodeType?\"\":e.getAttribute(\"aria-label\")||\"\"},l.arialabelledbyText=function(r,e){var a=1<arguments.length&&void 0!==e?e:{};return 1!==(r=r.actualNode||r).nodeType||a.inLabelledByContext||a.inControlContext?\"\":h.idrefs(r,\"aria-labelledby\").filter(function(e){return e}).reduce(function(e,t){var n=g.accessibleText(t,R({inLabelledByContext:!0,startNode:a.startNode||r},a));return e?\"\".concat(e,\" \").concat(n):n},\"\")},l.requiredAttr=function(e){var t=l.lookupTable.role[e];return t&&t.attributes&&t.attributes.required||[]},l.allowedAttr=function(e){var t=l.lookupTable.role[e],n=t&&t.attributes&&t.attributes.allowed||[],r=t&&t.attributes&&t.attributes.required||[];return n.concat(l.lookupTable.globalAttributes).concat(r)},l.validateAttr=function(e){return!!l.lookupTable.attributes[e]},l.getElementUnallowedRoles=function(t,e){var n=!(1<arguments.length&&void 0!==e)||e,r=t.nodeName.toUpperCase();if(!axe.utils.isHtmlElement(t))return[];var a=function(e){var t=[];if(!e)return t;if(e.hasAttribute(\"role\")){var n=axe.utils.tokenList(e.getAttribute(\"role\").toLowerCase());t=t.concat(n)}if(e.hasAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\")){var r=axe.utils.tokenList(e.getAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\").toLowerCase()).map(function(e){return\"doc-\".concat(e)});t=t.concat(r)}return t=t.filter(function(e){return axe.commons.aria.isValidRole(e)})}(t),o=axe.commons.aria.implicitRole(t);return a.filter(function(e){return(!n||e!==o)&&(!(n||\"row\"===e&&\"TR\"===r&&axe.utils.matchesSelector(t,'table[role=\"grid\"] > tr'))||!l.isAriaRoleAllowedOnElement(t,e))})},l.getOwnedVirtual=function(e){var t=e.actualNode,n=e.children;if(!t||!n)throw new Error(\"getOwnedVirtual requires a virtual node\");return h.idrefs(t,\"aria-owns\").reduce(function(e,t){if(t){var n=axe.utils.getNodeFromTree(t);e.push(n)}return e},n)},l.getRole=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=n.noImplicit,a=n.fallback,o=n.abstracts,i=n.dpub;if(1!==(e=e.actualNode||e).nodeType)return null;var u=(e.getAttribute(\"role\")||\"\").trim().toLowerCase(),s=(a?axe.utils.tokenList(u):[u]).filter(function(e){return!(!i&&\"doc-\"===e.substr(0,4))&&l.isValidRole(e,{allowAbstract:o})})[0];return s||r?s||null:l.implicitRole(e)};var a,u=/^idrefs?$/;function c(e){return e.getPropertyValue(\"font-family\").split(/[,;]/g).map(function(e){return e.trim().toLowerCase()})}function d(e,t){var n={TD:[\"TR\",\"TBODY\"],TH:[\"TR\",\"THEAD\"],INPUT:[\"LABEL\"]},r=e.map(function(e){return e.nodeName}),a=e;for(var o in n)if(r.includes(o))for(var i in n[o])if(o.hasOwnProperty(i)){var u=axe.commons.dom.findUp(t,n[o][i]);if(u&&-1===e.indexOf(u))axe.commons.dom.visuallyOverlaps(t.getBoundingClientRect(),u)&&a.splice(r.indexOf(o)+1,0,u);t.nodeName===n[o][i]&&-1===r.indexOf(t.nodeName)&&a.splice(r.indexOf(o)+1,0,t)}return a}function m(e,t){var n=e.getClientRects()[0],r=h.shadowElementsFromPoint(n.left,n.top);if(r)for(var a=0;a<r.length;a++)if(r[a]!==e&&r[a]===t)return!0;return!1}l.isAccessibleRef=function(e){e=e.actualNode||e;var t=h.getRootNode(e);t=t.documentElement||t;var n=e.id;axe._cache.get(\"idRefs\")||(axe._cache.set(\"idRefs\",{}),function e(n,t){n.hasAttribute&&(\"LABEL\"===n.nodeName.toUpperCase()&&n.hasAttribute(\"for\")&&(axe._cache.get(\"idRefs\")[n.getAttribute(\"for\")]=!0),t.filter(function(e){return n.hasAttribute(e)}).forEach(function(e){var t=n.getAttribute(e);axe.utils.tokenList(t).forEach(function(e){axe._cache.get(\"idRefs\")[e]=!0})}));for(var r=0;r<n.children.length;r++)e(n.children[r],t)}(t,Object.keys(l.lookupTable.attributes).filter(function(e){var t=l.lookupTable.attributes[e].type;return u.test(t)})));return!0===axe._cache.get(\"idRefs\")[n]},l.isAriaRoleAllowedOnElement=function(e,t){var n=e.nodeName.toUpperCase(),r=axe.commons.aria.lookupTable;if(i(e,r.elementsAllowedNoRole))return!1;if(i(e,r.elementsAllowedAnyRole))return!0;var a=r.role[t];if(!a||!a.allowedElements)return!1;var o=i(e,a.allowedElements);return Object.keys(r.evaluateRoleForElement).includes(n)?r.evaluateRoleForElement[n]({node:e,role:t,out:o}):o},l.isUnsupportedRole=function(e){var t=l.lookupTable.role[e];return!!t&&t.unsupported},l.labelVirtual=function(e){var t,n=e.actualNode;return n.getAttribute(\"aria-labelledby\")&&(t=h.idrefs(n,\"aria-labelledby\").map(function(e){var t=axe.utils.getNodeFromTree(e);return t?g.visibleVirtual(t,!0):\"\"}).join(\" \").trim())?t:(t=(t=n.getAttribute(\"aria-label\"))&&g.sanitize(t).trim())?t:null},l.label=function(e){return e=axe.utils.getNodeFromTree(e),l.labelVirtual(e)},l.namedFromContents=function(e,t){var n=(1<arguments.length&&void 0!==t?t:{}).strict;if(1!==(e=e.actualNode||e).nodeType)return!1;var r=l.getRole(e),a=l.lookupTable.role[r];return!!(a&&a.nameFrom.includes(\"contents\")||\"TABLE\"===e.nodeName.toUpperCase())||!n&&(!a||[\"presentation\",\"none\"].includes(r))},l.isValidRole=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=t.allowAbstract,r=t.flagUnsupported,a=void 0!==r&&r,o=l.lookupTable.role[e],i=!!o&&o.unsupported;return!(!o||a&&i)&&(!!n||\"abstract\"!==o.type)},l.getRolesWithNameFromContents=function(){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].nameFrom&&-1!==l.lookupTable.role[e].nameFrom.indexOf(\"contents\")})},l.getRolesByType=function(t){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].type===t})},l.getRoleType=function(e){var t=l.lookupTable.role[e];return t&&t.type||null},l.requiredOwned=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&(t=axe.utils.clone(n.owned)),t},l.requiredContext=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&(t=axe.utils.clone(n.context)),t},l.implicitNodes=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&n.implicit&&(t=axe.utils.clone(n.implicit)),t},l.implicitRole=function(n){\"use strict\";var e=Object.keys(l.lookupTable.role).map(function(e){var t=l.lookupTable.role[e];return{name:e,implicit:t&&t.implicit}}).reduce(function(e,t){return t.implicit&&t.implicit.some(function(e){return axe.utils.matchesSelector(n,e)})&&e.push(t.name),e},[]);if(!e.length)return null;for(var r,t=axe.utils.getNodeAttributes(n),a=[],o=0,i=t.length;o<i;o++){var u=t[o];u.name.match(/^aria-/)&&a.push(u.name)}return(r=a,e.map(function(e){return{score:function(e){return l.allowedAttr(e).reduce(function(e,t){return e+(-1<r.indexOf(t)?1:0)},0)}(e),name:e}}).sort(function(e,t){return t.score-e.score}).map(function(e){return e.name})).shift()},l.validateAttrValue=function(e,t){\"use strict\";var n,r,a=e.getAttribute(t),o=l.lookupTable.attributes[t],i=h.getRootNode(e);if(!o)return!0;if(o.allowEmpty&&(!a||\"\"===a.trim()))return!0;switch(o.type){case\"boolean\":case\"nmtoken\":return\"string\"==typeof a&&o.values.includes(a.toLowerCase());case\"nmtokens\":return(r=axe.utils.tokenList(a)).reduce(function(e,t){return e&&o.values.includes(t)},0!==r.length);case\"idref\":return!(!a||!i.getElementById(a));case\"idrefs\":return(r=axe.utils.tokenList(a)).some(function(e){return i.getElementById(e)});case\"string\":return\"\"!==a.trim();case\"decimal\":return!(!(n=a.match(/^[-+]?([0-9]*)\\.?([0-9]*)$/))||!n[1]&&!n[2]);case\"int\":return/^[-+]?[0-9]+$/.test(a)}},s.centerPointOfRect=function(e){if(!(e.left>window.innerWidth)&&!(e.top>window.innerHeight))return{x:Math.min(Math.ceil(e.left+e.width/2),window.innerWidth-1),y:Math.min(Math.ceil(e.top+e.height/2),window.innerHeight-1)}},s.Color=function(e,t,n,r){this.red=e,this.green=t,this.blue=n,this.alpha=r,this.toHexString=function(){var e=Math.round(this.red).toString(16),t=Math.round(this.green).toString(16),n=Math.round(this.blue).toString(16);return\"#\"+(15.5<this.red?e:\"0\"+e)+(15.5<this.green?t:\"0\"+t)+(15.5<this.blue?n:\"0\"+n)};var a=/^rgb\\((\\d+), (\\d+), (\\d+)\\)$/,o=/^rgba\\((\\d+), (\\d+), (\\d+), (\\d*(\\.\\d+)?)\\)/;this.parseRgbString=function(e){if(\"transparent\"===e)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var t=e.match(a);return t?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=1)):(t=e.match(o))?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=Math.round(100*parseFloat(t[4]))/100)):void 0},this.getRelativeLuminance=function(){var e=this.red/255,t=this.green/255,n=this.blue/255;return.2126*(e<=.03928?e/12.92:Math.pow((.055+e)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((.055+t)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((.055+n)/1.055,2.4))}},s.flattenColors=function(e,t){var n=e.alpha,r=(1-n)*t.red+n*e.red,a=(1-n)*t.green+n*e.green,o=(1-n)*t.blue+n*e.blue,i=e.alpha+t.alpha*(1-e.alpha);return new s.Color(r,a,o,i)},s.getContrast=function(e,t){if(!t||!e)return null;t.alpha<1&&(t=s.flattenColors(t,e));var n=e.getRelativeLuminance(),r=t.getRelativeLuminance();return(Math.max(r,n)+.05)/(Math.min(r,n)+.05)},s.hasValidContrastRatio=function(e,t,n,r){var a=s.getContrast(e,t),o=r&&Math.ceil(72*n)/96<14||!r&&Math.ceil(72*n)/96<18?4.5:3;return{isValid:o<a,contrastRatio:a,expectedContrastRatio:o}},s.elementHasImage=function(e,t){var n=e.nodeName.toUpperCase();if([\"IMG\",\"CANVAS\",\"OBJECT\",\"IFRAME\",\"VIDEO\",\"SVG\"].includes(n))return axe.commons.color.incompleteData.set(\"bgColor\",\"imgNode\"),!0;var r=(t=t||window.getComputedStyle(e)).getPropertyValue(\"background-image\"),a=\"none\"!==r;if(a){var o=/gradient/.test(r);axe.commons.color.incompleteData.set(\"bgColor\",o?\"bgGradient\":\"bgImage\")}return a},s.elementIsDistinct=function(e,t){var r=window.getComputedStyle(e);if(\"none\"!==r.getPropertyValue(\"background-image\"))return!0;if([\"border-bottom\",\"border-top\",\"outline\"].reduce(function(e,t){var n=new s.Color;return n.parseRgbString(r.getPropertyValue(t+\"-color\")),e||\"none\"!==r.getPropertyValue(t+\"-style\")&&0<parseFloat(r.getPropertyValue(t+\"-width\"))&&0!==n.alpha},!1))return!0;var n=window.getComputedStyle(t);if(c(r)[0]!==c(n)[0])return!0;var a=[\"text-decoration-line\",\"text-decoration-style\",\"font-weight\",\"font-style\",\"font-size\"].reduce(function(e,t){return e||r.getPropertyValue(t)!==n.getPropertyValue(t)},!1),o=r.getPropertyValue(\"text-decoration\");return o.split(\" \").length<3&&(a=a||o!==n.getPropertyValue(\"text-decoration\")),a},s.getBackgroundColor=function(r,e,t){var a=1<arguments.length&&void 0!==e?e:[];if(!0!==(2<arguments.length&&void 0!==t&&t)){var n=r.getBoundingClientRect().height-2>=2*window.innerHeight;r.scrollIntoView(n)}var o=[],i=s.getBackgroundStack(r);return(i||[]).some(function(e){var t=window.getComputedStyle(e),n=s.getOwnBackgroundColor(t);return function(e,t,n){var r=e!==t&&!h.visuallyContains(e,t)&&0!==n.alpha;r&&axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscured\");return r}(r,e,n)||s.elementHasImage(e,t)?(o=null,a.push(e),!0):0!==n.alpha&&(a.push(e),o.push(n),1===n.alpha)}),null===o||null===i?null:(o.push(new s.Color(255,255,255,1)),o.reduce(s.flattenColors))},s.getBackgroundStack=function(e){var t=s.filteredRectStack(e);if(null===t)return null;t=d(t,e);var n=(t=function(e){var t=e.indexOf(document.body),n=e;(1<t||-1===t)&&!s.elementHasImage(document.documentElement)&&0===s.getOwnBackgroundColor(window.getComputedStyle(document.documentElement)).alpha&&(1<t&&n.splice(t,1),n.splice(e.indexOf(document.documentElement),1),n.push(document.body));return n}(t=h.reduceToElementsBelowFloating(t,e))).indexOf(e);return.99<=function(e,t,n){var r=0;if(0<e)for(var a=e-1;0<=a;a--){var o=t[a],i=window.getComputedStyle(o),u=s.getOwnBackgroundColor(i);u.alpha&&m(n,o)?r+=u.alpha:t.splice(a,1)}return r}(n,t,e)?(axe.commons.color.incompleteData.set(\"bgColor\",\"bgOverlap\"),null):-1!==n?t:null},s.filteredRectStack=function(a){var o=s.getRectStack(a);if(o&&1===o.length)return o[0];if(o&&1<o.length){var i,u=o.shift();return d(u,a),o.forEach(function(e,t){if(0!==t){var n=o[t-1],r=o[t];i=n.every(function(e,t){return e===r[t]})||u.includes(a)}}),i?o[0]:(axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscuring\"),null)}return axe.commons.color.incompleteData.set(\"bgColor\",\"outsideViewport\"),null},s.getRectStack=function(e){var t=axe.commons.color.centerPointOfRect(e.getBoundingClientRect());if(!t)return null;var n=h.shadowElementsFromPoint(t.x,t.y),r=Array.from(e.getClientRects());if(!r||r.length<=1)return[n];var a=r.filter(function(e){return e.width&&0<e.width}).map(function(e){var t=axe.commons.color.centerPointOfRect(e);if(t)return h.shadowElementsFromPoint(t.x,t.y)});return a.some(function(e){return void 0===e})?null:(a.splice(0,0,n),a)},h.isOpaque=function(e){var t=window.getComputedStyle(e);return s.elementHasImage(e,t)||1===s.getOwnBackgroundColor(t).alpha},s.getForegroundColor=function(e,t){var n=window.getComputedStyle(e),r=new s.Color;r.parseRgbString(n.getPropertyValue(\"color\"));var a=n.getPropertyValue(\"opacity\");if(r.alpha=r.alpha*a,1===r.alpha)return r;var o=s.getBackgroundColor(e,[],t);if(null!==o)return s.flattenColors(r,o);var i=axe.commons.color.incompleteData.get(\"bgColor\");return axe.commons.color.incompleteData.set(\"fgColor\",i),null},s.getOwnBackgroundColor=function(e){var t=new s.Color;if(t.parseRgbString(e.getPropertyValue(\"background-color\")),0!==t.alpha){var n=e.getPropertyValue(\"opacity\");t.alpha=t.alpha*n}return t},s.incompleteData=(a={},{set:function(e,t){if(\"string\"!=typeof e)throw new Error(\"Incomplete data: key must be a string\");return t&&(a[e]=t),a[e]},get:function(e){return a[e]},clear:function(){a={}}}),h.reduceToElementsBelowFloating=function(e,t){var n,r,a,o=[\"fixed\",\"sticky\"],i=[],u=!1;for(n=0;n<e.length;++n)(r=e[n])===t&&(u=!0),a=window.getComputedStyle(r),u||-1===o.indexOf(a.position)?i.push(r):i=[];return i},h.findElmsInContext=function(e){var t,n=e.context,r=e.value,a=e.attr,o=e.elm,i=void 0===o?\"\":o,u=axe.utils.escapeSelector(r);return t=9===n.nodeType||11===n.nodeType?n:h.getRootNode(n),Array.from(t.querySelectorAll(i+\"[\"+a+\"=\"+u+\"]\"))},h.findUp=function(e,t){return h.findUpVirtual(axe.utils.getNodeFromTree(e),t)},h.findUpVirtual=function(e,t){var n;if(n=e.actualNode,!e.shadowId&&\"function\"==typeof e.actualNode.closest){var r=e.actualNode.closest(t);return r||null}for(;(n=n.assignedSlot?n.assignedSlot:n.parentNode)&&11===n.nodeType&&(n=n.host),n&&!axe.utils.matchesSelector(n,t)&&n!==document.documentElement;);return n&&axe.utils.matchesSelector(n,t)?n:null},h.getComposedParent=function e(t){if(t.assignedSlot)return e(t.assignedSlot);if(t.parentNode){var n=t.parentNode;if(1===n.nodeType)return n;if(n.host)return n.host}return null},h.getElementByReference=function(e,t){var n=e.getAttribute(t);if(!n)return null;\"#\"===n.charAt(0)?n=decodeURIComponent(n.substring(1)):\"/#\"===n.substr(0,2)&&(n=decodeURIComponent(n.substring(2)));var r=document.getElementById(n);return r||((r=document.getElementsByName(n)).length?r[0]:null)},h.getElementCoordinates=function(e){\"use strict\";var t=h.getScrollOffset(document),n=t.left,r=t.top,a=e.getBoundingClientRect();return{top:a.top+r,right:a.right+n,bottom:a.bottom+r,left:a.left+n,width:a.right-a.left,height:a.bottom-a.top}},h.getRootNode=axe.utils.getRootNode,h.getScrollOffset=function(e){\"use strict\";if(!e.nodeType&&e.document&&(e=e.document),9!==e.nodeType)return{left:e.scrollLeft,top:e.scrollTop};var t=e.documentElement,n=e.body;return{left:t&&t.scrollLeft||n&&n.scrollLeft||0,top:t&&t.scrollTop||n&&n.scrollTop||0}},h.getTabbableElements=function(e){return axe.utils.querySelectorAll(e,\"*\").filter(function(e){var t=e.isFocusable,n=e.actualNode.getAttribute(\"tabindex\");return(n=n&&!isNaN(parseInt(n,10))?parseInt(n):null)?t&&0<=n:t})},h.getViewportSize=function(e){\"use strict\";var t,n=e.document,r=n.documentElement;return e.innerWidth?{width:e.innerWidth,height:e.innerHeight}:r?{width:r.clientWidth,height:r.clientHeight}:{width:(t=n.body).clientWidth,height:t.clientHeight}};var p=[\"HEAD\",\"TITLE\",\"TEMPLATE\",\"SCRIPT\",\"STYLE\",\"IFRAME\",\"OBJECT\",\"VIDEO\",\"AUDIO\",\"NOSCRIPT\"];function f(e){return e.disabled||h.isHiddenWithCSS(e)&&\"AREA\"!==e.nodeName.toUpperCase()}h.hasContentVirtual=function(e,t,n){return function(e){if(!p.includes(e.actualNode.nodeName.toUpperCase()))return e.children.some(function(e){var t=e.actualNode;return 3===t.nodeType&&t.nodeValue.trim()})}(e)||h.isVisualContent(e.actualNode)||!!n||!!l.labelVirtual(e)||!t&&e.children.some(function(e){return 1===e.actualNode.nodeType&&h.hasContentVirtual(e)})},h.hasContent=function(e,t,n){return e=axe.utils.getNodeFromTree(e),h.hasContentVirtual(e,t,n)},h.idrefs=function(e,t){\"use strict\";var n,r,a=h.getRootNode(e),o=[],i=e.getAttribute(t);if(i)for(n=0,r=(i=axe.utils.tokenList(i)).length;n<r;n++)o.push(a.getElementById(i[n]));return o},h.isFocusable=function(e){\"use strict\";if(f(e))return!1;if(h.isNativelyFocusable(e))return!0;var t=e.getAttribute(\"tabindex\");return!(!t||isNaN(parseInt(t,10)))},h.isNativelyFocusable=function(e){\"use strict\";if(!e||f(e))return!1;switch(e.nodeName.toUpperCase()){case\"A\":case\"AREA\":if(e.href)return!0;break;case\"INPUT\":return\"hidden\"!==e.type;case\"TEXTAREA\":case\"SELECT\":case\"DETAILS\":case\"BUTTON\":return!0}return!1},h.insertedIntoFocusOrder=function(e){return-1<e.tabIndex&&h.isFocusable(e)&&!h.isNativelyFocusable(e)},h.isHiddenWithCSS=function(e,t){if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),[\"STYLE\",\"SCRIPT\"].includes(e.nodeName.toUpperCase()))return!1;var n=window.getComputedStyle(e,null);if(!n)throw new Error(\"Style does not exist for the given element.\");if(\"none\"===n.getPropertyValue(\"display\"))return!0;var r=[\"hidden\",\"collapse\"],a=n.getPropertyValue(\"visibility\");if(r.includes(a)&&!t)return!0;if(r.includes(a)&&t&&r.includes(t))return!0;var o=h.getComposedParent(e);return!(!o||r.includes(a))&&h.isHiddenWithCSS(o,a)},h.isHTML5=function(e){var t=e.doctype;return null!==t&&(\"html\"===t.name&&!t.publicId&&!t.systemId)};var b=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function y(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return b.includes(t)||\"table-\"===t.substr(0,6)}h.isInTextBlock=function(n){if(y(n))return!1;var e=function(e){for(var t=h.getComposedParent(e);t&&!y(t);)t=h.getComposedParent(t);return axe.utils.getNodeFromTree(t)}(n),r=\"\",a=\"\",o=0;return function t(e,n){!1!==n(e.actualNode)&&e.children.forEach(function(e){return t(e,n)})}(e,function(e){if(2===o)return!1;if(3===e.nodeType&&(r+=e.nodeValue),1===e.nodeType){var t=(e.nodeName||\"\").toUpperCase();if([\"BR\",\"HR\"].includes(t))0===o?a=r=\"\":o=2;else{if(\"none\"===e.style.display||\"hidden\"===e.style.overflow||![\"\",null,\"none\"].includes(e.style.float)||![\"\",null,\"relative\"].includes(e.style.position))return!1;if(\"A\"===t&&e.href||\"link\"===(e.getAttribute(\"role\")||\"\").toLowerCase())return e===n&&(o=1),a+=e.textContent,!1}}}),r=axe.commons.text.sanitize(r),a=axe.commons.text.sanitize(a),r.length>a.length},h.isNode=function(e){\"use strict\";return e instanceof Node},h.isOffscreen=function(e){var t,n=document.documentElement,r=window.getComputedStyle(e),a=window.getComputedStyle(document.body||n).getPropertyValue(\"direction\"),o=h.getElementCoordinates(e);if(o.bottom<0&&(function(e,t){for(e=h.getComposedParent(e);e&&\"html\"!==e.nodeName.toLowerCase();){if(e.scrollTop&&0<=(t+=e.scrollTop))return!1;e=h.getComposedParent(e)}return!0}(e,o.bottom)||\"absolute\"===r.position))return!0;if(0===o.left&&0===o.right)return!1;if(\"ltr\"===a){if(o.right<=0)return!0}else if(t=Math.max(n.scrollWidth,h.getViewportSize(window).width),o.left>=t)return!0;return!1};var v=/^\\/?#[^/!]/;h.isSkipLink=function(e){return!!v.test(e.getAttribute(\"href\"))&&(void 0!==axe._cache.get(\"firstPageLink\")?t=axe._cache.get(\"firstPageLink\"):(t=axe.utils.querySelectorAll(axe._tree,'a:not([href^=\"#\"]):not([href^=\"/#\"]):not([href^=\"javascript\"])')[0],axe._cache.set(\"firstPageLink\",t||null)),!t||e.compareDocumentPosition(t.actualNode)===e.DOCUMENT_POSITION_FOLLOWING);var t},h.isVisible=function(e,t,n){\"use strict\";var r=axe.utils.getNodeFromTree(e),a=\"_isVisible\"+(t?\"ScreenReader\":\"\");if(9===e.nodeType)return!0;if(11===e.nodeType&&(e=e.host),r&&void 0!==r[a])return r[a];var o=window.getComputedStyle(e,null);if(null===o)return!1;var i=e.nodeName.toUpperCase();if(\"none\"===o.getPropertyValue(\"display\")||[\"STYLE\",\"SCRIPT\",\"NOSCRIPT\",\"TEMPLATE\"].includes(i)||!t&&function(e){\"use strict\";var t=e.match(/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px\\s*\\)/);return!(!t||5!==t.length)&&(t[3]-t[1]<=0&&t[2]-t[4]<=0)}(o.getPropertyValue(\"clip\"))||!n&&(\"hidden\"===o.getPropertyValue(\"visibility\")||!t&&h.isOffscreen(e))||t&&\"true\"===e.getAttribute(\"aria-hidden\"))return!1;var u=e.assignedSlot?e.assignedSlot:e.parentNode,s=!1;return u&&(s=h.isVisible(u,t,!0)),r&&(r[a]=s),s};var D=[\"checkbox\",\"img\",\"radio\",\"range\",\"slider\",\"spinbutton\",\"textbox\"];h.isVisualContent=function(e){var t=e.getAttribute(\"role\");if(t)return-1!==D.indexOf(t);switch(e.nodeName.toUpperCase()){case\"IMG\":case\"IFRAME\":case\"OBJECT\":case\"VIDEO\":case\"AUDIO\":case\"CANVAS\":case\"SVG\":case\"MATH\":case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":case\"KEYGEN\":case\"PROGRESS\":case\"METER\":return!0;case\"INPUT\":return\"hidden\"!==e.type;default:return!1}},h.shadowElementsFromPoint=function(r,a){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:document,o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0;if(999<o)throw new Error(\"Infinite loop detected\");return Array.from(t.elementsFromPoint(r,a)).filter(function(e){return h.getRootNode(e)===t}).reduce(function(e,t){if(axe.utils.isShadowRoot(t)){var n=h.shadowElementsFromPoint(r,a,t.shadowRoot,o+1);(e=e.concat(n)).length&&axe.commons.dom.visuallyContains(e[0],t)&&e.push(t)}else e.push(t);return e},[])},h.visuallyContains=function(e,t){var n=e.getBoundingClientRect(),r=n.top+.01,a=n.bottom-.01,o=n.left+.01,i=n.right-.01,u=t.getBoundingClientRect(),s=u.top,l=u.left,c=s-t.scrollTop,d=s-t.scrollTop+t.scrollHeight,m=l-t.scrollLeft,p=l-t.scrollLeft+t.scrollWidth,f=window.getComputedStyle(t);return\"inline\"===f.getPropertyValue(\"display\")||!(o<m&&o<u.left||r<c&&r<u.top||p<i&&i>u.right||d<a&&a>u.bottom)&&(!(i>u.right||a>u.bottom)||(\"scroll\"===f.overflow||\"auto\"===f.overflow||\"hidden\"===f.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement))},h.visuallyOverlaps=function(e,t){var n=t.getBoundingClientRect(),r=n.top,a=n.left,o=r-t.scrollTop,i=r-t.scrollTop+t.scrollHeight,u=a-t.scrollLeft,s=a-t.scrollLeft+t.scrollWidth;if(e.left>s&&e.left>n.right||e.top>i&&e.top>n.bottom||e.right<u&&e.right<n.left||e.bottom<o&&e.bottom<n.top)return!1;var l=window.getComputedStyle(t);return!(e.left>n.right||e.top>n.bottom)||(\"scroll\"===l.overflow||\"auto\"===l.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement)},r.isAriaCombobox=function(e){return\"combobox\"===axe.commons.aria.getRole(e,{noImplicit:!0})},r.isAriaListbox=function(e){return\"listbox\"===axe.commons.aria.getRole(e,{noImplicit:!0})};var w=[\"progressbar\",\"scrollbar\",\"slider\",\"spinbutton\"];r.isAriaRange=function(e){var t=axe.commons.aria.getRole(e,{noImplicit:!0});return w.includes(t)},r.isAriaTextbox=function(e){return\"textbox\"===axe.commons.aria.getRole(e,{noImplicit:!0})},r.isNativeSelect=function(e){return\"SELECT\"===e.nodeName.toUpperCase()};var k=[\"button\",\"checkbox\",\"color\",\"file\",\"hidden\",\"image\",\"password\",\"radio\",\"reset\",\"submit\"];r.isNativeTextbox=function(e){var t=e.nodeName.toUpperCase();return\"TEXTAREA\"===t||\"INPUT\"===t&&!k.includes(e.type)},i.attributes=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t.getAttribute(e)},e)},i.condition=function(e,t){return!!t(e)};var x,E=[\"nodeName\",\"attributes\",\"properties\",\"condition\"];function C(e){var t=e.actualNode;return 3!==t.nodeType?\"\":t.textContent}i.fromDefinition=function(r,a){return r=r.actualNode||r,Array.isArray(a)?a.some(function(e){return i(r,e)}):\"string\"==typeof a?axe.utils.matchesSelector(r,a):Object.keys(a).every(function(e){if(!E.includes(e))throw new Error('Unknown matcher type \"'.concat(e,'\"'));var t=i[e],n=a[e];return t(r,n)})},i.fromFunction=function(t,n){if(\"object\"!==S(n)||Array.isArray(n)||n instanceof RegExp)throw new Error(\"Expect matcher to be an object\");return Object.keys(n).every(function(e){return i.fromPrimative(t(e),n[e])})},i.fromPrimative=function(e,t){var n=S(t);return Array.isArray(t)&&void 0!==e?t.includes(e):\"function\"===n?!!t(e):t instanceof RegExp?t.test(e):t===e},i.nodeName=function(e,t,n){var r=(2<arguments.length&&void 0!==n?n:{}).isXHTML;if(e=e.actualNode||e,void 0===r){if(\"string\"==typeof t)return axe.utils.matchesSelector(e,t);void 0===x&&(x=axe.utils.isXHTML(e.ownerDocument)),r=x}var a=r?e.nodeName:e.nodeName.toLowerCase();return i.fromPrimative(a,t)},i.properties=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t[e]},e)},o.getAllCells=function(e){var t,n,r,a,o=[];for(t=0,r=e.rows.length;t<r;t++)for(n=0,a=e.rows[t].cells.length;n<a;n++)o.push(e.rows[t].cells[n]);return o},o.getCellPosition=function(e,t){var n,r;for(t=t||o.toGrid(h.findUp(e,\"table\")),n=0;n<t.length;n++)if(t[n]&&-1!==(r=t[n].indexOf(e)))return{x:r,y:n}},o.getHeaders=function(e){if(e.hasAttribute(\"headers\"))return commons.dom.idrefs(e,\"headers\");var t=commons.table.toGrid(commons.dom.findUp(e,\"table\")),n=commons.table.getCellPosition(e,t),r=o.traverse(\"left\",n,t).filter(function(e){return o.isRowHeader(e)}),a=o.traverse(\"up\",n,t).filter(function(e){return o.isColumnHeader(e)});return[].concat(r,a).reverse()},o.getScope=function(e){var t=e.getAttribute(\"scope\"),n=e.getAttribute(\"role\");if(e instanceof Element==!1||-1===[\"TD\",\"TH\"].indexOf(e.nodeName.toUpperCase()))throw new TypeError(\"Expected TD or TH element\");if(\"columnheader\"===n)return\"col\";if(\"rowheader\"===n)return\"row\";if(\"col\"===t||\"row\"===t)return t;if(\"TH\"!==e.nodeName.toUpperCase())return!1;var r=o.toGrid(h.findUp(e,\"table\")),a=o.getCellPosition(e);return r[a.y].reduce(function(e,t){return e&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"col\":r.map(function(e){return e[a.x]}).reduce(function(e,t){return e&&t&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"row\":\"auto\"},o.isColumnHeader=function(e){return-1!==[\"col\",\"auto\"].indexOf(o.getScope(e))},o.isDataCell=function(e){if(!e.children.length&&!e.textContent.trim())return!1;var t=e.getAttribute(\"role\");return axe.commons.aria.isValidRole(t)?[\"cell\",\"gridcell\"].includes(t):\"TD\"===e.nodeName.toUpperCase()},o.isDataTable=function(e){var t=(e.getAttribute(\"role\")||\"\").toLowerCase();if((\"presentation\"===t||\"none\"===t)&&!h.isFocusable(e))return!1;if(\"true\"===e.getAttribute(\"contenteditable\")||h.findUp(e,'[contenteditable=\"true\"]'))return!0;if(\"grid\"===t||\"treegrid\"===t||\"table\"===t)return!0;if(\"landmark\"===commons.aria.getRoleType(t))return!0;if(\"0\"===e.getAttribute(\"datatable\"))return!1;if(e.getAttribute(\"summary\"))return!0;if(e.tHead||e.tFoot||e.caption)return!0;for(var n=0,r=e.children.length;n<r;n++)if(\"COLGROUP\"===e.children[n].nodeName.toUpperCase())return!0;for(var a,o,i=0,u=e.rows.length,s=!1,l=0;l<u;l++)for(var c=0,d=(a=e.rows[l]).cells.length;c<d;c++){if(\"TH\"===(o=a.cells[c]).nodeName.toUpperCase())return!0;if(s||o.offsetWidth===o.clientWidth&&o.offsetHeight===o.clientHeight||(s=!0),o.getAttribute(\"scope\")||o.getAttribute(\"headers\")||o.getAttribute(\"abbr\"))return!0;if([\"columnheader\",\"rowheader\"].includes((o.getAttribute(\"role\")||\"\").toLowerCase()))return!0;if(1===o.children.length&&\"ABBR\"===o.children[0].nodeName.toUpperCase())return!0;i++}if(e.getElementsByTagName(\"table\").length)return!1;if(u<2)return!1;var m,p,f=e.rows[Math.ceil(u/2)];if(1===f.cells.length&&1===f.cells[0].colSpan)return!1;if(5<=f.cells.length)return!0;if(s)return!0;for(l=0;l<u;l++){if(a=e.rows[l],m&&m!==window.getComputedStyle(a).getPropertyValue(\"background-color\"))return!0;if(m=window.getComputedStyle(a).getPropertyValue(\"background-color\"),p&&p!==window.getComputedStyle(a).getPropertyValue(\"background-image\"))return!0;p=window.getComputedStyle(a).getPropertyValue(\"background-image\")}return 20<=u||!(h.getElementCoordinates(e).width>.95*h.getViewportSize(window).width)&&(!(i<10)&&!e.querySelector(\"object, embed, iframe, applet\"))},o.isHeader=function(e){if(o.isColumnHeader(e)||o.isRowHeader(e))return!0;if(e.getAttribute(\"id\")){var t=axe.utils.escapeSelector(e.getAttribute(\"id\"));return!!document.querySelector('[headers~=\"'.concat(t,'\"]'))}return!1},o.isRowHeader=function(e){return[\"row\",\"auto\"].includes(o.getScope(e))},o.toGrid=function(e){for(var t=[],n=e.rows,r=0,a=n.length;r<a;r++){var o=n[r].cells;t[r]=t[r]||[];for(var i=0,u=0,s=o.length;u<s;u++)for(var l=0;l<o[u].colSpan;l++){for(var c=0;c<o[u].rowSpan;c++){for(t[r+c]=t[r+c]||[];t[r+c][i];)i++;t[r+c][i]=o[u]}i++}}return t},o.toArray=o.toGrid,o.traverse=function(e,t,n,r){if(Array.isArray(t)&&(r=n,n=t,t={x:0,y:0}),\"string\"==typeof e)switch(e){case\"left\":e={x:-1,y:0};break;case\"up\":e={x:0,y:-1};break;case\"right\":e={x:1,y:0};break;case\"down\":e={x:0,y:1}}return function e(t,n,r,a){var o,i=r[n.y]?r[n.y][n.x]:void 0;return i?\"function\"==typeof a&&!0===(o=a(i,n,r))?[i]:((o=e(t,{x:n.x+t.x,y:n.y+t.y},r,a)).unshift(i),o):[]}(e,{x:t.x+e.x,y:t.y+e.y},n,r)},g.accessibleText=function(e,t){var n=axe.utils.getNodeFromTree(e);return g.accessibleTextVirtual(n,t)},g.accessibleTextVirtual=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode;if(r=function(e,t){var n=e.actualNode;t.startNode||(t=R({startNode:e},t));1===n.nodeType&&t.inLabelledByContext&&void 0===t.includeHidden&&(t=R({includeHidden:!h.isVisible(n,!0)},t));return t}(n,r),function(e,t){var n=e.actualNode;if(1!==n.nodeType||t.includeHidden)return!1;return!h.isVisible(n,!0)}(n,r))return\"\";var a=[l.arialabelledbyText,l.arialabelText,g.nativeTextAlternative,g.formControlValue,g.subtreeText,C,g.titleText].reduce(function(e,t){return\"\"!==e?e:t(n,r)},\"\");return r.startNode===n&&(a=g.sanitize(a)),r.debug&&axe.log(a||\"{empty-value}\",t,r),a},g.accessibleTextVirtual.alreadyProcessed=function(e,t){return t.processed=t.processed||[],!!t.processed.includes(e)||(t.processed.push(e),!1)};var A=[\"textbox\",\"progressbar\",\"scrollbar\",\"slider\",\"spinbutton\",\"combobox\",\"listbox\"];g.formControlValueMethods={nativeTextboxValue:function(e){if(e=e.actualNode||e,axe.commons.forms.isNativeTextbox(e))return e.value||\"\";return\"\"},nativeSelectValue:function(e){return e=e.actualNode||e,axe.commons.forms.isNativeSelect(e)&&Array.from(e.options).filter(function(e){return e.selected}).map(function(e){return e.text}).join(\" \")||\"\"},ariaTextboxValue:function(e){var t=e.actualNode;if(!axe.commons.forms.isAriaTextbox(t))return\"\";return h.isHiddenWithCSS(t)?t.textContent:g.visibleVirtual(e,!0)},ariaListboxValue:function(e,t){var n=e.actualNode;if(!axe.commons.forms.isAriaListbox(n))return\"\";var r=l.getOwnedVirtual(e).filter(function(e){return\"option\"===l.getRole(e)&&\"true\"===e.actualNode.getAttribute(\"aria-selected\")});return 0!==r.length?axe.commons.text.accessibleTextVirtual(r[0],t):\"\"},ariaComboboxValue:function(e,t){var n,r=e.actualNode;return axe.commons.forms.isAriaCombobox(r)&&(n=l.getOwnedVirtual(e).filter(function(e){return\"listbox\"===l.getRole(e)})[0])?g.formControlValueMethods.ariaListboxValue(n,t):\"\"},ariaRangeValue:function(e){if(e=e.actualNode||e,!axe.commons.forms.isAriaRange(e)||!e.hasAttribute(\"aria-valuenow\"))return\"\";var t=+e.getAttribute(\"aria-valuenow\");return isNaN(t)?\"0\":String(t)}},g.formControlValue=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode,a=g.unsupported.accessibleNameFromFieldValue||[],o=l.getRole(t);if(r.startNode===n||!A.includes(o)||a.includes(o))return\"\";var i=Object.keys(g.formControlValueMethods).map(function(e){return g.formControlValueMethods[e]}).reduce(function(e,t){return e||t(n,r)},\"\");return r.debug&&axe.log(i||\"{empty-value}\",t,r),i},g.isHumanInterpretable=function(e){if(!e.length)return 0;if([\"x\",\"i\"].includes(e))return 0;var t=g.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return g.sanitize(t)?1:0};g.autocomplete={stateTerms:[\"on\",\"off\"],standaloneTerms:[\"name\",\"honorific-prefix\",\"given-name\",\"additional-name\",\"family-name\",\"honorific-suffix\",\"nickname\",\"username\",\"new-password\",\"current-password\",\"organization-title\",\"organization\",\"street-address\",\"address-line1\",\"address-line2\",\"address-line3\",\"address-level4\",\"address-level3\",\"address-level2\",\"address-level1\",\"country\",\"country-name\",\"postal-code\",\"cc-name\",\"cc-given-name\",\"cc-additional-name\",\"cc-family-name\",\"cc-number\",\"cc-exp\",\"cc-exp-month\",\"cc-exp-year\",\"cc-csc\",\"cc-type\",\"transaction-currency\",\"transaction-amount\",\"language\",\"bday\",\"bday-day\",\"bday-month\",\"bday-year\",\"sex\",\"url\",\"photo\"],qualifiers:[\"home\",\"work\",\"mobile\",\"fax\",\"pager\"],qualifiedTerms:[\"tel\",\"tel-country-code\",\"tel-national\",\"tel-area-code\",\"tel-local\",\"tel-local-prefix\",\"tel-local-suffix\",\"tel-extension\",\"email\",\"impp\"],locations:[\"billing\",\"shipping\"]},g.isValidAutocomplete=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=n.looseTyped,a=void 0!==r&&r,o=n.stateTerms,i=void 0===o?[]:o,u=n.locations,s=void 0===u?[]:u,l=n.qualifiers,c=void 0===l?[]:l,d=n.standaloneTerms,m=void 0===d?[]:d,p=n.qualifiedTerms,f=void 0===p?[]:p;if(e=e.toLowerCase().trim(),(i=i.concat(g.autocomplete.stateTerms)).includes(e)||\"\"===e)return!0;c=c.concat(g.autocomplete.qualifiers),s=s.concat(g.autocomplete.locations),m=m.concat(g.autocomplete.standaloneTerms),f=f.concat(g.autocomplete.qualifiedTerms);var h=e.split(/\\s+/g);if(!a&&(8<h[0].length&&\"section-\"===h[0].substr(0,8)&&h.shift(),s.includes(h[0])&&h.shift(),c.includes(h[0])&&(h.shift(),m=[]),1!==h.length))return!1;var b=h[h.length-1];return m.includes(b)||f.includes(b)},g.labelText=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=g.accessibleTextVirtual.alreadyProcessed;if(n.inControlContext||n.inLabelledByContext||r(e,n))return\"\";n.startNode||(n.startNode=e);var a,o=R({inControlContext:!0},n),i=function(e){var t=e.actualNode;return t.id?h.findElmsInContext({elm:\"label\",attr:\"for\",value:t.id,context:t}):[]}(e),u=h.findUpVirtual(e,\"label\");return u?(a=[].concat(he(i),[u])).sort(axe.utils.nodeSorter):a=i,a.map(function(e){return g.accessibleText(e,o)}).filter(function(e){return\"\"!==e}).join(\" \")},g.labelVirtual=function(e){var t,n;if(n=l.labelVirtual(e))return n;if(e.actualNode.id){var r=axe.utils.escapeSelector(e.actualNode.getAttribute(\"id\"));if(n=(t=axe.commons.dom.getRootNode(e.actualNode).querySelector('label[for=\"'+r+'\"]'))&&g.visible(t,!0))return n}return(n=(t=h.findUpVirtual(e,\"label\"))&&g.visible(t,!0))||null},g.label=function(e){return e=axe.utils.getNodeFromTree(e),g.labelVirtual(e)},g.nativeElementType=[{matches:[{nodeName:\"textarea\"},{nodeName:\"input\",properties:{type:[\"text\",\"password\",\"search\",\"tel\",\"email\",\"url\"]}}],namingMethods:\"labelText\"},{matches:{nodeName:\"input\",properties:{type:[\"button\",\"submit\",\"reset\"]}},namingMethods:[\"valueText\",\"titleText\",\"buttonDefaultText\"]},{matches:{nodeName:\"input\",properties:{type:\"image\"}},namingMethods:[\"altText\",\"valueText\",\"labelText\",\"titleText\",\"buttonDefaultText\"]},{matches:\"button\",namingMethods:\"subtreeText\"},{matches:\"fieldset\",namingMethods:\"fieldsetLegendText\"},{matches:\"OUTPUT\",namingMethods:\"subtreeText\"},{matches:[{nodeName:\"select\"},{nodeName:\"input\",properties:{type:/^(?!text|password|search|tel|email|url|button|submit|reset)/}}],namingMethods:\"labelText\"},{matches:\"summary\",namingMethods:\"subtreeText\"},{matches:\"figure\",namingMethods:[\"figureText\",\"titleText\"]},{matches:\"img\",namingMethods:\"altText\"},{matches:\"table\",namingMethods:[\"tableCaptionText\",\"tableSummaryText\"]},{matches:[\"hr\",\"br\"],namingMethods:[\"titleText\",\"singleSpace\"]}],g.nativeTextAlternative=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode;if(1!==t.nodeType||[\"presentation\",\"none\"].includes(l.getRole(t)))return\"\";var a=function(n){var e=g.nativeElementType,t=g.nativeTextMethods,r=e.find(function(e){var t=e.matches;return axe.commons.matches(n,t)});return(r?[].concat(r.namingMethods):[]).map(function(e){return t[e]})}(n).reduce(function(e,t){return e||t(n,r)},\"\");return r.debug&&axe.log(a||\"{empty-value}\",t,r),a};var F={submit:\"Submit\",image:\"Submit\",reset:\"Reset\",button:\"\"};function j(e,t){return t.actualNode.getAttribute(e)||\"\"}function z(e,t,n){var r=t.actualNode,a=[e=e.toLowerCase(),r.nodeName.toLowerCase()].join(\",\"),o=r.querySelector(a);return o&&o.nodeName.toLowerCase()===e?g.accessibleText(o,n):\"\"}g.nativeTextMethods={valueText:function(e){return e.actualNode.value||\"\"},buttonDefaultText:function(e){var t=e.actualNode;return F[t.type]||\"\"},tableCaptionText:z.bind(null,\"caption\"),figureText:z.bind(null,\"figcaption\"),fieldsetLegendText:z.bind(null,\"legend\"),altText:j.bind(null,\"alt\"),tableSummaryText:j.bind(null,\"summary\"),titleText:function(e,t){return g.titleText(e,t)},subtreeText:function(e,t){return g.subtreeText(e,t)},labelText:function(e,t){return g.labelText(e,t)},singleSpace:function(){return\" \"}},g.sanitize=function(e){\"use strict\";return e.replace(/\\r\\n/g,\"\\n\").replace(/\\u00A0/g,\" \").replace(/[\\s]{2,}/g,\" \").trim()},g.subtreeText=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=g.accessibleTextVirtual.alreadyProcessed;n.startNode=n.startNode||e;var a=n.strict;return r(e,n)||!l.namedFromContents(e,{strict:a})?\"\":l.getOwnedVirtual(e).reduce(function(e,t){return function(e,t,n){var r=t.actualNode.nodeName.toUpperCase(),a=g.accessibleTextVirtual(t,n);if(!a)return e;q.includes(r)||(\" \"!==a[0]&&(a+=\" \"),e&&\" \"!==e[e.length-1]&&(a=\" \"+a));return e+a}(e,t,n)},\"\")};var q=[\"A\",\"EM\",\"STRONG\",\"SMALL\",\"MARK\",\"ABBR\",\"DFN\",\"I\",\"B\",\"S\",\"U\",\"CODE\",\"VAR\",\"SAMP\",\"KBD\",\"SUP\",\"SUB\",\"Q\",\"CITE\",\"SPAN\",\"BDO\",\"BDI\",\"WBR\",\"INS\",\"DEL\",\"MAP\",\"AREA\",\"NOSCRIPT\",\"RUBY\",\"BUTTON\",\"LABEL\",\"OUTPUT\",\"DATALIST\",\"KEYGEN\",\"PROGRESS\",\"COMMAND\",\"CANVAS\",\"TIME\",\"METER\",\"#TEXT\"];var N=[\"button\",\"iframe\",\"a[href]\",{nodeName:\"input\",properties:{type:\"button\"}}];function T(){return new RegExp(\"[ᴀ-ᵿᶀ-ᶿ᷀-᷿₠-⃏⃐-⃿℀-⅏⅐-↏←-⇿∀-⋿⌀-⏿␀-␿⑀-⑟①-⓿─-╿▀-▟■-◿☀-⛿✀-➿]\")}return g.titleText=function(e){return 1===(e=e.actualNode||e).nodeType&&e.hasAttribute(\"title\")?!axe.commons.matches(e,N)&&[\"none\",\"presentation\"].includes(l.getRole(e))?\"\":e.getAttribute(\"title\"):\"\"},g.hasUnicode=function(e,t){var n=t.emoji,r=t.nonBmp,a=t.punctuations;return n?axe.imports.emojiRegexText().test(e):r?T().test(e):!!a&&/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g.test(e)},g.removeUnicode=function(e,t){var n=t.emoji,r=t.nonBmp,a=t.punctuations;return n&&(e=e.replace(axe.imports.emojiRegexText(),\"\")),r&&(e=e.replace(T(),\"\")),a&&(e=e.replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g,\"\")),e},g.unsupported={accessibleNameFromFieldValue:[\"combobox\",\"listbox\",\"progressbar\"]},g.visibleVirtual=function(n,r,a){var e=n.children.map(function(e){if(3===e.actualNode.nodeType){var t=e.actualNode.nodeValue;if(t&&h.isVisible(n.actualNode,r))return t}else if(!a)return g.visibleVirtual(e,r)}).join(\"\");return g.sanitize(e)},g.visible=function(e,t,n){return e=axe.utils.getNodeFromTree(e),g.visibleVirtual(e,t,n)},commons}()})}(\"object\"==typeof window?window:this);";
const pageFunctions=require('../../lib/page-functions.js');








function runA11yChecks(){

return window.axe.run(document,{
elementRef:true,
runOnly:{
type:'tag',
values:[
'wcag2a',
'wcag2aa']},


resultTypes:['violations','inapplicable'],
rules:{
'tabindex':{enabled:true},
'accesskeys':{enabled:true},
'table-fake-caption':{enabled:false},
'td-has-header':{enabled:false},
'marquee':{enabled:false},
'area-alt':{enabled:false},
'aria-dpub-role-fallback':{enabled:false},
'aria-hidden-body':{enabled:false},
'duplicate-id-active':{enabled:false},
'duplicate-id-aria':{enabled:false},
'html-xml-lang-mismatch':{enabled:false},
'blink':{enabled:false},
'server-side-image-map':{enabled:false},
'aria-hidden-focus':{enabled:false},
'form-field-multiple-labels':{enabled:false},
'aria-input-field-name':{enabled:false},
'aria-toggle-field-name':{enabled:false}}}).


then(axeResult=>{


axeResult.violations.forEach(v=>v.nodes.forEach(node=>{

node.path=getNodePath(node.element);

node.snippet=getOuterHTMLSnippet(node.element);

node.nodeLabel=getNodeLabel(node.element);

node.element=node.any=node.all=node.none=undefined;
}));


axeResult={violations:axeResult.violations,notApplicable:axeResult.inapplicable};
return axeResult;
});
}

class Accessibility extends Gatherer{




afterPass(passContext){
const driver=passContext.driver;
const expression=`(function () {
      ${pageFunctions.getOuterHTMLSnippetString};
      ${pageFunctions.getNodePathString};
      ${pageFunctions.getNodeLabelString};
      ${axeLibSource};
      return (${runA11yChecks.toString()}());
    })()`;

return driver.evaluateAsync(expression,{useIsolation:true}).then(returnedValue=>{
if(!returnedValue){
throw new Error('No axe-core results returned');
}
if(!Array.isArray(returnedValue.violations)){
throw new Error('Unable to parse axe results'+returnedValue);
}
return returnedValue;
});
}}


module.exports=Accessibility;

},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/anchor-elements":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');
const pageFunctions=require('../../lib/page-functions.js');













function collectAnchorElements(){

const resolveURLOrEmpty=url=>{
try{
return new URL(url,window.location.href).href;
}catch(_){
return'';
}
};



const anchorElements=getElementsInDocument('a');

return anchorElements.map(node=>{

const outerHTML=getOuterHTMLSnippet(node);

if(node instanceof HTMLAnchorElement){
return{
href:node.href,
text:node.innerText,
rel:node.rel,
target:node.target,
outerHTML};

}

return{
href:resolveURLOrEmpty(node.href.baseVal),
text:node.textContent||'',
rel:'',
target:node.target.baseVal||'',
outerHTML};

});
}

class AnchorElements extends Gatherer{




async afterPass(passContext){
const driver=passContext.driver;
const expression=`(() => {
      ${pageFunctions.getOuterHTMLSnippetString};
      ${pageFunctions.getElementsInDocumentString};

      return (${collectAnchorElements})();
    })()`;


return driver.evaluateAsync(expression,{useIsolation:true});
}}


module.exports=AnchorElements;

},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/cache-contents":[function(require,module,exports){





'use strict';



const Gatherer=require('./gatherer.js');






function getCacheContents(){

return caches.keys().


then(cacheNames=>Promise.all(cacheNames.map(cacheName=>caches.open(cacheName)))).

then(caches=>{

const requests=[];


return Promise.all(caches.map(cache=>{
return cache.keys().
then(reqs=>{
requests.push(...reqs.map(r=>r.url));
});
})).then(_=>{
return requests;
});
});
}

class CacheContents extends Gatherer{





async afterPass(passContext){
const driver=passContext.driver;


const cacheUrls=await driver.evaluateAsync(`(${getCacheContents.toString()}())`);
if(!cacheUrls||!Array.isArray(cacheUrls)){
throw new Error('Unable to retrieve cache contents');
}

return cacheUrls;
}}


module.exports=CacheContents;

},{"./gatherer.js":53}],"../gather/gatherers/console-messages":[function(require,module,exports){










'use strict';

const Gatherer=require('./gatherer.js');

class ConsoleMessages extends Gatherer{
constructor(){
super();

this._logEntries=[];
this._onConsoleEntryAdded=this.onConsoleEntry.bind(this);
}




onConsoleEntry(entry){
this._logEntries.push(entry);
}




async beforePass(passContext){
const driver=passContext.driver;
driver.on('Log.entryAdded',this._onConsoleEntryAdded);
await driver.sendCommand('Log.enable');
await driver.sendCommand('Log.startViolationsReport',{
config:[{name:'discouragedAPIUse',threshold:-1}]});

}





async afterPass(passContext){
await passContext.driver.sendCommand('Log.stopViolationsReport');
await passContext.driver.off('Log.entryAdded',this._onConsoleEntryAdded);
await passContext.driver.sendCommand('Log.disable');
return this._logEntries;
}}


module.exports=ConsoleMessages;

},{"./gatherer.js":53}],"../gather/gatherers/css-usage":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');




class CSSUsage extends Gatherer{




async afterPass(passContext){
const driver=passContext.driver;


const stylesheets=[];

const onStylesheetAdded=sheet=>stylesheets.push(sheet);
driver.on('CSS.styleSheetAdded',onStylesheetAdded);

await driver.sendCommand('DOM.enable');
await driver.sendCommand('CSS.enable');
await driver.sendCommand('CSS.startRuleUsageTracking');
await driver.evaluateAsync('getComputedStyle(document.body)');
driver.off('CSS.styleSheetAdded',onStylesheetAdded);


const promises=stylesheets.map(sheet=>{
const styleSheetId=sheet.header.styleSheetId;
return driver.sendCommand('CSS.getStyleSheetText',{styleSheetId}).then(content=>{
return{
header:sheet.header,
content:content.text};

});
});
const styleSheetInfo=await Promise.all(promises);

const ruleUsageResponse=await driver.sendCommand('CSS.stopRuleUsageTracking');
await driver.sendCommand('CSS.disable');
await driver.sendCommand('DOM.disable');

const dedupedStylesheets=new Map(styleSheetInfo.map(sheet=>{
return[sheet.content,sheet];
}));
return{
rules:ruleUsageResponse.ruleUsage,
stylesheets:Array.from(dedupedStylesheets.values())};

}}


module.exports=CSSUsage;

},{"./gatherer.js":53}],"../gather/gatherers/dobetterweb/appcache":[function(require,module,exports){





'use strict';

const Gatherer=require('../gatherer.js');

class AppCacheManifest extends Gatherer{






afterPass(passContext){
const driver=passContext.driver;

return driver.querySelector('html').
then(node=>node&&node.getAttribute('manifest'));
}}


module.exports=AppCacheManifest;

},{"../gatherer.js":53}],"../gather/gatherers/dobetterweb/doctype":[function(require,module,exports){





'use strict';

const Gatherer=require('../gatherer.js');






function getDoctype(){

if(!document.doctype){
return null;
}

const{name,publicId,systemId}=document.doctype;
return{name,publicId,systemId};
}

class Doctype extends Gatherer{




afterPass(passContext){
const driver=passContext.driver;
return driver.evaluateAsync(`(${getDoctype.toString()}())`);
}}


module.exports=Doctype;

},{"../gatherer.js":53}],"../gather/gatherers/dobetterweb/domstats":[function(require,module,exports){













'use strict';

const Gatherer=require('../gatherer.js');
const pageFunctions=require('../../../lib/page-functions.js');








function createSelectorsLabel(element){
let name=element.localName||'';
const idAttr=element.getAttribute&&element.getAttribute('id');
if(idAttr){
name+=`#${idAttr}`;
}


if(element.classList){
const className=element.classList.toString();
if(className){
name+=`.${className.trim().replace(/\s+/g,'.')}`;
}
}else if(ShadowRoot.prototype.isPrototypeOf(element)){
name+='#shadow-root';
}

return name;
}






function elementPathInDOM(element){
const visited=new Set();
const path=[createSelectorsLabel(element)];
let node=element;
while(node){
visited.add(node);



if(ShadowRoot.prototype.isPrototypeOf(node)){
const isShadowHost=node.host&&node.localName!=='a';
node=isShadowHost?node.host:node.parentElement;
}else{
const isShadowHost=node.parentNode&&node.parentNode.host&&
node.parentNode.localName!=='a';
node=isShadowHost?node.parentNode.host:node.parentElement;
}

if(visited.has(node)){
node=null;
}

if(node){
path.unshift(createSelectorsLabel(node));
}
}
return path;
}








function getDOMStats(element,deep=true){
let deepestElement=null;
let maxDepth=-1;
let maxWidth=-1;
let numElements=0;
let parentWithMostChildren=null;





const _calcDOMWidthAndHeight=function(element,depth=1){
if(depth>maxDepth){
deepestElement=element;
maxDepth=depth;
}
if(element.children.length>maxWidth){
parentWithMostChildren=element;
maxWidth=element.children.length;
}

let child=element.firstElementChild;
while(child){
_calcDOMWidthAndHeight(child,depth+1);

if(deep&&child.shadowRoot){
_calcDOMWidthAndHeight(child.shadowRoot,depth+1);
}
child=child.nextElementSibling;
numElements++;
}

return{maxDepth,maxWidth,numElements};
};

const result=_calcDOMWidthAndHeight(element);

return{
depth:{
max:result.maxDepth,
pathToElement:elementPathInDOM(deepestElement),

snippet:getOuterHTMLSnippet(deepestElement,['style'])},

width:{
max:result.maxWidth,
pathToElement:elementPathInDOM(parentWithMostChildren),
snippet:getOuterHTMLSnippet(parentWithMostChildren,['style'])},

totalBodyElements:result.numElements};

}

class DOMStats extends Gatherer{




async afterPass(passContext){
const driver=passContext.driver;

const expression=`(function() {
      ${pageFunctions.getOuterHTMLSnippetString};
      ${createSelectorsLabel.toString()};
      ${elementPathInDOM.toString()};
      return (${getDOMStats.toString()}(document.body));
    })()`;
await driver.sendCommand('DOM.enable');
const results=await driver.evaluateAsync(expression,{useIsolation:true});
await driver.sendCommand('DOM.disable');
return results;
}}


module.exports=DOMStats;

},{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/dobetterweb/optimized-images":[function(require,module,exports){










'use strict';

const log=require('lighthouse-logger');
const Gatherer=require('../gatherer.js');
const URL=require('../../../lib/url-shim.js');
const NetworkRequest=require('../../../lib/network-request.js');
const Sentry=require('../../../lib/sentry.js');
const Driver=require('../../driver.js');



const MAX_TIME_TO_SPEND_ENCODING=5000;

const MAX_RESOURCE_SIZE_TO_ENCODE=2000*1024;

const JPEG_QUALITY=0.92;
const WEBP_QUALITY=0.85;

const MINIMUM_IMAGE_SIZE=4096;

const IMAGE_REGEX=/^image\/((x|ms|x-ms)-)?(png|bmp|jpeg)$/;



class OptimizedImages extends Gatherer{
constructor(){
super();
this._encodingStartAt=0;
}





static filterImageRequests(networkRecords){

const seenUrls=new Set();
return networkRecords.reduce((prev,record)=>{

if(seenUrls.has(record.url)||!record.finished||record.sessionId){
return prev;
}

seenUrls.add(record.url);
const isOptimizableImage=record.resourceType===NetworkRequest.TYPES.Image&&
IMAGE_REGEX.test(record.mimeType);

const actualResourceSize=Math.min(record.resourceSize||0,record.transferSize||0);
if(isOptimizableImage&&actualResourceSize>MINIMUM_IMAGE_SIZE){
prev.push({
requestId:record.requestId,
url:record.url,
mimeType:record.mimeType,
resourceSize:actualResourceSize});

}

return prev;
},[]);
}







_getEncodedResponse(driver,requestId,encoding){
requestId=NetworkRequest.getRequestIdForBackend(requestId);

const quality=encoding==='jpeg'?JPEG_QUALITY:WEBP_QUALITY;
const params={requestId,encoding,quality,sizeOnly:true};
return driver.sendCommand('Audits.getEncodedResponse',params);
}






async calculateImageStats(driver,networkRecord){
const originalSize=networkRecord.resourceSize;


if(Date.now()-this._encodingStartAt>MAX_TIME_TO_SPEND_ENCODING||
originalSize>MAX_RESOURCE_SIZE_TO_ENCODE){
return{originalSize,jpegSize:undefined,webpSize:undefined};
}

const jpegData=await this._getEncodedResponse(driver,networkRecord.requestId,'jpeg');
const webpData=await this._getEncodedResponse(driver,networkRecord.requestId,'webp');

return{
originalSize,
jpegSize:jpegData.encodedSize,
webpSize:webpData.encodedSize};

}






async computeOptimizedImages(driver,imageRecords){
this._encodingStartAt=Date.now();


const results=[];

for(const record of imageRecords){
try{
const stats=await this.calculateImageStats(driver,record);

const image={failed:false,...stats,...record};
results.push(image);
}catch(err){
log.warn('optimized-images',err.message);



Sentry.captureException(err,{
tags:{gatherer:'OptimizedImages'},
extra:{imageUrl:URL.elideDataURI(record.url)},
level:'warning'});



const imageError={failed:true,errMsg:err.message,...record};
results.push(imageError);
}
}

return results;
}






afterPass(passContext,loadData){
const networkRecords=loadData.networkRecords;
const imageRecords=OptimizedImages.
filterImageRequests(networkRecords).
sort((a,b)=>b.resourceSize-a.resourceSize);

return Promise.resolve().
then(_=>this.computeOptimizedImages(passContext.driver,imageRecords)).
then(results=>{
const successfulResults=results.filter(result=>!result.failed);
if(results.length&&!successfulResults.length){
throw new Error('All image optimizations failed');
}

return results;
});
}}


module.exports=OptimizedImages;

},{"../../../lib/network-request.js":75,"../../../lib/sentry.js":78,"../../../lib/url-shim.js":"url","../../driver.js":51,"../gatherer.js":53,"lighthouse-logger":125}],"../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste":[function(require,module,exports){





'use strict';



const Gatherer=require('../gatherer.js');
const pageFunctions=require('../../../lib/page-functions.js');






function findPasswordInputsWithPreventedPaste(){
return Array.from(document.querySelectorAll('input[type="password"]')).
filter(passwordInput=>
!passwordInput.dispatchEvent(
new ClipboardEvent('paste',{cancelable:true}))).


map(passwordInput=>({

snippet:getOuterHTMLSnippet(passwordInput)}));

}

class PasswordInputsWithPreventedPaste extends Gatherer{




afterPass(passContext){
return passContext.driver.evaluateAsync(`(() => {
      ${pageFunctions.getOuterHTMLSnippetString};
      return (${findPasswordInputsWithPreventedPaste.toString()}());
    })()`);
}}



module.exports=PasswordInputsWithPreventedPaste;

},{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/dobetterweb/response-compression":[function(require,module,exports){
(function(Buffer){










'use strict';

const Gatherer=require('../gatherer.js');
const URL=require('../../../lib/url-shim.js');
const Sentry=require('../../../lib/sentry.js');
const NetworkRequest=require('../../../lib/network-request.js');
const gzip=require('zlib').gzip;

const CHROME_EXTENSION_PROTOCOL='chrome-extension:';
const compressionHeaders=['content-encoding','x-original-content-encoding'];
const compressionTypes=['gzip','br','deflate'];
const binaryMimeTypes=['image','audio','video'];

const textResourceTypes=[
NetworkRequest.TYPES.Document,
NetworkRequest.TYPES.Script,
NetworkRequest.TYPES.Stylesheet,
NetworkRequest.TYPES.XHR,
NetworkRequest.TYPES.Fetch,
NetworkRequest.TYPES.EventSource];


class ResponseCompression extends Gatherer{




static filterUnoptimizedResponses(networkRecords){

const unoptimizedResponses=[];

networkRecords.forEach(record=>{

if(record.sessionId)return;

const mimeType=record.mimeType;
const resourceType=record.resourceType||NetworkRequest.TYPES.Other;
const resourceSize=record.resourceSize;

const isBinaryResource=mimeType&&binaryMimeTypes.some(type=>mimeType.startsWith(type));
const isTextResource=!isBinaryResource&&textResourceTypes.includes(resourceType);
const isChromeExtensionResource=record.url.startsWith(CHROME_EXTENSION_PROTOCOL);

if(!isTextResource||!resourceSize||!record.finished||
isChromeExtensionResource||!record.transferSize||record.statusCode===304){
return;
}

const isContentEncoded=(record.responseHeaders||[]).find(header=>
compressionHeaders.includes(header.name.toLowerCase())&&
compressionTypes.includes(header.value));


if(!isContentEncoded){
unoptimizedResponses.push({
requestId:record.requestId,
url:record.url,
mimeType:mimeType,
transferSize:record.transferSize,
resourceSize:resourceSize,
gzipSize:0});

}
});

return unoptimizedResponses;
}






afterPass(passContext,loadData){
const networkRecords=loadData.networkRecords;
const textRecords=ResponseCompression.filterUnoptimizedResponses(networkRecords);

const driver=passContext.driver;
return Promise.all(textRecords.map(record=>{
return driver.getRequestContent(record.requestId).then(content=>{

if(!content){
return record;
}

return new Promise((resolve,reject)=>{
return gzip(content,(err,res)=>{
if(err){
return reject(err);
}


record.gzipSize=Buffer.byteLength(res,'utf8');

resolve(record);
});
});
}).catch(err=>{
Sentry.captureException(err,{
tags:{gatherer:'ResponseCompression'},
extra:{url:URL.elideDataURI(record.url)},
level:'warning'});


record.gzipSize=undefined;
return record;
});
}));
}}


module.exports=ResponseCompression;

}).call(this,require("buffer").Buffer);
},{"../../../lib/network-request.js":75,"../../../lib/sentry.js":78,"../../../lib/url-shim.js":"url","../gatherer.js":53,"buffer":102,"zlib":100}],"../gather/gatherers/dobetterweb/tags-blocking-first-paint":[function(require,module,exports){



















'use strict';

const Gatherer=require('../gatherer.js');
const Driver=require('../../driver.js');




function installMediaListener(){
window.___linkMediaChanges=[];
Object.defineProperty(HTMLLinkElement.prototype,'media',{
set:function(val){
window.___linkMediaChanges.push({
href:this.href,
media:val,
msSinceHTMLEnd:Date.now()-window.performance.timing.responseEnd,
matches:window.matchMedia(val).matches});


return this.setAttribute('media',val);
}});

}





function collectTagsThatBlockFirstPaint(){
return new Promise((resolve,reject)=>{
try{
const tagList=[...document.querySelectorAll('link, head script[src]')].
filter(tag=>{
if(tag.tagName==='SCRIPT'){
const scriptTag=tag;
return(
!scriptTag.hasAttribute('async')&&
!scriptTag.hasAttribute('defer')&&
!/^data:/.test(scriptTag.src)&&
!/^blob:/.test(scriptTag.src)&&
scriptTag.getAttribute('type')!=='module');

}else if(tag.tagName==='LINK'){



const linkTag=tag;
const blockingStylesheet=linkTag.rel==='stylesheet'&&
window.matchMedia(linkTag.media).matches&&!linkTag.disabled;
const blockingImport=linkTag.rel==='import'&&!linkTag.hasAttribute('async');
return blockingStylesheet||blockingImport;
}

return false;
}).
map(tag=>{
return{
tagName:tag.tagName,
url:tag.tagName==='LINK'?tag.href:tag.src,
src:tag.src,
href:tag.href,
rel:tag.rel,
media:tag.media,
disabled:tag.disabled,
mediaChanges:window.___linkMediaChanges.filter(item=>item.href===tag.href)};

});
resolve(tagList);
}catch(e){
const friendly='Unable to gather Scripts/Stylesheets/HTML Imports on the page';
reject(new Error(`${friendly}: ${e.message}`));
}
});
}

class TagsBlockingFirstPaint extends Gatherer{



static _filteredAndIndexedByUrl(networkRecords){

const result={};

return networkRecords.reduce((prev,record)=>{
if(!record.finished){
return prev;
}

const isParserGenerated=record.initiator.type==='parser';


const isParserScriptOrStyle=/(css|script)/.test(record.mimeType)&&isParserGenerated;
const isFailedRequest=record._failed;
const isHtml=record.mimeType&&record.mimeType.includes('html');



if(isHtml||isParserScriptOrStyle||isFailedRequest&&isParserGenerated){
prev[record.url]={
isLinkPreload:!!record.isLinkPreload,
transferSize:record.transferSize,
startTime:record.startTime,
endTime:record.endTime};

}

return prev;
},result);
}





static findBlockingTags(driver,networkRecords){
const scriptSrc=`(${collectTagsThatBlockFirstPaint.toString()}())`;
const firstRequestEndTime=networkRecords.reduce(
(min,record)=>Math.min(min,record.endTime),
Infinity);

return driver.evaluateAsync(scriptSrc).then(tags=>{
const requests=TagsBlockingFirstPaint._filteredAndIndexedByUrl(networkRecords);

return tags.reduce((prev,tag)=>{
const request=requests[tag.url];
if(request&&!request.isLinkPreload){



const timesResourceBecameNonBlocking=(tag.mediaChanges||[]).
filter(change=>!change.matches).
map(change=>change.msSinceHTMLEnd);
const earliestNonBlockingTime=Math.min(...timesResourceBecameNonBlocking);
const lastTimeResourceWasBlocking=Math.max(
request.startTime,
firstRequestEndTime+earliestNonBlockingTime/1000);


prev.push({
tag,
transferSize:request.transferSize||0,
startTime:request.startTime,
endTime:Math.min(request.endTime,lastTimeResourceWasBlocking)});



requests[tag.url]=null;
}

return prev;
},[]);
});
}




beforePass(passContext){
return passContext.driver.evaluateScriptOnNewDocument(`(${installMediaListener.toString()})()`);
}






afterPass(passContext,loadData){
return TagsBlockingFirstPaint.findBlockingTags(passContext.driver,loadData.networkRecords);
}}


module.exports=TagsBlockingFirstPaint;

},{"../../driver.js":51,"../gatherer.js":53}],"../gather/gatherers/html-without-javascript":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');









function getBodyText(){

const body=document.querySelector('body');
return Promise.resolve({
bodyText:body?body.innerText:'',
hasNoScript:!!document.querySelector('noscript')});

}

class HTMLWithoutJavaScript extends Gatherer{



beforePass(passContext){
passContext.disableJavaScript=true;
}





async afterPass(passContext){

passContext.disableJavaScript=false;

const expression=`(${getBodyText.toString()}())`;
const{bodyText,hasNoScript}=await passContext.driver.evaluateAsync(expression);
if(typeof bodyText!=='string'){
throw new Error('document body innerText returned by protocol was not a string');
}

return{
bodyText,
hasNoScript};

}}


module.exports=HTMLWithoutJavaScript;

},{"./gatherer.js":53}],"../gather/gatherers/http-redirect":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');






class HTTPRedirect extends Gatherer{
constructor(){
super();
this._preRedirectURL='';
}




beforePass(passContext){
this._preRedirectURL=passContext.url;
passContext.url=this._preRedirectURL.replace(/^https/,'http');
}





async afterPass(passContext){

passContext.url=this._preRedirectURL;

const expression=`new URL(window.location).protocol === 'https:'`;
const isHttps=await passContext.driver.evaluateAsync(expression,{useIsolation:true});
return{
value:isHttps};

}}


module.exports=HTTPRedirect;

},{"./gatherer.js":53}],"../gather/gatherers/iframe-elements":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');
const pageFunctions=require('../../lib/page-functions.js');







function collectIFrameElements(){

const iFrameElements=getElementsInDocument('iframe');
return iFrameElements.map(node=>{
const clientRect=node.getBoundingClientRect();
const{top,bottom,left,right,width,height}=clientRect;
return{
id:node.id,
src:node.src,
clientRect:{top,bottom,left,right,width,height},

isPositionFixed:isPositionFixed(node)};

});
}

class IFrameElements extends Gatherer{





async afterPass(passContext){
const driver=passContext.driver;

const expression=`(() => {
      ${pageFunctions.getOuterHTMLSnippetString};
      ${pageFunctions.getElementsInDocumentString};
      ${pageFunctions.isPositionFixedString};
      return (${collectIFrameElements})();
    })()`;


const iframeElements=await driver.evaluateAsync(expression,{useIsolation:true});
return iframeElements;
}}


module.exports=IFrameElements;

},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/image-elements":[function(require,module,exports){









'use strict';

const Gatherer=require('./gatherer.js');
const pageFunctions=require('../../lib/page-functions.js');
const Driver=require('../driver.js');






function getClientRect(element){
const clientRect=element.getBoundingClientRect();
return{

top:clientRect.top,
bottom:clientRect.bottom,
left:clientRect.left,
right:clientRect.right};

}






function getHTMLImages(allElements){
const allImageElements=allElements.filter(element=>{
return element.localName==='img';
});

return allImageElements.map(element=>{
const computedStyle=window.getComputedStyle(element);
return{


src:element.currentSrc,
displayedWidth:element.width,
displayedHeight:element.height,
clientRect:getClientRect(element),
naturalWidth:element.naturalWidth,
naturalHeight:element.naturalHeight,
isCss:false,
resourceSize:0,
isPicture:!!element.parentElement&&element.parentElement.tagName==='PICTURE',
usesObjectFit:['cover','contain','scale-down','none'].includes(
computedStyle.getPropertyValue('object-fit'))};


});
}






function getCSSImages(allElements){


const CSS_URL_REGEX=/^url\("([^"]+)"\)$/;


const images=[];

for(const element of allElements){
const style=window.getComputedStyle(element);

if(!style.backgroundImage||!CSS_URL_REGEX.test(style.backgroundImage))continue;

const imageMatch=style.backgroundImage.match(CSS_URL_REGEX);

const url=imageMatch[1];

images.push({
src:url,
displayedWidth:element.clientWidth,
displayedHeight:element.clientHeight,
clientRect:getClientRect(element),

naturalWidth:0,
naturalHeight:0,
isCss:true,
isPicture:false,
usesObjectFit:false,
resourceSize:0});

}

return images;
}



function collectImageElementInfo(){


const allElements=getElementsInDocument();
return getHTMLImages(allElements).concat(getCSSImages(allElements));
}






function determineNaturalSize(url){
return new Promise((resolve,reject)=>{
const img=new Image();
img.addEventListener('error',_=>reject(new Error('determineNaturalSize failed img load')));
img.addEventListener('load',()=>{
resolve({
naturalWidth:img.naturalWidth,
naturalHeight:img.naturalHeight});

});

img.src=url;
});
}

class ImageElements extends Gatherer{
constructor(){
super();

this._naturalSizeCache=new Map();
}






async fetchElementWithSizeInformation(driver,element){
const url=JSON.stringify(element.src);
if(this._naturalSizeCache.has(url)){
return Object.assign(element,this._naturalSizeCache.get(url));
}

try{

driver.setNextProtocolTimeout(250);

const size=await driver.evaluateAsync(`(${determineNaturalSize.toString()})(${url})`);
this._naturalSizeCache.set(url,size);
return Object.assign(element,size);
}catch(_){

return element;
}
}






async afterPass(passContext,loadData){
const driver=passContext.driver;
const indexedNetworkRecords=loadData.networkRecords.reduce((map,record)=>{


if(/^image/.test(record.mimeType)&&record.finished&&record.statusCode===200){
map[record.url]=record;
}

return map;
},{});

const expression=`(function() {
      ${pageFunctions.getElementsInDocumentString}; // define function on page
      ${getClientRect.toString()};
      ${getHTMLImages.toString()};
      ${getCSSImages.toString()};
      ${collectImageElementInfo.toString()};

      return collectImageElementInfo();
    })()`;


const elements=await driver.evaluateAsync(expression);


const imageUsage=[];
const top50Images=Object.values(indexedNetworkRecords).
sort((a,b)=>b.resourceSize-a.resourceSize).
slice(0,50);

for(let element of elements){

const networkRecord=indexedNetworkRecords[element.src]||{};
element.mimeType=networkRecord.mimeType;





const{resourceSize=0,transferSize=0}=networkRecord;
element.resourceSize=Math.min(resourceSize,transferSize);





if(
(element.isPicture||element.isCss)&&
networkRecord&&
top50Images.includes(networkRecord))
{
element=await this.fetchElementWithSizeInformation(driver,element);
}

imageUsage.push(element);
}

return imageUsage;
}}


module.exports=ImageElements;

},{"../../lib/page-functions.js":76,"../driver.js":51,"./gatherer.js":53}],"../gather/gatherers/js-usage":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');




class JsUsage extends Gatherer{



async beforePass(passContext){
await passContext.driver.sendCommand('Profiler.enable');
await passContext.driver.sendCommand('Profiler.startPreciseCoverage');
}





async afterPass(passContext){
const driver=passContext.driver;

const coverageResponse=await driver.sendCommand('Profiler.takePreciseCoverage');
await driver.sendCommand('Profiler.stopPreciseCoverage');
await driver.sendCommand('Profiler.disable');
return coverageResponse.result;
}}


module.exports=JsUsage;

},{"./gatherer.js":53}],"../gather/gatherers/link-elements":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');
const URL=require('../../lib/url-shim.js').URL;
const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
const LinkHeader=require('http-link-header');
const{getElementsInDocumentString}=require('../../lib/page-functions.js');















function normalizeUrlOrNull(url,finalUrl){
try{
return new URL(url,finalUrl).href;
}catch(_){
return null;
}
}





function getCrossoriginFromHeader(value){
if(value==='anonymous')return'anonymous';
if(value==='use-credentials')return'use-credentials';
return null;
}





function getLinkElementsInDOM(){


const browserElements=getElementsInDocument('link');

const linkElements=[];

for(const link of browserElements){


if(!(link instanceof HTMLLinkElement))continue;

linkElements.push({
rel:link.rel,
href:link.href,
hrefRaw:link.href,
hreflang:link.hreflang,
as:link.as,
crossOrigin:link.crossOrigin,
source:link.closest('head')?'head':'body'});

}

return linkElements;
}

class LinkElements extends Gatherer{




static getLinkElementsInDOM(passContext){


return passContext.driver.evaluateAsync(`(() => {
      ${getElementsInDocumentString};
      ${getLinkElementsInDOM};

      return getLinkElementsInDOM();
    })()`,{useIsolation:true});
}






static getLinkElementsInHeaders(passContext,loadData){
const finalUrl=passContext.url;
const records=loadData.networkRecords;
const mainDocument=NetworkAnalyzer.findMainDocument(records,finalUrl);


const linkElements=[];

for(const header of mainDocument.responseHeaders){
if(header.name.toLowerCase()!=='link')continue;

for(const link of LinkHeader.parse(header.value).refs){
linkElements.push({
rel:link.rel||'',
href:normalizeUrlOrNull(link.uri,finalUrl),
hrefRaw:link.uri||'',
hreflang:link.hreflang||'',
as:link.as||'',
crossOrigin:getCrossoriginFromHeader(link.crossorigin),
source:'headers'});

}
}

return linkElements;
}






async afterPass(passContext,loadData){
const fromDOM=await LinkElements.getLinkElementsInDOM(passContext);
const fromHeaders=LinkElements.getLinkElementsInHeaders(passContext,loadData);
const linkElements=fromDOM.concat(fromHeaders);

for(const link of linkElements){

link.rel=link.rel.toLowerCase();
}

return linkElements;
}}


module.exports=LinkElements;

},{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"../../lib/page-functions.js":76,"../../lib/url-shim.js":"url","./gatherer.js":53,"http-link-header":109}],"../gather/gatherers/main-document-content":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');
const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');




class MainDocumentContent extends Gatherer{





async afterPass(passContext,loadData){
const mainResource=NetworkAnalyzer.findMainDocument(loadData.networkRecords,passContext.url);

const driver=passContext.driver;
return driver.getRequestContent(mainResource.requestId);
}}


module.exports=MainDocumentContent;

},{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"./gatherer.js":53}],"../gather/gatherers/meta-elements":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');
const getElementsInDocumentString=require('../../lib/page-functions.js').getElementsInDocumentString;

class MetaElements extends Gatherer{




async afterPass(passContext){
const driver=passContext.driver;



return driver.evaluateAsync(`(() => {
      ${getElementsInDocumentString};

      return getElementsInDocument('head meta').map(meta => {
        return {
          name: meta.name.toLowerCase(),
          content: meta.content,
        };
      });
    })()`,{useIsolation:true});
}}


module.exports=MetaElements;

},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/mixed-content":[function(require,module,exports){
(function(Buffer){





'use strict';

const Gatherer=require('./gatherer.js');
const URL=require('../../lib/url-shim.js');

const Driver=require('../driver.js');













class MixedContent extends Gatherer{
constructor(){
super();
this.ids=new Set();
this.url=undefined;
this._onRequestIntercepted=undefined;
}





upgradeURL(url){
const parsedURL=new URL(url);
parsedURL.protocol='https:';
return parsedURL.href;
}





downgradeURL(url){
const parsedURL=new URL(url);
parsedURL.protocol='http:';
return parsedURL.href;
}





_getRequestInterceptor(pageUrl,driver){

const onRequestIntercepted=event=>{



if(new URL(event.request.url).protocol==='http:'&&
!URL.equalWithExcludedFragments(event.request.url,pageUrl)&&
!this.ids.has(event.interceptionId)){
this.ids.add(event.interceptionId);
event.request.url=this.upgradeURL(event.request.url);
driver.sendCommand('Network.continueInterceptedRequest',{
interceptionId:event.interceptionId,
rawResponse:Buffer.from(
`HTTP/1.1 302 Found\r\nLocation: ${event.request.url}\r\n\r\n`,
'utf8').toString('base64')});

}else{
driver.sendCommand('Network.continueInterceptedRequest',{
interceptionId:event.interceptionId});

}
};

return onRequestIntercepted;
}




async beforePass(passContext){
const driver=passContext.driver;





passContext.url=this.downgradeURL(passContext.url);
this.url=passContext.url;
this._onRequestIntercepted=this._getRequestInterceptor(this.url,driver);

await driver.sendCommand('Network.enable');
driver.on('Network.requestIntercepted',this._onRequestIntercepted);
await driver.sendCommand('Network.setCacheDisabled',{cacheDisabled:true});
await driver.sendCommand('Network.setRequestInterception',{patterns:[{urlPattern:'*'}]});
}





async afterPass(passContext){
const driver=passContext.driver;
await driver.sendCommand('Network.setRequestInterception',{patterns:[]});
if(this._onRequestIntercepted){
driver.off('Network.requestIntercepted',this._onRequestIntercepted);
}
await driver.sendCommand('Network.setCacheDisabled',{cacheDisabled:false});

return{url:passContext.url};
}}


module.exports=MixedContent;

}).call(this,require("buffer").Buffer);
},{"../../lib/url-shim.js":"url","../driver.js":51,"./gatherer.js":53,"buffer":102}],"../gather/gatherers/offline":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');
const URL=require('../../lib/url-shim.js');

class Offline extends Gatherer{



beforePass(passContext){



return passContext.driver.goOffline();
}






async afterPass(passContext,loadData){
const navigationRecord=loadData.networkRecords.filter(record=>{
return URL.equalWithExcludedFragments(record.url,passContext.url)&&
record.fetchedViaServiceWorker;
}).pop();

return navigationRecord?navigationRecord.statusCode:-1;
}}


module.exports=Offline;

},{"../../lib/url-shim.js":"url","./gatherer.js":53}],"../gather/gatherers/runtime-exceptions":[function(require,module,exports){










'use strict';

const Gatherer=require('./gatherer.js');

class RuntimeExceptions extends Gatherer{
constructor(){
super();

this._exceptions=[];
this._onRuntimeExceptionThrown=this.onRuntimeExceptionThrown.bind(this);
}




onRuntimeExceptionThrown(entry){
this._exceptions.push(entry);
}




beforePass(passContext){
const driver=passContext.driver;
driver.on('Runtime.exceptionThrown',this._onRuntimeExceptionThrown);
}





async afterPass(passContext){
await passContext.driver.off('Runtime.exceptionThrown',this._onRuntimeExceptionThrown);
return this._exceptions;
}}


module.exports=RuntimeExceptions;

},{"./gatherer.js":53}],"../gather/gatherers/script-elements":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');
const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
const NetworkRequest=require('../../lib/network-request.js');
const getElementsInDocumentString=require('../../lib/page-functions.js').getElementsInDocumentString;
const pageFunctions=require('../../lib/page-functions.js');







function collectAllScriptElements(){


const scripts=getElementsInDocument('script');

return scripts.map(script=>{
return{
type:script.type||null,
src:script.src||null,
id:script.id||null,
async:script.async,
defer:script.defer,
source:script.closest('head')?'head':'body',

devtoolsNodePath:getNodePath(script),
content:script.src?null:script.text,
requestId:null};

});
}




class ScriptElements extends Gatherer{





async afterPass(passContext,loadData){
const driver=passContext.driver;
const mainResource=NetworkAnalyzer.findMainDocument(loadData.networkRecords,passContext.url);


const scripts=await driver.evaluateAsync(`(() => {
      ${getElementsInDocumentString}
      ${pageFunctions.getNodePathString};
      return (${collectAllScriptElements.toString()})();
    })()`,{useIsolation:true});

for(const script of scripts){
if(script.content)script.requestId=mainResource.requestId;
}

const scriptRecords=loadData.networkRecords.

filter(record=>!record.sessionId).

filter(record=>record.resourceType===NetworkRequest.TYPES.Script);

for(const record of scriptRecords){
try{
const content=await driver.getRequestContent(record.requestId);
if(!content)continue;

const matchedScriptElement=scripts.find(script=>script.src===record.url);
if(matchedScriptElement){
matchedScriptElement.requestId=record.requestId;
matchedScriptElement.content=content;
}else{
scripts.push({
devtoolsNodePath:'',
type:null,
src:record.url,
id:null,
async:false,
defer:false,
source:'network',
requestId:record.requestId,
content});

}
}catch(e){}
}

return scripts;
}}


module.exports=ScriptElements;

},{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"../../lib/network-request.js":75,"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/seo/embedded-content":[function(require,module,exports){





'use strict';

const Gatherer=require('../gatherer.js');
const pageFunctions=require('../../../lib/page-functions.js');

class EmbeddedContent extends Gatherer{




afterPass(passContext){
const expression=`(function() {
      ${pageFunctions.getElementsInDocumentString}; // define function on page
      const selector = 'object, embed, applet';
      const elements = getElementsInDocument(selector);
      return elements
        .map(node => ({
          tagName: node.tagName,
          type: node.getAttribute('type'),
          src: node.getAttribute('src'),
          data: node.getAttribute('data'),
          code: node.getAttribute('code'),
          params: Array.from(node.children)
            .filter(el => el.tagName === 'PARAM')
            .map(el => ({
              name: el.getAttribute('name') || '',
              value: el.getAttribute('value') || '',
            })),
        }));
    })()`;

return passContext.driver.evaluateAsync(expression);
}}


module.exports=EmbeddedContent;

},{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/seo/font-size":[function(require,module,exports){





'use strict';












const Gatherer=require('../gatherer.js');
const Sentry=require('../../../lib/sentry.js');
const FONT_SIZE_PROPERTY_NAME='font-size';
const TEXT_NODE_BLOCK_LIST=new Set(['SCRIPT','STYLE','NOSCRIPT']);
const MINIMAL_LEGIBLE_FONT_SIZE_PX=12;

const MAX_NODES_VISITED=500;
const MAX_NODES_SOURCE_RULE_FETCHED=50;


const TEXT_NODE_TYPE=3;









function nodeInBody(node){
if(!node){
return false;
}
if(node.nodeName==='BODY'){
return true;
}
return nodeInBody(node.parentNode);
}







async function getAllNodesFromBody(driver){
const nodes=await driver.getNodesInDocument();

const nodeMap=new Map();
nodes.forEach(node=>nodeMap.set(node.nodeId,node));
nodes.forEach(node=>node.parentNode=nodeMap.get(node.parentId));
return nodes.filter(nodeInBody);
}





function hasFontSizeDeclaration(style){
return!!style&&!!style.cssProperties.find(({name})=>name===FONT_SIZE_PROPERTY_NAME);
}











function computeSelectorSpecificity(selector){
const tokens=selector.split(' ');

let numIDs=0;
let numClasses=0;
let numTypes=0;

for(const token of tokens){
const ids=token.match(/\b#[a-z0-9]+/g)||[];
const classes=token.match(/\b\.[a-z0-9]+/g)||[];
const types=token.match(/^[a-z]+/)?[1]:[];
numIDs+=ids.length;
numClasses+=classes.length;
numTypes+=types.length;
}

return Math.min(9,numIDs)*100+Math.min(9,numClasses)*10+Math.min(9,numTypes);
}







function findMostSpecificMatchedCSSRule(matchedCSSRules=[]){
let maxSpecificity=-Infinity;

let maxSpecificityRule;

for(const{rule,matchingSelectors}of matchedCSSRules){
if(hasFontSizeDeclaration(rule.style)){
const specificities=matchingSelectors.map(idx=>
computeSelectorSpecificity(rule.selectorList.selectors[idx].text));

const specificity=Math.max(...specificities);

if(specificity>=maxSpecificity){
maxSpecificity=specificity;
maxSpecificityRule=rule;
}
}
}

if(maxSpecificityRule){
return{
type:'Regular',
...maxSpecificityRule.style,
parentRule:{
origin:maxSpecificityRule.origin,
selectors:maxSpecificityRule.selectorList.selectors}};


}
}







function findInheritedCSSRule(inheritedEntries=[]){




for(const{inlineStyle,matchedCSSRules}of inheritedEntries){
if(hasFontSizeDeclaration(inlineStyle))return{type:'Inline',...inlineStyle};

const directRule=findMostSpecificMatchedCSSRule(matchedCSSRules);
if(directRule)return directRule;
}
}









function getEffectiveFontRule({attributesStyle,inlineStyle,matchedCSSRules,inherited}){

if(hasFontSizeDeclaration(inlineStyle))return{type:'Inline',...inlineStyle};


const matchedRule=findMostSpecificMatchedCSSRule(matchedCSSRules);
if(matchedRule)return matchedRule;


if(hasFontSizeDeclaration(attributesStyle))return{type:'Attributes',...attributesStyle};


const inheritedRule=findInheritedCSSRule(inherited);
if(inheritedRule)return inheritedRule;

return undefined;
}





function getNodeTextLength(node){

return!node.nodeValue?0:Array.from(node.nodeValue.trim()).length;
}






async function fetchSourceRule(driver,node){
const matchedRules=await driver.sendCommand('CSS.getMatchedStylesForNode',{
nodeId:node.nodeId});

const sourceRule=getEffectiveFontRule(matchedRules);
if(!sourceRule)return undefined;

return{
type:sourceRule.type,
range:sourceRule.range,
styleSheetId:sourceRule.styleSheetId,
parentRule:sourceRule.parentRule&&{
origin:sourceRule.parentRule.origin,
selectors:sourceRule.parentRule.selectors}};


}






async function fetchComputedFontSize(driver,textNode){
try{
const{computedStyle}=await driver.sendCommand('CSS.getComputedStyleForNode',{
nodeId:textNode.parentId});


const fontSizeProperty=computedStyle.find(({name})=>name===FONT_SIZE_PROPERTY_NAME);

return{

fontSize:parseInt(fontSizeProperty.value,10),
textLength:getNodeTextLength(textNode),
node:textNode.parentNode};

}catch(err){
Sentry.captureException(err,{tags:{gatherer:'FontSize'}});
return null;
}
}





function isNonEmptyTextNode(node){
return(
node.nodeType===TEXT_NODE_TYPE&&
!TEXT_NODE_BLOCK_LIST.has(node.parentNode.nodeName)&&
getNodeTextLength(node)>0);

}

class FontSize extends Gatherer{



static async fetchNodesToAnalyze(driver){
let failingTextLength=0;
let visitedTextLength=0;
let totalTextLength=0;

const nodes=await getAllNodesFromBody(driver);

const textNodes=nodes.filter(isNonEmptyTextNode);
totalTextLength=textNodes.reduce((sum,node)=>sum+=getNodeTextLength(node),0);

const nodesToVisit=textNodes.
sort((a,b)=>getNodeTextLength(b)-getNodeTextLength(a)).
slice(0,MAX_NODES_VISITED);

const nodePromises=nodesToVisit.map(node=>fetchComputedFontSize(driver,node));
const visitedNodes=await Promise.all(nodePromises);


const failingNodes=[];
for(const visitedNode of visitedNodes){
if(!visitedNode)continue;
visitedTextLength+=visitedNode.textLength;

if(visitedNode.fontSize<MINIMAL_LEGIBLE_FONT_SIZE_PX){
failingNodes.push(visitedNode);
failingTextLength+=visitedNode.textLength;
}
}

return{totalTextLength,visitedTextLength,failingTextLength,failingNodes};
}





static async fetchFailingNodeSourceRules(driver,failingNodes){
const analysisPromises=failingNodes.
sort((a,b)=>b.textLength-a.textLength).
slice(0,MAX_NODES_SOURCE_RULE_FETCHED).
map(async failingNode=>{
failingNode.cssRule=await fetchSourceRule(driver,failingNode.node);
return failingNode;
});

const analyzedFailingNodesData=await Promise.all(analysisPromises);

const analyzedFailingTextLength=analyzedFailingNodesData.reduce(
(sum,{textLength})=>sum+=textLength,
0);


return{analyzedFailingNodesData,analyzedFailingTextLength};
}





async afterPass(passContext){

const stylesheets=new Map();

const onStylesheetAdd=sheet=>stylesheets.set(sheet.header.styleSheetId,sheet.header);
passContext.driver.on('CSS.styleSheetAdded',onStylesheetAdd);

await Promise.all([
passContext.driver.sendCommand('DOM.enable'),
passContext.driver.sendCommand('CSS.enable')]);


const{
totalTextLength,
visitedTextLength,
failingTextLength,
failingNodes}=
await FontSize.fetchNodesToAnalyze(passContext.driver);

const{
analyzedFailingNodesData,
analyzedFailingTextLength}=
await FontSize.fetchFailingNodeSourceRules(passContext.driver,failingNodes);

passContext.driver.off('CSS.styleSheetAdded',onStylesheetAdd);

analyzedFailingNodesData.
filter(data=>data.cssRule&&data.cssRule.styleSheetId).

forEach(data=>data.cssRule.stylesheet=stylesheets.get(data.cssRule.styleSheetId));

await Promise.all([
passContext.driver.sendCommand('DOM.disable'),
passContext.driver.sendCommand('CSS.disable')]);


return{
analyzedFailingNodesData,
analyzedFailingTextLength,
failingTextLength,
visitedTextLength,
totalTextLength};

}}


module.exports=FontSize;
module.exports.TEXT_NODE_TYPE=TEXT_NODE_TYPE;
module.exports.computeSelectorSpecificity=computeSelectorSpecificity;
module.exports.getEffectiveFontRule=getEffectiveFontRule;

},{"../../../lib/sentry.js":78,"../gatherer.js":53}],"../gather/gatherers/seo/robots-txt":[function(require,module,exports){





'use strict';

const Gatherer=require('../gatherer.js');





async function getRobotsTxtContent(){
try{
const response=await fetch(new URL('/robots.txt',location.href).href);
if(!response.ok){
return{status:response.status,content:null};
}

const content=await response.text();
return{status:response.status,content};
}catch(_){
return{status:null,content:null};
}
}


class RobotsTxt extends Gatherer{




afterPass(passContext){
return passContext.driver.evaluateAsync(`(${getRobotsTxtContent.toString()}())`);
}}


module.exports=RobotsTxt;

},{"../gatherer.js":53}],"../gather/gatherers/seo/tap-targets":[function(require,module,exports){





'use strict';



const Gatherer=require('../gatherer.js');
const pageFunctions=require('../../../lib/page-functions.js');
const{
rectContains,
getRectArea,
getRectCenterPoint,
getLargestRect}=
require('../../../lib/rect-helpers.js');

const TARGET_SELECTORS=[
'button',
'a',
'input',
'textarea',
'select',
'option',
'[role=button]',
'[role=checkbox]',
'[role=link]',
'[role=menuitem]',
'[role=menuitemcheckbox]',
'[role=menuitemradio]',
'[role=option]',
'[role=scrollbar]',
'[role=slider]',
'[role=spinbutton]'];

const tapTargetsSelector=TARGET_SELECTORS.join(',');






function elementIsVisible(element){
return!!(element.offsetWidth||element.offsetHeight||element.getClientRects().length);
}






function getClientRects(element){
const clientRects=Array.from(
element.getClientRects()).
map(clientRect=>{


const{width,height,left,top,right,bottom}=clientRect;
return{width,height,left,top,right,bottom};
});

for(const child of element.children){
clientRects.push(...getClientRects(child));
}

return clientRects;
}






function elementHasAncestorTapTarget(element){
if(!element.parentElement){
return false;
}
if(element.parentElement.matches(tapTargetsSelector)){
return true;
}
return elementHasAncestorTapTarget(element.parentElement);
}





function hasTextNodeSiblingsFormingTextBlock(element){
if(!element.parentElement){
return false;
}

const parentElement=element.parentElement;

const nodeText=element.textContent||'';
const parentText=parentElement.textContent||'';
if(parentText.length-nodeText.length<5){


return false;
}

for(const sibling of element.parentElement.childNodes){
if(sibling===element){
continue;
}
const siblingTextContent=(sibling.textContent||'').trim();




if(sibling.nodeType===Node.TEXT_NODE&&siblingTextContent.length>0){
return true;
}
}

return false;
}









function elementIsInTextBlock(element){
const{display}=getComputedStyle(element);
if(display!=='inline'&&display!=='inline-block'){
return false;
}

if(hasTextNodeSiblingsFormingTextBlock(element)){
return true;
}else if(element.parentElement){
return elementIsInTextBlock(element.parentElement);
}else{
return false;
}
}







function truncate(str,maxLength){
if(str.length<=maxLength){
return str;
}
return str.slice(0,maxLength-1)+'…';
}






function elementCenterIsAtZAxisTop(el,elCenterPoint){
const viewportHeight=window.innerHeight;
const targetScrollY=Math.floor(elCenterPoint.y/viewportHeight)*viewportHeight;
if(window.scrollY!==targetScrollY){
window.scrollTo(0,targetScrollY);
}

const topEl=document.elementFromPoint(
elCenterPoint.x,
elCenterPoint.y-window.scrollY);


return topEl===el||el.contains(topEl);
}







function disableFixedAndStickyElementPointerEvents(){
const className='lighthouse-disable-pointer-events';
const styleTag=document.createElement('style');
styleTag.textContent=`.${className} { pointer-events: none !important }`;
document.body.appendChild(styleTag);

document.querySelectorAll('*').forEach(el=>{
const position=getComputedStyle(el).position;
if(position==='fixed'||position==='sticky'){
el.classList.add(className);
}
});

return function undo(){
Array.from(document.getElementsByClassName(className)).forEach(el=>{
el.classList.remove(className);
});
styleTag.remove();
};
}





function gatherTapTargets(){

const targets=[];


window.scrollTo(0,0);



const tapTargetElements=getElementsInDocument(tapTargetsSelector);





const tapTargetsWithClientRects=[];
tapTargetElements.forEach(tapTargetElement=>{

if(elementHasAncestorTapTarget(tapTargetElement)){


return;
}
if(elementIsInTextBlock(tapTargetElement)){


return;
}
if(!elementIsVisible(tapTargetElement)){
return;
}

tapTargetsWithClientRects.push({
tapTargetElement,
clientRects:getClientRects(tapTargetElement)});

});




const reenableFixedAndStickyElementPointerEvents=disableFixedAndStickyElementPointerEvents();





const tapTargetsWithVisibleClientRects=[];



tapTargetsWithClientRects.forEach(({tapTargetElement,clientRects})=>{

let visibleClientRects=clientRects.filter(cr=>cr.width!==0&&cr.height!==0);






visibleClientRects=visibleClientRects.filter(rect=>{


const rectCenterPoint=getRectCenterPoint(rect);
return elementCenterIsAtZAxisTop(tapTargetElement,rectCenterPoint);
});

if(visibleClientRects.length>0){
tapTargetsWithVisibleClientRects.push({
tapTargetElement,
visibleClientRects});

}
});

for(const{tapTargetElement,visibleClientRects}of tapTargetsWithVisibleClientRects){
targets.push({
clientRects:visibleClientRects,
snippet:truncate(tapTargetElement.outerHTML,300),

path:getNodePath(tapTargetElement),

selector:getNodeSelector(tapTargetElement),

nodeLabel:getNodeLabel(tapTargetElement),
href:tapTargetElement['href']||''});

}

reenableFixedAndStickyElementPointerEvents();

return targets;
}

class TapTargets extends Gatherer{




afterPass(passContext){
const expression=`(function() {
      const tapTargetsSelector = "${tapTargetsSelector}";
      ${pageFunctions.getElementsInDocumentString};
      ${disableFixedAndStickyElementPointerEvents.toString()};
      ${elementIsVisible.toString()};
      ${elementHasAncestorTapTarget.toString()};
      ${elementCenterIsAtZAxisTop.toString()}
      ${truncate.toString()};
      ${getClientRects.toString()};
      ${hasTextNodeSiblingsFormingTextBlock.toString()};
      ${elementIsInTextBlock.toString()};
      ${getRectArea.toString()};
      ${getLargestRect.toString()};
      ${getRectCenterPoint.toString()};
      ${rectContains.toString()};
      ${pageFunctions.getNodePathString};
      ${pageFunctions.getNodeSelectorString};
      ${pageFunctions.getNodeLabelString};
      ${gatherTapTargets.toString()};

      return gatherTapTargets();
    })()`;

return passContext.driver.evaluateAsync(expression,{useIsolation:true});
}}


module.exports=TapTargets;

},{"../../../lib/page-functions.js":76,"../../../lib/rect-helpers.js":77,"../gatherer.js":53}],"../gather/gatherers/service-worker":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');

class ServiceWorker extends Gatherer{




async beforePass(passContext){
const{versions}=await passContext.driver.getServiceWorkerVersions();
const{registrations}=await passContext.driver.getServiceWorkerRegistrations();

return{
versions,
registrations};

}}


module.exports=ServiceWorker;

},{"./gatherer.js":53}],"../gather/gatherers/source-maps":[function(require,module,exports){
(function(Buffer){





'use strict';



const Gatherer=require('./gatherer.js');
const URL=require('../../lib/url-shim.js');










async function fetchSourceMap(url){

const response=await fetch(url);
if(response.ok){
return response.text();
}else{
throw new Error(`Received status code ${response.status} for ${url}`);
}
}




class SourceMaps extends Gatherer{
constructor(){
super();

this._scriptParsedEvents=[];
this.onScriptParsed=this.onScriptParsed.bind(this);
}






async fetchSourceMapInPage(driver,sourceMapUrl){
driver.setNextProtocolTimeout(1500);

const sourceMapJson=
await driver.evaluateAsync(`(${fetchSourceMap})(${JSON.stringify(sourceMapUrl)})`);
return JSON.parse(sourceMapJson);
}





parseSourceMapFromDataUrl(sourceMapURL){
const buffer=Buffer.from(sourceMapURL.split(',')[1],'base64');
return JSON.parse(buffer.toString());
}




onScriptParsed(event){
if(event.sourceMapURL){
this._scriptParsedEvents.push(event);
}
}




async beforePass(passContext){
const driver=passContext.driver;
driver.on('Debugger.scriptParsed',this.onScriptParsed);
await driver.sendCommand('Debugger.enable');
}






_resolveUrl(url,base){
try{
return new URL(url,base).href;
}catch(e){
return;
}
}






async _retrieveMapFromScriptParsedEvent(driver,event){
if(!event.sourceMapURL){
throw new Error('precondition failed: event.sourceMapURL should exist');
}



const isSourceMapADataUri=event.sourceMapURL.startsWith('data:');
const scriptUrl=event.url;
const rawSourceMapUrl=isSourceMapADataUri?
event.sourceMapURL:
this._resolveUrl(event.sourceMapURL,event.url);

if(!rawSourceMapUrl){
return{
scriptUrl,
errorMessage:`Could not resolve map url: ${event.sourceMapURL}`};

}


const sourceMapUrl=isSourceMapADataUri?undefined:rawSourceMapUrl;

try{
const map=isSourceMapADataUri?
this.parseSourceMapFromDataUrl(rawSourceMapUrl):
await this.fetchSourceMapInPage(driver,rawSourceMapUrl);
return{
scriptUrl,
sourceMapUrl,
map};

}catch(err){
return{
scriptUrl,
sourceMapUrl,
errorMessage:err.toString()};

}
}





async afterPass(passContext){
const driver=passContext.driver;

driver.off('Debugger.scriptParsed',this.onScriptParsed);
await driver.sendCommand('Debugger.disable');

const eventProcessPromises=this._scriptParsedEvents.
map(event=>this._retrieveMapFromScriptParsedEvent(driver,event));

return Promise.all(eventProcessPromises);
}}


module.exports=SourceMaps;

}).call(this,require("buffer").Buffer);
},{"../../lib/url-shim.js":"url","./gatherer.js":53,"buffer":102}],"../gather/gatherers/start-url":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');



class StartUrl extends Gatherer{





async afterPass(passContext){

await passContext.driver.goOffline();
const result=await this._determineStartUrlAvailability(passContext);
await passContext.driver.goOnline(passContext);

return result;
}






async _determineStartUrlAvailability(passContext){
const manifest=passContext.baseArtifacts.WebAppManifest;
const startUrlInfo=this._readManifestStartUrl(manifest);
if(startUrlInfo.isReadFailure){
return{statusCode:-1,explanation:startUrlInfo.reason};
}

try{
return await this._attemptStartURLFetch(passContext.driver,startUrlInfo.startUrl);
}catch(err){
return{statusCode:-1,explanation:'Error while fetching start_url via service worker.'};
}
}






_readManifestStartUrl(manifest){
if(!manifest||!manifest.value){
const detailedMsg=manifest&&manifest.warning;

if(detailedMsg){
return{isReadFailure:true,reason:`Error fetching web app manifest: ${detailedMsg}.`};
}else{
return{isReadFailure:true,reason:`No usable web app manifest found on page.`};
}
}


return{isReadFailure:false,startUrl:manifest.value.start_url.value};
}








_attemptStartURLFetch(driver,startUrl){


const timeoutPromise=new Promise(resolve=>
setTimeout(
()=>resolve({statusCode:-1,explanation:'Timed out waiting for start_url to respond.'}),
3000));



const fetchPromise=new Promise(resolve=>{
driver.on('Network.responseReceived',onResponseReceived);


function onResponseReceived(responseEvent){
const{response}=responseEvent;

if(response.url!==startUrl)return;
driver.off('Network.responseReceived',onResponseReceived);

if(!response.fromServiceWorker){
return resolve({
statusCode:-1,
explanation:'The start_url did respond, but not via a service worker.'});

}

return resolve({statusCode:response.status});
}
});

return driver.
evaluateAsync(`window.location = '${startUrl}'`).
then(()=>Promise.race([fetchPromise,timeoutPromise]));
}}


module.exports=StartUrl;

},{"./gatherer.js":53}],"../gather/gatherers/viewport-dimensions":[function(require,module,exports){





'use strict';

const Gatherer=require('./gatherer.js');







function getViewportDimensions(){



return Promise.resolve({
innerWidth:window.innerWidth,
innerHeight:window.innerHeight,
outerWidth:window.outerWidth,
outerHeight:window.outerHeight,
devicePixelRatio:window.devicePixelRatio});

}

class ViewportDimensions extends Gatherer{




async afterPass(passContext){
const driver=passContext.driver;


const dimensions=await driver.evaluateAsync(`(${getViewportDimensions.toString()}())`,
{useIsolation:true});

const allNumeric=Object.values(dimensions).every(Number.isFinite);
if(!allNumeric){
const results=JSON.stringify(dimensions);
throw new Error(`ViewportDimensions results were not numeric: ${results}`);
}

return dimensions;
}}


module.exports=ViewportDimensions;

},{"./gatherer.js":53}],1:[function(require,module,exports){
(function(global){





'use strict';

const lighthouse=require('../lighthouse-core/index.js');
const RawProtocol=require('../lighthouse-core/gather/connections/raw.js');
const log=require('lighthouse-logger');
const{registerLocaleData,lookupLocale}=require('../lighthouse-core/lib/i18n/i18n.js');










function getDefaultConfigForCategories(categoryIDs){
return{
extends:'lighthouse:default',
plugins:['lighthouse-plugin-publisher-ads'],
settings:{
onlyCategories:categoryIDs}};


}








function runLighthouseInWorker(port,url,flags,categoryIDs){

flags.logLevel=flags.logLevel||'info';
flags.channel='devtools';
global.devtools=true;
const config=getDefaultConfigForCategories(categoryIDs);
const connection=new RawProtocol(port);

return lighthouse(url,flags,config,connection);
}


function listenForStatus(listenCallback){
log.events.addListener('status',listenCallback);
}

if(typeof module!=='undefined'&&module.exports){

module.exports={
runLighthouseInWorker,
listenForStatus,
registerLocaleData,
lookupLocale};

}



if(typeof self!=='undefined'){

self.runLighthouseInWorker=runLighthouseInWorker;

self.listenForStatus=listenForStatus;

self.registerLocaleData=registerLocaleData;

self.lookupLocale=lookupLocale;
}

}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
},{"../lighthouse-core/gather/connections/raw.js":49,"../lighthouse-core/index.js":54,"../lighthouse-core/lib/i18n/i18n.js":66,"lighthouse-logger":125}],2:[function(require,module,exports){
(function(__filename){





'use strict';






const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');

const UIStrings={

failingElementsHeader:'Failing Elements'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

class AxeAudit extends Audit{





static audit(artifacts){



const notApplicables=artifacts.Accessibility.notApplicable||[];
const isNotApplicable=notApplicables.find(result=>result.id===this.meta.id);
if(isNotApplicable){
return{
score:1,
notApplicable:true};

}

const violations=artifacts.Accessibility.violations||[];
const rule=violations.find(result=>result.id===this.meta.id);
const impact=rule&&rule.impact;
const tags=rule&&rule.tags;


let items=[];
if(rule&&rule.nodes){
items=rule.nodes.map(node=>({
node:{
type:'node',
selector:Array.isArray(node.target)?node.target.join(' '):'',
path:node.path,
snippet:node.html||node.snippet,
explanation:node.failureSummary,
nodeLabel:node.nodeLabel}}));


}


const headings=[
{key:'node',itemType:'node',text:str_(UIStrings.failingElementsHeader)}];



let debugData;
if(impact||tags){
debugData={
type:'debugdata',
impact,
tags};

}

return{
score:Number(rule===undefined),
extendedInfo:{
value:rule},

details:{...Audit.makeTableDetails(headings,items),debugData}};

}}


module.exports=AxeAudit;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/audits/accessibility/axe-audit.js");
},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],3:[function(require,module,exports){





'use strict';

const statistics=require('../lib/statistics.js');
const Util=require('../report/html/renderer/util.js');

const DEFAULT_PASS='defaultPass';






const clampTo2Decimals=val=>Math.round(val*100)/100;

class Audit{



static get DEFAULT_PASS(){
return DEFAULT_PASS;
}




static get SCORING_MODES(){
return{
NUMERIC:'numeric',
BINARY:'binary',
MANUAL:'manual',
INFORMATIVE:'informative',
NOT_APPLICABLE:'notApplicable',
ERROR:'error'};

}




static get meta(){
throw new Error('Audit meta information must be overridden.');
}




static get defaultOptions(){
return{};
}









static audit(artifacts,context){
throw new Error('audit() method must be overriden');
}













static computeLogNormalScore(measuredValue,diminishingReturnsValue,medianValue){
const distribution=statistics.getLogNormalDistribution(
medianValue,
diminishingReturnsValue);


let score=distribution.computeComplementaryPercentile(measuredValue);
score=Math.min(1,score);
score=Math.max(0,score);
return clampTo2Decimals(score);
}







static makeTableDetails(headings,results,summary){
if(results.length===0){
return{
type:'table',
headings:[],
items:[],
summary};

}

return{
type:'table',
headings:headings,
items:results,
summary};

}





static makeListDetails(items){
return{
type:'list',
items:items};

}














static makeSnippetDetails({
content,
title,
lineMessages,
generalMessages,
node,
maxLineLength=200,
maxLinesAroundMessage=20})
{
const allLines=Audit._makeSnippetLinesArray(content,maxLineLength);
const lines=Util.filterRelevantLines(allLines,lineMessages,maxLinesAroundMessage);
return{
type:'snippet',
lines,
title,
lineMessages,
generalMessages,
lineCount:allLines.length,
node};

}






static _makeSnippetLinesArray(content,maxLineLength){
return content.split('\n').map((line,lineIndex)=>{
const lineNumber=lineIndex+1;

const lineDetail={
content:line.slice(0,maxLineLength),
lineNumber};

if(line.length>maxLineLength){
lineDetail.truncated=true;
}
return lineDetail;
});
}








static makeOpportunityDetails(headings,items,overallSavingsMs,overallSavingsBytes){
return{
type:'opportunity',
headings:items.length===0?[]:headings,
items,
overallSavingsMs,
overallSavingsBytes};

}







static _normalizeAuditScore(score,scoreDisplayMode,auditId){
if(scoreDisplayMode!==Audit.SCORING_MODES.BINARY&&
scoreDisplayMode!==Audit.SCORING_MODES.NUMERIC){
return null;
}


if(score===null||!Number.isFinite(score)){
throw new Error(`Invalid score for ${auditId}: ${score}`);
}
if(score>1)throw new Error(`Audit score for ${auditId} is > 1`);
if(score<0)throw new Error(`Audit score for ${auditId} is < 0`);

score=clampTo2Decimals(score);

return score;
}






static generateErrorAuditResult(audit,errorMessage){
return Audit.generateAuditResult(audit,{
score:null,
errorMessage});

}






static generateAuditResult(audit,product){
if(product.score===undefined){
throw new Error('generateAuditResult requires a score');
}


let scoreDisplayMode=audit.meta.scoreDisplayMode||Audit.SCORING_MODES.BINARY;


if(product.errorMessage){

scoreDisplayMode=Audit.SCORING_MODES.ERROR;
}else if(product.notApplicable){

scoreDisplayMode=Audit.SCORING_MODES.NOT_APPLICABLE;
}

const score=Audit._normalizeAuditScore(product.score,scoreDisplayMode,audit.meta.id);

let auditTitle=audit.meta.title;
if(audit.meta.failureTitle){
if(score!==null&&score<Util.PASS_THRESHOLD){
auditTitle=audit.meta.failureTitle;
}
}

return{
id:audit.meta.id,
title:auditTitle,
description:audit.meta.description,

score,
scoreDisplayMode,
numericValue:product.numericValue,

displayValue:product.displayValue,
explanation:product.explanation,
errorMessage:product.errorMessage,
warnings:product.warnings,

details:product.details};

}}


module.exports=Audit;

},{"../lib/statistics.js":81,"../report/html/renderer/util.js":87}],4:[function(require,module,exports){
(function(__filename){





'use strict';

const Audit=require('../audit.js');
const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
const Interactive=require('../../computed/metrics/lantern-interactive.js');
const i18n=require('../../lib/i18n/i18n.js');
const NetworkRecords=require('../../computed/network-records.js');
const LoadSimulator=require('../../computed/load-simulator.js');
const PageDependencyGraph=require('../../computed/page-dependency-graph.js');

const str_=i18n.createMessageInstanceIdFn(__filename,{});




const KB_IN_BYTES=1024;

const WASTED_MS_FOR_AVERAGE=300;
const WASTED_MS_FOR_POOR=750;
const WASTED_MS_FOR_SCORE_OF_ZERO=5000;














class UnusedBytes extends Audit{






static scoreForWastedMs(wastedMs){
if(wastedMs===0){
return 1;
}else if(wastedMs<WASTED_MS_FOR_AVERAGE){
return linearInterpolation(0,1,WASTED_MS_FOR_AVERAGE,0.75,wastedMs);
}else if(wastedMs<WASTED_MS_FOR_POOR){
return linearInterpolation(WASTED_MS_FOR_AVERAGE,0.75,WASTED_MS_FOR_POOR,0.5,wastedMs);
}else{
return Math.max(
0,
linearInterpolation(WASTED_MS_FOR_POOR,0.5,WASTED_MS_FOR_SCORE_OF_ZERO,0,wastedMs));

}
}










static estimateTransferSize(networkRecord,totalBytes,resourceType){
if(!networkRecord){




switch(resourceType){
case'Stylesheet':

return Math.round(totalBytes*0.2);
case'Script':
case'Document':

return Math.round(totalBytes*0.33);
default:

return Math.round(totalBytes*0.5);}

}else if(networkRecord.resourceType===resourceType){

return networkRecord.transferSize||0;
}else{


const transferSize=networkRecord.transferSize||0;
const resourceSize=networkRecord.resourceSize||0;

const compressionRatio=Number.isFinite(resourceSize)&&resourceSize>0?
transferSize/resourceSize:1;
return Math.round(totalBytes*compressionRatio);
}
}






static audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const settings=context&&context.settings||{};
const simulatorOptions={
devtoolsLog,
settings};


return NetworkRecords.request(devtoolsLog,context).
then(networkRecords=>
Promise.all([
this.audit_(artifacts,networkRecords,context),
PageDependencyGraph.request({trace,devtoolsLog},context),
LoadSimulator.request(simulatorOptions,context)])).


then(([result,graph,simulator])=>this.createAuditProduct(result,graph,simulator));
}













static computeWasteWithTTIGraph(results,graph,simulator,options){
options=Object.assign({includeLoad:true,label:this.meta.id},options);
const beforeLabel=`${options.label}-before`;
const afterLabel=`${options.label}-after`;

const simulationBeforeChanges=simulator.simulate(graph,{label:beforeLabel});

const resultsByUrl=new Map();
for(const result of results){
resultsByUrl.set(result.url,result);
}



const originalTransferSizes=new Map();
graph.traverse(node=>{
if(node.type!=='network')return;
const result=resultsByUrl.get(node.record.url);
if(!result)return;

const original=node.record.transferSize;
originalTransferSizes.set(node.record.requestId,original);

const wastedBytes=result.wastedBytes;
node.record.transferSize=Math.max(original-wastedBytes,0);
});

const simulationAfterChanges=simulator.simulate(graph,{label:afterLabel});


graph.traverse(node=>{
if(node.type!=='network')return;
const originalTransferSize=originalTransferSizes.get(node.record.requestId);
if(originalTransferSize===undefined)return;
node.record.transferSize=originalTransferSize;
});

const savingsOnOverallLoad=simulationBeforeChanges.timeInMs-simulationAfterChanges.timeInMs;
const savingsOnTTI=Interactive.getLastLongTaskEndTime(simulationBeforeChanges.nodeTimings)-
Interactive.getLastLongTaskEndTime(simulationAfterChanges.nodeTimings);

let savings=savingsOnTTI;
if(options.includeLoad)savings=Math.max(savings,savingsOnOverallLoad);


return Math.round(Math.max(savings,0)/10)*10;
}







static createAuditProduct(result,graph,simulator){
const results=result.items.sort((itemA,itemB)=>itemB.wastedBytes-itemA.wastedBytes);

const wastedBytes=results.reduce((sum,item)=>sum+item.wastedBytes,0);
const wastedKb=Math.round(wastedBytes/KB_IN_BYTES);
const wastedMs=this.computeWasteWithTTIGraph(results,graph,simulator);

let displayValue=result.displayValue||'';
if(typeof result.displayValue==='undefined'&&wastedBytes){
displayValue=str_(i18n.UIStrings.displayValueByteSavings,{wastedBytes});
}

const details=Audit.makeOpportunityDetails(result.headings,results,wastedMs,wastedBytes);

return{
explanation:result.explanation,
warnings:result.warnings,
displayValue,
numericValue:wastedMs,
score:UnusedBytes.scoreForWastedMs(wastedMs),
extendedInfo:{
value:{
wastedMs,
wastedKb,
results}},


details};

}









static audit_(artifacts,networkRecords,context){
throw new Error('audit_ unimplemented');
}}




module.exports=UnusedBytes;

}).call(this,"/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js");
},{"../../computed/load-simulator.js":10,"../../computed/metrics/lantern-interactive.js":23,"../../computed/network-records.js":34,"../../computed/page-dependency-graph.js":35,"../../lib/i18n/i18n.js":66,"../../lib/statistics.js":81,"../audit.js":3}],5:[function(require,module,exports){





'use strict';






const Audit=require('../audit.js');

class ManualAudit extends Audit{



static get partialMeta(){
return{
scoreDisplayMode:Audit.SCORING_MODES.MANUAL,
requiredArtifacts:[]};

}




static audit(){
return{
score:0};


}}


module.exports=ManualAudit;

},{"../audit.js":3}],6:[function(require,module,exports){





'use strict';





const Audit=require('./audit.js');

class MultiCheckAudit extends Audit{





static async audit(artifacts,context){
const multiProduct=await this.audit_(artifacts,context);
return this.createAuditProduct(multiProduct);
}





static createAuditProduct(result){

const detailsItem={
...result,
...result.manifestValues,
manifestValues:undefined,
allChecks:undefined};


if(result.manifestValues&&result.manifestValues.allChecks){
result.manifestValues.allChecks.forEach(check=>{
detailsItem[check.id]=check.passing;
});
}



const details={
type:'debugdata',

items:[detailsItem]};



if(result.failures.length>0){
return{
score:0,

explanation:`Failures: ${result.failures.join(',\n')}.`,
details};

}


return{
score:1,
details};

}








static audit_(artifacts,context){
throw new Error('audit_ unimplemented');
}}




module.exports=MultiCheckAudit;

},{"./audit.js":3}],7:[function(require,module,exports){





'use strict';

const Audit=require('./audit.js');

class ViolationAudit extends Audit{





static getViolationResults(artifacts,pattern){
const seen=new Set();
return artifacts.ConsoleMessages.
map(message=>message.entry).
filter(entry=>entry.url&&entry.source==='violation'&&pattern.test(entry.text)).
map(entry=>({label:`line: ${entry.lineNumber}`,url:entry.url})).
filter(entry=>{


const key=`${entry.url}!${entry.label}`;
if(seen.has(key))return false;
seen.add(key);
return true;
});
}}


module.exports=ViolationAudit;

},{"./audit.js":3}],8:[function(require,module,exports){





'use strict';

const ArbitraryEqualityMap=require('../lib/arbitrary-equality-map.js');
const log=require('lighthouse-logger');







function makeComputedArtifact(computableArtifact){









const request=(artifacts,context)=>{
const computedCache=context.computedCache;
const computedName=computableArtifact.name;

const cache=computedCache.get(computedName)||new ArbitraryEqualityMap();
computedCache.set(computedName,cache);

const computed=cache.get(artifacts);
if(computed){
return computed;
}

const status={msg:`Computing artifact: ${computedName}`,id:`lh:computed:${computedName}`};
log.time(status,'verbose');

const artifactPromise=
computableArtifact.compute_(artifacts,context);
cache.set(artifacts,artifactPromise);

artifactPromise.then(()=>log.timeEnd(status)).catch(()=>log.timeEnd(status));

return artifactPromise;
};

return Object.assign(computableArtifact,{request});
}

module.exports=makeComputedArtifact;

},{"../lib/arbitrary-equality-map.js":55,"lighthouse-logger":125}],9:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const NetworkRequest=require('../lib/network-request.js');
const assert=require('assert');
const NetworkRecords=require('./network-records.js');
const MainResource=require('./main-resource.js');

class CriticalRequestChains{








static isCritical(request,mainResource){
assert.ok(mainResource,'mainResource not provided');


if(request.isLinkPreload){
return false;
}





while(request.redirectDestination){
request=request.redirectDestination;
}


const isIframe=request.resourceType===NetworkRequest.TYPES.Document&&
request.frameId!==mainResource.frameId;




const nonCriticalResourceTypes=[
NetworkRequest.TYPES.Image,
NetworkRequest.TYPES.XHR,
NetworkRequest.TYPES.Fetch,
NetworkRequest.TYPES.EventSource];

if(nonCriticalResourceTypes.includes(request.resourceType||'Other')||
isIframe||
request.mimeType&&request.mimeType.startsWith('image/')){
return false;
}

return['VeryHigh','High','Medium'].includes(request.priority);
}






static extractChain(networkRecords,mainResource){
networkRecords=networkRecords.filter(req=>req.finished);



const requestIdToRequests=new Map();
for(const request of networkRecords){
requestIdToRequests.set(request.requestId,request);
}



const criticalRequests=networkRecords.filter(request=>
CriticalRequestChains.isCritical(request,mainResource));



const criticalRequestChains={};
for(const request of criticalRequests){




const ancestors=[];
let ancestorRequest=request.initiatorRequest;

let node=criticalRequestChains;
while(ancestorRequest){
const ancestorIsCritical=CriticalRequestChains.isCritical(ancestorRequest,mainResource);





if(!ancestorIsCritical||ancestors.includes(ancestorRequest.requestId)){


ancestors.length=0;
node=undefined;
break;
}
ancestors.push(ancestorRequest.requestId);
ancestorRequest=ancestorRequest.initiatorRequest;
}



let ancestor=ancestors.pop();
while(ancestor&&node){
const parentRequest=requestIdToRequests.get(ancestor);
if(!parentRequest){
throw new Error(`request with id ${ancestor} not found.`);
}

const parentRequestId=parentRequest.requestId;
if(!node[parentRequestId]){
node[parentRequestId]={
request:parentRequest,
children:{}};

}


ancestor=ancestors.pop();
node=node[parentRequestId].children;
}

if(!node){
continue;
}


if(node[request.requestId]){
continue;
}


node[request.requestId]={
request,
children:{}};

}

return criticalRequestChains;
}






static async compute_(data,context){
const[networkRecords,mainResource]=await Promise.all([
NetworkRecords.request(data.devtoolsLog,context),
MainResource.request(data,context)]);


return CriticalRequestChains.extractChain(networkRecords,mainResource);
}}


module.exports=makeComputedArtifact(CriticalRequestChains);

},{"../lib/network-request.js":75,"./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":34,"assert":92}],10:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const constants=require('../config/constants.js');
const Simulator=require('../lib/dependency-graph/simulator/simulator.js');
const NetworkAnalysis=require('./network-analysis.js');

class LoadSimulator{





static async compute_(data,context){
const{throttlingMethod,throttling,precomputedLanternData}=data.settings;
const networkAnalysis=await NetworkAnalysis.request(data.devtoolsLog,context);


const options={
additionalRttByOrigin:networkAnalysis.additionalRttByOrigin,
serverResponseTimeByOrigin:networkAnalysis.serverResponseTimeByOrigin};




if(precomputedLanternData){
options.additionalRttByOrigin=new Map(Object.entries(
precomputedLanternData.additionalRttByOrigin));
options.serverResponseTimeByOrigin=new Map(Object.entries(
precomputedLanternData.serverResponseTimeByOrigin));
}

switch(throttlingMethod){
case'provided':
options.rtt=networkAnalysis.rtt;
options.throughput=networkAnalysis.throughput;
options.cpuSlowdownMultiplier=1;
options.layoutTaskMultiplier=1;
break;
case'devtools':
if(throttling){
options.rtt=
throttling.requestLatencyMs/constants.throttling.DEVTOOLS_RTT_ADJUSTMENT_FACTOR;
options.throughput=
throttling.downloadThroughputKbps*1024/
constants.throttling.DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR;
}

options.cpuSlowdownMultiplier=1;
options.layoutTaskMultiplier=1;
break;
case'simulate':
if(throttling){
options.rtt=throttling.rttMs;
options.throughput=throttling.throughputKbps*1024;
options.cpuSlowdownMultiplier=throttling.cpuSlowdownMultiplier;
}
break;
default:

break;}


return new Simulator(options);
}





static convertAnalysisToSaveableLanternData(networkAnalysis){

const lanternData={additionalRttByOrigin:{},serverResponseTimeByOrigin:{}};
for(const[origin,value]of networkAnalysis.additionalRttByOrigin.entries()){
if(origin.startsWith('http'))lanternData.additionalRttByOrigin[origin]=value;
}

for(const[origin,value]of networkAnalysis.serverResponseTimeByOrigin.entries()){
if(origin.startsWith('http'))lanternData.serverResponseTimeByOrigin[origin]=value;
}

return lanternData;
}}


module.exports=makeComputedArtifact(LoadSimulator);

},{"../config/constants.js":46,"../lib/dependency-graph/simulator/simulator.js":63,"./computed-artifact.js":8,"./network-analysis.js":33}],11:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
const NetworkRecords=require('./network-records.js');





class MainResource{





static async compute_(data,context){
const finalUrl=data.URL.finalUrl;
const requests=await NetworkRecords.request(data.devtoolsLog,context);
const mainResource=NetworkAnalyzer.findMainDocument(requests,finalUrl);
if(!mainResource){
throw new Error('Unable to identify the main resource');
}

return mainResource;
}}


module.exports=makeComputedArtifact(MainResource);

},{"../lib/dependency-graph/simulator/network-analyzer.js":62,"./computed-artifact.js":8,"./network-records.js":34}],12:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const MainThreadTasks_=require('../lib/tracehouse/main-thread-tasks.js');
const TraceOfTab=require('./trace-of-tab.js');

class MainThreadTasks{





static async compute_(trace,context){
const{mainThreadEvents,timestamps}=await TraceOfTab.request(trace,context);
return MainThreadTasks_.getMainThreadTasks(mainThreadEvents,timestamps.traceEnd);
}}


module.exports=makeComputedArtifact(MainThreadTasks);

},{"../lib/tracehouse/main-thread-tasks.js":83,"./computed-artifact.js":8,"./trace-of-tab.js":39}],13:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const icons=require('../lib/icons.js');

const PWA_DISPLAY_VALUES=['minimal-ui','fullscreen','standalone'];



const SUGGESTED_SHORTNAME_LENGTH=12;

class ManifestValues{





static get manifestChecks(){
return[
{
id:'hasStartUrl',
failureText:'Manifest does not contain a `start_url`',
validate:manifestValue=>!!manifestValue.start_url.value},

{
id:'hasIconsAtLeast192px',
failureText:'Manifest does not have a PNG icon of at least 192px',
validate:manifestValue=>icons.doExist(manifestValue)&&
icons.pngSizedAtLeast(192,manifestValue).length>0},

{
id:'hasIconsAtLeast512px',
failureText:'Manifest does not have a PNG icon of at least 512px',
validate:manifestValue=>icons.doExist(manifestValue)&&
icons.pngSizedAtLeast(512,manifestValue).length>0},

{
id:'hasPWADisplayValue',
failureText:'Manifest\'s `display` value is not one of: '+PWA_DISPLAY_VALUES.join(' | '),
validate:manifestValue=>PWA_DISPLAY_VALUES.includes(manifestValue.display.value)},

{
id:'hasBackgroundColor',
failureText:'Manifest does not have `background_color`',
validate:manifestValue=>!!manifestValue.background_color.value},

{
id:'hasThemeColor',
failureText:'Manifest does not have `theme_color`',
validate:manifestValue=>!!manifestValue.theme_color.value},

{
id:'hasShortName',
failureText:'Manifest does not have `short_name`',
validate:manifestValue=>!!manifestValue.short_name.value},

{
id:'shortNameLength',
failureText:`Manifest's \`short_name\` is too long (>${SUGGESTED_SHORTNAME_LENGTH} `+
`characters) to be displayed on a homescreen without truncation`,

validate:manifestValue=>!!manifestValue.short_name.value&&
manifestValue.short_name.value.length<=SUGGESTED_SHORTNAME_LENGTH},

{
id:'hasName',
failureText:'Manifest does not have `name`',
validate:manifestValue=>!!manifestValue.name.value}];


}






static async compute_(manifest){

if(manifest===null){
return{
isParseFailure:true,
parseFailureReason:'No manifest was fetched',
allChecks:[]};

}
const manifestValue=manifest.value;
if(manifestValue===undefined){
return{
isParseFailure:true,
parseFailureReason:'Manifest failed to parse as valid JSON',
allChecks:[]};

}


const remainingChecks=ManifestValues.manifestChecks.map(item=>{
return{
id:item.id,
failureText:item.failureText,
passing:item.validate(manifestValue)};

});

return{
isParseFailure:false,
allChecks:remainingChecks};

}}


module.exports=makeComputedArtifact(ManifestValues);

},{"../lib/icons.js":68,"./computed-artifact.js":8}],14:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const LHError=require('../../lib/lh-error.js');
const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
const LanternEstimatedInputLatency=require('./lantern-estimated-input-latency.js');

const ROLLING_WINDOW_SIZE=5000;






class EstimatedInputLatency extends ComputedMetric{




static calculateRollingWindowEIL(events){
const candidateStartEvts=events.filter(evt=>evt.duration>=10);

let worst90thPercentileLatency=16;
for(const startEvt of candidateStartEvts){
const latencyPercentiles=TracingProcessor.getRiskToResponsiveness(
events,
startEvt.start,
startEvt.start+ROLLING_WINDOW_SIZE,
[0.9]);


worst90thPercentileLatency=Math.max(latencyPercentiles[0].time,worst90thPercentileLatency);
}

return worst90thPercentileLatency;
}






static computeSimulatedMetric(data,context){
return LanternEstimatedInputLatency.request(data,context);
}





static computeObservedMetric(data){
const{firstMeaningfulPaint}=data.traceOfTab.timings;
if(!firstMeaningfulPaint){
throw new LHError(LHError.errors.NO_FMP);
}

const events=TracingProcessor.getMainThreadTopLevelEvents(
data.traceOfTab,
firstMeaningfulPaint).
filter(evt=>evt.duration>=1);

return Promise.resolve({
timing:EstimatedInputLatency.calculateRollingWindowEIL(events)});

}}


module.exports=makeComputedArtifact(EstimatedInputLatency);

},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-estimated-input-latency.js":19,"./metric.js":30}],15:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');

class FirstContentfulPaint extends ComputedMetric{





static computeSimulatedMetric(data,context){
return LanternFirstContentfulPaint.request(data,context);
}





static async computeObservedMetric(data){
const{traceOfTab}=data;

return{
timing:traceOfTab.timings.firstContentfulPaint,
timestamp:traceOfTab.timestamps.firstContentfulPaint};

}}


module.exports=makeComputedArtifact(FirstContentfulPaint);

},{"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./metric.js":30}],16:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
const LHError=require('../../lib/lh-error.js');
const LanternFirstCPUIdle=require('./lantern-first-cpu-idle.js');

const LONG_TASK_THRESHOLD=50;

const MAX_TASK_CLUSTER_DURATION=250;
const MIN_TASK_CLUSTER_PADDING=1000;
const MIN_TASK_CLUSTER_FMP_DISTANCE=5000;

const MAX_QUIET_WINDOW_SIZE=5000;


const EXPONENTIATION_COEFFICIENT=-Math.log(3-1)/15;





























class FirstCPUIdle extends ComputedMetric{




static getRequiredWindowSizeInMs(t){
const tInSeconds=t/1000;
const exponentiationComponent=Math.exp(EXPONENTIATION_COEFFICIENT*tInSeconds);
return(4*exponentiationComponent+1)*1000;
}










static getTaskClustersInWindow(tasks,startIndex,windowEnd){
const clusters=[];

let previousTaskEndTime=-Infinity;

let currentCluster=[];





const clusteringWindowEnd=windowEnd+MIN_TASK_CLUSTER_PADDING;

const isInClusteringWindow=task=>task.start<clusteringWindowEnd;
for(let i=startIndex;i<tasks.length;i++){
if(!isInClusteringWindow(tasks[i])){
break;
}

const task=tasks[i];


if(task.start-previousTaskEndTime>MIN_TASK_CLUSTER_PADDING){
currentCluster=[];
clusters.push(currentCluster);
}

currentCluster.push(task);
previousTaskEndTime=task.end;
}

return clusters.

map(tasks=>{
const start=tasks[0].start;
const end=tasks[tasks.length-1].end;
const duration=end-start;
return{start,end,duration};
}).

filter(cluster=>cluster.start<windowEnd);
}










static findQuietWindow(FMP,traceEnd,longTasks){

if(longTasks.length===0||
longTasks[0].start>FMP+FirstCPUIdle.getRequiredWindowSizeInMs(0)){
return FMP;
}


const isTooCloseToFMP=cluster=>cluster.start<FMP+MIN_TASK_CLUSTER_FMP_DISTANCE;

const isTooLong=cluster=>cluster.duration>MAX_TASK_CLUSTER_DURATION;

const isBadCluster=cluster=>isTooCloseToFMP(cluster)||isTooLong(cluster);



for(let i=0;i<longTasks.length;i++){
const windowStart=longTasks[i].end;
const windowSize=FirstCPUIdle.getRequiredWindowSizeInMs(windowStart-FMP);
const windowEnd=windowStart+windowSize;


if(windowEnd>traceEnd){
throw new LHError(LHError.errors.NO_FCPUI_IDLE_PERIOD);
}


if(i+1<longTasks.length&&
longTasks[i+1].start-windowStart<=MIN_TASK_CLUSTER_PADDING){
continue;
}

const taskClusters=FirstCPUIdle.getTaskClustersInWindow(longTasks,i+1,windowEnd);
const hasBadTaskClusters=taskClusters.some(isBadCluster);

if(!hasBadTaskClusters){
return windowStart;
}
}

throw new LHError(LHError.errors.NO_FCPUI_IDLE_PERIOD);
}






static computeSimulatedMetric(data,context){
return LanternFirstCPUIdle.request(data,context);
}





static async computeObservedMetric(data){
const{traceOfTab}=data;
const navStart=traceOfTab.timestamps.navigationStart;
const FMP=traceOfTab.timings.firstMeaningfulPaint;
const DCL=traceOfTab.timings.domContentLoaded;
const traceEnd=traceOfTab.timings.traceEnd;

if(!FMP||!DCL){
throw new LHError(FMP?LHError.errors.NO_DCL:LHError.errors.NO_FMP);
}

if(traceEnd-FMP<MAX_QUIET_WINDOW_SIZE){
throw new LHError(LHError.errors.FMP_TOO_LATE_FOR_FCPUI);
}

const longTasksAfterFMP=TracingProcessor.getMainThreadTopLevelEvents(traceOfTab,FMP).
filter(evt=>evt.duration>=LONG_TASK_THRESHOLD);
const firstInteractive=FirstCPUIdle.findQuietWindow(FMP,traceEnd,longTasksAfterFMP);

const valueInMs=Math.max(firstInteractive,DCL);

return Promise.resolve({
timing:valueInMs,
timestamp:valueInMs*1000+navStart});

}}







module.exports=makeComputedArtifact(FirstCPUIdle);

},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-first-cpu-idle.js":21,"./metric.js":30}],17:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const LHError=require('../../lib/lh-error.js');
const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');

class FirstMeaningfulPaint extends ComputedMetric{





static computeSimulatedMetric(data,context){
return LanternFirstMeaningfulPaint.request(data,context);
}





static async computeObservedMetric(data){
const{traceOfTab}=data;
if(!traceOfTab.timestamps.firstMeaningfulPaint){
throw new LHError(LHError.errors.NO_FMP);
}

return{

timing:traceOfTab.timings.firstMeaningfulPaint,
timestamp:traceOfTab.timestamps.firstMeaningfulPaint};

}}


module.exports=makeComputedArtifact(FirstMeaningfulPaint);

},{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./metric.js":30}],18:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const LanternInteractive=require('./lantern-interactive.js');

const NetworkRecorder=require('../../lib/network-recorder.js');
const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
const LHError=require('../../lib/lh-error.js');

const REQUIRED_QUIET_WINDOW=5000;
const ALLOWED_CONCURRENT_REQUESTS=2;






class Interactive extends ComputedMetric{







static _findNetworkQuietPeriods(networkRecords,traceOfTab){
const traceEndTsInMs=traceOfTab.timestamps.traceEnd/1000;

const filteredNetworkRecords=networkRecords.filter(record=>{
return record.finished&&record.requestMethod==='GET'&&!record.failed&&

record.statusCode<400;
});
return NetworkRecorder.findNetworkQuietPeriods(filteredNetworkRecords,
ALLOWED_CONCURRENT_REQUESTS,traceEndTsInMs);
}







static _findCPUQuietPeriods(longTasks,traceOfTab){
const navStartTsInMs=traceOfTab.timestamps.navigationStart/1000;
const traceEndTsInMs=traceOfTab.timestamps.traceEnd/1000;
if(longTasks.length===0){
return[{start:0,end:traceEndTsInMs}];
}


const quietPeriods=[];
longTasks.forEach((task,index)=>{
if(index===0){
quietPeriods.push({
start:0,
end:task.start+navStartTsInMs});

}

if(index===longTasks.length-1){
quietPeriods.push({
start:task.end+navStartTsInMs,
end:traceEndTsInMs});

}else{
quietPeriods.push({
start:task.end+navStartTsInMs,
end:longTasks[index+1].start+navStartTsInMs});

}
});

return quietPeriods;
}








static findOverlappingQuietPeriods(longTasks,networkRecords,traceOfTab){
const FcpTsInMs=traceOfTab.timestamps.firstContentfulPaint/1000;


const isLongEnoughQuietPeriod=period=>
period.end>FcpTsInMs+REQUIRED_QUIET_WINDOW&&
period.end-period.start>=REQUIRED_QUIET_WINDOW;
const networkQuietPeriods=this._findNetworkQuietPeriods(networkRecords,traceOfTab).
filter(isLongEnoughQuietPeriod);
const cpuQuietPeriods=this._findCPUQuietPeriods(longTasks,traceOfTab).
filter(isLongEnoughQuietPeriod);

const cpuQueue=cpuQuietPeriods.slice();
const networkQueue=networkQuietPeriods.slice();


let cpuCandidate=cpuQueue.shift();
let networkCandidate=networkQueue.shift();
while(cpuCandidate&&networkCandidate){
if(cpuCandidate.start>=networkCandidate.start){

if(networkCandidate.end>=cpuCandidate.start+REQUIRED_QUIET_WINDOW){
return{
cpuQuietPeriod:cpuCandidate,
networkQuietPeriod:networkCandidate,
cpuQuietPeriods,
networkQuietPeriods};

}else{
networkCandidate=networkQueue.shift();
}
}else{

if(cpuCandidate.end>=networkCandidate.start+REQUIRED_QUIET_WINDOW){
return{
cpuQuietPeriod:cpuCandidate,
networkQuietPeriod:networkCandidate,
cpuQuietPeriods,
networkQuietPeriods};

}else{
cpuCandidate=cpuQueue.shift();
}
}
}

throw new LHError(
cpuCandidate?
LHError.errors.NO_TTI_NETWORK_IDLE_PERIOD:
LHError.errors.NO_TTI_CPU_IDLE_PERIOD);

}






static computeSimulatedMetric(data,context){
return LanternInteractive.request(data,context);
}





static computeObservedMetric(data){
const{traceOfTab,networkRecords}=data;

if(!traceOfTab.timestamps.domContentLoaded){
throw new LHError(LHError.errors.NO_DCL);
}

const longTasks=TracingProcessor.getMainThreadTopLevelEvents(traceOfTab).
filter(event=>event.duration>=50);
const quietPeriodInfo=Interactive.findOverlappingQuietPeriods(
longTasks,
networkRecords,
traceOfTab);


const cpuQuietPeriod=quietPeriodInfo.cpuQuietPeriod;

const timestamp=Math.max(
cpuQuietPeriod.start,
traceOfTab.timestamps.firstContentfulPaint/1000,
traceOfTab.timestamps.domContentLoaded/1000)*
1000;
const timing=(timestamp-traceOfTab.timestamps.navigationStart)/1000;
return Promise.resolve({timing,timestamp});
}}


module.exports=makeComputedArtifact(Interactive);







},{"../../lib/lh-error.js":71,"../../lib/network-recorder.js":74,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-interactive.js":23,"./metric.js":30}],19:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetric=require('./lantern-metric.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');
const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');



class LanternEstimatedInputLatency extends LanternMetric{



static get COEFFICIENTS(){
return{
intercept:0,
optimistic:0.4,
pessimistic:0.4};

}





static getOptimisticGraph(dependencyGraph){
return dependencyGraph;
}





static getPessimisticGraph(dependencyGraph){
return dependencyGraph;
}






static getEstimateFromSimulation(simulation,extras){


const fmpTimeInMs=extras.optimistic?
extras.fmpResult.pessimisticEstimate.timeInMs:
extras.fmpResult.optimisticEstimate.timeInMs;

const events=LanternEstimatedInputLatency.getEventsAfterFMP(
simulation.nodeTimings,
fmpTimeInMs);



const EstimatedInputLatency=require('./estimated-input-latency.js');

return{
timeInMs:EstimatedInputLatency.calculateRollingWindowEIL(events),
nodeTimings:simulation.nodeTimings};

}






static async compute_(data,context){
const fmpResult=await LanternFirstMeaningfulPaint.request(data,context);
return this.computeMetricWithGraphs(data,context,{fmpResult});
}





static getEventsAfterFMP(nodeTimings,fmpTimeInMs){

const events=[];
for(const[node,timing]of nodeTimings.entries()){
if(node.type!==BaseNode.TYPES.CPU)continue;
if(timing.endTime<fmpTimeInMs)continue;

events.push({
start:timing.startTime,
end:timing.endTime,
duration:timing.duration});

}

return events.sort((a,b)=>a.start-b.start);
}}


module.exports=makeComputedArtifact(LanternEstimatedInputLatency);

},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./estimated-input-latency.js":14,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],20:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetric=require('./lantern-metric.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');





class LanternFirstContentfulPaint extends LanternMetric{



static get COEFFICIENTS(){
return{
intercept:0,
optimistic:0.5,
pessimistic:0.5};

}
















static getBlockingNodeData(
graph,
filterTimestamp,
blockingScriptFilter,
extraBlockingCpuNodesToIncludeFilter)
{

const scriptUrlToNodeMap=new Map();


const cpuNodes=[];
graph.traverse(node=>{
if(node.type===BaseNode.TYPES.CPU){


if(node.startTime<=filterTimestamp)cpuNodes.push(node);


const scriptUrls=node.getEvaluateScriptURLs();
for(const url of scriptUrls){

const existing=scriptUrlToNodeMap.get(url)||node;
scriptUrlToNodeMap.set(url,node.startTime<existing.startTime?node:existing);
}
}
});

cpuNodes.sort((a,b)=>a.startTime-b.startTime);


const possiblyRenderBlockingScriptUrls=LanternMetric.getScriptUrls(graph,node=>{
return node.endTime<=filterTimestamp&&blockingScriptFilter(node);
});



const definitelyNotRenderBlockingScriptUrls=new Set();

const blockingCpuNodeIds=new Set();
for(const url of possiblyRenderBlockingScriptUrls){

const cpuNodeForUrl=scriptUrlToNodeMap.get(url);


if(!cpuNodeForUrl)continue;


if(cpuNodes.includes(cpuNodeForUrl)){
blockingCpuNodeIds.add(cpuNodeForUrl.id);
continue;
}



definitelyNotRenderBlockingScriptUrls.add(url);
}



const firstLayout=cpuNodes.find(node=>node.didPerformLayout());
if(firstLayout)blockingCpuNodeIds.add(firstLayout.id);
const firstPaint=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='Paint'));
if(firstPaint)blockingCpuNodeIds.add(firstPaint.id);
const firstParse=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='ParseHTML'));
if(firstParse)blockingCpuNodeIds.add(firstParse.id);


if(extraBlockingCpuNodesToIncludeFilter){
cpuNodes.
filter(extraBlockingCpuNodesToIncludeFilter).
forEach(node=>blockingCpuNodeIds.add(node.id));
}

return{
definitelyNotRenderBlockingScriptUrls,
blockingCpuNodeIds};

}













static getFirstPaintBasedGraph(
dependencyGraph,
paintTs,
blockingResourcesFilter,
extraBlockingCpuNodesToIncludeFilter)
{
const{
definitelyNotRenderBlockingScriptUrls,
blockingCpuNodeIds}=
this.getBlockingNodeData(
dependencyGraph,
paintTs,
blockingResourcesFilter,
extraBlockingCpuNodesToIncludeFilter);


return dependencyGraph.cloneWithRelationships(node=>{
if(node.type===BaseNode.TYPES.NETWORK){

if(node.endTime>paintTs&&!node.isMainDocument())return false;

const url=node.record.url;

if(definitelyNotRenderBlockingScriptUrls.has(url)){
return false;
}

return blockingResourcesFilter(node);
}else{

return blockingCpuNodeIds.has(node.id);
}
});
}






static getOptimisticGraph(dependencyGraph,traceOfTab){
return this.getFirstPaintBasedGraph(
dependencyGraph,
traceOfTab.timestamps.firstContentfulPaint,



node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');

}






static getPessimisticGraph(dependencyGraph,traceOfTab){
return this.getFirstPaintBasedGraph(
dependencyGraph,
traceOfTab.timestamps.firstContentfulPaint,
node=>node.hasRenderBlockingPriority());

}}


module.exports=makeComputedArtifact(LanternFirstContentfulPaint);

},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-metric.js":25}],21:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');
const LanternInteractive=require('./lantern-interactive.js');

class LanternFirstCPUIdle extends LanternInteractive{



static get COEFFICIENTS(){
return{
intercept:0,
optimistic:1,
pessimistic:0};

}







static getEstimateFromSimulation(simulation,extras){
const fmpTimeInMs=extras.optimistic?
extras.fmpResult.optimisticEstimate.timeInMs:
extras.fmpResult.pessimisticEstimate.timeInMs;

return{
timeInMs:LanternFirstCPUIdle.getFirstCPUIdleWindowStart(simulation.nodeTimings,fmpTimeInMs),
nodeTimings:simulation.nodeTimings};

}






static getFirstCPUIdleWindowStart(nodeTimings,fmpTimeInMs,longTaskLength=50){

const longTasks=[];
for(const[node,timing]of nodeTimings.entries()){
if(node.type!==BaseNode.TYPES.CPU)continue;
if(timing.duration<longTaskLength)continue;
longTasks.push({start:timing.startTime,end:timing.endTime});
}

longTasks.sort((a,b)=>a.start-b.start);

const FirstCPUIdle=require('./first-cpu-idle.js');
return FirstCPUIdle.findQuietWindow(fmpTimeInMs,Infinity,longTasks);
}






static async compute_(data,context){
return super.compute_(data,context);
}}


module.exports=makeComputedArtifact(LanternFirstCPUIdle);

},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./first-cpu-idle.js":16,"./lantern-interactive.js":23}],22:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetric=require('./lantern-metric.js');
const LHError=require('../../lib/lh-error.js');
const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');



class LanternFirstMeaningfulPaint extends LanternMetric{



static get COEFFICIENTS(){
return{
intercept:0,
optimistic:0.5,
pessimistic:0.5};

}






static getOptimisticGraph(dependencyGraph,traceOfTab){
const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
if(!fmp){
throw new LHError(LHError.errors.NO_FMP);
}

return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
dependencyGraph,
fmp,


node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');

}






static getPessimisticGraph(dependencyGraph,traceOfTab){
const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
if(!fmp){
throw new LHError(LHError.errors.NO_FMP);
}

return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
dependencyGraph,
fmp,
node=>node.hasRenderBlockingPriority(),

node=>node.didPerformLayout());

}






static async compute_(data,context){
const fcpResult=await LanternFirstContentfulPaint.request(data,context);
const metricResult=await this.computeMetricWithGraphs(data,context);
metricResult.timing=Math.max(metricResult.timing,fcpResult.timing);
return metricResult;
}}


module.exports=makeComputedArtifact(LanternFirstMeaningfulPaint);

},{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],23:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetric=require('./lantern-metric.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');
const NetworkRequest=require('../../lib/network-request.js');
const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');




const CRITICAL_LONG_TASK_THRESHOLD=20;

class LanternInteractive extends LanternMetric{



static get COEFFICIENTS(){
return{
intercept:0,
optimistic:0.5,
pessimistic:0.5};

}





static getOptimisticGraph(dependencyGraph){

const minimumCpuTaskDuration=CRITICAL_LONG_TASK_THRESHOLD*1000;

return dependencyGraph.cloneWithRelationships(node=>{

if(node.type===BaseNode.TYPES.CPU){
return node.event.dur>minimumCpuTaskDuration;
}


const isImage=node.record.resourceType===NetworkRequest.TYPES.Image;
const isScript=node.record.resourceType===NetworkRequest.TYPES.Script;
return(
!isImage&&(
isScript||
node.record.priority==='High'||
node.record.priority==='VeryHigh'));

});
}





static getPessimisticGraph(dependencyGraph){
return dependencyGraph;
}






static getEstimateFromSimulation(simulationResult,extras){
const lastTaskAt=LanternInteractive.getLastLongTaskEndTime(simulationResult.nodeTimings);
const minimumTime=extras.optimistic?
extras.fmpResult.optimisticEstimate.timeInMs:
extras.fmpResult.pessimisticEstimate.timeInMs;
return{
timeInMs:Math.max(minimumTime,lastTaskAt),
nodeTimings:simulationResult.nodeTimings};

}






static async compute_(data,context){
const fmpResult=await LanternFirstMeaningfulPaint.request(data,context);
const metricResult=await this.computeMetricWithGraphs(data,context,{fmpResult});
metricResult.timing=Math.max(metricResult.timing,fmpResult.timing);
return metricResult;
}





static getLastLongTaskEndTime(nodeTimings,duration=50){
return Array.from(nodeTimings.entries()).
filter(([node,timing])=>{
if(node.type!==BaseNode.TYPES.CPU)return false;
return timing.duration>duration;
}).
map(([_,timing])=>timing.endTime).
reduce((max,x)=>Math.max(max||0,x||0),0);
}}


module.exports=makeComputedArtifact(LanternInteractive);

},{"../../lib/dependency-graph/base-node.js":57,"../../lib/network-request.js":75,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],24:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetricArtifact=require('./lantern-metric.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');
const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');



class LanternMaxPotentialFID extends LanternMetricArtifact{



static get COEFFICIENTS(){
return{
intercept:0,
optimistic:0.5,
pessimistic:0.5};

}





static getOptimisticGraph(dependencyGraph){
return dependencyGraph;
}





static getPessimisticGraph(dependencyGraph){
return dependencyGraph;
}






static getEstimateFromSimulation(simulation,extras){


const fcpTimeInMs=extras.optimistic?
extras.fcpResult.pessimisticEstimate.timeInMs:
extras.fcpResult.optimisticEstimate.timeInMs;

const timings=LanternMaxPotentialFID.getTimingsAfterFCP(
simulation.nodeTimings,
fcpTimeInMs);


return{
timeInMs:Math.max(...timings.map(timing=>timing.duration),16),
nodeTimings:simulation.nodeTimings};

}






static async compute_(data,context){
const fcpResult=await LanternFirstContentfulPaint.request(data,context);
return super.computeMetricWithGraphs(data,context,{fcpResult});
}






static getTimingsAfterFCP(nodeTimings,fcpTimeInMs){
return Array.from(nodeTimings.entries()).
filter(([node,timing])=>node.type===BaseNode.TYPES.CPU&&timing.endTime>fcpTimeInMs).
map(([_,timing])=>timing);
}}


module.exports=makeComputedArtifact(LanternMaxPotentialFID);

},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],25:[function(require,module,exports){





'use strict';

const BaseNode=require('../../lib/dependency-graph/base-node.js');
const NetworkRequest=require('../../lib/network-request.js');
const TraceOfTab=require('../trace-of-tab.js');
const PageDependencyGraph=require('../page-dependency-graph.js');
const LoadSimulator=require('../load-simulator.js');





class LanternMetricArtifact{





static getScriptUrls(dependencyGraph,condition){

const scriptUrls=new Set();

dependencyGraph.traverse(node=>{
if(node.type===BaseNode.TYPES.CPU)return;
if(node.record.resourceType!==NetworkRequest.TYPES.Script)return;
if(condition&&!condition(node))return;
scriptUrls.add(node.record.url);
});

return scriptUrls;
}




static get COEFFICIENTS(){
throw new Error('COEFFICIENTS unimplemented!');
}










static getScaledCoefficients(rttMs){
return this.COEFFICIENTS;
}






static getOptimisticGraph(dependencyGraph,traceOfTab){
throw new Error('Optimistic graph unimplemented!');
}






static getPessimisticGraph(dependencyGraph,traceOfTab){
throw new Error('Pessmistic graph unimplemented!');
}






static getEstimateFromSimulation(simulationResult,extras){
return simulationResult;
}







static async computeMetricWithGraphs(data,context,extras){
const{trace,devtoolsLog,settings}=data;
const metricName=this.name.replace('Lantern','');
const graph=await PageDependencyGraph.request({trace,devtoolsLog},context);
const traceOfTab=await TraceOfTab.request(trace,context);
const simulator=data.simulator||(
await LoadSimulator.request({devtoolsLog,settings},context));

const optimisticGraph=this.getOptimisticGraph(graph,traceOfTab);
const pessimisticGraph=this.getPessimisticGraph(graph,traceOfTab);


let simulateOptions={label:`optimistic${metricName}`};
const optimisticSimulation=simulator.simulate(optimisticGraph,simulateOptions);

simulateOptions={label:`optimisticFlex${metricName}`,flexibleOrdering:true};
const optimisticFlexSimulation=simulator.simulate(optimisticGraph,simulateOptions);

simulateOptions={label:`pessimistic${metricName}`};
const pessimisticSimulation=simulator.simulate(pessimisticGraph,simulateOptions);

const optimisticEstimate=this.getEstimateFromSimulation(
optimisticSimulation.timeInMs<optimisticFlexSimulation.timeInMs?
optimisticSimulation:optimisticFlexSimulation,
Object.assign({},extras,{optimistic:true}));


const pessimisticEstimate=this.getEstimateFromSimulation(
pessimisticSimulation,
Object.assign({},extras,{optimistic:false}));


const coefficients=this.getScaledCoefficients(simulator.rtt);

const interceptMultiplier=coefficients.intercept>0?
Math.min(1,optimisticEstimate.timeInMs/1000):1;
const timing=
coefficients.intercept*interceptMultiplier+
coefficients.optimistic*optimisticEstimate.timeInMs+
coefficients.pessimistic*pessimisticEstimate.timeInMs;

return{
timing,
optimisticEstimate,
pessimisticEstimate,
optimisticGraph,
pessimisticGraph};

}






static async compute_(data,context){
return this.computeMetricWithGraphs(data,context);
}}


module.exports=LanternMetricArtifact;

},{"../../lib/dependency-graph/base-node.js":57,"../../lib/network-request.js":75,"../load-simulator.js":10,"../page-dependency-graph.js":35,"../trace-of-tab.js":39}],26:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetric=require('./lantern-metric.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');
const Speedline=require('../speedline.js');
const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
const defaultThrottling=require('../../config/constants.js').throttling;



class LanternSpeedIndex extends LanternMetric{



static get COEFFICIENTS(){
return{



intercept:-250,
optimistic:1.4,
pessimistic:0.65};

}





static getScaledCoefficients(rttMs){











const defaultCoefficients=this.COEFFICIENTS;
const defaultRttExcess=defaultThrottling.mobileSlow4G.rttMs-30;
const multiplier=Math.max((rttMs-30)/defaultRttExcess,0);

return{
intercept:defaultCoefficients.intercept*multiplier,
optimistic:0.5+(defaultCoefficients.optimistic-0.5)*multiplier,
pessimistic:0.5+(defaultCoefficients.pessimistic-0.5)*multiplier};

}





static getOptimisticGraph(dependencyGraph){
return dependencyGraph;
}





static getPessimisticGraph(dependencyGraph){
return dependencyGraph;
}






static getEstimateFromSimulation(simulationResult,extras){
const fcpTimeInMs=extras.fcpResult.pessimisticEstimate.timeInMs;
const estimate=extras.optimistic?
extras.speedline.speedIndex:
LanternSpeedIndex.computeLayoutBasedSpeedIndex(simulationResult.nodeTimings,fcpTimeInMs);
return{
timeInMs:estimate,
nodeTimings:simulationResult.nodeTimings};

}






static async compute_(data,context){
const speedline=await Speedline.request(data.trace,context);
const fcpResult=await LanternFirstContentfulPaint.request(data,context);
const metricResult=await this.computeMetricWithGraphs(data,context,{
speedline,
fcpResult});

metricResult.timing=Math.max(metricResult.timing,fcpResult.timing);
return metricResult;
}
















static computeLayoutBasedSpeedIndex(nodeTimings,fcpTimeInMs){

const layoutWeights=[];
for(const[node,timing]of nodeTimings.entries()){
if(node.type!==BaseNode.TYPES.CPU)continue;

if(node.childEvents.some(x=>x.name==='Layout')){
const timingWeight=Math.max(Math.log2(timing.endTime-timing.startTime),0);
layoutWeights.push({time:timing.endTime,weight:timingWeight});
}
}

if(!layoutWeights.length){
return fcpTimeInMs;
}

const totalWeightedTime=layoutWeights.
map(evt=>evt.weight*Math.max(evt.time,fcpTimeInMs)).
reduce((a,b)=>a+b,0);
const totalWeight=layoutWeights.map(evt=>evt.weight).reduce((a,b)=>a+b,0);
return totalWeightedTime/totalWeight;
}}


module.exports=makeComputedArtifact(LanternSpeedIndex);

},{"../../config/constants.js":46,"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"../speedline.js":38,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],27:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetric=require('./lantern-metric.js');
const BaseNode=require('../../lib/dependency-graph/base-node.js');
const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
const LanternInteractive=require('./lantern-interactive.js');



class LanternTotalBlockingTime extends LanternMetric{



static get COEFFICIENTS(){
return{
intercept:0,
optimistic:0.5,
pessimistic:0.5};

}





static getOptimisticGraph(dependencyGraph){
return dependencyGraph;
}





static getPessimisticGraph(dependencyGraph){
return dependencyGraph;
}






static getEstimateFromSimulation(simulation,extras){




const fcpTimeInMs=extras.optimistic?
extras.fcpResult.pessimisticEstimate.timeInMs:
extras.fcpResult.optimisticEstimate.timeInMs;





const interactiveTimeMs=extras.optimistic?
extras.interactiveResult.optimisticEstimate.timeInMs:
extras.interactiveResult.pessimisticEstimate.timeInMs;


const TotalBlockingTime=require('./total-blocking-time.js');
const minDurationMs=TotalBlockingTime.BLOCKING_TIME_THRESHOLD;

const events=LanternTotalBlockingTime.getTopLevelEvents(
simulation.nodeTimings,
minDurationMs);


return{
timeInMs:TotalBlockingTime.calculateSumOfBlockingTime(
events,
fcpTimeInMs,
interactiveTimeMs),

nodeTimings:simulation.nodeTimings};

}






static async compute_(data,context){
const fcpResult=await LanternFirstContentfulPaint.request(data,context);
const interactiveResult=await LanternInteractive.request(data,context);
return this.computeMetricWithGraphs(data,context,{fcpResult,interactiveResult});
}





static getTopLevelEvents(nodeTimings,minDurationMs){


const events=[];

for(const[node,timing]of nodeTimings.entries()){
if(node.type!==BaseNode.TYPES.CPU)continue;

if(timing.duration<minDurationMs)continue;

events.push({
start:timing.startTime,
end:timing.endTime,
duration:timing.duration});

}

return events;
}}


module.exports=makeComputedArtifact(LanternTotalBlockingTime);

},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-interactive.js":23,"./lantern-metric.js":25,"./total-blocking-time.js":32}],28:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const LHError=require('../../lib/lh-error.js');

class LargestContentfulPaint extends ComputedMetric{






static computeSimulatedMetric(data,context){
throw new Error('Unimplemented');
}





static async computeObservedMetric(data){
const{traceOfTab}=data;
if(!traceOfTab.timestamps.largestContentfulPaint){
throw new LHError(LHError.errors.NO_LCP);
}

return{

timing:traceOfTab.timings.largestContentfulPaint,
timestamp:traceOfTab.timestamps.largestContentfulPaint};

}}


module.exports=makeComputedArtifact(LargestContentfulPaint);

},{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./metric.js":30}],29:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const MetricArtifact=require('./metric.js');
const LanternMaxPotentialFID=require('./lantern-max-potential-fid.js');
const LHError=require('../../lib/lh-error.js');
const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');

class MaxPotentialFID extends MetricArtifact{





static computeSimulatedMetric(data,context){
return LanternMaxPotentialFID.request(data,context);
}





static computeObservedMetric(data){
const{firstContentfulPaint}=data.traceOfTab.timings;
if(!firstContentfulPaint){
throw new LHError(LHError.errors.NO_FCP);
}

const events=TracingProcessor.getMainThreadTopLevelEvents(
data.traceOfTab,
firstContentfulPaint).
filter(evt=>evt.duration>=1);

return Promise.resolve({
timing:Math.max(...events.map(evt=>evt.duration),16)});

}}


module.exports=makeComputedArtifact(MaxPotentialFID);

},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-max-potential-fid.js":24,"./metric.js":30}],30:[function(require,module,exports){





'use strict';

const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
const TraceOfTab=require('../trace-of-tab.js');
const NetworkRecords=require('../network-records.js');










class ComputedMetric{
constructor(){}






static computeSimulatedMetric(data,context){
throw new Error('Unimplemented');
}






static computeObservedMetric(data,context){
throw new Error('Unimplemented');
}






static async compute_(data,context){
const{trace,devtoolsLog,settings}=data;
if(!trace||!devtoolsLog||!settings){
throw new Error('Did not provide necessary metric computation data');
}

const augmentedData=Object.assign({
networkRecords:await NetworkRecords.request(devtoolsLog,context),
traceOfTab:await TraceOfTab.request(trace,context)},
data);

TracingProcessor.assertHasToplevelEvents(augmentedData.traceOfTab.mainThreadEvents);

switch(settings.throttlingMethod){
case'simulate':
return this.computeSimulatedMetric(augmentedData,context);
case'provided':
case'devtools':
return this.computeObservedMetric(augmentedData,context);
default:
throw new TypeError(`Unrecognized throttling method: ${settings.throttlingMethod}`);}

}}


module.exports=ComputedMetric;

},{"../../lib/tracehouse/trace-processor.js":85,"../network-records.js":34,"../trace-of-tab.js":39}],31:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const LanternSpeedIndex=require('./lantern-speed-index.js');
const Speedline=require('../speedline.js');

class SpeedIndex extends ComputedMetric{





static computeSimulatedMetric(data,context){
return LanternSpeedIndex.request(data,context);
}






static async computeObservedMetric(data,context){
const speedline=await Speedline.request(data.trace,context);
const timing=Math.round(speedline.speedIndex);
const timestamp=(timing+speedline.beginning)*1000;
return Promise.resolve({timing,timestamp});
}}


module.exports=makeComputedArtifact(SpeedIndex);

},{"../computed-artifact.js":8,"../speedline.js":38,"./lantern-speed-index.js":26,"./metric.js":30}],32:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('../computed-artifact.js');
const ComputedMetric=require('./metric.js');
const LHError=require('../../lib/lh-error.js');
const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
const LanternTotalBlockingTime=require('./lantern-total-blocking-time.js');
const TimetoInteractive=require('./interactive.js');














class TotalBlockingTime extends ComputedMetric{



static get BLOCKING_TIME_THRESHOLD(){
return 50;
}






static calculateSumOfBlockingTime(topLevelEvents,fcpTimeInMs,interactiveTimeMs){
if(interactiveTimeMs<=fcpTimeInMs)return 0;

const threshold=TotalBlockingTime.BLOCKING_TIME_THRESHOLD;
let sumBlockingTime=0;
for(const event of topLevelEvents){

if(event.duration<threshold)continue;





if(event.end<fcpTimeInMs)continue;



if(event.start>interactiveTimeMs)continue;






const clippedStart=Math.max(event.start,fcpTimeInMs);
const clippedEnd=Math.min(event.end,interactiveTimeMs);
const clippedDuration=clippedEnd-clippedStart;
if(clippedDuration<threshold)continue;





sumBlockingTime+=clippedDuration-threshold;
}

return sumBlockingTime;
}






static computeSimulatedMetric(data,context){
return LanternTotalBlockingTime.request(data,context);
}






static async computeObservedMetric(data,context){
const{firstContentfulPaint}=data.traceOfTab.timings;
if(!firstContentfulPaint){
throw new LHError(LHError.errors.NO_FCP);
}

const interactiveTimeMs=(await TimetoInteractive.request(data,context)).timing;

const events=TracingProcessor.getMainThreadTopLevelEvents(data.traceOfTab);

return{
timing:TotalBlockingTime.calculateSumOfBlockingTime(
events,
firstContentfulPaint,
interactiveTimeMs)};


}}


module.exports=makeComputedArtifact(TotalBlockingTime);

},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./interactive.js":18,"./lantern-total-blocking-time.js":27,"./metric.js":30}],33:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
const NetworkRecords=require('./network-records.js');

class NetworkAnalysis{




static computeRTTAndServerResponseTime(records){


const rttByOrigin=new Map();
for(const[origin,summary]of NetworkAnalyzer.estimateRTTByOrigin(records).entries()){
rttByOrigin.set(origin,summary.min);
}



const minimumRtt=Math.min(...Array.from(rttByOrigin.values()));

const responseTimeSummaries=NetworkAnalyzer.estimateServerResponseTimeByOrigin(records,{
rttByOrigin});



const additionalRttByOrigin=new Map();

const serverResponseTimeByOrigin=new Map();
for(const[origin,summary]of responseTimeSummaries.entries()){

const rttForOrigin=rttByOrigin.get(origin)||minimumRtt;
additionalRttByOrigin.set(origin,rttForOrigin-minimumRtt);
serverResponseTimeByOrigin.set(origin,summary.median);
}

return{
rtt:minimumRtt,
additionalRttByOrigin,
serverResponseTimeByOrigin};

}






static async compute_(devtoolsLog,context){
const records=await NetworkRecords.request(devtoolsLog,context);
const throughput=NetworkAnalyzer.estimateThroughput(records);
const rttAndServerResponseTime=NetworkAnalysis.computeRTTAndServerResponseTime(records);
return{throughput,...rttAndServerResponseTime};
}}


module.exports=makeComputedArtifact(NetworkAnalysis);

},{"../lib/dependency-graph/simulator/network-analyzer.js":62,"./computed-artifact.js":8,"./network-records.js":34}],34:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const NetworkRecorder=require('../lib/network-recorder.js');

class NetworkRecords{




static async compute_(devtoolsLog){
return NetworkRecorder.recordsFromLogs(devtoolsLog);
}}


module.exports=makeComputedArtifact(NetworkRecords);

},{"../lib/network-recorder.js":74,"./computed-artifact.js":8}],35:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const NetworkNode=require('../lib/dependency-graph/network-node.js');
const CPUNode=require('../lib/dependency-graph/cpu-node.js');
const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
const TracingProcessor=require('../lib/tracehouse/trace-processor.js');
const NetworkRequest=require('../lib/network-request.js');
const TraceOfTab=require('./trace-of-tab.js');
const NetworkRecords=require('./network-records.js');




const MINIMUM_TASK_DURATION_OF_INTEREST=10;


const IGNORED_MIME_TYPES_REGEX=/^video/;

class PageDependencyGraph{




static getNetworkInitiators(record){
if(!record.initiator)return[];
if(record.initiator.url)return[record.initiator.url];
if(record.initiator.type==='script'){




const scriptURLs=new Set();
let stack=record.initiator.stack;
while(stack){
const callFrames=stack.callFrames||[];
for(const frame of callFrames){
if(frame.url)scriptURLs.add(frame.url);
}

stack=stack.parent;
}

return Array.from(scriptURLs);
}

return[];
}





static getNetworkNodeOutput(networkRecords){

const nodes=[];
const idToNodeMap=new Map();
const urlToNodeMap=new Map();

networkRecords.forEach(record=>{
if(IGNORED_MIME_TYPES_REGEX.test(record.mimeType))return;





while(idToNodeMap.has(record.requestId)){
record.requestId+=':duplicate';
}

const node=new NetworkNode(record);
nodes.push(node);

const list=urlToNodeMap.get(record.url)||[];
list.push(node);

idToNodeMap.set(record.requestId,node);
urlToNodeMap.set(record.url,list);
});

return{nodes,idToNodeMap,urlToNodeMap};
}





static getCPUNodes(traceOfTab){

const nodes=[];
let i=0;

TracingProcessor.assertHasToplevelEvents(traceOfTab.mainThreadEvents);

const minimumEvtDur=MINIMUM_TASK_DURATION_OF_INTEREST*1000;
while(i<traceOfTab.mainThreadEvents.length){
const evt=traceOfTab.mainThreadEvents[i];


if(
!TracingProcessor.isScheduleableTask(evt)||
!evt.dur||
evt.dur<minimumEvtDur)
{
i++;
continue;
}



const children=[];
i++;
for(
const endTime=evt.ts+evt.dur;
i<traceOfTab.mainThreadEvents.length&&traceOfTab.mainThreadEvents[i].ts<endTime;
i++)
{
children.push(traceOfTab.mainThreadEvents[i]);
}

nodes.push(new CPUNode(evt,children));
}

return nodes;
}





static linkNetworkNodes(rootNode,networkNodeOutput){
networkNodeOutput.nodes.forEach(node=>{
const initiators=PageDependencyGraph.getNetworkInitiators(node.record);
if(initiators.length){
initiators.forEach(initiator=>{
const parentCandidates=networkNodeOutput.urlToNodeMap.get(initiator)||[rootNode];

const parent=parentCandidates.length===1?parentCandidates[0]:rootNode;
node.addDependency(parent);
});
}else if(node!==rootNode){
rootNode.addDependent(node);
}

if(!node.record.redirects)return;

const redirects=[...node.record.redirects,node.record];
for(let i=1;i<redirects.length;i++){
const redirectNode=networkNodeOutput.idToNodeMap.get(redirects[i-1].requestId);
const actualNode=networkNodeOutput.idToNodeMap.get(redirects[i].requestId);
if(actualNode&&redirectNode){
actualNode.addDependency(redirectNode);
}
}
});
}






static linkCPUNodes(rootNode,networkNodeOutput,cpuNodes){

function addDependentNetworkRequest(cpuNode,reqId){
const networkNode=networkNodeOutput.idToNodeMap.get(reqId);
if(!networkNode||

networkNode.record.resourceType!==NetworkRequest.TYPES.XHR||


networkNode.startTime<=cpuNode.startTime)return;
cpuNode.addDependent(networkNode);
}


function addDependencyOnUrl(cpuNode,url){
if(!url)return;


const minimumAllowableTimeSinceNetworkNodeEnd=-100*1000;
const candidates=networkNodeOutput.urlToNodeMap.get(url)||[];

let minCandidate=null;
let minDistance=Infinity;

for(const candidate of candidates){


if(cpuNode.startTime<=candidate.startTime)return;

const distance=cpuNode.startTime-candidate.endTime;
if(distance>=minimumAllowableTimeSinceNetworkNodeEnd&&distance<minDistance){
minCandidate=candidate;
minDistance=distance;
}
}

if(!minCandidate)return;
cpuNode.addDependency(minCandidate);
}


const timers=new Map();
for(const node of cpuNodes){
for(const evt of node.childEvents){
if(!evt.args.data)continue;

const argsUrl=evt.args.data.url;
const stackTraceUrls=(evt.args.data.stackTrace||[]).map(l=>l.url).filter(Boolean);

switch(evt.name){
case'TimerInstall':

timers.set(evt.args.data.timerId,node);
stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
break;
case'TimerFire':{

const installer=timers.get(evt.args.data.timerId);
if(!installer)break;
installer.addDependent(node);
break;
}

case'InvalidateLayout':
case'ScheduleStyleRecalculation':
stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
break;

case'EvaluateScript':

addDependencyOnUrl(node,argsUrl);
stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
break;

case'XHRReadyStateChange':


if(evt.args.data.readyState!==4)break;


addDependencyOnUrl(node,argsUrl);
stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
break;

case'FunctionCall':
case'v8.compile':

addDependencyOnUrl(node,argsUrl);
break;

case'ParseAuthorStyleSheet':

addDependencyOnUrl(node,evt.args.data.styleSheetUrl);
break;

case'ResourceSendRequest':

addDependentNetworkRequest(node,evt.args.data.requestId);
stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
break;}

}

if(node.getNumberOfDependencies()===0){
node.addDependency(rootNode);
}
}
}






static createGraph(traceOfTab,networkRecords){
const networkNodeOutput=PageDependencyGraph.getNetworkNodeOutput(networkRecords);
const cpuNodes=PageDependencyGraph.getCPUNodes(traceOfTab);


const rootRequest=networkRecords.reduce((min,r)=>r.startTime<min.startTime?r:min);
const rootNode=networkNodeOutput.idToNodeMap.get(rootRequest.requestId);


const mainDocumentRequest=NetworkAnalyzer.findMainDocument(networkRecords);
const mainDocumentNode=networkNodeOutput.idToNodeMap.get(mainDocumentRequest.requestId);

if(!rootNode||!mainDocumentNode){

throw new Error(`${rootNode?'mainDocument':'root'}Node not found.`);
}

if(mainDocumentNode!==rootNode&&(
!mainDocumentNode.record.redirects||
!mainDocumentNode.record.redirects.includes(rootNode.record))){
throw new Error('Root node was not in redirect chain of mainDocument');
}

PageDependencyGraph.linkNetworkNodes(rootNode,networkNodeOutput);
PageDependencyGraph.linkCPUNodes(rootNode,networkNodeOutput,cpuNodes);
mainDocumentNode.setIsMainDocument(true);

if(NetworkNode.hasCycle(rootNode)){
throw new Error('Invalid dependency graph created, cycle detected');
}

return rootNode;
}





static printGraph(rootNode,widthInCharacters=100){

function padRight(str,target,padChar=' '){
return str+padChar.repeat(Math.max(target-str.length,0));
}


const nodes=[];
rootNode.traverse(node=>nodes.push(node));
nodes.sort((a,b)=>a.startTime-b.startTime);

const min=nodes[0].startTime;
const max=nodes.reduce((max,node)=>Math.max(max,node.endTime),0);

const totalTime=max-min;
const timePerCharacter=totalTime/widthInCharacters;
nodes.forEach(node=>{
const offset=Math.round((node.startTime-min)/timePerCharacter);
const length=Math.ceil((node.endTime-node.startTime)/timePerCharacter);
const bar=padRight('',offset)+padRight('',length,'=');


const displayName=node.record?node.record.url:node.type;

console.log(padRight(bar,widthInCharacters),`| ${displayName.slice(0,30)}`);
});
}






static async compute_(data,context){
const trace=data.trace;
const devtoolsLog=data.devtoolsLog;
const[traceOfTab,networkRecords]=await Promise.all([
TraceOfTab.request(trace,context),
NetworkRecords.request(devtoolsLog,context)]);


return PageDependencyGraph.createGraph(traceOfTab,networkRecords);
}}


module.exports=makeComputedArtifact(PageDependencyGraph);








},{"../lib/dependency-graph/cpu-node.js":58,"../lib/dependency-graph/network-node.js":59,"../lib/dependency-graph/simulator/network-analyzer.js":62,"../lib/network-request.js":75,"../lib/tracehouse/trace-processor.js":85,"./computed-artifact.js":8,"./network-records.js":34,"./trace-of-tab.js":39}],36:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const NetworkRecords=require('./network-records.js');
const MainResource=require('./main-resource.js');
const URL=require('../lib/url-shim.js');


class ResourceSummary{




static determineResourceType(record){
if(!record.resourceType)return'other';

const requestToResourceType={
'Stylesheet':'stylesheet',
'Image':'image',
'Media':'media',
'Font':'font',
'Script':'script',
'Document':'document'};

return requestToResourceType[record.resourceType]||'other';
}






static summarize(networkRecords,mainResourceURL){

const resourceSummary={
'stylesheet':{count:0,size:0},
'image':{count:0,size:0},
'media':{count:0,size:0},
'font':{count:0,size:0},
'script':{count:0,size:0},
'document':{count:0,size:0},
'other':{count:0,size:0},
'total':{count:0,size:0},
'third-party':{count:0,size:0}};


for(const record of networkRecords){
const type=this.determineResourceType(record);
resourceSummary[type].count++;
resourceSummary[type].size+=record.transferSize;

resourceSummary.total.count++;
resourceSummary.total.size+=record.transferSize;


if(!URL.rootDomainsMatch(record.url,mainResourceURL)){
resourceSummary['third-party'].count++;
resourceSummary['third-party'].size+=record.transferSize;
}
}
return resourceSummary;
}






static async compute_(data,context){
const[networkRecords,mainResource]=await Promise.all([
NetworkRecords.request(data.devtoolsLog,context),
MainResource.request(data,context)]);


return ResourceSummary.summarize(networkRecords,mainResource.url);
}}


module.exports=makeComputedArtifact(ResourceSummary);

},{"../lib/url-shim.js":"url","./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":34}],37:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');

const SCREENSHOT_TRACE_NAME='Screenshot';

class Screenshots{




static async compute_(trace){
return trace.traceEvents.
filter(evt=>evt.name===SCREENSHOT_TRACE_NAME).
map(evt=>{
return{
timestamp:evt.ts,
datauri:`data:image/jpeg;base64,${evt.args.snapshot}`};

});
}}


module.exports=makeComputedArtifact(Screenshots);

},{"./computed-artifact.js":8}],38:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const speedline=require('speedline-core');
const LHError=require('../lib/lh-error.js');
const TraceOfTab=require('./trace-of-tab.js');

class Speedline{





static async compute_(trace,context){


return TraceOfTab.request(trace,context).then(traceOfTab=>{


const traceEvents=trace.traceEvents.slice();


const navStart=traceOfTab.timestamps.navigationStart;
return speedline(traceEvents,{
timeOrigin:navStart,
fastMode:true,
include:'speedIndex'});

}).catch(err=>{
if(/No screenshots found in trace/.test(err.message)){
throw new LHError(LHError.errors.NO_SCREENSHOTS);
}

throw err;
}).then(speedline=>{
if(speedline.frames.length===0){
throw new LHError(LHError.errors.NO_SPEEDLINE_FRAMES);
}

if(speedline.speedIndex===0){
throw new LHError(LHError.errors.SPEEDINDEX_OF_ZERO);
}

return speedline;
});
}}


module.exports=makeComputedArtifact(Speedline);

},{"../lib/lh-error.js":71,"./computed-artifact.js":8,"./trace-of-tab.js":39,"speedline-core":181}],39:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const LHError=require('../lib/lh-error.js');
const TraceProcessor=require('../lib/tracehouse/trace-processor.js');



class LHTraceProcessor extends TraceProcessor{



static createNoNavstartError(){
return new LHError(LHError.errors.NO_NAVSTART);
}




static createNoTracingStartedError(){
return new LHError(LHError.errors.NO_TRACING_STARTED);
}}



class TraceOfTab{






static async compute_(trace){



const traceOfTab=await LHTraceProcessor.computeTraceOfTab(trace);
const{timings,timestamps,firstContentfulPaintEvt}=traceOfTab;
const{firstContentfulPaint:firstContentfulPaintTiming}=timings;
const{firstContentfulPaint:firstContentfulPaintTs}=timestamps;
if(
!firstContentfulPaintEvt||
firstContentfulPaintTiming===undefined||
firstContentfulPaintTs===undefined)
{
throw new LHError(LHError.errors.NO_FCP);
}



return{
...traceOfTab,
firstContentfulPaintEvt,
timings:{...timings,firstContentfulPaint:firstContentfulPaintTiming},
timestamps:{...timestamps,firstContentfulPaint:firstContentfulPaintTs}};

}}


module.exports=makeComputedArtifact(TraceOfTab);

},{"../lib/lh-error.js":71,"../lib/tracehouse/trace-processor.js":85,"./computed-artifact.js":8}],40:[function(require,module,exports){





'use strict';

const makeComputedArtifact=require('./computed-artifact.js');
const TraceOfTab=require('./trace-of-tab.js');




class UserTimings{





static async compute_(trace,context){
const traceOfTab=await TraceOfTab.request(trace,context);

const userTimings=[];

const measuresStartTimes={};





traceOfTab.processEvents.filter(evt=>{
if(!evt.cat.includes('blink.user_timing')){
return false;
}



return evt.name!=='requestStart'&&
evt.name!=='navigationStart'&&
evt.name!=='paintNonDefaultBackgroundColor'&&
evt.args.frame===undefined;
}).
forEach(ut=>{

if(ut.ph==='R'||ut.ph.toUpperCase()==='I'){
userTimings.push({
name:ut.name,
isMark:true,
args:ut.args,
startTime:ut.ts});



}else if(ut.ph.toLowerCase()==='b'){
measuresStartTimes[ut.name]=ut.ts;


}else if(ut.ph.toLowerCase()==='e'){
userTimings.push({
name:ut.name,
isMark:false,
args:ut.args,
startTime:measuresStartTimes[ut.name],
endTime:ut.ts,
duration:ut.ts-measuresStartTimes[ut.name]});

}
});


userTimings.forEach(ut=>{
ut.startTime=(ut.startTime-traceOfTab.navigationStartEvt.ts)/1000;
if(!ut.isMark){
ut.endTime=(ut.endTime-traceOfTab.navigationStartEvt.ts)/1000;
ut.duration=ut.duration/1000;
}
});

return userTimings;
}}


module.exports=makeComputedArtifact(UserTimings);

},{"./computed-artifact.js":8,"./trace-of-tab.js":39}],41:[function(require,module,exports){





'use strict';

const Parser=require('metaviewport-parser');

const makeComputedArtifact=require('./computed-artifact.js');

class ViewportMeta{




static async compute_(MetaElements){
const viewportMeta=MetaElements.find(meta=>meta.name==='viewport');

if(!viewportMeta){
return{
hasViewportTag:false,
isMobileOptimized:false,
parserWarnings:[]};

}

const warnings=[];
const parsedProps=Parser.parseMetaViewPortContent(viewportMeta.content||'');

if(Object.keys(parsedProps.unknownProperties).length){
warnings.push(`Invalid properties found: ${JSON.stringify(parsedProps.unknownProperties)}`);
}
if(Object.keys(parsedProps.invalidValues).length){
warnings.push(`Invalid values found: ${JSON.stringify(parsedProps.invalidValues)}`);
}

const viewportProps=parsedProps.validProperties;
const isMobileOptimized=Boolean(viewportProps.width||viewportProps['initial-scale']);

return{
hasViewportTag:true,
isMobileOptimized,
parserWarnings:warnings};

}}


module.exports=makeComputedArtifact(ViewportMeta);








},{"./computed-artifact.js":8,"metaviewport-parser":145}],42:[function(require,module,exports){





'use strict';





function isArrayOfUnknownObjects(arr){
return Array.isArray(arr)&&arr.every(isObjectOfUnknownProperties);
}





function isObjectOfUnknownProperties(val){
return typeof val==='object'&&val!==null&&!Array.isArray(val);
}







function isNumber(val){
return typeof val==='number'&&!isNaN(val);
}

class Budget{






static assertNoExcessProperties(obj,objectName){
const invalidKeys=Object.keys(obj);
if(invalidKeys.length>0){
const keys=invalidKeys.join(', ');
throw new Error(`${objectName} has unrecognized properties: [${keys}]`);
}
}







static assertNoDuplicateStrings(strings,arrayName){
const foundStrings=new Set();
for(const string of strings){
if(foundStrings.has(string)){
throw new Error(`${arrayName} has duplicate entry of type '${string}'`);
}
foundStrings.add(string);
}
}





static validateResourceBudget(resourceBudget){
const{resourceType,budget,...invalidRest}=resourceBudget;
Budget.assertNoExcessProperties(invalidRest,'Resource Budget');


const validResourceTypes=[
'total',
'document',
'script',
'stylesheet',
'image',
'media',
'font',
'other',
'third-party'];


if(!validResourceTypes.includes(resourceType)){
throw new Error(`Invalid resource type: ${resourceType}. \n`+
`Valid resource types are: ${validResourceTypes.join(', ')}`);
}
if(!isNumber(budget)){
throw new Error(`Invalid budget: ${budget}`);
}
return{
resourceType:resourceType,
budget};

}





static throwInvalidPathError(path,error){
throw new Error(`Invalid path ${path}. ${error}\n`+
`'Path' should be specified using the 'robots.txt' format.\n`+
`Learn more about the 'robots.txt' format here:\n`+
`https://developers.google.com/search/reference/robots_txt#url-matching-based-on-path-values`);
}








static validatePath(path){
if(path===undefined){
return undefined;
}else if(typeof path!=='string'){
this.throwInvalidPathError(path,`Path should be a string.`);
return;
}else if(!path.startsWith('/')){
this.throwInvalidPathError(path,`Path should start with '/'.`);
}else if((path.match(/\*/g)||[]).length>1){
this.throwInvalidPathError(path,`Path should only contain one '*'.`);
}else if((path.match(/\$/g)||[]).length>1){
this.throwInvalidPathError(path,`Path should only contain one '$' character.`);
}else if(path.includes('$')&&!path.endsWith('$')){
this.throwInvalidPathError(path,`'$' character should only occur at end of path.`);
}
return path;
}









static urlMatchesPattern(url,pattern='/'){
const urlObj=new URL(url);
const urlPath=urlObj.pathname+urlObj.search;

const hasWildcard=pattern.includes('*');
const hasDollarSign=pattern.includes('$');









if(!hasWildcard&&!hasDollarSign){
return urlPath.startsWith(pattern);





}else if(!hasWildcard&&hasDollarSign){
return urlPath===pattern.slice(0,-1);






}else if(hasWildcard&&!hasDollarSign){
const[beforeWildcard,afterWildcard]=pattern.split('*');
const remainingUrl=urlPath.slice(beforeWildcard.length);
return urlPath.startsWith(beforeWildcard)&&remainingUrl.includes(afterWildcard);






}else if(hasWildcard&&hasDollarSign){
const[beforeWildcard,afterWildcard]=pattern.split('*');
const urlEnd=urlPath.slice(beforeWildcard.length);
return urlPath.startsWith(beforeWildcard)&&urlEnd.endsWith(afterWildcard.slice(0,-1));
}
return false;
}





static validateTimingBudget(timingBudget){
const{metric,budget,tolerance,...invalidRest}=timingBudget;
Budget.assertNoExcessProperties(invalidRest,'Timing Budget');


const validTimingMetrics=[
'first-contentful-paint',
'first-cpu-idle',
'interactive',
'first-meaningful-paint',
'max-potential-fid'];


if(!validTimingMetrics.includes(metric)){
throw new Error(`Invalid timing metric: ${metric}. \n`+
`Valid timing metrics are: ${validTimingMetrics.join(', ')}`);
}
if(!isNumber(budget)){
throw new Error(`Invalid budget: ${budget}`);
}
if(typeof tolerance!=='undefined'&&!isNumber(tolerance)){
throw new Error(`Invalid tolerance: ${tolerance}`);
}
return{
metric:metric,
budget,
tolerance};

}







static initializeBudget(budgetJson){

budgetJson=JSON.parse(JSON.stringify(budgetJson));
if(!isArrayOfUnknownObjects(budgetJson)){
throw new Error('Budget file is not defined as an array of budgets.');
}

const budgets=budgetJson.map((b,index)=>{

const budget={};

const{path,resourceSizes,resourceCounts,timings,...invalidRest}=b;
Budget.assertNoExcessProperties(invalidRest,'Budget');

budget.path=Budget.validatePath(path);

if(isArrayOfUnknownObjects(resourceSizes)){
budget.resourceSizes=resourceSizes.map(Budget.validateResourceBudget);
Budget.assertNoDuplicateStrings(budget.resourceSizes.map(r=>r.resourceType),
`budgets[${index}].resourceSizes`);
}else if(resourceSizes!==undefined){
throw new Error(`Invalid resourceSizes entry in budget at index ${index}`);
}

if(isArrayOfUnknownObjects(resourceCounts)){
budget.resourceCounts=resourceCounts.map(Budget.validateResourceBudget);
Budget.assertNoDuplicateStrings(budget.resourceCounts.map(r=>r.resourceType),
`budgets[${index}].resourceCounts`);
}else if(resourceCounts!==undefined){
throw new Error(`Invalid resourceCounts entry in budget at index ${index}`);
}

if(isArrayOfUnknownObjects(timings)){
budget.timings=timings.map(Budget.validateTimingBudget);
Budget.assertNoDuplicateStrings(budget.timings.map(r=>r.metric),
`budgets[${index}].timings`);
}else if(timings!==undefined){
throw new Error(`Invalid timings entry in budget at index ${index}`);
}

return budget;
});

return budgets;
}}


module.exports=Budget;

},{}],43:[function(require,module,exports){
(function(process,global,__dirname){





'use strict';

const path=require('path');
const Audit=require('../audits/audit.js');
const Runner=require('../runner.js');









const mergeOptionsOfItems=function(items){

const mergedItems=[];

for(const item of items){
const existingItem=item.path&&mergedItems.find(candidate=>candidate.path===item.path);
if(!existingItem){
mergedItems.push(item);
continue;
}

existingItem.options=Object.assign({},existingItem.options,item.options);
}

return mergedItems;
};






function assertValidAudit(auditDefinition){
const{implementation,path:auditPath}=auditDefinition;
const auditName=auditPath||
implementation&&implementation.meta&&implementation.meta.id||
'Unknown audit';

if(typeof implementation.audit!=='function'||implementation.audit===Audit.audit){
throw new Error(`${auditName} has no audit() method.`);
}

if(typeof implementation.meta.id!=='string'){
throw new Error(`${auditName} has no meta.id property, or the property is not a string.`);
}

if(typeof implementation.meta.title!=='string'){
throw new Error(`${auditName} has no meta.title property, or the property is not a string.`);
}


if(
typeof implementation.meta.failureTitle!=='string'&&
implementation.meta.scoreDisplayMode===Audit.SCORING_MODES.BINARY)
{
throw new Error(`${auditName} has no failureTitle and should.`);
}

if(typeof implementation.meta.description!=='string'){
throw new Error(
`${auditName} has no meta.description property, or the property is not a string.`);

}else if(implementation.meta.description===''){
throw new Error(
`${auditName} has an empty meta.description string. Please add a description for the UI.`);

}

if(!Array.isArray(implementation.meta.requiredArtifacts)){
throw new Error(
`${auditName} has no meta.requiredArtifacts property, or the property is not an array.`);

}
}






function expandAuditShorthand(audits){
if(!audits){
return null;
}

const newAudits=audits.map(audit=>{
if(typeof audit==='string'){

return{path:audit,options:{}};
}else if('implementation'in audit&&typeof audit.implementation.audit==='function'){

return audit;
}else if('path'in audit&&typeof audit.path==='string'){

return audit;
}else if('audit'in audit&&typeof audit.audit==='function'){

return{implementation:audit,options:{}};
}else{
throw new Error('Invalid Audit type '+JSON.stringify(audit));
}
});

return newAudits;
}









function requireAudits(audits,configDir){
const expandedAudits=expandAuditShorthand(audits);
if(!expandedAudits){
return null;
}

const coreList=Runner.getAuditList();
const auditDefns=expandedAudits.map(audit=>{
let implementation;
if('implementation'in audit){
implementation=audit.implementation;
}else{

const auditPathJs=`${audit.path}.js`;
const coreAudit=coreList.find(a=>a===auditPathJs);
let requirePath=`../audits/${audit.path}`;
if(!coreAudit){
if(global.devtools){
requirePath=audit.path;
}else{

const absolutePath=resolveModule(audit.path,configDir,'audit');

requirePath=path.relative(__dirname,absolutePath);
}
}
implementation=require(requirePath);
}

return{
implementation,
path:audit.path,
options:audit.options||{}};

});

const mergedAuditDefns=mergeOptionsOfItems(auditDefns);
mergedAuditDefns.forEach(audit=>assertValidAudit(audit));
return mergedAuditDefns;
}











function resolveModule(moduleIdentifier,configDir,category){




try{
return require.resolve(moduleIdentifier);
}catch(e){}




const cwdPath=path.resolve(process.cwd(),moduleIdentifier);
try{
return require.resolve(cwdPath);
}catch(e){}

const errorString=
'Unable to locate '+(
category?`${category}: `:'')+
`${moduleIdentifier} (tried to require() from '${__dirname}' and load from '${cwdPath}'`;

if(!configDir){
throw new Error(errorString+')');
}




const relativePath=path.resolve(configDir,moduleIdentifier);
try{
return require.resolve(relativePath);
}catch(requireError){}

throw new Error(errorString+` and '${relativePath}')`);
}

module.exports={
mergeOptionsOfItems,
requireAudits,
resolveModule};


}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/config");
},{"../audits/audit.js":3,"../runner.js":89,"_process":158,"path":156}],44:[function(require,module,exports){





'use strict';





function isArrayOfUnknownObjects(arr){
return Array.isArray(arr)&&arr.every(isObjectOfUnknownProperties);
}





function isObjectOfUnknownProperties(val){
return typeof val==='object'&&val!==null&&!Array.isArray(val);
}








function assertNoExcessProperties(obj,pluginName,objectName=''){
if(objectName){
objectName+=' ';
}

const invalidKeys=Object.keys(obj);
if(invalidKeys.length>0){
const keys=invalidKeys.join(', ');
throw new Error(`${pluginName} has unrecognized ${objectName}properties: [${keys}]`);
}
}




class ConfigPlugin{







static _parseAuditsList(auditsJson,pluginName){

if(auditsJson===undefined){
return undefined;
}else if(!isArrayOfUnknownObjects(auditsJson)){
throw new Error(`${pluginName} has an invalid audits array.`);
}

return auditsJson.map(auditDefnJson=>{
const{path,...invalidRest}=auditDefnJson;
assertNoExcessProperties(invalidRest,pluginName,'audit');

if(typeof path!=='string'){
throw new Error(`${pluginName} has a missing audit path.`);
}
return{
path};

});
}







static _parseAuditRefsList(auditRefsJson,pluginName){
if(!isArrayOfUnknownObjects(auditRefsJson)){
throw new Error(`${pluginName} has no valid auditsRefs.`);
}

return auditRefsJson.map(auditRefJson=>{
const{id,weight,group,...invalidRest}=auditRefJson;
assertNoExcessProperties(invalidRest,pluginName,'auditRef');

if(typeof id!=='string'){
throw new Error(`${pluginName} has an invalid auditRef id.`);
}
if(typeof weight!=='number'){
throw new Error(`${pluginName} has an invalid auditRef weight.`);
}
if(typeof group!=='string'&&typeof group!=='undefined'){
throw new Error(`${pluginName} has an invalid auditRef group.`);
}

const prependedGroup=group?`${pluginName}-${group}`:group;
return{
id,
weight,
group:prependedGroup};

});
}







static _parseCategory(categoryJson,pluginName){
if(!isObjectOfUnknownProperties(categoryJson)){
throw new Error(`${pluginName} has no valid category.`);
}

const{
title,
description,
manualDescription,
auditRefs:auditRefsJson,
...invalidRest}=
categoryJson;

assertNoExcessProperties(invalidRest,pluginName,'category');

if(typeof title!=='string'){
throw new Error(`${pluginName} has an invalid category tile.`);
}
if(typeof description!=='string'&&typeof description!=='undefined'){
throw new Error(`${pluginName} has an invalid category description.`);
}
if(typeof manualDescription!=='string'&&typeof manualDescription!=='undefined'){
throw new Error(`${pluginName} has an invalid category manualDescription.`);
}
const auditRefs=ConfigPlugin._parseAuditRefsList(auditRefsJson,pluginName);

return{
title,
auditRefs,
description:description,
manualDescription:manualDescription};

}








static _parseGroups(groupsJson,pluginName){
if(groupsJson===undefined){
return undefined;
}

if(!isObjectOfUnknownProperties(groupsJson)){
throw new Error(`${pluginName} groups json is not defined as an object.`);
}

const groups=Object.entries(groupsJson);


const parsedGroupsJson={};
groups.forEach(([groupId,groupJson])=>{
if(!isObjectOfUnknownProperties(groupJson)){
throw new Error(`${pluginName} has a group not defined as an object.`);
}
const{title,description,...invalidRest}=groupJson;
assertNoExcessProperties(invalidRest,pluginName,'group');

if(typeof title!=='string'){
throw new Error(`${pluginName} has an invalid group title.`);
}
if(typeof description!=='string'&&typeof description!=='undefined'){
throw new Error(`${pluginName} has an invalid group description.`);
}
parsedGroupsJson[`${pluginName}-${groupId}`]={
title,
description};

});
return parsedGroupsJson;
}








static parsePlugin(pluginJson,pluginName){

pluginJson=JSON.parse(JSON.stringify(pluginJson));
if(!isObjectOfUnknownProperties(pluginJson)){
throw new Error(`${pluginName} is not defined as an object.`);
}

const{
audits:pluginAuditsJson,
category:pluginCategoryJson,
groups:pluginGroupsJson,
...invalidRest}=
pluginJson;

assertNoExcessProperties(invalidRest,pluginName);

return{
audits:ConfigPlugin._parseAuditsList(pluginAuditsJson,pluginName),
categories:{
[pluginName]:ConfigPlugin._parseCategory(pluginCategoryJson,pluginName)},

groups:ConfigPlugin._parseGroups(pluginGroupsJson,pluginName)};

}}


module.exports=ConfigPlugin;

},{}],45:[function(require,module,exports){
(function(global,__dirname){





'use strict';

const defaultConfigPath='./default-config.js';
const defaultConfig=require('./default-config.js');
const constants=require('./constants.js');
const i18n=require('./../lib/i18n/i18n.js');

const isDeepEqual=require('lodash.isequal');
const log=require('lighthouse-logger');
const path=require('path');
const Runner=require('../runner.js');
const ConfigPlugin=require('./config-plugin.js');
const Budget=require('./budget.js');
const{requireAudits,mergeOptionsOfItems,resolveModule}=require('./config-helpers.js');








const BASE_ARTIFACT_BLANKS={
fetchTime:'',
LighthouseRunWarnings:'',
TestedAsMobileDevice:'',
HostUserAgent:'',
NetworkUserAgent:'',
BenchmarkIndex:'',
WebAppManifest:'',
Stacks:'',
traces:'',
devtoolsLogs:'',
settings:'',
URL:'',
Timing:'',
PageLoadError:''};

const BASE_ARTIFACT_NAMES=Object.keys(BASE_ARTIFACT_BLANKS);





function assertValidPasses(passes,audits){
if(!Array.isArray(passes)){
return;
}

const requiredGatherers=Config.getGatherersNeededByAudits(audits);

const foundGatherers=new Set(BASE_ARTIFACT_NAMES);


passes.forEach(pass=>{
pass.gatherers.forEach(gathererDefn=>{
const gatherer=gathererDefn.instance;
foundGatherers.add(gatherer.name);
const isGatherRequiredByAudits=requiredGatherers.has(gatherer.name);
if(!isGatherRequiredByAudits){
const msg=`${gatherer.name} gatherer requested, however no audit requires it.`;
log.warn('config',msg);
}
});
});


for(const auditDefn of audits||[]){
const auditMeta=auditDefn.implementation.meta;
for(const requiredArtifact of auditMeta.requiredArtifacts){
if(!foundGatherers.has(requiredArtifact)){
throw new Error(`${requiredArtifact} gatherer, required by audit ${auditMeta.id}, `+
'was not found in config.');
}
}
}


const usedNames=new Set();
passes.forEach(pass=>{
const passName=pass.passName;
if(usedNames.has(passName)){
throw new Error(`Passes must have unique names (repeated passName: ${passName}.`);
}
usedNames.add(passName);
});
}






function assertValidCategories(categories,audits,groups){
if(!categories){
return;
}

const auditsKeyedById=new Map((audits||[]).map(audit=>

[audit.implementation.meta.id,audit]));


Object.keys(categories).forEach(categoryId=>{
categories[categoryId].auditRefs.forEach((auditRef,index)=>{
if(!auditRef.id){
throw new Error(`missing an audit id at ${categoryId}[${index}]`);
}

const audit=auditsKeyedById.get(auditRef.id);
if(!audit){
throw new Error(`could not find ${auditRef.id} audit for category ${categoryId}`);
}

const auditImpl=audit.implementation;
const isManual=auditImpl.meta.scoreDisplayMode==='manual';
if(categoryId==='accessibility'&&!auditRef.group&&!isManual){
throw new Error(`${auditRef.id} accessibility audit does not have a group`);
}

if(auditRef.weight>0&&isManual){
throw new Error(`${auditRef.id} is manual but has a positive weight`);
}

if(auditRef.group&&(!groups||!groups[auditRef.group])){
throw new Error(`${auditRef.id} references unknown group ${auditRef.group}`);
}
});
});
}





function assertValidGatherer(gathererInstance,gathererName){
gathererName=gathererName||gathererInstance.name||'gatherer';

if(typeof gathererInstance.beforePass!=='function'){
throw new Error(`${gathererName} has no beforePass() method.`);
}

if(typeof gathererInstance.pass!=='function'){
throw new Error(`${gathererName} has no pass() method.`);
}

if(typeof gathererInstance.afterPass!=='function'){
throw new Error(`${gathererName} has no afterPass() method.`);
}
}







function assertValidPluginName(configJSON,pluginName){
if(!pluginName.startsWith('lighthouse-plugin-')){
throw new Error(`plugin name '${pluginName}' does not start with 'lighthouse-plugin-'`);
}

if(configJSON.categories&&configJSON.categories[pluginName]){
throw new Error(`plugin name '${pluginName}' not allowed because it is the id of a category already found in config`);
}
}







function cleanFlagsForSettings(flags={}){

const settings={};

for(const key of Object.keys(flags)){
if(key in constants.defaultSettings){

settings[key]=flags[key];
}
}

return settings;
}







function _merge(base,extension,overwriteArrays=false){

if(typeof base==='undefined'||base===null){
return extension;
}else if(typeof extension==='undefined'){
return base;
}else if(Array.isArray(extension)){
if(overwriteArrays)return extension;
if(!Array.isArray(base))throw new TypeError(`Expected array but got ${typeof base}`);
const merged=base.slice();
extension.forEach(item=>{
if(!merged.some(candidate=>isDeepEqual(candidate,item)))merged.push(item);
});

return merged;
}else if(typeof extension==='object'){
if(typeof base!=='object')throw new TypeError(`Expected object but got ${typeof base}`);
if(Array.isArray(base))throw new TypeError('Expected object but got Array');
Object.keys(extension).forEach(key=>{
const localOverwriteArrays=overwriteArrays||
key==='settings'&&typeof base[key]==='object';
base[key]=_merge(base[key],extension[key],localOverwriteArrays);
});
return base;
}

return extension;
}






const merge=_merge;






function cloneArrayWithPluginSafety(array){
return array.map(item=>{
if(typeof item==='object'){

return Object.assign(
Object.create(
Object.getPrototypeOf(item)),

item);

}

return item;
});
}








function deepClone(json){
return JSON.parse(JSON.stringify(json));
}







function deepCloneConfigJson(json){
const cloned=deepClone(json);



if(Array.isArray(cloned.passes)&&Array.isArray(json.passes)){
for(let i=0;i<cloned.passes.length;i++){
const pass=cloned.passes[i];
pass.gatherers=cloneArrayWithPluginSafety(json.passes[i].gatherers||[]);
}
}

if(Array.isArray(json.audits)){
cloned.audits=cloneArrayWithPluginSafety(json.audits);
}

return cloned;
}

class Config{






constructor(configJSON,flags){
const status={msg:'Create config',id:'lh:init:config'};
log.time(status,'verbose');
let configPath=flags&&flags.configPath;

if(!configJSON){
configJSON=defaultConfig;
configPath=path.resolve(__dirname,defaultConfigPath);
}

if(configPath&&!path.isAbsolute(configPath)){
throw new Error('configPath must be an absolute path.');
}


configJSON=deepCloneConfigJson(configJSON);


if(configJSON.extends){
configJSON=Config.extendConfigJSON(deepCloneConfigJson(defaultConfig),configJSON);
}


const configDir=configPath?path.dirname(configPath):undefined;


configJSON=Config.mergePlugins(configJSON,flags,configDir);

const settings=Config.initSettings(configJSON.settings,flags);


const passesWithDefaults=Config.augmentPassesWithDefaults(configJSON.passes);
Config.adjustDefaultPassForThrottling(settings,passesWithDefaults);
const passes=Config.requireGatherers(passesWithDefaults,configDir);


this.settings=settings;

this.passes=passes;

this.audits=Config.requireAudits(configJSON.audits,configDir);

this.categories=configJSON.categories||null;

this.groups=configJSON.groups||null;

Config.filterConfigIfNeeded(this);

assertValidPasses(this.passes,this.audits);
assertValidCategories(this.categories,this.audits,this.groups);



const configJson=this;
log.timeEnd(status);
}






getPrintString(){
const jsonConfig=deepClone(this);

if(jsonConfig.passes){
for(const pass of jsonConfig.passes){
for(const gathererDefn of pass.gatherers){
gathererDefn.implementation=undefined;

gathererDefn.instance=undefined;
if(Object.keys(gathererDefn.options).length===0){

gathererDefn.options=undefined;
}
}
}
}

if(jsonConfig.audits){
for(const auditDefn of jsonConfig.audits){

auditDefn.implementation=undefined;
if(Object.keys(auditDefn.options).length===0){

auditDefn.options=undefined;
}
}
}


i18n.replaceIcuMessageInstanceIds(jsonConfig,jsonConfig.settings.locale);

return JSON.stringify(jsonConfig,null,2);
}






static extendConfigJSON(baseJSON,extendJSON){
if(extendJSON.passes&&baseJSON.passes){
for(const pass of extendJSON.passes){

const passName=pass.passName||constants.defaultPassConfig.passName;
const basePass=baseJSON.passes.find(candidate=>candidate.passName===passName);

if(!basePass){
baseJSON.passes.push(pass);
}else{
merge(basePass,pass);
}
}

delete extendJSON.passes;
}

return merge(baseJSON,extendJSON);
}







static mergePlugins(configJSON,flags,configDir){
const configPlugins=configJSON.plugins||[];
const flagPlugins=flags&&flags.plugins||[];
const pluginNames=new Set([...configPlugins,...flagPlugins]);

for(const pluginName of pluginNames){
assertValidPluginName(configJSON,pluginName);

const pluginPath=global.devtools?
pluginName:
resolveModule(pluginName,configDir,'plugin');
const rawPluginJson=require(pluginPath);
const pluginJson=ConfigPlugin.parsePlugin(rawPluginJson,pluginName);

configJSON=Config.extendConfigJSON(configJSON,pluginJson);
}

return configJSON;
}





static augmentPassesWithDefaults(passes){
if(!passes){
return null;
}

const{defaultPassConfig}=constants;
return passes.map(pass=>merge(deepClone(defaultPassConfig),pass));
}






static initSettings(settingsJson={},flags){



const locale=i18n.lookupLocale(flags&&flags.locale||settingsJson.locale);


const{defaultSettings}=constants;
const settingWithDefaults=merge(deepClone(defaultSettings),settingsJson,true);


const settingsWithFlags=merge(settingWithDefaults||{},cleanFlagsForSettings(flags),true);

if(settingsWithFlags.budgets){
settingsWithFlags.budgets=Budget.initializeBudget(settingsWithFlags.budgets);
}

settingsWithFlags.locale=locale;

return settingsWithFlags;
}












static expandGathererShorthand(gatherers){
const expanded=gatherers.map(gatherer=>{
if(typeof gatherer==='string'){

return{path:gatherer,options:{}};
}else if('implementation'in gatherer||'instance'in gatherer){

return gatherer;
}else if('path'in gatherer){

if(typeof gatherer.path!=='string'){
throw new Error('Invalid Gatherer type '+JSON.stringify(gatherer));
}
return gatherer;
}else if(typeof gatherer==='function'){

return{implementation:gatherer,options:{}};
}else if(gatherer&&typeof gatherer.beforePass==='function'){

return{instance:gatherer,options:{}};
}else{
throw new Error('Invalid Gatherer type '+JSON.stringify(gatherer));
}
});

return expanded;
}







static adjustDefaultPassForThrottling(settings,passes){
if(!passes||
settings.throttlingMethod!=='devtools'&&settings.throttlingMethod!=='provided'){
return;
}

const defaultPass=passes.find(pass=>pass.passName==='defaultPass');
if(!defaultPass)return;
const overrides=constants.nonSimulatedPassConfigOverrides;
defaultPass.pauseAfterLoadMs=
Math.max(overrides.pauseAfterLoadMs,defaultPass.pauseAfterLoadMs);
defaultPass.cpuQuietThresholdMs=
Math.max(overrides.cpuQuietThresholdMs,defaultPass.cpuQuietThresholdMs);
defaultPass.networkQuietThresholdMs=
Math.max(overrides.networkQuietThresholdMs,defaultPass.networkQuietThresholdMs);
}





static filterConfigIfNeeded(config){
const settings=config.settings;
if(!settings.onlyCategories&&!settings.onlyAudits&&!settings.skipAudits){
return;
}


const{categories,requestedAuditNames}=Config.filterCategoriesAndAudits(config.categories,
settings);


const audits=config.audits&&config.audits.filter(auditDefn=>
requestedAuditNames.has(auditDefn.implementation.meta.id));


const requiredGathererIds=Config.getGatherersNeededByAudits(audits);


const passes=Config.generatePassesNeededByGatherers(config.passes,requiredGathererIds);

config.categories=categories;
config.audits=audits;
config.passes=passes;
}







static filterCategoriesAndAudits(oldCategories,settings){
if(!oldCategories){
return{categories:null,requestedAuditNames:new Set()};
}

if(settings.onlyAudits&&settings.skipAudits){
throw new Error('Cannot set both skipAudits and onlyAudits');
}


const categories={};
const filterByIncludedCategory=!!settings.onlyCategories;
const filterByIncludedAudit=!!settings.onlyAudits;
const categoryIds=settings.onlyCategories||[];
const auditIds=settings.onlyAudits||[];
const skipAuditIds=settings.skipAudits||[];


categoryIds.forEach(categoryId=>{
if(!oldCategories[categoryId]){
log.warn('config',`unrecognized category in 'onlyCategories': ${categoryId}`);
}
});


const auditsToValidate=new Set(auditIds.concat(skipAuditIds));
for(const auditId of auditsToValidate){
const foundCategory=Object.keys(oldCategories).find(categoryId=>{
const auditRefs=oldCategories[categoryId].auditRefs;
return!!auditRefs.find(candidate=>candidate.id===auditId);
});

if(!foundCategory){
const parentKeyName=skipAuditIds.includes(auditId)?'skipAudits':'onlyAudits';
log.warn('config',`unrecognized audit in '${parentKeyName}': ${auditId}`);
}else if(auditIds.includes(auditId)&&categoryIds.includes(foundCategory)){
log.warn('config',`${auditId} in 'onlyAudits' is already included by `+
`${foundCategory} in 'onlyCategories'`);
}
}

const includedAudits=new Set(auditIds);
skipAuditIds.forEach(id=>includedAudits.delete(id));

Object.keys(oldCategories).forEach(categoryId=>{
const category=deepClone(oldCategories[categoryId]);

if(filterByIncludedCategory&&filterByIncludedAudit){

if(!categoryIds.includes(categoryId)){
category.auditRefs=category.auditRefs.filter(audit=>auditIds.includes(audit.id));
}
}else if(filterByIncludedCategory){

if(!categoryIds.includes(categoryId)){
return;
}
}else if(filterByIncludedAudit){
category.auditRefs=category.auditRefs.filter(audit=>auditIds.includes(audit.id));
}


category.auditRefs=category.auditRefs.filter(audit=>!skipAuditIds.includes(audit.id));

if(category.auditRefs.length){
categories[categoryId]=category;
category.auditRefs.forEach(audit=>includedAudits.add(audit.id));
}
});

return{categories,requestedAuditNames:includedAudits};
}





static getCategories(config){
const categories=config.categories;
if(!categories){
return[];
}

return Object.keys(categories).map(id=>{
const title=categories[id].title;
return{id,title};
});
}






static getGatherersNeededByAudits(audits){


if(!audits){
return new Set();
}

return audits.reduce((list,auditDefn)=>{
auditDefn.implementation.meta.requiredArtifacts.forEach(artifact=>list.add(artifact));
return list;
},new Set());
}







static generatePassesNeededByGatherers(passes,requiredGatherers){
if(!passes){
return null;
}

const auditsNeedTrace=requiredGatherers.has('traces');
const filteredPasses=passes.map(pass=>{

pass.gatherers=pass.gatherers.filter(gathererDefn=>{
const gatherer=gathererDefn.instance;
return requiredGatherers.has(gatherer.name);
});


if(pass.recordTrace&&!auditsNeedTrace){
const passName=pass.passName||'unknown pass';
log.warn('config',`Trace not requested by an audit, dropping trace in ${passName}`);
pass.recordTrace=false;
}

return pass;
}).filter(pass=>{

if(pass.recordTrace)return true;

if(pass.passName==='defaultPass')return true;
return pass.gatherers.length>0;
});
return filteredPasses;
}









static requireAudits(audits,configDir){
const status={msg:'Requiring audits',id:'lh:config:requireAudits'};
log.time(status,'verbose');
const auditDefns=requireAudits(audits,configDir);
log.timeEnd(status);
return auditDefns;
}








static requireGathererFromPath(path,options,coreAuditList,configDir){
const coreGatherer=coreAuditList.find(a=>a===`${path}.js`);

let requirePath=`../gather/gatherers/${path}`;
if(!coreGatherer){

requirePath=resolveModule(path,configDir,'gatherer');
}

const GathererClass=require(requirePath);

return{
instance:new GathererClass(),
implementation:GathererClass,
path,
options:options||{}};

}









static requireGatherers(passes,configDir){
if(!passes){
return null;
}
const status={msg:'Requiring gatherers',id:'lh:config:requireGatherers'};
log.time(status,'verbose');

const coreList=Runner.getGathererList();
const fullPasses=passes.map(pass=>{
const gathererDefns=Config.expandGathererShorthand(pass.gatherers).map(gathererDefn=>{
if(gathererDefn.instance){
return{
instance:gathererDefn.instance,
implementation:gathererDefn.implementation,
path:gathererDefn.path,
options:gathererDefn.options||{}};

}else if(gathererDefn.implementation){
const GathererClass=gathererDefn.implementation;
return{
instance:new GathererClass(),
implementation:gathererDefn.implementation,
path:gathererDefn.path,
options:gathererDefn.options||{}};

}else if(gathererDefn.path){
const path=gathererDefn.path;
const options=gathererDefn.options;
return Config.requireGathererFromPath(path,options,coreList,configDir);
}else{
throw new Error('Invalid expanded Gatherer: '+JSON.stringify(gathererDefn));
}
});

const mergedDefns=mergeOptionsOfItems(gathererDefns);
mergedDefns.forEach(gatherer=>assertValidGatherer(gatherer.instance,gatherer.path));

return Object.assign(pass,{gatherers:mergedDefns});
});
log.timeEnd(status);
return fullPasses;
}}


module.exports=Config;

}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/config");
},{"../runner.js":89,"./../lib/i18n/i18n.js":66,"./budget.js":42,"./config-helpers.js":43,"./config-plugin.js":44,"./constants.js":46,"./default-config.js":47,"lighthouse-logger":125,"lodash.isequal":142,"path":156}],46:[function(require,module,exports){





'use strict';







const DEVTOOLS_RTT_ADJUSTMENT_FACTOR=3.75;
const DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR=0.9;

const throttling={
DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,


mobileSlow4G:{
rttMs:150,
throughputKbps:1.6*1024,
requestLatencyMs:150*DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
downloadThroughputKbps:1.6*1024*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
uploadThroughputKbps:750*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
cpuSlowdownMultiplier:4},




mobileRegluar3G:{
rttMs:300,
throughputKbps:700,
requestLatencyMs:300*DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
downloadThroughputKbps:700*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
uploadThroughputKbps:700*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
cpuSlowdownMultiplier:4}};




const defaultSettings={
output:'json',
maxWaitForFcp:30*1000,
maxWaitForLoad:45*1000,
throttlingMethod:'simulate',
throttling:throttling.mobileSlow4G,
auditMode:false,
gatherMode:false,
disableStorageReset:false,
emulatedFormFactor:'mobile',
internalDisableDeviceScreenEmulation:false,
channel:'node',



budgets:null,
locale:'en-US',
blockedUrlPatterns:null,
additionalTraceCategories:null,
extraHeaders:null,
precomputedLanternData:null,
onlyAudits:null,
onlyCategories:null,
skipAudits:null};



const defaultPassConfig={
passName:'defaultPass',
recordTrace:false,
useThrottling:false,
pauseAfterLoadMs:0,
networkQuietThresholdMs:0,
cpuQuietThresholdMs:0,
blockedUrlPatterns:[],
blankPage:'about:blank',
gatherers:[]};


const nonSimulatedPassConfigOverrides={
pauseAfterLoadMs:5250,
networkQuietThresholdMs:5250,
cpuQuietThresholdMs:5250};


module.exports={
throttling,
defaultSettings,
defaultPassConfig,
nonSimulatedPassConfigOverrides};


},{}],47:[function(require,module,exports){
(function(__filename){





'use strict';



const constants=require('./constants.js');
const i18n=require('../lib/i18n/i18n.js');

const UIStrings={

performanceCategoryTitle:'Performance',

budgetsGroupTitle:'Budgets',

budgetsGroupDescription:'Performance budgets set standards for the performance of your site.',

metricGroupTitle:'Metrics',

loadOpportunitiesGroupTitle:'Opportunities',

loadOpportunitiesGroupDescription:'These suggestions can help your page load faster. They don\'t [directly affect](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted) the Performance score.',

firstPaintImprovementsGroupTitle:'First Paint Improvements',

firstPaintImprovementsGroupDescription:'The most critical aspect of performance is how quickly pixels are rendered onscreen. Key metrics: First Contentful Paint, First Meaningful Paint',

overallImprovementsGroupTitle:'Overall Improvements',

overallImprovementsGroupDescription:'Enhance the overall loading experience, so the page is responsive and ready to use as soon as possible. Key metrics: Time to Interactive, Speed Index',

diagnosticsGroupTitle:'Diagnostics',

diagnosticsGroupDescription:'More information about the performance of your application. These numbers don\'t [directly affect](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted) the Performance score.',

a11yCategoryTitle:'Accessibility',

a11yCategoryDescription:'These checks highlight opportunities to [improve the accessibility of your web app](https://developers.google.com/web/fundamentals/accessibility). Only a subset of accessibility issues can be automatically detected so manual testing is also encouraged.',

a11yCategoryManualDescription:'These items address areas which an automated testing tool cannot cover. Learn more in our guide on [conducting an accessibility review](https://developers.google.com/web/fundamentals/accessibility/how-to-review).',

a11yBestPracticesGroupTitle:'Best practices',

a11yBestPracticesGroupDescription:'These items highlight common accessibility best practices.',

a11yColorContrastGroupTitle:'Contrast',

a11yColorContrastGroupDescription:'These are opportunities to improve the legibility of your content.',

a11yNamesLabelsGroupTitle:'Names and labels',

a11yNamesLabelsGroupDescription:'These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader.',

a11yNavigationGroupTitle:'Navigation',

a11yNavigationGroupDescription:'These are opportunities to improve keyboard navigation in your application.',

a11yAriaGroupTitle:'ARIA',

a11yAriaGroupDescription:'These are opportunities to improve the usage of ARIA in your application which may enhance the experience for users of assistive technology, like a screen reader.',

a11yLanguageGroupTitle:'Internationalization and localization',

a11yLanguageGroupDescription:'These are opportunities to improve the interpretation of your content by users in different locales.',

a11yAudioVideoGroupTitle:'Audio and video',

a11yAudioVideoGroupDescription:'These are opportunities to provide alternative content for audio and video. This may improve the experience for users with hearing or vision impairments.',

a11yTablesListsVideoGroupTitle:'Tables and lists',

a11yTablesListsVideoGroupDescription:'These are opportunities to to improve the experience of reading tabular or list data using assistive technology, like a screen reader.',

seoCategoryTitle:'SEO',

seoCategoryDescription:'These checks ensure that your page is optimized for search engine results ranking. '+
'There are additional factors Lighthouse does not check that may affect your search ranking. '+
'[Learn more](https://support.google.com/webmasters/answer/35769).',

seoCategoryManualDescription:'Run these additional validators on your site to check additional SEO best practices.',

seoMobileGroupTitle:'Mobile Friendly',

seoMobileGroupDescription:'Make sure your pages are mobile friendly so users don’t have to pinch or zoom '+
'in order to read the content pages. [Learn more](https://developers.google.com/search/mobile-sites/).',

seoContentGroupTitle:'Content Best Practices',

seoContentGroupDescription:'Format your HTML in a way that enables crawlers to better understand your app’s content.',

seoCrawlingGroupTitle:'Crawling and Indexing',

seoCrawlingGroupDescription:'To appear in search results, crawlers need access to your app.',

pwaCategoryTitle:'Progressive Web App',

pwaCategoryDescription:'These checks validate the aspects of a Progressive Web App. '+
'[Learn more](https://developers.google.com/web/progressive-web-apps/checklist).',

pwaCategoryManualDescription:'These checks are required by the baseline '+
'[PWA Checklist](https://developers.google.com/web/progressive-web-apps/checklist) but are '+
'not automatically checked by Lighthouse. They do not affect your score but it\'s important that you verify them manually.',

bestPracticesCategoryTitle:'Best Practices',

pwaFastReliableGroupTitle:'Fast and reliable',

pwaInstallableGroupTitle:'Installable',

pwaOptimizedGroupTitle:'PWA Optimized'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const defaultConfig={
settings:constants.defaultSettings,
passes:[{
passName:'defaultPass',
recordTrace:true,
useThrottling:true,
pauseAfterLoadMs:1000,
networkQuietThresholdMs:1000,
cpuQuietThresholdMs:1000,
gatherers:[
'css-usage',
'viewport-dimensions',
'runtime-exceptions',
'console-messages',
'anchor-elements',
'image-elements',
'link-elements',
'meta-elements',
'script-elements',
'iframe-elements',
'main-document-content',
'dobetterweb/appcache',
'dobetterweb/doctype',
'dobetterweb/domstats',
'dobetterweb/optimized-images',
'dobetterweb/password-inputs-with-prevented-paste',
'dobetterweb/response-compression',
'dobetterweb/tags-blocking-first-paint',
'seo/font-size',
'seo/embedded-content',
'seo/robots-txt',
'seo/tap-targets',
'accessibility']},


{
passName:'offlinePass',
gatherers:[
'service-worker',
'offline',
'start-url']},


{
passName:'redirectPass',

blockedUrlPatterns:['*.css','*.jpg','*.jpeg','*.png','*.gif','*.svg','*.ttf','*.woff','*.woff2'],
gatherers:[
'http-redirect',
'html-without-javascript']}],


audits:[
'is-on-https',
'redirects-http',
'service-worker',
'works-offline',
'viewport',
'without-javascript',
'metrics/first-contentful-paint',
'metrics/first-meaningful-paint',
'load-fast-enough-for-pwa',
'metrics/speed-index',
'screenshot-thumbnails',
'final-screenshot',
'metrics/estimated-input-latency',
'metrics/total-blocking-time',
'metrics/max-potential-fid',
'errors-in-console',
'time-to-first-byte',
'metrics/first-cpu-idle',
'metrics/interactive',
'user-timings',
'critical-request-chains',
'redirects',
'installable-manifest',
'apple-touch-icon',
'splash-screen',
'themed-omnibox',
'content-width',
'image-aspect-ratio',
'deprecations',
'mainthread-work-breakdown',
'bootup-time',
'uses-rel-preload',
'uses-rel-preconnect',
'font-display',
'diagnostics',
'network-requests',
'network-rtt',
'network-server-latency',
'main-thread-tasks',
'metrics',
'offline-start-url',
'performance-budget',
'resource-summary',
'third-party-summary',
'manual/pwa-cross-browser',
'manual/pwa-page-transitions',
'manual/pwa-each-page-has-url',
'accessibility/accesskeys',
'accessibility/aria-allowed-attr',
'accessibility/aria-required-attr',
'accessibility/aria-required-children',
'accessibility/aria-required-parent',
'accessibility/aria-roles',
'accessibility/aria-valid-attr-value',
'accessibility/aria-valid-attr',
'accessibility/audio-caption',
'accessibility/button-name',
'accessibility/bypass',
'accessibility/color-contrast',
'accessibility/definition-list',
'accessibility/dlitem',
'accessibility/document-title',
'accessibility/duplicate-id',
'accessibility/frame-title',
'accessibility/html-has-lang',
'accessibility/html-lang-valid',
'accessibility/image-alt',
'accessibility/input-image-alt',
'accessibility/label',
'accessibility/layout-table',
'accessibility/link-name',
'accessibility/list',
'accessibility/listitem',
'accessibility/meta-refresh',
'accessibility/meta-viewport',
'accessibility/object-alt',
'accessibility/tabindex',
'accessibility/td-headers-attr',
'accessibility/th-has-data-cells',
'accessibility/valid-lang',
'accessibility/video-caption',
'accessibility/video-description',
'accessibility/manual/custom-controls-labels',
'accessibility/manual/custom-controls-roles',
'accessibility/manual/focus-traps',
'accessibility/manual/focusable-controls',
'accessibility/manual/heading-levels',
'accessibility/manual/interactive-element-affordance',
'accessibility/manual/logical-tab-order',
'accessibility/manual/managed-focus',
'accessibility/manual/offscreen-content-hidden',
'accessibility/manual/use-landmarks',
'accessibility/manual/visual-order-follows-dom',
'byte-efficiency/uses-long-cache-ttl',
'byte-efficiency/total-byte-weight',
'byte-efficiency/offscreen-images',
'byte-efficiency/render-blocking-resources',
'byte-efficiency/unminified-css',
'byte-efficiency/unminified-javascript',
'byte-efficiency/unused-css-rules',
'byte-efficiency/uses-webp-images',
'byte-efficiency/uses-optimized-images',
'byte-efficiency/uses-text-compression',
'byte-efficiency/uses-responsive-images',
'byte-efficiency/efficient-animated-content',
'dobetterweb/appcache-manifest',
'dobetterweb/doctype',
'dobetterweb/dom-size',
'dobetterweb/external-anchors-use-rel-noopener',
'dobetterweb/geolocation-on-start',
'dobetterweb/no-document-write',
'dobetterweb/no-vulnerable-libraries',
'dobetterweb/js-libraries',
'dobetterweb/notification-on-start',
'dobetterweb/password-inputs-can-be-pasted-into',
'dobetterweb/uses-http2',
'dobetterweb/uses-passive-event-listeners',
'seo/meta-description',
'seo/http-status-code',
'seo/font-size',
'seo/link-text',
'seo/is-crawlable',
'seo/robots-txt',
'seo/tap-targets',
'seo/hreflang',
'seo/plugins',
'seo/canonical',
'seo/manual/structured-data'],


groups:{
'metrics':{
title:str_(UIStrings.metricGroupTitle)},

'load-opportunities':{
title:str_(UIStrings.loadOpportunitiesGroupTitle),
description:str_(UIStrings.loadOpportunitiesGroupDescription)},

'budgets':{
title:str_(UIStrings.budgetsGroupTitle),
description:str_(UIStrings.budgetsGroupDescription)},

'diagnostics':{
title:str_(UIStrings.diagnosticsGroupTitle),
description:str_(UIStrings.diagnosticsGroupDescription)},

'pwa-fast-reliable':{
title:str_(UIStrings.pwaFastReliableGroupTitle)},

'pwa-installable':{
title:str_(UIStrings.pwaInstallableGroupTitle)},

'pwa-optimized':{
title:str_(UIStrings.pwaOptimizedGroupTitle)},

'a11y-best-practices':{
title:str_(UIStrings.a11yBestPracticesGroupTitle),
description:str_(UIStrings.a11yBestPracticesGroupDescription)},

'a11y-color-contrast':{
title:str_(UIStrings.a11yColorContrastGroupTitle),
description:str_(UIStrings.a11yColorContrastGroupDescription)},

'a11y-names-labels':{
title:str_(UIStrings.a11yNamesLabelsGroupTitle),
description:str_(UIStrings.a11yNamesLabelsGroupDescription)},

'a11y-navigation':{
title:str_(UIStrings.a11yNavigationGroupTitle),
description:str_(UIStrings.a11yNavigationGroupDescription)},

'a11y-aria':{
title:str_(UIStrings.a11yAriaGroupTitle),
description:str_(UIStrings.a11yAriaGroupDescription)},

'a11y-language':{
title:str_(UIStrings.a11yLanguageGroupTitle),
description:str_(UIStrings.a11yLanguageGroupDescription)},

'a11y-audio-video':{
title:str_(UIStrings.a11yAudioVideoGroupTitle),
description:str_(UIStrings.a11yAudioVideoGroupDescription)},

'a11y-tables-lists':{
title:str_(UIStrings.a11yTablesListsVideoGroupTitle),
description:str_(UIStrings.a11yTablesListsVideoGroupDescription)},

'seo-mobile':{
title:str_(UIStrings.seoMobileGroupTitle),
description:str_(UIStrings.seoMobileGroupDescription)},

'seo-content':{
title:str_(UIStrings.seoContentGroupTitle),
description:str_(UIStrings.seoContentGroupDescription)},

'seo-crawl':{
title:str_(UIStrings.seoCrawlingGroupTitle),
description:str_(UIStrings.seoCrawlingGroupDescription)}},


categories:{
'performance':{
title:str_(UIStrings.performanceCategoryTitle),
auditRefs:[
{id:'first-contentful-paint',weight:3,group:'metrics'},
{id:'first-meaningful-paint',weight:1,group:'metrics'},
{id:'speed-index',weight:4,group:'metrics'},
{id:'interactive',weight:5,group:'metrics'},
{id:'first-cpu-idle',weight:2,group:'metrics'},
{id:'max-potential-fid',weight:0,group:'metrics'},
{id:'estimated-input-latency',weight:0},
{id:'total-blocking-time',weight:0},
{id:'render-blocking-resources',weight:0,group:'load-opportunities'},
{id:'uses-responsive-images',weight:0,group:'load-opportunities'},
{id:'offscreen-images',weight:0,group:'load-opportunities'},
{id:'unminified-css',weight:0,group:'load-opportunities'},
{id:'unminified-javascript',weight:0,group:'load-opportunities'},
{id:'unused-css-rules',weight:0,group:'load-opportunities'},
{id:'uses-optimized-images',weight:0,group:'load-opportunities'},
{id:'uses-webp-images',weight:0,group:'load-opportunities'},
{id:'uses-text-compression',weight:0,group:'load-opportunities'},
{id:'uses-rel-preconnect',weight:0,group:'load-opportunities'},
{id:'time-to-first-byte',weight:0,group:'load-opportunities'},
{id:'redirects',weight:0,group:'load-opportunities'},
{id:'uses-rel-preload',weight:0,group:'load-opportunities'},
{id:'efficient-animated-content',weight:0,group:'load-opportunities'},
{id:'total-byte-weight',weight:0,group:'diagnostics'},
{id:'uses-long-cache-ttl',weight:0,group:'diagnostics'},
{id:'dom-size',weight:0,group:'diagnostics'},
{id:'critical-request-chains',weight:0,group:'diagnostics'},
{id:'user-timings',weight:0,group:'diagnostics'},
{id:'bootup-time',weight:0,group:'diagnostics'},
{id:'mainthread-work-breakdown',weight:0,group:'diagnostics'},
{id:'font-display',weight:0,group:'diagnostics'},
{id:'performance-budget',weight:0,group:'budgets'},
{id:'resource-summary',weight:0,group:'diagnostics'},
{id:'third-party-summary',weight:0,group:'diagnostics'},

{id:'network-requests',weight:0},
{id:'network-rtt',weight:0},
{id:'network-server-latency',weight:0},
{id:'main-thread-tasks',weight:0},
{id:'diagnostics',weight:0},
{id:'metrics',weight:0},
{id:'screenshot-thumbnails',weight:0},
{id:'final-screenshot',weight:0}]},


'accessibility':{
title:str_(UIStrings.a11yCategoryTitle),
description:str_(UIStrings.a11yCategoryDescription),
manualDescription:str_(UIStrings.a11yCategoryManualDescription),




auditRefs:[
{id:'accesskeys',weight:3,group:'a11y-navigation'},
{id:'aria-allowed-attr',weight:10,group:'a11y-aria'},
{id:'aria-required-attr',weight:10,group:'a11y-aria'},
{id:'aria-required-children',weight:10,group:'a11y-aria'},
{id:'aria-required-parent',weight:10,group:'a11y-aria'},
{id:'aria-roles',weight:10,group:'a11y-aria'},
{id:'aria-valid-attr-value',weight:10,group:'a11y-aria'},
{id:'aria-valid-attr',weight:10,group:'a11y-aria'},
{id:'audio-caption',weight:10,group:'a11y-audio-video'},
{id:'button-name',weight:10,group:'a11y-names-labels'},
{id:'bypass',weight:3,group:'a11y-navigation'},
{id:'color-contrast',weight:3,group:'a11y-color-contrast'},
{id:'definition-list',weight:3,group:'a11y-tables-lists'},
{id:'dlitem',weight:3,group:'a11y-tables-lists'},
{id:'document-title',weight:3,group:'a11y-names-labels'},
{id:'duplicate-id',weight:1,group:'a11y-best-practices'},
{id:'frame-title',weight:3,group:'a11y-names-labels'},
{id:'html-has-lang',weight:3,group:'a11y-language'},
{id:'html-lang-valid',weight:3,group:'a11y-language'},
{id:'image-alt',weight:10,group:'a11y-names-labels'},
{id:'input-image-alt',weight:10,group:'a11y-names-labels'},
{id:'label',weight:10,group:'a11y-names-labels'},
{id:'layout-table',weight:3,group:'a11y-tables-lists'},
{id:'link-name',weight:3,group:'a11y-names-labels'},
{id:'list',weight:3,group:'a11y-tables-lists'},
{id:'listitem',weight:3,group:'a11y-tables-lists'},
{id:'meta-refresh',weight:10,group:'a11y-best-practices'},
{id:'meta-viewport',weight:10,group:'a11y-best-practices'},
{id:'object-alt',weight:3,group:'a11y-names-labels'},
{id:'tabindex',weight:3,group:'a11y-navigation'},
{id:'td-headers-attr',weight:3,group:'a11y-tables-lists'},
{id:'th-has-data-cells',weight:3,group:'a11y-tables-lists'},
{id:'valid-lang',weight:3,group:'a11y-language'},
{id:'video-caption',weight:10,group:'a11y-audio-video'},
{id:'video-description',weight:10,group:'a11y-audio-video'},

{id:'logical-tab-order',weight:0},
{id:'focusable-controls',weight:0},
{id:'interactive-element-affordance',weight:0},
{id:'managed-focus',weight:0},
{id:'focus-traps',weight:0},
{id:'custom-controls-labels',weight:0},
{id:'custom-controls-roles',weight:0},
{id:'visual-order-follows-dom',weight:0},
{id:'offscreen-content-hidden',weight:0},
{id:'heading-levels',weight:0},
{id:'use-landmarks',weight:0}]},


'best-practices':{
title:str_(UIStrings.bestPracticesCategoryTitle),
auditRefs:[
{id:'appcache-manifest',weight:1},
{id:'is-on-https',weight:1},
{id:'uses-http2',weight:1},
{id:'uses-passive-event-listeners',weight:1},
{id:'no-document-write',weight:1},
{id:'external-anchors-use-rel-noopener',weight:1},
{id:'geolocation-on-start',weight:1},
{id:'doctype',weight:1},
{id:'no-vulnerable-libraries',weight:1},
{id:'js-libraries',weight:0},
{id:'notification-on-start',weight:1},
{id:'deprecations',weight:1},
{id:'password-inputs-can-be-pasted-into',weight:1},
{id:'errors-in-console',weight:1},
{id:'image-aspect-ratio',weight:1}]},


'seo':{
title:str_(UIStrings.seoCategoryTitle),
description:str_(UIStrings.seoCategoryDescription),
manualDescription:str_(UIStrings.seoCategoryManualDescription),
auditRefs:[
{id:'viewport',weight:1,group:'seo-mobile'},
{id:'document-title',weight:1,group:'seo-content'},
{id:'meta-description',weight:1,group:'seo-content'},
{id:'http-status-code',weight:1,group:'seo-crawl'},
{id:'link-text',weight:1,group:'seo-content'},
{id:'is-crawlable',weight:1,group:'seo-crawl'},
{id:'robots-txt',weight:1,group:'seo-crawl'},
{id:'image-alt',weight:1,group:'seo-content'},
{id:'hreflang',weight:1,group:'seo-content'},
{id:'canonical',weight:1,group:'seo-content'},
{id:'font-size',weight:1,group:'seo-mobile'},
{id:'plugins',weight:1,group:'seo-content'},
{id:'tap-targets',weight:1,group:'seo-mobile'},

{id:'structured-data',weight:0}]},


'pwa':{
title:str_(UIStrings.pwaCategoryTitle),
description:str_(UIStrings.pwaCategoryDescription),
manualDescription:str_(UIStrings.pwaCategoryManualDescription),
auditRefs:[

{id:'load-fast-enough-for-pwa',weight:7,group:'pwa-fast-reliable'},
{id:'works-offline',weight:5,group:'pwa-fast-reliable'},
{id:'offline-start-url',weight:1,group:'pwa-fast-reliable'},

{id:'is-on-https',weight:2,group:'pwa-installable'},
{id:'service-worker',weight:1,group:'pwa-installable'},
{id:'installable-manifest',weight:2,group:'pwa-installable'},

{id:'redirects-http',weight:2,group:'pwa-optimized'},
{id:'splash-screen',weight:1,group:'pwa-optimized'},
{id:'themed-omnibox',weight:1,group:'pwa-optimized'},
{id:'content-width',weight:1,group:'pwa-optimized'},
{id:'viewport',weight:2,group:'pwa-optimized'},
{id:'without-javascript',weight:1,group:'pwa-optimized'},
{id:'apple-touch-icon',weight:1,group:'pwa-optimized'},

{id:'pwa-cross-browser',weight:0},
{id:'pwa-page-transitions',weight:0},
{id:'pwa-each-page-has-url',weight:0}]}}};





module.exports=defaultConfig;


Object.defineProperty(module.exports,'UIStrings',{
enumerable:false,
get:()=>UIStrings});


}).call(this,"/lighthouse-core/config/default-config.js");
},{"../lib/i18n/i18n.js":66,"./constants.js":46}],48:[function(require,module,exports){





'use strict';

const EventEmitter=require('events').EventEmitter;
const log=require('lighthouse-logger');
const LHError=require('../../lib/lh-error.js');










class Connection{
constructor(){
this._lastCommandId=0;

this._callbacks=new Map();

this._eventEmitter=new EventEmitter();
}




connect(){
return Promise.reject(new Error('Not implemented'));
}




disconnect(){
return Promise.reject(new Error('Not implemented'));
}




wsEndpoint(){
return Promise.reject(new Error('Not implemented'));
}









sendCommand(method,sessionId,...paramArgs){

const params=paramArgs.length?paramArgs[0]:undefined;

log.formatProtocol('method => browser',{method,params},'verbose');
const id=++this._lastCommandId;
const message=JSON.stringify({id,sessionId,method,params});
this.sendRawMessage(message);

return new Promise(resolve=>{
this._callbacks.set(id,{method,resolve});
});
}






on(eventName,cb){
if(eventName!=='protocolevent'){
throw new Error('Only supports "protocolevent" events');
}

if(!this._eventEmitter){
throw new Error('Attempted to add event listener after connection disposed.');
}
this._eventEmitter.on(eventName,cb);
}







sendRawMessage(message){
throw new Error('Not implemented');
}








handleRawMessage(message){
const object=JSON.parse(message);


if(!('id'in object)){
log.formatProtocol('<= event',
{method:object.method,params:object.params},'verbose');
this.emitProtocolEvent(object);
return;
}

const callback=this._callbacks.get(object.id);
if(callback){
this._callbacks.delete(object.id);

callback.resolve(Promise.resolve().then(_=>{
if(object.error){
log.formatProtocol('method <= browser ERR',{method:callback.method},'error');
throw LHError.fromProtocolMessage(callback.method,object.error);
}

log.formatProtocol('method <= browser OK',
{method:callback.method,params:object.result},'verbose');
return object.result;
}));
}else{


const error=object.error&&object.error.message;
log.formatProtocol(`disowned method <= browser ${error?'ERR':'OK'}`,
{method:'UNKNOWN',params:error||object.result},'verbose');
}
}




emitProtocolEvent(eventMessage){
if(!this._eventEmitter){
throw new Error('Attempted to emit event after connection disposed.');
}

this._eventEmitter.emit('protocolevent',eventMessage);
}




dispose(){
if(this._eventEmitter){
this._eventEmitter.removeAllListeners();
this._eventEmitter=null;
}
}}


module.exports=Connection;

},{"../../lib/lh-error.js":71,"events":108,"lighthouse-logger":125}],49:[function(require,module,exports){





'use strict';

const Connection=require('./connection.js');












class RawConnection extends Connection{



constructor(port){
super();
this._port=port;
this._port.on('message',this.handleRawMessage.bind(this));
this._port.on('close',this.dispose.bind(this));
}





connect(){
return Promise.resolve();
}




disconnect(){
this._port.close();
return Promise.resolve();
}






sendRawMessage(message){
this._port.send(message);
}}


module.exports=RawConnection;

},{"./connection.js":48}],50:[function(require,module,exports){





'use strict';






class DevtoolsLog{



constructor(regexFilter){
this._filter=regexFilter;


this._messages=[];
this._isRecording=false;
}




get messages(){
return this._messages;
}

reset(){
this._messages=[];
}

beginRecording(){
this._isRecording=true;
}

endRecording(){
this._isRecording=false;
}





record(message){
if(this._isRecording&&(!this._filter||this._filter.test(message.method))){
this._messages.push(message);
}
}}


module.exports=DevtoolsLog;

},{}],51:[function(require,module,exports){
(function(Buffer){





'use strict';

const NetworkRecorder=require('../lib/network-recorder.js');
const emulation=require('../lib/emulation.js');
const LHElement=require('../lib/lh-element.js');
const LHError=require('../lib/lh-error.js');
const NetworkRequest=require('../lib/network-request.js');
const EventEmitter=require('events').EventEmitter;
const URL=require('../lib/url-shim.js');
const constants=require('../config/constants.js');

const log=require('lighthouse-logger');
const DevtoolsLog=require('./devtools-log.js');

const pageFunctions=require('../lib/page-functions.js');



const Connection=require('./connections/connection.js');


const DEFAULT_PAUSE_AFTER_LOAD=0;

const DEFAULT_NETWORK_QUIET_THRESHOLD=5000;

const DEFAULT_CPU_QUIET_THRESHOLD=0;

const DEFAULT_PROTOCOL_TIMEOUT=30000;





class Driver{



constructor(connection){
this._traceCategories=Driver.traceCategories;



this._eventEmitter=new EventEmitter();
this._connection=connection;

this._devtoolsLog=new DevtoolsLog(/^(Page|Network)\./);
this.online=true;

this._domainEnabledCounts=new Map();

this._isolatedExecutionContextId=undefined;






this._networkStatusMonitor=null;






this._monitoredUrl=null;

this.on('Target.attachedToTarget',event=>{
this._handleTargetAttached(event).catch(this._handleEventError);
});



this.on('Runtime.executionContextDestroyed',event=>{
if(event.executionContextId===this._isolatedExecutionContextId){
this._clearIsolatedContextId();
}
});

this.on('Page.frameNavigated',()=>this._clearIsolatedContextId());

connection.on('protocolevent',this._handleProtocolEvent.bind(this));





this._nextProtocolTimeout=DEFAULT_PROTOCOL_TIMEOUT;
}

static get traceCategories(){
return[

'-*',


'disabled-by-default-lighthouse',



'v8',


'v8.execute',


'blink.user_timing',


'blink.console',


'devtools.timeline',
'disabled-by-default-devtools.timeline',


'disabled-by-default-devtools.screenshot',


'disabled-by-default-devtools.timeline.stack'];





}




async getBrowserVersion(){
const status={msg:'Getting browser version',id:'lh:gather:getVersion'};
log.time(status,'verbose');
const version=await this.sendCommand('Browser.getVersion');
const match=version.product.match(/\/(\d+)/);
const milestone=match?parseInt(match[1]):0;
log.timeEnd(status);
return Object.assign(version,{milestone});
}





async getBenchmarkIndex(){
const status={msg:'Benchmarking machine',id:'lh:gather:getBenchmarkIndex'};
log.time(status);
const indexVal=await this.evaluateAsync(`(${pageFunctions.ultradumbBenchmarkString})()`);
log.timeEnd(status);
return indexVal;
}




async connect(){
const status={msg:'Connecting to browser',id:'lh:init:connect'};
log.time(status);
await this._connection.connect();
log.timeEnd(status);
}




disconnect(){
return this._connection.disconnect();
}






wsEndpoint(){
return this._connection.wsEndpoint();
}







on(eventName,cb){
if(this._eventEmitter===null){
throw new Error('connect() must be called before attempting to listen to events.');
}


log.formatProtocol('listen for event =>',{method:eventName},'verbose');
this._eventEmitter.on(eventName,cb);
}








once(eventName,cb){
if(this._eventEmitter===null){
throw new Error('connect() must be called before attempting to listen to events.');
}

log.formatProtocol('listen once for event =>',{method:eventName},'verbose');
this._eventEmitter.once(eventName,cb);
}







off(eventName,cb){
if(this._eventEmitter===null){
throw new Error('connect() must be called before attempting to remove an event listener.');
}

this._eventEmitter.removeListener(eventName,cb);
}














_shouldToggleDomain(domain,sessionId,enable){
const key=domain+(sessionId||'');
const enabledCount=this._domainEnabledCounts.get(key)||0;
const newCount=enabledCount+(enable?1:-1);
this._domainEnabledCounts.set(key,Math.max(0,newCount));


if(enable&&newCount===1||!enable&&newCount===0){
log.verbose('Driver',`${domain}.${enable?'enable':'disable'}`);
return true;
}else{
if(newCount<0){
log.error('Driver',`Attempted to disable domain '${domain}' when already disabled.`);
}
return false;
}
}







setNextProtocolTimeout(timeout){
this._nextProtocolTimeout=timeout;
}




_handleProtocolEvent(event){
this._devtoolsLog.record(event);
if(this._networkStatusMonitor){
this._networkStatusMonitor.dispatch(event);
}




this._eventEmitter.emit(event.method,event.params);
}




_handleEventError(error){
log.error('Driver','Unhandled event error',error.message);
}




async _handleTargetAttached(event){


if(event.targetInfo.type!=='iframe'){

await this.sendCommandToSession('Runtime.runIfWaitingForDebugger',event.sessionId);
return;
}



await this.sendCommandToSession('Network.enable',event.sessionId);


await this.sendCommandToSession('Target.setAutoAttach',event.sessionId,{
autoAttach:true,
flatten:true,

waitForDebuggerOnStart:true});



await this.sendCommandToSession('Runtime.runIfWaitingForDebugger',event.sessionId);
}











sendCommandToSession(method,sessionId,...params){
const timeout=this._nextProtocolTimeout;
this._nextProtocolTimeout=DEFAULT_PROTOCOL_TIMEOUT;
return new Promise(async(resolve,reject)=>{
const asyncTimeout=setTimeout(()=>{
const err=new LHError(
LHError.errors.PROTOCOL_TIMEOUT,
{protocolMethod:method});

reject(err);
},timeout);
try{
const result=await this._innerSendCommand(method,sessionId,...params);
resolve(result);
}catch(err){
reject(err);
}finally{
clearTimeout(asyncTimeout);
}
});
}








sendCommand(method,...params){
return this.sendCommandToSession(method,undefined,...params);
}










_innerSendCommand(method,sessionId,...params){
const domainCommand=/^(\w+)\.(enable|disable)$/.exec(method);
if(domainCommand){
const enable=domainCommand[2]==='enable';
if(!this._shouldToggleDomain(domainCommand[1],sessionId,enable)){
return Promise.resolve();
}
}
return this._connection.sendCommand(method,sessionId,...params);
}






isDomainEnabled(domain){

return!!this._domainEnabledCounts.get(domain);
}






evaluateScriptOnNewDocument(scriptSource){
return this.sendCommand('Page.addScriptToEvaluateOnLoad',{
scriptSource});

}










async evaluateAsync(expression,options={}){
const contextId=options.useIsolation?await this._getOrCreateIsolatedContextId():undefined;

try{

return await this._evaluateInContext(expression,contextId);
}catch(err){

if(contextId&&err.message.includes('Cannot find context')){
this._clearIsolatedContextId();
const freshContextId=await this._getOrCreateIsolatedContextId();
return this._evaluateInContext(expression,freshContextId);
}

throw err;
}
}








async _evaluateInContext(expression,contextId){


const timeout=this._nextProtocolTimeout===DEFAULT_PROTOCOL_TIMEOUT?
60000:this._nextProtocolTimeout;
const evaluationParams={





expression:`(function wrapInNativePromise() {
        const __nativePromise = window.__nativePromise || Promise;
        const URL = window.__nativeURL || window.URL;
        return new __nativePromise(function (resolve) {
          return __nativePromise.resolve()
            .then(_ => ${expression})
            .catch(${pageFunctions.wrapRuntimeEvalErrorInBrowserString})
            .then(resolve);
        });
      }())`,
includeCommandLineAPI:true,
awaitPromise:true,
returnByValue:true,
timeout,
contextId};


this.setNextProtocolTimeout(timeout);
const response=await this.sendCommand('Runtime.evaluate',evaluationParams);
if(response.exceptionDetails){


const errorMessage=response.exceptionDetails.exception?
response.exceptionDetails.exception.description:
response.exceptionDetails.text;
return Promise.reject(new Error(`Evaluation exception: ${errorMessage}`));
}

if(response.result===undefined){
return Promise.reject(
new Error('Runtime.evaluate response did not contain a "result" object'));
}
const value=response.result.value;
if(value&&value.__failedInBrowser){
return Promise.reject(Object.assign(new Error(),value));
}else{
return value;
}
}




async getAppManifest(){







this.setNextProtocolTimeout(10000);
let response;
try{
response=await this.sendCommand('Page.getAppManifest');
}catch(err){
if(err.code==='PROTOCOL_TIMEOUT'){


log.error('Driver','Failed fetching manifest',err);
return null;
}

throw err;
}

let data=response.data;




if(!data){

return null;
}

const BOM_LENGTH=3;
const BOM_FIRSTCHAR=65279;
const isBomEncoded=data.charCodeAt(0)===BOM_FIRSTCHAR;

if(isBomEncoded){
data=Buffer.from(data).slice(BOM_LENGTH).toString();
}

return{...response,data};
}




getServiceWorkerVersions(){
return new Promise((resolve,reject)=>{



const versionUpdatedListener=data=>{


const activateCandidates=data.versions.filter(sw=>{
return sw.status!=='redundant';
});
const hasActiveServiceWorker=activateCandidates.find(sw=>{
return sw.status==='activated';
});

if(!activateCandidates.length||hasActiveServiceWorker){
this.off('ServiceWorker.workerVersionUpdated',versionUpdatedListener);
this.sendCommand('ServiceWorker.disable').
then(_=>resolve(data),reject);
}
};

this.on('ServiceWorker.workerVersionUpdated',versionUpdatedListener);

this.sendCommand('ServiceWorker.enable').catch(reject);
});
}




getServiceWorkerRegistrations(){
return new Promise((resolve,reject)=>{
this.once('ServiceWorker.workerRegistrationUpdated',data=>{
this.sendCommand('ServiceWorker.disable').
then(_=>resolve(data),reject);
});

this.sendCommand('ServiceWorker.enable').catch(reject);
});
}








assertNoSameOriginServiceWorkerClients(pageUrl){

let registrations;

let versions;

return this.getServiceWorkerRegistrations().then(data=>{
registrations=data.registrations;
}).then(_=>this.getServiceWorkerVersions()).then(data=>{
versions=data.versions;
}).then(_=>{
const origin=new URL(pageUrl).origin;

registrations.
filter(reg=>{
const swOrigin=new URL(reg.scopeURL).origin;

return origin===swOrigin;
}).
forEach(reg=>{
versions.forEach(ver=>{

if(ver.registrationId!==reg.registrationId){
return;
}


if(ver.controlledClients&&ver.controlledClients.length>0){
throw new Error('You probably have multiple tabs open to the same origin.');
}
});
});
});
}







_waitForNothing(){
return{promise:Promise.resolve(),cancel(){}};
}





_waitForFrameNavigated(){
return new Promise(resolve=>{
this.once('Page.frameNavigated',resolve);
});
}






_waitForFCP(maxWaitForFCPMs){

let cancel=()=>{
throw new Error('_waitForFCP.cancel() called before it was defined');
};

const promise=new Promise((resolve,reject)=>{
const maxWaitTimeout=setTimeout(()=>{
reject(new LHError(LHError.errors.NO_FCP));
},maxWaitForFCPMs);


const lifecycleListener=e=>{
if(e.name==='firstContentfulPaint'){
resolve();
cancel();
}
};

this.on('Page.lifecycleEvent',lifecycleListener);

let canceled=false;
cancel=()=>{
if(canceled)return;
canceled=true;
this.off('Page.lifecycleEvent',lifecycleListener);
maxWaitTimeout&&clearTimeout(maxWaitTimeout);
reject(new Error('Wait for FCP canceled'));
};
});

return{
promise,
cancel};

}








_waitForNetworkIdle(networkQuietThresholdMs){
let hasDCLFired=false;

let idleTimeout;

let cancel=()=>{
throw new Error('_waitForNetworkIdle.cancel() called before it was defined');
};



if(!this._networkStatusMonitor){
throw new Error('Driver._waitForNetworkIdle called with no networkStatusMonitor');
}
const networkStatusMonitor=this._networkStatusMonitor;

const promise=new Promise((resolve,reject)=>{
const onIdle=()=>{

networkStatusMonitor.once('network-2-busy',onBusy);
idleTimeout=setTimeout(_=>{
cancel();
resolve();
},networkQuietThresholdMs);
};

const onBusy=()=>{
networkStatusMonitor.once('network-2-idle',onIdle);
idleTimeout&&clearTimeout(idleTimeout);
};

const domContentLoadedListener=()=>{
hasDCLFired=true;
if(networkStatusMonitor.is2Idle()){
onIdle();
}else{
onBusy();
}
};



const logStatus=()=>{
if(!hasDCLFired){
log.verbose('Driver','Waiting on DomContentLoaded');
return;
}

const inflightRecords=networkStatusMonitor.getInflightRecords();


if(inflightRecords.length<20){
for(const record of inflightRecords){
log.verbose('Driver',`Waiting on ${record.url.slice(0,120)} to finish`);
}
}
};

networkStatusMonitor.on('requeststarted',logStatus);
networkStatusMonitor.on('requestloaded',logStatus);
networkStatusMonitor.on('network-2-busy',logStatus);

this.once('Page.domContentEventFired',domContentLoadedListener);
let canceled=false;
cancel=()=>{
if(canceled)return;
canceled=true;
idleTimeout&&clearTimeout(idleTimeout);
this.off('Page.domContentEventFired',domContentLoadedListener);
networkStatusMonitor.removeListener('network-2-busy',onBusy);
networkStatusMonitor.removeListener('network-2-idle',onIdle);
networkStatusMonitor.removeListener('requeststarted',logStatus);
networkStatusMonitor.removeListener('requestloaded',logStatus);
networkStatusMonitor.removeListener('network-2-busy',logStatus);
};
});

return{
promise,
cancel};

}






_waitForCPUIdle(waitForCPUQuiet){
if(!waitForCPUQuiet){
return{
promise:Promise.resolve(),
cancel:()=>undefined};

}


let lastTimeout;
let canceled=false;

const checkForQuietExpression=`(${pageFunctions.checkTimeSinceLastLongTaskString})()`;





async function checkForQuiet(driver,resolve){
if(canceled)return;
const timeSinceLongTask=await driver.evaluateAsync(checkForQuietExpression);
if(canceled)return;

if(typeof timeSinceLongTask==='number'){
if(timeSinceLongTask>=waitForCPUQuiet){
log.verbose('Driver',`CPU has been idle for ${timeSinceLongTask} ms`);
resolve();
}else{
log.verbose('Driver',`CPU has been idle for ${timeSinceLongTask} ms`);
const timeToWait=waitForCPUQuiet-timeSinceLongTask;
lastTimeout=setTimeout(()=>checkForQuiet(driver,resolve),timeToWait);
}
}
}


let cancel=()=>{
throw new Error('_waitForCPUIdle.cancel() called before it was defined');
};
const promise=new Promise((resolve,reject)=>{
checkForQuiet(this,resolve).catch(reject);
cancel=()=>{
if(canceled)return;
canceled=true;
if(lastTimeout)clearTimeout(lastTimeout);
reject(new Error('Wait for CPU idle canceled'));
};
});

return{
promise,
cancel};

}








_waitForLoadEvent(pauseAfterLoadMs){

let cancel=()=>{
throw new Error('_waitForLoadEvent.cancel() called before it was defined');
};

const promise=new Promise((resolve,reject)=>{

let loadTimeout;
const loadListener=function(){
loadTimeout=setTimeout(resolve,pauseAfterLoadMs);
};
this.once('Page.loadEventFired',loadListener);

let canceled=false;
cancel=()=>{
if(canceled)return;
canceled=true;
this.off('Page.loadEventFired',loadListener);
loadTimeout&&clearTimeout(loadTimeout);
};
});

return{
promise,
cancel};

}





async isPageHung(){
try{
this.setNextProtocolTimeout(1000);
await this.sendCommand('Runtime.evaluate',{
expression:'"ping"',
returnByValue:true,
timeout:1000});


return false;
}catch(err){
return true;
}
}



















async _waitForFullyLoaded(pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs,
maxWaitForLoadedMs,maxWaitForFCPMs){

let maxTimeoutHandle;


const waitForFCP=maxWaitForFCPMs?this._waitForFCP(maxWaitForFCPMs):this._waitForNothing();

const waitForLoadEvent=this._waitForLoadEvent(pauseAfterLoadMs);

const waitForNetworkIdle=this._waitForNetworkIdle(networkQuietThresholdMs);

let waitForCPUIdle=this._waitForNothing();



const loadPromise=Promise.all([
waitForFCP.promise,
waitForLoadEvent.promise,
waitForNetworkIdle.promise]).
then(()=>{
waitForCPUIdle=this._waitForCPUIdle(cpuQuietThresholdMs);
return waitForCPUIdle.promise;
}).then(()=>{
return function(){
log.verbose('Driver','loadEventFired and network considered idle');
};
}).catch(err=>{

return function(){
throw err;
};
});



const maxTimeoutPromise=new Promise((resolve,reject)=>{
maxTimeoutHandle=setTimeout(resolve,maxWaitForLoadedMs);
}).then(_=>{
return async()=>{
log.warn('Driver','Timed out waiting for page load. Checking if page is hung...');
if(await this.isPageHung()){
log.warn('Driver','Page appears to be hung, killing JavaScript...');
await this.sendCommand('Emulation.setScriptExecutionDisabled',{value:true});
await this.sendCommand('Runtime.terminateExecution');
throw new LHError(LHError.errors.PAGE_HUNG);
}
};
});


const cleanupFn=await Promise.race([
loadPromise,
maxTimeoutPromise]);


maxTimeoutHandle&&clearTimeout(maxTimeoutHandle);
waitForFCP.cancel();
waitForLoadEvent.cancel();
waitForNetworkIdle.cancel();
waitForCPUIdle.cancel();

await cleanupFn();
}









_beginNetworkStatusMonitoring(startingUrl){
this._networkStatusMonitor=new NetworkRecorder();


this._monitoredUrl=startingUrl;

const requestLoadedListener=redirectRequest=>{

if(!redirectRequest.redirectSource){
return;
}
const earlierRequest=redirectRequest.redirectSource;
if(earlierRequest.url===this._monitoredUrl){
this._monitoredUrl=redirectRequest.url;
}
};
this._networkStatusMonitor.on('requestloaded',requestLoadedListener);

return this.sendCommand('Network.enable');
}







_endNetworkStatusMonitoring(){
this._networkStatusMonitor=null;
const finalUrl=this._monitoredUrl;
this._monitoredUrl=null;

if(!finalUrl){
throw new Error('Network Status Monitoring ended with an undefined finalUrl');
}

return finalUrl;
}







async _getOrCreateIsolatedContextId(){
if(typeof this._isolatedExecutionContextId==='number'){
return this._isolatedExecutionContextId;
}

const resourceTreeResponse=await this.sendCommand('Page.getResourceTree');
const mainFrameId=resourceTreeResponse.frameTree.frame.id;

const isolatedWorldResponse=await this.sendCommand('Page.createIsolatedWorld',{
frameId:mainFrameId,
worldName:'lighthouse_isolated_context'});


this._isolatedExecutionContextId=isolatedWorldResponse.executionContextId;
return isolatedWorldResponse.executionContextId;
}

_clearIsolatedContextId(){
this._isolatedExecutionContextId=undefined;
}












async gotoURL(url,options={}){
const waitForFCP=options.waitForFCP||false;
const waitForNavigated=options.waitForNavigated||false;
const waitForLoad=options.waitForLoad||false;
const passContext=options.passContext||{};
const disableJS=passContext.disableJavaScript||false;

if(waitForNavigated&&(waitForFCP||waitForLoad)){
throw new Error('Cannot use both waitForNavigated and another event, pick just one');
}

await this._beginNetworkStatusMonitoring(url);
await this._clearIsolatedContextId();


await this.sendCommand('Target.setAutoAttach',{
flatten:true,
autoAttach:true,

waitForDebuggerOnStart:true});


await this.sendCommand('Page.enable');
await this.sendCommand('Page.setLifecycleEventsEnabled',{enabled:true});
await this.sendCommand('Emulation.setScriptExecutionDisabled',{value:disableJS});

const waitforPageNavigateCmd=this._innerSendCommand('Page.navigate',undefined,{url});

if(waitForNavigated){
await this._waitForFrameNavigated();
}else if(waitForLoad){
const passConfig=passContext.passConfig||{};
let{pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs}=passConfig;
let maxWaitMs=passContext.settings&&passContext.settings.maxWaitForLoad;
let maxFCPMs=passContext.settings&&passContext.settings.maxWaitForFcp;


if(typeof pauseAfterLoadMs!=='number')pauseAfterLoadMs=DEFAULT_PAUSE_AFTER_LOAD;
if(typeof networkQuietThresholdMs!=='number')networkQuietThresholdMs=DEFAULT_NETWORK_QUIET_THRESHOLD;
if(typeof cpuQuietThresholdMs!=='number')cpuQuietThresholdMs=DEFAULT_CPU_QUIET_THRESHOLD;
if(typeof maxWaitMs!=='number')maxWaitMs=constants.defaultSettings.maxWaitForLoad;
if(typeof maxFCPMs!=='number')maxFCPMs=constants.defaultSettings.maxWaitForFcp;


if(!waitForFCP)maxFCPMs=undefined;
await this._waitForFullyLoaded(pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs,
maxWaitMs,maxFCPMs);
}


await waitforPageNavigateCmd;

return this._endNetworkStatusMonitoring();
}






async getObjectProperty(objectId,propName){
const propertiesResponse=await this.sendCommand('Runtime.getProperties',{
objectId,
accessorPropertiesOnly:true,
generatePreview:false,
ownProperties:false});


const propertyForName=propertiesResponse.result.
find(property=>property.name===propName);

if(propertyForName&&propertyForName.value){
return propertyForName.value.value;
}else{
return null;
}
}








async getRequestContent(requestId,timeout=1000){
requestId=NetworkRequest.getRequestIdForBackend(requestId);



this.setNextProtocolTimeout(timeout);
const result=await this.sendCommand('Network.getResponseBody',{requestId});
return result.body;
}






queryPermissionState(name){
const expressionToEval=`
      navigator.permissions.query({name: '${name}'}).then(result => {
        return result.state;
      })
    `;

return this.evaluateAsync(expressionToEval);
}





async querySelector(selector){
const documentResponse=await this.sendCommand('DOM.getDocument');
const rootNodeId=documentResponse.root.nodeId;

const targetNode=await this.sendCommand('DOM.querySelector',{
nodeId:rootNodeId,
selector});


if(targetNode.nodeId===0){
return null;
}
return new LHElement(targetNode,this);
}





async querySelectorAll(selector){
const documentResponse=await this.sendCommand('DOM.getDocument');
const rootNodeId=documentResponse.root.nodeId;

const targetNodeList=await this.sendCommand('DOM.querySelectorAll',{
nodeId:rootNodeId,
selector});



const elementList=[];
targetNodeList.nodeIds.forEach(nodeId=>{
if(nodeId!==0){
elementList.push(new LHElement({nodeId},this));
}
});
return elementList;
}







getElementsInDocument(pierce=true){
return this.getNodesInDocument(pierce).
then(nodes=>nodes.
filter(node=>node.nodeType===1).
map(node=>new LHElement({nodeId:node.nodeId},this)));

}







async getNodesInDocument(pierce=true){
const flattenedDocument=await this.sendCommand('DOM.getFlattenedDocument',
{depth:-1,pierce});

return flattenedDocument.nodes?flattenedDocument.nodes:[];
}





scrollTo(position){
const scrollExpression=`window.scrollTo(${position.x}, ${position.y})`;
return this.evaluateAsync(scrollExpression,{useIsolation:true});
}




getScrollPosition(){
return this.evaluateAsync(`({x: window.scrollX, y: window.scrollY})`,{useIsolation:true});
}





async beginTrace(settings){
const additionalCategories=settings&&settings.additionalTraceCategories&&
settings.additionalTraceCategories.split(',')||[];
const traceCategories=this._traceCategories.concat(additionalCategories);



const milestone=(await this.getBrowserVersion()).milestone;
if(milestone<71){
const toplevelIndex=traceCategories.indexOf('disabled-by-default-lighthouse');
traceCategories[toplevelIndex]='toplevel';
}

const uniqueCategories=Array.from(new Set(traceCategories));


if(this.isDomainEnabled('CSS')){
throw new Error('CSS domain enabled when starting trace');
}
if(this.isDomainEnabled('DOM')){
throw new Error('DOM domain enabled when starting trace');
}


return this.sendCommand('Page.enable').
then(_=>this.sendCommand('Tracing.start',{
categories:uniqueCategories.join(','),
options:'sampling-frequency=10000'}));

}




endTrace(){

const traceEvents=[];





const dataListener=function(data){
traceEvents.push(...data.value);
};
this.on('Tracing.dataCollected',dataListener);

return new Promise((resolve,reject)=>{
this.once('Tracing.tracingComplete',_=>{
this.off('Tracing.dataCollected',dataListener);
resolve({traceEvents});
});

this.sendCommand('Tracing.end').catch(reject);
});
}




beginDevtoolsLog(){
this._devtoolsLog.reset();
this._devtoolsLog.beginRecording();
}





endDevtoolsLog(){
this._devtoolsLog.endRecording();
return this._devtoolsLog.messages;
}




enableRuntimeEvents(){
return this.sendCommand('Runtime.enable');
}







async enableAsyncStacks(){
await this.sendCommand('Debugger.enable');
await this.sendCommand('Debugger.setSkipAllPauses',{skip:true});
await this.sendCommand('Debugger.setAsyncCallStackDepth',{maxDepth:8});
}





async beginEmulation(settings){
await emulation.emulate(this,settings);
await this.setThrottling(settings,{useThrottling:true});
}






async setThrottling(settings,passConfig){
if(settings.throttlingMethod!=='devtools'){
return emulation.clearAllNetworkEmulation(this);
}

const cpuPromise=passConfig.useThrottling?
emulation.enableCPUThrottling(this,settings.throttling):
emulation.disableCPUThrottling(this);
const networkPromise=passConfig.useThrottling?
emulation.enableNetworkThrottling(this,settings.throttling):
emulation.clearAllNetworkEmulation(this);

await Promise.all([cpuPromise,networkPromise]);
}





async goOffline(){
await this.sendCommand('Network.enable');
await emulation.goOffline(this);
this.online=false;
}






async goOnline(options){
await this.setThrottling(options.settings,options.passConfig);
this.online=true;
}





async cleanBrowserCaches(){
const status={msg:'Cleaning browser cache',id:'lh:driver:cleanBrowserCaches'};
log.time(status);


await this.sendCommand('Network.clearBrowserCache');

await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:true});
await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:false});

log.timeEnd(status);
}





async setExtraHTTPHeaders(headers){
if(!headers){
return;
}

return this.sendCommand('Network.setExtraHTTPHeaders',{headers});
}





async clearDataForOrigin(url){
const origin=new URL(url).origin;



const typesToClear=[
'appcache',

'file_systems',
'indexeddb',
'local_storage',
'shader_cache',
'websql',
'service_workers',
'cache_storage'].
join(',');



this.setNextProtocolTimeout(5000);

try{
await this.sendCommand('Storage.clearDataForOrigin',{
origin:origin,
storageTypes:typesToClear});

}catch(err){
if(err.code==='PROTOCOL_TIMEOUT'){
log.warn('Driver','clearDataForOrigin timed out');
}else{
throw err;
}
}
}






async cacheNatives(){
await this.evaluateScriptOnNewDocument(`
        window.__nativePromise = Promise;
        window.__nativeError = Error;
        window.__nativeURL = URL;
        window.__ElementMatches = Element.prototype.matches;
        window.__perfNow = performance.now.bind(performance);
    `);
}





async registerPerformanceObserver(){
const scriptStr=`(${pageFunctions.registerPerformanceObserverInPageString})()`;
await this.evaluateScriptOnNewDocument(scriptStr);
}





blockUrlPatterns(urls){
return this.sendCommand('Network.setBlockedURLs',{urls}).
catch(err=>{

if(!/wasn't found/.test(err.message)){
throw err;
}
});
}






async dismissJavaScriptDialogs(){
this.on('Page.javascriptDialogOpening',data=>{
log.warn('Driver',`${data.type} dialog opened by the page automatically suppressed.`);

this.sendCommand('Page.handleJavaScriptDialog',{
accept:true,
promptText:'Lighthouse prompt response'}).
catch(err=>log.warn('Driver',err));
});

await this.sendCommand('Page.enable');
}}


module.exports=Driver;

}).call(this,require("buffer").Buffer);
},{"../config/constants.js":46,"../lib/emulation.js":65,"../lib/lh-element.js":70,"../lib/lh-error.js":71,"../lib/network-recorder.js":74,"../lib/network-request.js":75,"../lib/page-functions.js":76,"../lib/url-shim.js":"url","./connections/connection.js":48,"./devtools-log.js":50,"buffer":102,"events":108,"lighthouse-logger":125}],52:[function(require,module,exports){





'use strict';

const log=require('lighthouse-logger');
const manifestParser=require('../lib/manifest-parser.js');
const stacksGatherer=require('../lib/stack-collector.js');
const LHError=require('../lib/lh-error.js');
const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
const NetworkRecorder=require('../lib/network-recorder.js');
const constants=require('../config/constants.js');
const i18n=require('../lib/i18n/i18n.js');















class GatherRunner{









static async loadBlank(driver,url=constants.defaultPassConfig.blankPage){
const status={msg:'Resetting state with about:blank',id:'lh:gather:loadBlank'};
log.time(status);
await driver.gotoURL(url,{waitForNavigated:true});
log.timeEnd(status);
}











static async loadPage(driver,passContext){
const gatherers=passContext.passConfig.gatherers;
const status={
msg:'Loading page & waiting for onload',
id:`lh:gather:loadPage-${passContext.passConfig.passName}`,
args:[gatherers.map(g=>g.instance.name).join(', ')]};

log.time(status);
try{
const finalUrl=await driver.gotoURL(passContext.url,{
waitForFCP:passContext.passConfig.recordTrace,
waitForLoad:true,
passContext});

passContext.url=finalUrl;
}catch(err){

if(err.code==='NO_FCP'||err.code==='PAGE_HUNG'){
return{navigationError:err};
}

throw err;
}finally{
log.timeEnd(status);
}

return{};
}






static async setupDriver(driver,options){
const status={msg:'Initializing…',id:'lh:gather:setupDriver'};
log.time(status);
const resetStorage=!options.settings.disableStorageReset;
await driver.assertNoSameOriginServiceWorkerClients(options.requestedUrl);
await driver.beginEmulation(options.settings);
await driver.enableRuntimeEvents();
await driver.enableAsyncStacks();
await driver.cacheNatives();
await driver.registerPerformanceObserver();
await driver.dismissJavaScriptDialogs();
if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
log.timeEnd(status);
}







static async disposeDriver(driver,options){
const status={msg:'Disconnecting from browser...',id:'lh:gather:disconnect'};

log.time(status);
try{

const resetStorage=!options.settings.disableStorageReset;
if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);

await driver.disconnect();
}catch(err){


if(!/close\/.*status: (500|404)$/.test(err.message)){
log.error('GatherRunner disconnect',err.message);
}
}
log.timeEnd(status);
}






static getNetworkError(mainRecord){
if(!mainRecord){
return new LHError(LHError.errors.NO_DOCUMENT_REQUEST);
}else if(mainRecord.failed){
const netErr=mainRecord.localizedFailDescription;


if(
netErr==='net::ERR_NAME_NOT_RESOLVED'||
netErr==='net::ERR_NAME_RESOLUTION_FAILED'||
netErr.startsWith('net::ERR_DNS_'))
{
return new LHError(LHError.errors.DNS_FAILURE);
}else{
return new LHError(
LHError.errors.FAILED_DOCUMENT_REQUEST,
{errorDetails:netErr});

}
}else if(mainRecord.hasErrorStatusCode()){
return new LHError(
LHError.errors.ERRORED_DOCUMENT_REQUEST,
{statusCode:`${mainRecord.statusCode}`});

}
}







static getInterstitialError(mainRecord,networkRecords){

if(!mainRecord)return undefined;

const interstitialRequest=networkRecords.
find(record=>record.documentURL.startsWith('chrome-error://'));

if(!interstitialRequest)return undefined;




if(!mainRecord.failed)return undefined;


if(mainRecord.localizedFailDescription.startsWith('net::ERR_CERT')){
return new LHError(LHError.errors.INSECURE_DOCUMENT_REQUEST,{securityMessages:
mainRecord.localizedFailDescription});
}


return new LHError(LHError.errors.CHROME_INTERSTITIAL_ERROR);
}









static getPageLoadError(passContext,loadData,navigationError){
const{networkRecords}=loadData;

let mainRecord;
try{
mainRecord=NetworkAnalyzer.findMainDocument(networkRecords,passContext.url);
}catch(_){}

const networkError=GatherRunner.getNetworkError(mainRecord);
const interstitialError=GatherRunner.getInterstitialError(mainRecord,networkRecords);


if(!passContext.driver.online)return;


if(interstitialError)return interstitialError;




if(networkError)return networkError;




return navigationError;
}







static async setupPassNetwork(passContext){
const status={msg:'Setting up network for the pass trace',id:`lh:gather:setupPassNetwork`};
log.time(status);

const passConfig=passContext.passConfig;
await passContext.driver.setThrottling(passContext.settings,passConfig);

const blockedUrls=(passContext.passConfig.blockedUrlPatterns||[]).
concat(passContext.settings.blockedUrlPatterns||[]);




await passContext.driver.blockUrlPatterns(blockedUrls);
await passContext.driver.setExtraHTTPHeaders(passContext.settings.extraHeaders);

log.timeEnd(status);
}






static async beginRecording(passContext){
const status={msg:'Beginning devtoolsLog and trace',id:'lh:gather:beginRecording'};
log.time(status);

const{driver,passConfig,settings}=passContext;


await driver.beginDevtoolsLog();

if(passConfig.recordTrace){
await driver.beginTrace(settings);
}

log.timeEnd(status);
}







static async endRecording(passContext){
const{driver,passConfig}=passContext;

let trace;
if(passConfig.recordTrace){
const status={msg:'Gathering trace',id:`lh:gather:getTrace`};
log.time(status);
trace=await driver.endTrace();
log.timeEnd(status);
}

const status={
msg:'Gathering devtoolsLog & network records',
id:`lh:gather:getDevtoolsLog`};

log.time(status);
const devtoolsLog=driver.endDevtoolsLog();
const networkRecords=NetworkRecorder.recordsFromLogs(devtoolsLog);
log.timeEnd(status);

return{
networkRecords,
devtoolsLog,
trace};

}







static async beforePass(passContext,gathererResults){
const bpStatus={msg:`Running beforePass methods`,id:`lh:gather:beforePass`};
log.time(bpStatus,'verbose');

for(const gathererDefn of passContext.passConfig.gatherers){
const gatherer=gathererDefn.instance;

passContext.options=gathererDefn.options||{};
const status={
msg:`Gathering setup: ${gatherer.name}`,
id:`lh:gather:beforePass:${gatherer.name}`};

log.time(status,'verbose');
const artifactPromise=Promise.resolve().then(_=>gatherer.beforePass(passContext));
gathererResults[gatherer.name]=[artifactPromise];
await artifactPromise.catch(()=>{});
log.timeEnd(status);
}
log.timeEnd(bpStatus);
}







static async pass(passContext,gathererResults){
const config=passContext.passConfig;
const gatherers=config.gatherers;

const pStatus={msg:`Running pass methods`,id:`lh:gather:pass`};
log.time(pStatus,'verbose');

for(const gathererDefn of gatherers){
const gatherer=gathererDefn.instance;

passContext.options=gathererDefn.options||{};
const status={
msg:`Gathering in-page: ${gatherer.name}`,
id:`lh:gather:pass:${gatherer.name}`};

log.time(status);
const artifactPromise=Promise.resolve().then(_=>gatherer.pass(passContext));

const gathererResult=gathererResults[gatherer.name]||[];
gathererResult.push(artifactPromise);
gathererResults[gatherer.name]=gathererResult;
await artifactPromise.catch(()=>{});
}

log.timeEnd(pStatus);
}








static async afterPass(passContext,loadData,gathererResults){
const driver=passContext.driver;
const config=passContext.passConfig;
const gatherers=config.gatherers;

const apStatus={msg:`Running afterPass methods`,id:`lh:gather:afterPass`};
log.time(apStatus,'verbose');



const scrollPosition=await driver.getScrollPosition();

for(const gathererDefn of gatherers){
const gatherer=gathererDefn.instance;
const status={
msg:`Gathering: ${gatherer.name}`,
id:`lh:gather:afterPass:${gatherer.name}`};

log.time(status);


passContext.options=gathererDefn.options||{};
const artifactPromise=Promise.resolve().
then(_=>gatherer.afterPass(passContext,loadData));

const gathererResult=gathererResults[gatherer.name]||[];
gathererResult.push(artifactPromise);
gathererResults[gatherer.name]=gathererResult;
await artifactPromise.catch(()=>{});
await driver.scrollTo(scrollPosition);
log.timeEnd(status);
}
log.timeEnd(apStatus);
}









static async collectArtifacts(gathererResults){

const gathererArtifacts={};

const resultsEntries=Object.entries(gathererResults);
for(const[gathererName,phaseResultsPromises]of resultsEntries){
try{
const phaseResults=await Promise.all(phaseResultsPromises);

const definedResults=phaseResults.filter(element=>element!==undefined);
const artifact=definedResults[definedResults.length-1];

gathererArtifacts[gathererName]=artifact;
}catch(err){

gathererArtifacts[gathererName]=err;
}

if(gathererArtifacts[gathererName]===undefined){
throw new Error(`${gathererName} failed to provide an artifact.`);
}
}

return{
artifacts:gathererArtifacts};

}







static async initializeBaseArtifacts(options){
const hostUserAgent=(await options.driver.getBrowserVersion()).userAgent;

const{emulatedFormFactor}=options.settings;

const IsMobileHost=hostUserAgent.includes('Android')||hostUserAgent.includes('Mobile');
const TestedAsMobileDevice=emulatedFormFactor==='mobile'||
emulatedFormFactor!=='desktop'&&IsMobileHost;

return{
fetchTime:new Date().toJSON(),
LighthouseRunWarnings:[],
TestedAsMobileDevice,
HostUserAgent:hostUserAgent,
NetworkUserAgent:'',
BenchmarkIndex:0,
WebAppManifest:null,
Stacks:[],
traces:{},
devtoolsLogs:{},
settings:options.settings,
URL:{requestedUrl:options.requestedUrl,finalUrl:options.requestedUrl},
Timing:[],
PageLoadError:null};

}







static async populateBaseArtifacts(passContext){
const baseArtifacts=passContext.baseArtifacts;


baseArtifacts.URL.finalUrl=passContext.url;


baseArtifacts.WebAppManifest=await GatherRunner.getWebAppManifest(passContext);

baseArtifacts.Stacks=await stacksGatherer(passContext);


const devtoolsLog=baseArtifacts.devtoolsLogs[passContext.passConfig.passName];
const userAgentEntry=devtoolsLog.find(entry=>
entry.method==='Network.requestWillBeSent'&&
!!entry.params.request.headers['User-Agent']);

if(userAgentEntry){

baseArtifacts.NetworkUserAgent=userAgentEntry.params.request.headers['User-Agent'];
}
}





static finalizeBaseArtifacts(baseArtifacts){

baseArtifacts.LighthouseRunWarnings=Array.from(new Set(baseArtifacts.LighthouseRunWarnings));


baseArtifacts.Timing=log.getTimeEntries();
}













static async getWebAppManifest(passContext){
const response=await passContext.driver.getAppManifest();
if(!response)return null;
return manifestParser(response.data,response.url,passContext.url);
}






static async run(passConfigs,options){
const driver=options.driver;


const artifacts={};

try{
await driver.connect();


await GatherRunner.loadBlank(driver);

const baseArtifacts=await GatherRunner.initializeBaseArtifacts(options);
baseArtifacts.BenchmarkIndex=await options.driver.getBenchmarkIndex();

await GatherRunner.setupDriver(driver,options);

let isFirstPass=true;
for(const passConfig of passConfigs){

const passContext={
driver,
url:options.requestedUrl,
settings:options.settings,
passConfig,
baseArtifacts,
LighthouseRunWarnings:baseArtifacts.LighthouseRunWarnings};

const passResults=await GatherRunner.runPass(passContext);
Object.assign(artifacts,passResults.artifacts);


if(passResults.pageLoadError){
baseArtifacts.PageLoadError=passResults.pageLoadError;
break;
}

if(isFirstPass){
await GatherRunner.populateBaseArtifacts(passContext);
isFirstPass=false;
}
}

await GatherRunner.disposeDriver(driver,options);
GatherRunner.finalizeBaseArtifacts(baseArtifacts);
return{...baseArtifacts,...artifacts};
}catch(err){

GatherRunner.disposeDriver(driver,options);

throw err;
}
}






static isPerfPass(passContext){
const{settings,passConfig}=passContext;
return!settings.disableStorageReset&&passConfig.recordTrace&&passConfig.useThrottling;
}







static _addLoadDataToBaseArtifacts(passContext,loadData,passName){
const baseArtifacts=passContext.baseArtifacts;
baseArtifacts.devtoolsLogs[passName]=loadData.devtoolsLog;
if(loadData.trace)baseArtifacts.traces[passName]=loadData.trace;
}






static async runPass(passContext){

const gathererResults={};
const{driver,passConfig}=passContext;


await GatherRunner.loadBlank(driver,passConfig.blankPage);
await GatherRunner.setupPassNetwork(passContext);
const isPerfPass=GatherRunner.isPerfPass(passContext);
if(isPerfPass)await driver.cleanBrowserCaches();
await GatherRunner.beforePass(passContext,gathererResults);


await GatherRunner.beginRecording(passContext);
const{navigationError:possibleNavError}=await GatherRunner.loadPage(driver,passContext);
await GatherRunner.pass(passContext,gathererResults);
const loadData=await GatherRunner.endRecording(passContext);


await driver.setThrottling(passContext.settings,{useThrottling:false});


const pageLoadError=GatherRunner.getPageLoadError(passContext,loadData,possibleNavError);
if(pageLoadError){
const localizedMessage=i18n.getFormatted(pageLoadError.friendlyMessage,
passContext.settings.locale);
log.error('GatherRunner',localizedMessage,passContext.url);

passContext.LighthouseRunWarnings.push(pageLoadError.friendlyMessage);
GatherRunner._addLoadDataToBaseArtifacts(passContext,loadData,
`pageLoadError-${passConfig.passName}`);

return{artifacts:{},pageLoadError};
}


GatherRunner._addLoadDataToBaseArtifacts(passContext,loadData,passConfig.passName);


await GatherRunner.afterPass(passContext,loadData,gathererResults);
return GatherRunner.collectArtifacts(gathererResults);
}}


module.exports=GatherRunner;

},{"../config/constants.js":46,"../lib/dependency-graph/simulator/network-analyzer.js":62,"../lib/i18n/i18n.js":66,"../lib/lh-error.js":71,"../lib/manifest-parser.js":72,"../lib/network-recorder.js":74,"../lib/stack-collector.js":79,"lighthouse-logger":125}],53:[function(require,module,exports){





'use strict';













class Gatherer{



get name(){

return this.constructor.name;
}








beforePass(passContext){}







pass(passContext){}









afterPass(passContext,loadData){}}




module.exports=Gatherer;

},{}],54:[function(require,module,exports){





'use strict';

const Runner=require('./runner.js');
const log=require('lighthouse-logger');
const ChromeProtocol=require('./gather/connections/cri.js');
const Config=require('./config/config.js');


























async function lighthouse(url,flags={},configJSON,connection){

flags.logLevel=flags.logLevel||'error';
log.setLevel(flags.logLevel);

const config=generateConfig(configJSON,flags);

connection=connection||new ChromeProtocol(flags.port,flags.hostname);


return Runner.run(connection,{url,config});
}









function generateConfig(configJson,flags){
return new Config(configJson,flags);
}

lighthouse.generateConfig=generateConfig;
lighthouse.getAuditList=Runner.getAuditList;
lighthouse.traceCategories=require('./gather/driver.js').traceCategories;
lighthouse.Audit=require('./audits/audit.js');
lighthouse.Gatherer=require('./gather/gatherers/gatherer.js');
lighthouse.NetworkRecords=require('./computed/network-records.js');

module.exports=lighthouse;

},{"./audits/audit.js":3,"./computed/network-records.js":34,"./config/config.js":45,"./gather/connections/cri.js":101,"./gather/driver.js":51,"./gather/gatherers/gatherer.js":53,"./runner.js":89,"lighthouse-logger":125}],55:[function(require,module,exports){





'use strict';

const isEqual=require('lodash.isequal');






class ArbitraryEqualityMap{
constructor(){
this._equalsFn=ArbitraryEqualityMap.deepEquals;

this._entries=[];
}




setEqualityFn(equalsFn){
this._equalsFn=equalsFn;
}





has(key){
return this._findIndexOf(key)!==-1;
}





get(key){
const entry=this._entries[this._findIndexOf(key)];
return entry&&entry.value;
}





set(key,value){
let index=this._findIndexOf(key);
if(index===-1)index=this._entries.length;
this._entries[index]={key,value};
}





_findIndexOf(key){
for(let i=0;i<this._entries.length;i++){
if(this._equalsFn(key,this._entries[i].key))return i;
}

return-1;
}









static deepEquals(objA,objB){
return isEqual(objA,objB);
}}


module.exports=ArbitraryEqualityMap;

},{"lodash.isequal":142}],56:[function(require,module,exports){
(function(process){





'use strict';

const fs=require('fs');
const path=require('path');
const log=require('lighthouse-logger');
const stream=require('stream');
const Simulator=require('./dependency-graph/simulator/simulator.js');
const lanternTraceSaver=require('./lantern-trace-saver.js');
const Metrics=require('./traces/pwmetrics-events.js');
const rimraf=require('rimraf');
const mkdirp=require('mkdirp');
const NetworkAnalysisComputed=require('../computed/network-analysis.js');
const LoadSimulatorComputed=require('../computed/load-simulator.js');
const LHError=require('../lib/lh-error.js');

const artifactsFilename='artifacts.json';
const traceSuffix='.trace.json';
const devtoolsLogSuffix='.devtoolslog.json';















function loadArtifacts(basePath){
log.log('Reading artifacts from disk:',basePath);

if(!fs.existsSync(basePath)){
throw new Error('No saved artifacts found at '+basePath);
}


const artifactsStr=fs.readFileSync(path.join(basePath,artifactsFilename),'utf8');

const artifacts=JSON.parse(artifactsStr,LHError.parseReviver);

const filenames=fs.readdirSync(basePath);


artifacts.devtoolsLogs={};
filenames.filter(f=>f.endsWith(devtoolsLogSuffix)).forEach(filename=>{
const passName=filename.replace(devtoolsLogSuffix,'');
const devtoolsLog=JSON.parse(fs.readFileSync(path.join(basePath,filename),'utf8'));
artifacts.devtoolsLogs[passName]=devtoolsLog;
});


artifacts.traces={};
filenames.filter(f=>f.endsWith(traceSuffix)).forEach(filename=>{
const file=fs.readFileSync(path.join(basePath,filename),{encoding:'utf-8'});
const trace=JSON.parse(file);
const passName=filename.replace(traceSuffix,'');
artifacts.traces[passName]=Array.isArray(trace)?{traceEvents:trace}:trace;
});

if(Array.isArray(artifacts.Timing)){


artifacts.Timing.forEach(entry=>entry.gather=true);
}
return artifacts;
}







function stringifyReplacer(key,value){

if(value instanceof Error){
return LHError.stringifyReplacer(value);
}

return value;
}








async function saveArtifacts(artifacts,basePath){
const status={msg:'Saving artifacts',id:'lh:assetSaver:saveArtifacts'};
log.time(status);
mkdirp.sync(basePath);
rimraf.sync(`${basePath}/*${traceSuffix}`);
rimraf.sync(`${basePath}/${artifactsFilename}`);

const{traces,devtoolsLogs,...restArtifacts}=artifacts;


for(const[passName,trace]of Object.entries(traces)){
await saveTrace(trace,`${basePath}/${passName}${traceSuffix}`);
}


for(const[passName,devtoolsLog]of Object.entries(devtoolsLogs)){
const log=JSON.stringify(devtoolsLog);
fs.writeFileSync(`${basePath}/${passName}${devtoolsLogSuffix}`,log,'utf8');
}


const restArtifactsString=JSON.stringify(restArtifacts,stringifyReplacer,2);
fs.writeFileSync(`${basePath}/${artifactsFilename}`,restArtifactsString,'utf8');
log.log('Artifacts saved to disk in folder:',basePath);
log.timeEnd(status);
}







async function prepareAssets(artifacts,audits){
const passNames=Object.keys(artifacts.traces);

const assets=[];

for(const passName of passNames){
const trace=artifacts.traces[passName];
const devtoolsLog=artifacts.devtoolsLogs[passName];

const traceData=Object.assign({},trace);
if(audits){
const evts=new Metrics(traceData.traceEvents,audits).generateFakeEvents();
traceData.traceEvents=traceData.traceEvents.concat(evts);
}

assets.push({
passName,
traceData,
devtoolsLog});

}

return assets;
}







function*traceJsonGenerator(traceData){
const EVENTS_PER_ITERATION=500;
const keys=Object.keys(traceData);

yield'{\n';


yield'"traceEvents": [\n';
if(traceData.traceEvents.length>0){
const eventsIterator=traceData.traceEvents[Symbol.iterator]();

const firstEvent=eventsIterator.next().value;
yield`  ${JSON.stringify(firstEvent)}`;

let eventsRemaining=EVENTS_PER_ITERATION;
let eventsJSON='';
for(const event of eventsIterator){
eventsJSON+=`,\n  ${JSON.stringify(event)}`;
eventsRemaining--;
if(eventsRemaining===0){
yield eventsJSON;
eventsRemaining=EVENTS_PER_ITERATION;
eventsJSON='';
}
}
yield eventsJSON;
}
yield'\n]';


if(keys.length>1){
for(const key of keys){
if(key==='traceEvents')continue;

yield`,\n"${key}": ${JSON.stringify(traceData[key],null,2)}`;
}
}

yield'}\n';
}







function saveTrace(traceData,traceFilename){
return new Promise((resolve,reject)=>{
const traceIter=traceJsonGenerator(traceData);


const traceStream=new stream.Readable({
read(){
const next=traceIter.next();
this.push(next.done?null:next.value);
}});


const writeStream=fs.createWriteStream(traceFilename);
writeStream.on('finish',resolve);
writeStream.on('error',reject);

traceStream.pipe(writeStream);
});
}





async function saveLanternDebugTraces(pathWithBasename){
if(!process.env.LANTERN_DEBUG)return;

for(const[label,nodeTimings]of Simulator.ALL_NODE_TIMINGS){
if(lanternTraceSaver.simulationNamesToIgnore.includes(label))continue;

const traceFilename=`${pathWithBasename}-${label}${traceSuffix}`;
await saveTrace(lanternTraceSaver.convertNodeTimingsToTrace(nodeTimings),traceFilename);
log.log('saveAssets',`${label} lantern trace file streamed to disk: ${traceFilename}`);
}
}








async function saveAssets(artifacts,audits,pathWithBasename){
const allAssets=await prepareAssets(artifacts,audits);
const saveAll=allAssets.map(async(passAssets,index)=>{
const devtoolsLogFilename=`${pathWithBasename}-${index}${devtoolsLogSuffix}`;
fs.writeFileSync(devtoolsLogFilename,JSON.stringify(passAssets.devtoolsLog,null,2));
log.log('saveAssets','devtools log saved to disk: '+devtoolsLogFilename);

const streamTraceFilename=`${pathWithBasename}-${index}${traceSuffix}`;
log.log('saveAssets','streaming trace file to disk: '+streamTraceFilename);
await saveTrace(passAssets.traceData,streamTraceFilename);
log.log('saveAssets','trace file streamed to disk: '+streamTraceFilename);
});

await Promise.all(saveAll);
await saveLanternDebugTraces(pathWithBasename);
}






async function saveLanternNetworkData(devtoolsLog,outputPath){
const context={computedCache:new Map()};
const networkAnalysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
const lanternData=LoadSimulatorComputed.convertAnalysisToSaveableLanternData(networkAnalysis);

fs.writeFileSync(outputPath,JSON.stringify(lanternData));
}

module.exports={
saveArtifacts,
loadArtifacts,
saveAssets,
prepareAssets,
saveTrace,
saveLanternNetworkData,
stringifyReplacer};


}).call(this,require('_process'));
},{"../computed/load-simulator.js":10,"../computed/network-analysis.js":33,"../lib/lh-error.js":71,"./dependency-graph/simulator/simulator.js":63,"./lantern-trace-saver.js":69,"./traces/pwmetrics-events.js":86,"_process":158,"fs":101,"lighthouse-logger":125,"mkdirp":101,"path":156,"rimraf":101,"stream":183}],57:[function(require,module,exports){





'use strict';



















class BaseNode{



constructor(id){
this._id=id;
this._isMainDocument=false;

this._dependents=[];

this._dependencies=[];
}




get id(){
return this._id;
}




get type(){
throw new Error('Unimplemented');
}




get startTime(){
throw new Error('Unimplemented');
}




get endTime(){
throw new Error('Unimplemented');
}




setIsMainDocument(value){
this._isMainDocument=value;
}




isMainDocument(){
return this._isMainDocument;
}




getDependents(){
return this._dependents.slice();
}




getDependencies(){
return this._dependencies.slice();
}




getNumberOfDependencies(){
return this._dependencies.length;
}




getRootNode(){
let rootNode=this;
while(rootNode._dependencies.length){
rootNode=rootNode._dependencies[0];
}

return rootNode;
}




addDependent(node){
node.addDependency(this);
}




addDependency(node){
if(this._dependencies.includes(node)){
return;
}

node._dependents.push(this);
this._dependencies.push(node);
}




removeDependent(node){
node.removeDependency(this);
}




removeDependency(node){
if(!this._dependencies.includes(node)){
return;
}

const thisIndex=node._dependents.indexOf(this);
node._dependents.splice(thisIndex,1);
this._dependencies.splice(this._dependencies.indexOf(node),1);
}

removeAllDependencies(){
for(const node of this._dependencies.slice()){
this.removeDependency(node);
}
}





cloneWithoutRelationships(){
const node=new BaseNode(this.id);
node.setIsMainDocument(this._isMainDocument);
return node;
}








cloneWithRelationships(predicate){
const rootNode=this.getRootNode();


const idsToIncludedClones=new Map();


rootNode.traverse(node=>{
if(idsToIncludedClones.has(node.id))return;

if(predicate===undefined){

idsToIncludedClones.set(node.id,node.cloneWithoutRelationships());
return;
}

if(predicate(node)){

node.traverse(
node=>idsToIncludedClones.set(node.id,node.cloneWithoutRelationships()),

node=>node._dependencies.filter(parent=>!idsToIncludedClones.has(parent.id)));

}
});


rootNode.traverse(originalNode=>{
const clonedNode=idsToIncludedClones.get(originalNode.id);
if(!clonedNode)return;

for(const dependency of originalNode._dependencies){
const clonedDependency=idsToIncludedClones.get(dependency.id);
if(!clonedDependency)throw new Error('Dependency somehow not cloned');
clonedNode.addDependency(clonedDependency);
}
});

const clonedThisNode=idsToIncludedClones.get(this.id);
if(!clonedThisNode)throw new Error('Cloned graph missing node');
return clonedThisNode;
}











traverse(callback,getNextNodes){
if(!getNextNodes){
getNextNodes=node=>node.getDependents();
}



const queue=[[this]];
const visited=new Set([this.id]);

while(queue.length){


const traversalPath=queue.shift();
const node=traversalPath[0];
callback(node,traversalPath);

for(const nextNode of getNextNodes(node)){
if(visited.has(nextNode.id))continue;
visited.add(nextNode.id);

queue.push([nextNode,...traversalPath]);
}
}
}







static hasCycle(node,direction='both'){

if(direction==='both'){
return BaseNode.hasCycle(node,'dependents')||BaseNode.hasCycle(node,'dependencies');
}

const visited=new Set();

const currentPath=[];
const toVisit=[node];
const depthAdded=new Map([[node,0]]);


while(toVisit.length){



const currentNode=toVisit.pop();


if(currentPath.includes(currentNode))return true;

if(visited.has(currentNode))continue;



while(currentPath.length>depthAdded.get(currentNode))currentPath.pop();


visited.add(currentNode);
currentPath.push(currentNode);


const nodesToExplore=direction==='dependents'?
currentNode._dependents:
currentNode._dependencies;
for(const nextNode of nodesToExplore){
if(toVisit.includes(nextNode))continue;
toVisit.push(nextNode);
depthAdded.set(nextNode,currentPath.length);
}
}

return false;
}}


BaseNode.TYPES={
NETWORK:'network',
CPU:'cpu'};


module.exports=BaseNode;

},{}],58:[function(require,module,exports){





'use strict';

const BaseNode=require('./base-node.js');

class CPUNode extends BaseNode{




constructor(parentEvent,childEvents=[]){
const nodeId=`${parentEvent.tid}.${parentEvent.ts}`;
super(nodeId);

this._event=parentEvent;
this._childEvents=childEvents;
}

get type(){
return BaseNode.TYPES.CPU;
}




get startTime(){
return this._event.ts;
}




get endTime(){
return this._event.ts+this._event.dur;
}




get event(){
return this._event;
}




get childEvents(){
return this._childEvents;
}





didPerformLayout(){
return this._childEvents.some(evt=>evt.name==='Layout');
}




getEvaluateScriptURLs(){

const urls=new Set();
for(const event of this._childEvents){
if(event.name!=='EvaluateScript')continue;
if(!event.args.data||!event.args.data.url)continue;
urls.add(event.args.data.url);
}

return urls;
}




cloneWithoutRelationships(){
return new CPUNode(this._event,this._childEvents);
}}


module.exports=CPUNode;

},{"./base-node.js":57}],59:[function(require,module,exports){





'use strict';

const BaseNode=require('./base-node.js');
const NetworkRequest=require('../network-request.js');

class NetworkNode extends BaseNode{



constructor(networkRecord){
super(networkRecord.requestId);

this._record=networkRecord;
}

get type(){
return BaseNode.TYPES.NETWORK;
}




get startTime(){
return this._record.startTime*1000*1000;
}




get endTime(){
return this._record.endTime*1000*1000;
}




get record(){
return this._record;
}




get initiatorType(){
return this._record.initiator&&this._record.initiator.type;
}




get fromDiskCache(){
return!!this._record.fromDiskCache;
}




hasRenderBlockingPriority(){
const priority=this._record.priority;
const isScript=this._record.resourceType===NetworkRequest.TYPES.Script;
const isDocument=this._record.resourceType===NetworkRequest.TYPES.Document;
const isBlockingScript=priority==='High'&&isScript;
const isBlockingHtmlImport=priority==='High'&&isDocument;
return priority==='VeryHigh'||isBlockingScript||isBlockingHtmlImport;
}




cloneWithoutRelationships(){
const node=new NetworkNode(this._record);
node.setIsMainDocument(this._isMainDocument);
return node;
}}


module.exports=NetworkNode;

},{"../network-request.js":75,"./base-node.js":57}],60:[function(require,module,exports){





'use strict';

const NetworkAnalyzer=require('./network-analyzer.js');
const TcpConnection=require('./tcp-connection.js');

const DEFAULT_SERVER_RESPONSE_TIME=30;
const TLS_SCHEMES=['https','wss'];



const CONNECTIONS_PER_ORIGIN=6;

module.exports=class ConnectionPool{




constructor(records,options){
this._options=options;

this._records=records;

this._connectionsByOrigin=new Map();

this._connectionsByRecord=new Map();
this._connectionsInUse=new Set();
this._connectionReusedByRequestId=NetworkAnalyzer.estimateIfConnectionWasReused(records,{
forceCoarseEstimates:true});


this._initializeConnections();
}




connectionsInUse(){
return Array.from(this._connectionsInUse);
}

_initializeConnections(){
const connectionReused=this._connectionReusedByRequestId;
const additionalRttByOrigin=this._options.additionalRttByOrigin;
const serverResponseTimeByOrigin=this._options.serverResponseTimeByOrigin;

const recordsByOrigin=NetworkAnalyzer.groupByOrigin(this._records);
for(const[origin,records]of recordsByOrigin.entries()){
const connections=[];
const additionalRtt=additionalRttByOrigin.get(origin)||0;
const responseTime=serverResponseTimeByOrigin.get(origin)||DEFAULT_SERVER_RESPONSE_TIME;

for(const record of records){
if(connectionReused.get(record.requestId))continue;

const isTLS=TLS_SCHEMES.includes(record.parsedURL.scheme);
const isH2=record.protocol==='h2';
const connection=new TcpConnection(
this._options.rtt+additionalRtt,
this._options.throughput,
responseTime,
isTLS,
isH2);


connections.push(connection);
}

if(!connections.length){
throw new Error(`Could not find a connection for origin: ${origin}`);
}


while(connections.length<CONNECTIONS_PER_ORIGIN)connections.push(connections[0].clone());

this._connectionsByOrigin.set(origin,connections);
}
}





_findAvailableConnectionWithLargestCongestionWindow(connections,options){
const{ignoreConnectionReused,observedConnectionWasReused}=options;


let maxConnection=null;
for(let i=0;i<connections.length;i++){
const connection=connections[i];





if(!ignoreConnectionReused&&connection._warmed!==observedConnectionWasReused){
continue;
}


if(this._connectionsInUse.has(connection)){
continue;
}


const currentMax=maxConnection&&maxConnection.congestionWindow||-Infinity;
if(connection.congestionWindow>currentMax)maxConnection=connection;
}

return maxConnection;
}













acquire(record,options={}){
if(this._connectionsByRecord.has(record))throw new Error('Record already has a connection');

const origin=record.parsedURL.securityOrigin;
const observedConnectionWasReused=!!this._connectionReusedByRequestId.get(record.requestId);
const connections=this._connectionsByOrigin.get(origin)||[];
const connectionToUse=this._findAvailableConnectionWithLargestCongestionWindow(connections,{
ignoreConnectionReused:options.ignoreConnectionReused,
observedConnectionWasReused});


if(!connectionToUse)return null;

this._connectionsInUse.add(connectionToUse);
this._connectionsByRecord.set(record,connectionToUse);
return connectionToUse;
}








acquireActiveConnectionFromRecord(record){
const activeConnection=this._connectionsByRecord.get(record);
if(!activeConnection)throw new Error('Could not find an active connection for record');

return activeConnection;
}




release(record){
const connection=this._connectionsByRecord.get(record);
this._connectionsByRecord.delete(record);
this._connectionsInUse.delete(connection);
}};


},{"./network-analyzer.js":62,"./tcp-connection.js":64}],61:[function(require,module,exports){





'use strict';






const DNS_RESOLUTION_RTT_MULTIPLIER=2;

class DNSCache{



constructor({rtt}){
this._rtt=rtt;


this._resolvedDomainNames=new Map();
}






getTimeUntilResolution(request,options){
const{requestedAt=0,shouldUpdateCache=false}=options||{};

const domain=request.parsedURL.host;
const cacheEntry=this._resolvedDomainNames.get(domain);
let timeUntilResolved=this._rtt*DNSCache.RTT_MULTIPLIER;
if(cacheEntry){
const timeUntilCachedIsResolved=Math.max(cacheEntry.resolvedAt-requestedAt,0);
timeUntilResolved=Math.min(timeUntilCachedIsResolved,timeUntilResolved);
}

const resolvedAt=requestedAt+timeUntilResolved;
if(shouldUpdateCache)this._updateCacheResolvedAtIfNeeded(request,resolvedAt);

return timeUntilResolved;
}





_updateCacheResolvedAtIfNeeded(request,resolvedAt){
const domain=request.parsedURL.host;
const cacheEntry=this._resolvedDomainNames.get(domain)||{resolvedAt};
cacheEntry.resolvedAt=Math.min(cacheEntry.resolvedAt,resolvedAt);
this._resolvedDomainNames.set(domain,cacheEntry);
}








setResolvedAt(domain,resolvedAt){
this._resolvedDomainNames.set(domain,{resolvedAt});
}}


DNSCache.RTT_MULTIPLIER=DNS_RESOLUTION_RTT_MULTIPLIER;

module.exports=DNSCache;

},{}],62:[function(require,module,exports){





'use strict';

const INITIAL_CWD=14*1024;
const NetworkRequest=require('../../network-request.js');
const URL=require('../../url-shim.js');


const DEFAULT_SERVER_RESPONSE_PERCENTAGE=0.4;






const SERVER_RESPONSE_PERCENTAGE_OF_TTFB={
Document:0.9,
XHR:0.9,
Fetch:0.9};


class NetworkAnalyzer{



static get SUMMARY(){
return'__SUMMARY__';
}





static groupByOrigin(records){
const grouped=new Map();
records.forEach(item=>{
const key=item.parsedURL.securityOrigin;
const group=grouped.get(key)||[];
group.push(item);
grouped.set(key,group);
});
return grouped;
}





static getSummary(values){
values.sort((a,b)=>a-b);

return{
min:values[0],
max:values[values.length-1],
avg:values.reduce((a,b)=>a+b,0)/values.length,
median:values[Math.floor((values.length-1)/2)]};

}





static summarize(values){
const summaryByKey=new Map();
const allEstimates=[];
for(const[key,estimates]of values){
summaryByKey.set(key,NetworkAnalyzer.getSummary(estimates));
allEstimates.push(...estimates);
}

summaryByKey.set(NetworkAnalyzer.SUMMARY,NetworkAnalyzer.getSummary(allEstimates));
return summaryByKey;
}








static _estimateValueByOrigin(records,iteratee){
const connectionWasReused=NetworkAnalyzer.estimateIfConnectionWasReused(records);
const groupedByOrigin=NetworkAnalyzer.groupByOrigin(records);

const estimates=new Map();
for(const[origin,originRecords]of groupedByOrigin.entries()){

let originEstimates=[];

for(const record of originRecords){
const timing=record.timing;
if(!timing)continue;

const value=iteratee({
record,
timing,
connectionReused:connectionWasReused.get(record.requestId)});

if(typeof value!=='undefined'){
originEstimates=originEstimates.concat(value);
}
}

if(!originEstimates.length)continue;
estimates.set(origin,originEstimates);
}

return estimates;
}








static _estimateRTTByOriginViaTCPTiming(records){
return NetworkAnalyzer._estimateValueByOrigin(records,({timing,connectionReused})=>{
if(connectionReused)return;



if(timing.sslStart>0&&timing.sslEnd>0){
return[timing.connectEnd-timing.sslStart,timing.sslStart-timing.connectStart];
}else if(timing.connectStart>0&&timing.connectEnd>0){
return timing.connectEnd-timing.connectStart;
}
});
}









static _estimateRTTByOriginViaDownloadTiming(records){
return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
if(connectionReused)return;

if(record.transferSize<=INITIAL_CWD)return;
if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;


const totalTime=(record.endTime-record.startTime)*1000;
const downloadTimeAfterFirstByte=totalTime-timing.receiveHeadersEnd;
const numberOfRoundTrips=Math.log2(record.transferSize/INITIAL_CWD);



if(numberOfRoundTrips>5)return;
return downloadTimeAfterFirstByte/numberOfRoundTrips;
});
}










static _estimateRTTByOriginViaSendStartTiming(records){
return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
if(connectionReused)return;
if(!Number.isFinite(timing.sendStart)||timing.sendStart<0)return;



let roundTrips=2;
if(record.parsedURL.scheme==='https')roundTrips+=1;
return timing.sendStart/roundTrips;
});
}










static _estimateRTTByOriginViaHeadersEndTiming(records){
return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
if(!record.resourceType)return;

const serverResponseTimePercentage=SERVER_RESPONSE_PERCENTAGE_OF_TTFB[record.resourceType]||
DEFAULT_SERVER_RESPONSE_PERCENTAGE;
const estimatedServerResponseTime=timing.receiveHeadersEnd*serverResponseTimePercentage;



let roundTrips=1;



if(!connectionReused){
roundTrips+=1;
if(record.parsedURL.scheme==='https')roundTrips+=1;
roundTrips+=1;
}


return Math.max((timing.receiveHeadersEnd-estimatedServerResponseTime)/roundTrips,3);
});
}








static _estimateResponseTimeByOrigin(records,rttByOrigin){
return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing})=>{
if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
if(!Number.isFinite(timing.sendEnd)||timing.sendEnd<0)return;

const ttfb=timing.receiveHeadersEnd-timing.sendEnd;
const origin=record.parsedURL.securityOrigin;
const rtt=rttByOrigin.get(origin)||rttByOrigin.get(NetworkAnalyzer.SUMMARY)||0;
return Math.max(ttfb-rtt,0);
});
}





static canTrustConnectionInformation(records){
const connectionIdWasStarted=new Map();
for(const record of records){
const started=connectionIdWasStarted.get(record.connectionId)||!record.connectionReused;
connectionIdWasStarted.set(record.connectionId,started);
}


if(connectionIdWasStarted.size<=1)return false;

return Array.from(connectionIdWasStarted.values()).every(started=>started);
}









static estimateIfConnectionWasReused(records,options){
const{forceCoarseEstimates=false}=options||{};


if(!forceCoarseEstimates&&NetworkAnalyzer.canTrustConnectionInformation(records)){

return new Map(records.map(record=>[record.requestId,!!record.connectionReused]));
}





const connectionWasReused=new Map();
const groupedByOrigin=NetworkAnalyzer.groupByOrigin(records);
for(const[_,originRecords]of groupedByOrigin.entries()){
const earliestReusePossible=originRecords.
map(record=>record.endTime).
reduce((a,b)=>Math.min(a,b),Infinity);

for(const record of originRecords){
connectionWasReused.set(
record.requestId,
record.startTime>=earliestReusePossible||record.protocol==='h2');

}

const firstRecord=originRecords.reduce((a,b)=>a.startTime>b.startTime?b:a);
connectionWasReused.set(firstRecord.requestId,false);
}

return connectionWasReused;
}










static estimateRTTByOrigin(records,options){
const{
forceCoarseEstimates=false,


coarseEstimateMultiplier=0.3,
useDownloadEstimates=true,
useSendStartEstimates=true,
useHeadersEndEstimates=true}=
options||{};

let estimatesByOrigin=NetworkAnalyzer._estimateRTTByOriginViaTCPTiming(records);
if(!estimatesByOrigin.size||forceCoarseEstimates){
estimatesByOrigin=new Map();
const estimatesViaDownload=NetworkAnalyzer._estimateRTTByOriginViaDownloadTiming(records);
const estimatesViaSendStart=NetworkAnalyzer._estimateRTTByOriginViaSendStartTiming(records);
const estimatesViaTTFB=NetworkAnalyzer._estimateRTTByOriginViaHeadersEndTiming(records);

for(const[origin,estimates]of estimatesViaDownload.entries()){
if(!useDownloadEstimates)continue;
estimatesByOrigin.set(origin,estimates);
}

for(const[origin,estimates]of estimatesViaSendStart.entries()){
if(!useSendStartEstimates)continue;
const existing=estimatesByOrigin.get(origin)||[];
estimatesByOrigin.set(origin,existing.concat(estimates));
}

for(const[origin,estimates]of estimatesViaTTFB.entries()){
if(!useHeadersEndEstimates)continue;
const existing=estimatesByOrigin.get(origin)||[];
estimatesByOrigin.set(origin,existing.concat(estimates));
}

for(const estimates of estimatesByOrigin.values()){
estimates.forEach((x,i)=>estimates[i]=x*coarseEstimateMultiplier);
}
}

if(!estimatesByOrigin.size)throw new Error('No timing information available');
return NetworkAnalyzer.summarize(estimatesByOrigin);
}









static estimateServerResponseTimeByOrigin(records,options){
let rttByOrigin=(options||{}).rttByOrigin;
if(!rttByOrigin){

rttByOrigin=new Map();

const rttSummaryByOrigin=NetworkAnalyzer.estimateRTTByOrigin(records,options);
for(const[origin,summary]of rttSummaryByOrigin.entries()){
rttByOrigin.set(origin,summary.min);
}
}

const estimatesByOrigin=NetworkAnalyzer._estimateResponseTimeByOrigin(records,rttByOrigin);
return NetworkAnalyzer.summarize(estimatesByOrigin);
}










static estimateThroughput(networkRecords){
let totalBytes=0;




const timeBoundaries=networkRecords.reduce((boundaries,record)=>{
const scheme=record.parsedURL&&record.parsedURL.scheme;


if(scheme==='data'||record.failed||!record.finished||
record.statusCode>300||!record.transferSize){
return boundaries;
}


totalBytes+=record.transferSize;
boundaries.push({time:record.responseReceivedTime,isStart:true});
boundaries.push({time:record.endTime,isStart:false});
return boundaries;
},[]).sort((a,b)=>a.time-b.time);

if(!timeBoundaries.length){
return Infinity;
}

let inflight=0;
let currentStart=0;
let totalDuration=0;

timeBoundaries.forEach(boundary=>{
if(boundary.isStart){
if(inflight===0){

currentStart=boundary.time;
}
inflight++;
}else{
inflight--;
if(inflight===0){

totalDuration+=boundary.time-currentStart;
}
}
});

return totalBytes*8/totalDuration;
}






static findMainDocument(records,finalURL){

if(finalURL){

const mainResource=records.find(request=>finalURL.startsWith(request.url)&&
URL.equalWithExcludedFragments(request.url,finalURL));
if(mainResource)return mainResource;

}

const documentRequests=records.filter(record=>record.resourceType===
NetworkRequest.TYPES.Document);
if(!documentRequests.length)throw new Error('Unable to identify the main resource');

return documentRequests.reduce((min,r)=>r.startTime<min.startTime?r:min);
}}


module.exports=NetworkAnalyzer;


















},{"../../network-request.js":75,"../../url-shim.js":"url"}],63:[function(require,module,exports){





'use strict';

const BaseNode=require('../base-node.js');
const TcpConnection=require('./tcp-connection.js');
const ConnectionPool=require('./connection-pool.js');
const DNSCache=require('./dns-cache.js');
const mobileSlow4G=require('../../../config/constants.js').throttling.mobileSlow4G;






const DEFAULT_MAXIMUM_CONCURRENT_REQUESTS=10;

const DEFAULT_LAYOUT_TASK_MULTIPLIER=0.5;

const DEFAULT_MAXIMUM_CPU_TASK_DURATION=10000;

const NodeState={
NotReadyToStart:0,
ReadyToStart:1,
InProgress:2,
Complete:3};



const ALL_SIMULATION_NODE_TIMINGS=new Map();

class Simulator{



constructor(options){

this._options=Object.assign(
{
rtt:mobileSlow4G.rttMs,
throughput:mobileSlow4G.throughputKbps*1024,
maximumConcurrentRequests:DEFAULT_MAXIMUM_CONCURRENT_REQUESTS,
cpuSlowdownMultiplier:mobileSlow4G.cpuSlowdownMultiplier,
layoutTaskMultiplier:DEFAULT_LAYOUT_TASK_MULTIPLIER,
additionalRttByOrigin:new Map(),
serverResponseTimeByOrigin:new Map()},

options);


this._rtt=this._options.rtt;
this._throughput=this._options.throughput;
this._maximumConcurrentRequests=Math.max(Math.min(
TcpConnection.maximumSaturatedConnections(this._rtt,this._throughput),
this._options.maximumConcurrentRequests),
1);
this._cpuSlowdownMultiplier=this._options.cpuSlowdownMultiplier;
this._layoutTaskMultiplier=this._cpuSlowdownMultiplier*this._options.layoutTaskMultiplier;

this._cachedNodeListByStartTime=[];


this._flexibleOrdering=false;

this._nodeTimings=new Map();

this._numberInProgressByType=new Map();

this._nodes={};
this._dns=new DNSCache({rtt:this._rtt});

this._connectionPool=null;
}


get rtt(){
return this._rtt;
}




_initializeConnectionPool(graph){

const records=[];
graph.getRootNode().traverse(node=>{
if(node.type===BaseNode.TYPES.NETWORK){
records.push(node.record);
}
});

this._connectionPool=new ConnectionPool(records,this._options);
}




_initializeAuxiliaryData(){
this._nodeTimings=new Map();
this._numberInProgressByType=new Map();

this._nodes={};
this._cachedNodeListByStartTime=[];


for(const state of Object.values(NodeState)){
this._nodes[state]=new Set();
}
}





_numberInProgress(type){
return this._numberInProgressByType.get(type)||0;
}





_setTimingData(node,values){
const timingData=this._nodeTimings.get(node)||{};
Object.assign(timingData,values);
this._nodeTimings.set(node,timingData);
}





_getTimingData(node){
const timingData=this._nodeTimings.get(node);
if(!timingData)throw new Error(`Unable to get timing data for node ${node.id}`);
return timingData;
}





_markNodeAsReadyToStart(node,queuedTime){
const firstNodeIndexWithGreaterStartTime=this._cachedNodeListByStartTime.
findIndex(candidate=>candidate.startTime>node.startTime);
const insertionIndex=firstNodeIndexWithGreaterStartTime===-1?
this._cachedNodeListByStartTime.length:firstNodeIndexWithGreaterStartTime;
this._cachedNodeListByStartTime.splice(insertionIndex,0,node);

this._nodes[NodeState.ReadyToStart].add(node);
this._nodes[NodeState.NotReadyToStart].delete(node);
this._setTimingData(node,{queuedTime});
}





_markNodeAsInProgress(node,startTime){
const indexOfNodeToStart=this._cachedNodeListByStartTime.indexOf(node);
this._cachedNodeListByStartTime.splice(indexOfNodeToStart,1);

this._nodes[NodeState.InProgress].add(node);
this._nodes[NodeState.ReadyToStart].delete(node);
this._numberInProgressByType.set(node.type,this._numberInProgress(node.type)+1);
this._setTimingData(node,{startTime});
}





_markNodeAsComplete(node,endTime){
this._nodes[NodeState.Complete].add(node);
this._nodes[NodeState.InProgress].delete(node);
this._numberInProgressByType.set(node.type,this._numberInProgress(node.type)-1);
this._setTimingData(node,{endTime});


for(const dependent of node.getDependents()){

const dependencies=dependent.getDependencies();
if(dependencies.some(dep=>!this._nodes[NodeState.Complete].has(dep)))continue;


this._markNodeAsReadyToStart(dependent,endTime);
}
}





_acquireConnection(record){
return this._connectionPool.acquire(record,{
ignoreConnectionReused:this._flexibleOrdering});

}




_getNodesSortedByStartTime(){

return Array.from(this._cachedNodeListByStartTime);
}





_startNodeIfPossible(node,totalElapsedTime){
if(node.type===BaseNode.TYPES.CPU){

if(this._numberInProgress(node.type)===0){
this._markNodeAsInProgress(node,totalElapsedTime);
this._setTimingData(node,{timeElapsed:0});
}

return;
}

if(node.type!==BaseNode.TYPES.NETWORK)throw new Error('Unsupported');


if(!node.fromDiskCache){

const numberOfActiveRequests=this._numberInProgress(node.type);
if(numberOfActiveRequests>=this._maximumConcurrentRequests)return;
const connection=this._acquireConnection(node.record);
if(!connection)return;
}

this._markNodeAsInProgress(node,totalElapsedTime);
this._setTimingData(node,{
timeElapsed:0,
timeElapsedOvershoot:0,
bytesDownloaded:0});

}





_updateNetworkCapacity(){
for(const connection of this._connectionPool.connectionsInUse()){
connection.setThroughput(this._throughput/this._nodes[NodeState.InProgress].size);
}
}






_estimateTimeRemaining(node){
if(node.type===BaseNode.TYPES.CPU){
return this._estimateCPUTimeRemaining(node);
}else if(node.type===BaseNode.TYPES.NETWORK){
return this._estimateNetworkTimeRemaining(node);
}else{
throw new Error('Unsupported');
}
}





_estimateCPUTimeRemaining(cpuNode){
const timingData=this._getTimingData(cpuNode);
const multiplier=cpuNode.didPerformLayout()?
this._layoutTaskMultiplier:
this._cpuSlowdownMultiplier;
const totalDuration=Math.min(
Math.round(cpuNode.event.dur/1000*multiplier),
DEFAULT_MAXIMUM_CPU_TASK_DURATION);

const estimatedTimeElapsed=totalDuration-timingData.timeElapsed;
this._setTimingData(cpuNode,{estimatedTimeElapsed});
return estimatedTimeElapsed;
}





_estimateNetworkTimeRemaining(networkNode){
const record=networkNode.record;
const timingData=this._getTimingData(networkNode);

let timeElapsed=0;
if(networkNode.fromDiskCache){


const sizeInMb=(record.resourceSize||0)/1024/1024;
timeElapsed=8+20*sizeInMb-timingData.timeElapsed;
}else{
const connection=this._connectionPool.acquireActiveConnectionFromRecord(record);
const dnsResolutionTime=this._dns.getTimeUntilResolution(record,{
requestedAt:timingData.startTime,
shouldUpdateCache:true});

const timeAlreadyElapsed=timingData.timeElapsed;
const calculation=connection.simulateDownloadUntil(
record.transferSize-timingData.bytesDownloaded,
{timeAlreadyElapsed,dnsResolutionTime,maximumTimeToElapse:Infinity});


timeElapsed=calculation.timeElapsed;
}

const estimatedTimeElapsed=timeElapsed+timingData.timeElapsedOvershoot;
this._setTimingData(networkNode,{estimatedTimeElapsed});
return estimatedTimeElapsed;
}





_findNextNodeCompletionTime(){
let minimumTime=Infinity;
for(const node of this._nodes[NodeState.InProgress]){
minimumTime=Math.min(minimumTime,this._estimateTimeRemaining(node));
}

return minimumTime;
}







_updateProgressMadeInTimePeriod(node,timePeriodLength,totalElapsedTime){
const timingData=this._getTimingData(node);
const isFinished=timingData.estimatedTimeElapsed===timePeriodLength;

if(node.type===BaseNode.TYPES.CPU||node.fromDiskCache){
return isFinished?
this._markNodeAsComplete(node,totalElapsedTime):
timingData.timeElapsed+=timePeriodLength;
}

if(node.type!==BaseNode.TYPES.NETWORK)throw new Error('Unsupported');

const record=node.record;
const connection=this._connectionPool.acquireActiveConnectionFromRecord(record);
const dnsResolutionTime=this._dns.getTimeUntilResolution(record,{
requestedAt:timingData.startTime,
shouldUpdateCache:true});

const calculation=connection.simulateDownloadUntil(
record.transferSize-timingData.bytesDownloaded,
{
dnsResolutionTime,
timeAlreadyElapsed:timingData.timeElapsed,
maximumTimeToElapse:timePeriodLength-timingData.timeElapsedOvershoot});



connection.setCongestionWindow(calculation.congestionWindow);
connection.setH2OverflowBytesDownloaded(calculation.extraBytesDownloaded);

if(isFinished){
connection.setWarmed(true);
this._connectionPool.release(record);
this._markNodeAsComplete(node,totalElapsedTime);
}else{
timingData.timeElapsed+=calculation.timeElapsed;
timingData.timeElapsedOvershoot+=calculation.timeElapsed-timePeriodLength;
timingData.bytesDownloaded+=calculation.bytesDownloaded;
}
}




_computeFinalNodeTimings(){

const nodeTimingEntries=[];
for(const[node,timing]of this._nodeTimings){
nodeTimingEntries.push([node,{
startTime:timing.startTime,
endTime:timing.endTime,
duration:timing.endTime-timing.startTime}]);

}


nodeTimingEntries.sort((a,b)=>a[1].startTime-b[1].startTime);
return new Map(nodeTimingEntries);
}




getOptions(){
return this._options;
}














simulate(graph,options){
if(BaseNode.hasCycle(graph)){
throw new Error('Cannot simulate graph with cycle');
}

options=Object.assign({
label:undefined,
flexibleOrdering:false},
options);


this._flexibleOrdering=!!options.flexibleOrdering;
this._dns=new DNSCache({rtt:this._rtt});
this._initializeConnectionPool(graph);
this._initializeAuxiliaryData();

const nodesNotReadyToStart=this._nodes[NodeState.NotReadyToStart];
const nodesReadyToStart=this._nodes[NodeState.ReadyToStart];
const nodesInProgress=this._nodes[NodeState.InProgress];

const rootNode=graph.getRootNode();
rootNode.traverse(node=>nodesNotReadyToStart.add(node));
let totalElapsedTime=0;
let iteration=0;


this._markNodeAsReadyToStart(rootNode,totalElapsedTime);


while(nodesReadyToStart.size||nodesInProgress.size){

for(const node of this._getNodesSortedByStartTime()){
this._startNodeIfPossible(node,totalElapsedTime);
}

if(!nodesInProgress.size){


if(this._flexibleOrdering)throw new Error('Failed to start a node');
this._flexibleOrdering=true;
continue;
}


this._updateNetworkCapacity();


const minimumTime=this._findNextNodeCompletionTime();
totalElapsedTime+=minimumTime;


if(!Number.isFinite(minimumTime)||iteration>100000){
throw new Error('Graph creation failed, depth exceeded');
}

iteration++;

for(const node of nodesInProgress){
this._updateProgressMadeInTimePeriod(node,minimumTime,totalElapsedTime);
}
}

const nodeTimings=this._computeFinalNodeTimings();
ALL_SIMULATION_NODE_TIMINGS.set(options.label||'unlabeled',nodeTimings);

return{
timeInMs:totalElapsedTime,
nodeTimings};

}


static get ALL_NODE_TIMINGS(){
return ALL_SIMULATION_NODE_TIMINGS;
}}


module.exports=Simulator;












},{"../../../config/constants.js":46,"../base-node.js":57,"./connection-pool.js":60,"./dns-cache.js":61,"./tcp-connection.js":64}],64:[function(require,module,exports){





'use strict';

const INITIAL_CONGESTION_WINDOW=10;
const TCP_SEGMENT_SIZE=1460;

class TcpConnection{







constructor(rtt,throughput,serverLatency=0,ssl=true,h2=false){
this._warmed=false;
this._ssl=ssl;
this._h2=h2;
this._rtt=rtt;
this._throughput=throughput;
this._serverLatency=serverLatency;
this._congestionWindow=INITIAL_CONGESTION_WINDOW;
this._h2OverflowBytesDownloaded=0;
}






static maximumSaturatedConnections(rtt,availableThroughput){
const roundTripsPerSecond=1000/rtt;
const bytesPerRoundTrip=TCP_SEGMENT_SIZE;
const bytesPerSecond=roundTripsPerSecond*bytesPerRoundTrip;
const minimumThroughputRequiredPerRequest=bytesPerSecond*8;
return Math.floor(availableThroughput/minimumThroughputRequiredPerRequest);
}




_computeMaximumCongestionWindowInSegments(){
const bytesPerSecond=this._throughput/8;
const secondsPerRoundTrip=this._rtt/1000;
const bytesPerRoundTrip=bytesPerSecond*secondsPerRoundTrip;
return Math.floor(bytesPerRoundTrip/TCP_SEGMENT_SIZE);
}




setThroughput(throughput){
this._throughput=throughput;
}




setCongestionWindow(congestion){
this._congestionWindow=congestion;
}




setWarmed(warmed){
this._warmed=warmed;
}




isWarm(){
return this._warmed;
}




isH2(){
return this._h2;
}




get congestionWindow(){
return this._congestionWindow;
}






setH2OverflowBytesDownloaded(bytes){
if(!this._h2)return;
this._h2OverflowBytesDownloaded=bytes;
}




clone(){
return Object.assign(new TcpConnection(this._rtt,this._throughput),this);
}












simulateDownloadUntil(bytesToDownload,options){
const{timeAlreadyElapsed=0,maximumTimeToElapse=Infinity,dnsResolutionTime=0}=
options||{};

if(this._warmed&&this._h2){
bytesToDownload-=this._h2OverflowBytesDownloaded;
}
const twoWayLatency=this._rtt;
const oneWayLatency=twoWayLatency/2;
const maximumCongestionWindow=this._computeMaximumCongestionWindowInSegments();

let handshakeAndRequest=oneWayLatency;
if(!this._warmed){
handshakeAndRequest=

dnsResolutionTime+

oneWayLatency+

oneWayLatency+

oneWayLatency+(

this._ssl?twoWayLatency:0);
}

let roundTrips=Math.ceil(handshakeAndRequest/twoWayLatency);
let timeToFirstByte=handshakeAndRequest+this._serverLatency+oneWayLatency;
if(this._warmed&&this._h2)timeToFirstByte=0;

const timeElapsedForTTFB=Math.max(timeToFirstByte-timeAlreadyElapsed,0);
const maximumDownloadTimeToElapse=maximumTimeToElapse-timeElapsedForTTFB;

let congestionWindow=Math.min(this._congestionWindow,maximumCongestionWindow);
let totalBytesDownloaded=0;
if(timeElapsedForTTFB>0){
totalBytesDownloaded=congestionWindow*TCP_SEGMENT_SIZE;
}else{
roundTrips=0;
}

let downloadTimeElapsed=0;
let bytesRemaining=bytesToDownload-totalBytesDownloaded;
while(bytesRemaining>0&&downloadTimeElapsed<=maximumDownloadTimeToElapse){
roundTrips++;
downloadTimeElapsed+=twoWayLatency;
congestionWindow=Math.max(Math.min(maximumCongestionWindow,congestionWindow*2),1);

const bytesDownloadedInWindow=congestionWindow*TCP_SEGMENT_SIZE;
totalBytesDownloaded+=bytesDownloadedInWindow;
bytesRemaining-=bytesDownloadedInWindow;
}

const timeElapsed=timeElapsedForTTFB+downloadTimeElapsed;
const extraBytesDownloaded=this._h2?Math.max(totalBytesDownloaded-bytesToDownload,0):0;
const bytesDownloaded=Math.max(Math.min(totalBytesDownloaded,bytesToDownload),0);

return{
roundTrips,
timeElapsed,
bytesDownloaded,
extraBytesDownloaded,
congestionWindow};

}}


module.exports=TcpConnection;

















},{}],65:[function(require,module,exports){





'use strict';







const NEXUS5X_EMULATION_METRICS={
mobile:true,
screenWidth:412,
screenHeight:660,
width:412,
height:660,
positionX:0,
positionY:0,
scale:1,
deviceScaleFactor:2.625,
screenOrientation:{
angle:0,
type:'portraitPrimary'}};







const DESKTOP_EMULATION_METRICS={
mobile:false,
width:1350,
height:940,
deviceScaleFactor:1};



const NEXUS5X_USERAGENT='Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3694.0 Mobile Safari/537.36 Chrome-Lighthouse';

const DESKTOP_USERAGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3694.0 Safari/537.36 Chrome-Lighthouse';

const OFFLINE_METRICS={
offline:true,

latency:0,
downloadThroughput:0,
uploadThroughput:0};


const NO_THROTTLING_METRICS={
latency:0,
downloadThroughput:0,
uploadThroughput:0,
offline:false};


const NO_CPU_THROTTLE_METRICS={
rate:1};


const emulationParams={
mobile:{
userAgent:NEXUS5X_USERAGENT,
metrics:NEXUS5X_EMULATION_METRICS,
touchEnabled:true},

desktop:{
userAgent:DESKTOP_USERAGENT,
metrics:DESKTOP_EMULATION_METRICS,
touchEnabled:false}};









async function emulate(driver,settings){
if(!settings.emulatedFormFactor||settings.emulatedFormFactor==='none')return;
const params=emulationParams[settings.emulatedFormFactor];






await driver.sendCommand('Network.enable');
await driver.sendCommand('Network.setUserAgentOverride',{userAgent:params.userAgent});

if(!settings.internalDisableDeviceScreenEmulation){
await driver.sendCommand('Emulation.setDeviceMetricsOverride',params.metrics);
await driver.sendCommand('Emulation.setTouchEmulationEnabled',{enabled:params.touchEnabled});
}
}







function enableNetworkThrottling(driver,throttlingSettings){

const conditions={
offline:false,
latency:throttlingSettings.requestLatencyMs||0,
downloadThroughput:throttlingSettings.downloadThroughputKbps||0,
uploadThroughput:throttlingSettings.uploadThroughputKbps||0};



conditions.downloadThroughput=Math.floor(conditions.downloadThroughput*1024/8);
conditions.uploadThroughput=Math.floor(conditions.uploadThroughput*1024/8);
return driver.sendCommand('Network.emulateNetworkConditions',conditions);
}





function clearAllNetworkEmulation(driver){
return driver.sendCommand('Network.emulateNetworkConditions',NO_THROTTLING_METRICS);
}





function goOffline(driver){
return driver.sendCommand('Network.emulateNetworkConditions',OFFLINE_METRICS);
}






function enableCPUThrottling(driver,throttlingSettings){
const rate=throttlingSettings.cpuSlowdownMultiplier;
return driver.sendCommand('Emulation.setCPUThrottlingRate',{rate});
}





function disableCPUThrottling(driver){
return driver.sendCommand('Emulation.setCPUThrottlingRate',NO_CPU_THROTTLE_METRICS);
}

module.exports={
emulate,
enableNetworkThrottling,
clearAllNetworkEmulation,
enableCPUThrottling,
disableCPUThrottling,
goOffline,
MOBILE_USERAGENT:NEXUS5X_USERAGENT,
DESKTOP_USERAGENT};


},{}],66:[function(require,module,exports){
(function(__filename,__dirname){





'use strict';

const path=require('path');
const isDeepEqual=require('lodash.isequal');
const log=require('lighthouse-logger');
const MessageFormat=require('intl-messageformat').default;
const lookupClosestLocale=require('lookup-closest-locale');
const LOCALES=require('./locales.js');




const LH_ROOT=path.join(__dirname,'../../../');
const MESSAGE_INSTANCE_ID_REGEX=/(.* \| .*) # (\d+)$/;

const MESSAGE_INSTANCE_ID_QUICK_REGEX=/ # \d+$/;

(()=>{





require('intl-pluralrules');


const IntlPolyfill=require('intl');


if(!IntlPolyfill.NumberFormat)return;


const minimumLocales=['en','es','ru','zh'];
const supportedLocales=Intl.NumberFormat.supportedLocalesOf(minimumLocales);

if(supportedLocales.length!==minimumLocales.length){
Intl.NumberFormat=IntlPolyfill.NumberFormat;
Intl.DateTimeFormat=IntlPolyfill.DateTimeFormat;
}
})();


const UIStrings={

ms:'{timeInMs, number, milliseconds}\xa0ms',

seconds:'{timeInMs, number, seconds}\xa0s',

displayValueByteSavings:'Potential savings of {wastedBytes, number, bytes}\xa0KB',

displayValueMsSavings:'Potential savings of {wastedMs, number, milliseconds}\xa0ms',

columnURL:'URL',

columnSize:'Size',

columnCacheTTL:'Cache TTL',

columnWastedBytes:'Potential Savings',

columnWastedMs:'Potential Savings',

columnTimeSpent:'Time Spent',

columnLocation:'Location',

columnResourceType:'Resource Type',

columnRequests:'Requests',

columnTransferSize:'Transfer Size',

columnName:'Name',

totalResourceType:'Total',

documentResourceType:'Document',

scriptResourceType:'Script',

stylesheetResourceType:'Stylesheet',

imageResourceType:'Image',

mediaResourceType:'Media',

fontResourceType:'Font',

otherResourceType:'Other',

thirdPartyResourceType:'Third-party'};


const formats={
number:{
bytes:{
maximumFractionDigits:0},

milliseconds:{
maximumFractionDigits:0},

seconds:{

minimumFractionDigits:1,
maximumFractionDigits:1},

extendedPercent:{

maximumFractionDigits:2,
style:'percent'}}};














function lookupLocale(locale){

const canonicalLocale=Intl.getCanonicalLocales(locale)[0];

const closestLocale=lookupClosestLocale(canonicalLocale,LOCALES);
return closestLocale||'en';
}



















function collectAllCustomElementsFromICU(icuElements,seenElementsById=new Map()){
for(const el of icuElements){

if(el.type!=='argumentElement')continue;

seenElementsById.set(el.id,el);


if(!el.format||el.format.type!=='pluralFormat')continue;

for(const option of el.format.options){

collectAllCustomElementsFromICU(option.value.elements,seenElementsById);
}
}

return seenElementsById;
}










function _preformatValues(icuMessage,messageFormatter,values){
const elementMap=collectAllCustomElementsFromICU(messageFormatter.getAst().elements);
const argumentElements=[...elementMap.values()];


const formattedValues={};

for(const{id,format}of argumentElements){

if(id&&id in values===false){
throw new Error(`ICU Message "${icuMessage}" contains a value reference ("${id}") `+
`that wasn't provided`);
}

const value=values[id];


if(!format||format.type!=='numberFormat'){
formattedValues[id]=value;
continue;
}

if(typeof value!=='number'){
throw new Error(`ICU Message "${icuMessage}" contains a numeric reference ("${id}") `+
'but provided value was not a number');
}


if(format.style==='milliseconds'){

formattedValues[id]=Math.round(value/10)*10;
}else if(format.style==='seconds'&&id==='timeInMs'){

formattedValues[id]=Math.round(value/100)/10;
}else if(format.style==='bytes'){

formattedValues[id]=value/1024;
}else{

formattedValues[id]=value;
}
}


for(const valueId of Object.keys(values)){
if(valueId in formattedValues)continue;


if(valueId==='errorCode'){
formattedValues.errorCode=values.errorCode;
continue;
}

throw new Error(`Provided value "${valueId}" does not match any placeholder in `+
`ICU message "${icuMessage}"`);
}

return formattedValues;
}









const _icuMessageInstanceMap=new Map();

const _ICUMsgNotFoundMsg='ICU message not found in destination locale';








function _formatIcuMessage(locale,icuMessageId,uiStringMessage,values={}){
const localeMessages=LOCALES[locale];
if(!localeMessages)throw new Error(`Unsupported locale '${locale}'`);
let localeMessage=localeMessages[icuMessageId]&&localeMessages[icuMessageId].message;



if(!localeMessage&&uiStringMessage){

localeMessage=uiStringMessage;


if(!LOCALES.en[icuMessageId]||localeMessage!==LOCALES.en[icuMessageId].message){
log.verbose('i18n',`Message "${icuMessageId}" does not match its 'en' counterpart. `+
`Run 'i18n' to update.`);
}
}

if(!localeMessage){
throw new Error(_ICUMsgNotFoundMsg);
}


const localeForMessageFormat=locale==='en-XA'||locale==='en-XL'?'de-DE':locale;

const formatter=new MessageFormat(localeMessage,localeForMessageFormat,formats);


const valuesForMessageFormat=_preformatValues(localeMessage,formatter,values);

const formattedString=formatter.format(valuesForMessageFormat);
return{formattedString,icuMessage:localeMessage};
}


function _formatPathAsString(pathInLHR){
let pathAsString='';
for(const property of pathInLHR){
if(/^[a-z]+$/i.test(property)){
if(pathAsString.length)pathAsString+='.';
pathAsString+=property;
}else{
if(/]|"|'|\s/.test(property))throw new Error(`Cannot handle "${property}" in i18n`);
pathAsString+=`[${property}]`;
}
}

return pathAsString;
}





function getRendererFormattedStrings(locale){
const localeMessages=LOCALES[locale];
if(!localeMessages)throw new Error(`Unsupported locale '${locale}'`);

const icuMessageIds=Object.keys(localeMessages).filter(f=>f.includes('core/report/html/'));

const strings={};
for(const icuMessageId of icuMessageIds){
const[filename,varName]=icuMessageId.split(' | ');
if(!filename.endsWith('util.js'))throw new Error(`Unexpected message: ${icuMessageId}`);
strings[varName]=localeMessages[icuMessageId].message;
}

return strings;
}








function createMessageInstanceIdFn(filename,fileStrings){

const mergedStrings={...UIStrings,...fileStrings};








const getMessageInstanceIdFn=(icuMessage,values)=>{
const keyname=Object.keys(mergedStrings).find(key=>mergedStrings[key]===icuMessage);
if(!keyname)throw new Error(`Could not locate: ${icuMessage}`);

const filenameToLookup=keyname in fileStrings?filename:__filename;
const unixStyleFilename=path.relative(LH_ROOT,filenameToLookup).replace(/\\/g,'/');
const icuMessageId=`${unixStyleFilename} | ${keyname}`;
const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];

let indexOfInstance=icuMessageInstances.findIndex(inst=>isDeepEqual(inst.values,values));
if(indexOfInstance===-1){
icuMessageInstances.push({icuMessageId,icuMessage,values});
indexOfInstance=icuMessageInstances.length-1;
}

_icuMessageInstanceMap.set(icuMessageId,icuMessageInstances);

return`${icuMessageId} # ${indexOfInstance}`;
};

return getMessageInstanceIdFn;
}






function isIcuMessage(icuMessageIdOrRawString){
return MESSAGE_INSTANCE_ID_QUICK_REGEX.test(icuMessageIdOrRawString)&&
MESSAGE_INSTANCE_ID_REGEX.test(icuMessageIdOrRawString);
}






function getFormatted(icuMessageIdOrRawString,locale){
if(isIcuMessage(icuMessageIdOrRawString)){
return _resolveIcuMessageInstanceId(icuMessageIdOrRawString,locale).formattedString;
}

return icuMessageIdOrRawString;
}







function getFormattedFromIdAndValues(locale,icuMessageId,values){
const icuMessageIdRegex=/(.* \| .*)$/;
if(!icuMessageIdRegex.test(icuMessageId))throw new Error('This is not an ICU message ID');

const{formattedString}=_formatIcuMessage(locale,icuMessageId,undefined,values);
return formattedString;
}






function _resolveIcuMessageInstanceId(icuMessageInstanceId,locale){
const matches=icuMessageInstanceId.match(MESSAGE_INSTANCE_ID_REGEX);
if(!matches)throw new Error(`${icuMessageInstanceId} is not a valid message instance ID`);

const[_,icuMessageId,icuMessageInstanceIndex]=matches;
const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];
const icuMessageInstance=icuMessageInstances[Number(icuMessageInstanceIndex)];

const{formattedString}=_formatIcuMessage(locale,icuMessageId,
icuMessageInstance.icuMessage,icuMessageInstance.values);

return{icuMessageInstance,formattedString};
}









function replaceIcuMessageInstanceIds(inputObject,locale){





function replaceInObject(subObject,icuMessagePaths,pathInLHR=[]){
if(typeof subObject!=='object'||!subObject)return;

for(const[property,value]of Object.entries(subObject)){
const currentPathInLHR=pathInLHR.concat([property]);


if(typeof value==='string'&&isIcuMessage(value)){
const{icuMessageInstance,formattedString}=_resolveIcuMessageInstanceId(value,locale);
const messageInstancesInLHR=icuMessagePaths[icuMessageInstance.icuMessageId]||[];
const currentPathAsString=_formatPathAsString(currentPathInLHR);

messageInstancesInLHR.push(
icuMessageInstance.values?
{values:icuMessageInstance.values,path:currentPathAsString}:
currentPathAsString);


subObject[property]=formattedString;
icuMessagePaths[icuMessageInstance.icuMessageId]=messageInstancesInLHR;
}else{
replaceInObject(value,icuMessagePaths,currentPathInLHR);
}
}
}


const icuMessagePaths={};
replaceInObject(inputObject,icuMessagePaths);
return icuMessagePaths;
}










function registerLocaleData(locale,lhlMessages){
LOCALES[locale]=lhlMessages;
}

module.exports={
_formatPathAsString,
_ICUMsgNotFoundMsg,
UIStrings,
lookupLocale,
getRendererFormattedStrings,
createMessageInstanceIdFn,
getFormatted,
getFormattedFromIdAndValues,
replaceIcuMessageInstanceIds,
isIcuMessage,
collectAllCustomElementsFromICU,
registerLocaleData};


}).call(this,"/lighthouse-core/lib/i18n/i18n.js","/lighthouse-core/lib/i18n");
},{"./locales.js":67,"intl":101,"intl-messageformat":119,"intl-pluralrules":101,"lighthouse-logger":125,"lodash.isequal":142,"lookup-closest-locale":143,"path":156}],67:[function(require,module,exports){





'use strict';















const locales={
'en-US':require('./locales/en-US.json'),
'en':require('./locales/en-US.json'),


'en-AU':require('./locales/en-GB.json'),
'en-GB':require('./locales/en-GB.json'),
'en-IE':require('./locales/en-GB.json'),
'en-SG':require('./locales/en-GB.json'),
'en-ZA':require('./locales/en-GB.json'),
'en-IN':require('./locales/en-GB.json'),


'ar-XB':require('./locales/ar-XB.json'),
'ar':require('./locales/ar.json'),
'bg':require('./locales/bg.json'),
'bs':require('./locales/hr.json'),
'ca':require('./locales/ca.json'),
'cs':require('./locales/cs.json'),
'da':require('./locales/da.json'),
'de':require('./locales/de.json'),
'el':require('./locales/el.json'),
'en-XA':require('./locales/en-XA.json'),
'en-XL':require('./locales/en-XL.json'),
'es':require('./locales/es.json'),
'es-419':require('./locales/es-419.json'),

'es-AR':require('./locales/es-419.json'),
'es-BO':require('./locales/es-419.json'),
'es-BR':require('./locales/es-419.json'),
'es-BZ':require('./locales/es-419.json'),
'es-CL':require('./locales/es-419.json'),
'es-CO':require('./locales/es-419.json'),
'es-CR':require('./locales/es-419.json'),
'es-CU':require('./locales/es-419.json'),
'es-DO':require('./locales/es-419.json'),
'es-EC':require('./locales/es-419.json'),
'es-GT':require('./locales/es-419.json'),
'es-HN':require('./locales/es-419.json'),
'es-MX':require('./locales/es-419.json'),
'es-NI':require('./locales/es-419.json'),
'es-PA':require('./locales/es-419.json'),
'es-PE':require('./locales/es-419.json'),
'es-PR':require('./locales/es-419.json'),
'es-PY':require('./locales/es-419.json'),
'es-SV':require('./locales/es-419.json'),
'es-US':require('./locales/es-419.json'),
'es-UY':require('./locales/es-419.json'),
'es-VE':require('./locales/es-419.json'),

'fi':require('./locales/fi.json'),
'fil':require('./locales/fil.json'),
'fr':require('./locales/fr.json'),
'he':require('./locales/he.json'),
'hi':require('./locales/hi.json'),
'hr':require('./locales/hr.json'),
'hu':require('./locales/hu.json'),
'gsw':require('./locales/de.json'),
'id':require('./locales/id.json'),
'in':require('./locales/id.json'),
'it':require('./locales/it.json'),
'iw':require('./locales/he.json'),
'ja':require('./locales/ja.json'),
'ko':require('./locales/ko.json'),
'ln':require('./locales/fr.json'),
'lt':require('./locales/lt.json'),
'lv':require('./locales/lv.json'),
'mo':require('./locales/ro.json'),
'nl':require('./locales/nl.json'),
'nb':require('./locales/no.json'),
'no':require('./locales/no.json'),
'pl':require('./locales/pl.json'),
'pt':require('./locales/pt.json'),
'pt-PT':require('./locales/pt-PT.json'),
'ro':require('./locales/ro.json'),
'ru':require('./locales/ru.json'),
'sk':require('./locales/sk.json'),
'sl':require('./locales/sl.json'),
'sr':require('./locales/sr.json'),
'sr-Latn':require('./locales/sr-Latn.json'),
'sv':require('./locales/sv.json'),
'ta':require('./locales/ta.json'),
'te':require('./locales/te.json'),
'th':require('./locales/th.json'),
'tl':require('./locales/fil.json'),
'tr':require('./locales/tr.json'),
'uk':require('./locales/uk.json'),
'vi':require('./locales/vi.json'),
'zh':require('./locales/zh.json'),
'zh-HK':require('./locales/zh-HK.json'),
'zh-TW':require('./locales/zh-TW.json')};


module.exports=locales;

},{"./locales/ar-XB.json":101,"./locales/ar.json":101,"./locales/bg.json":101,"./locales/ca.json":101,"./locales/cs.json":101,"./locales/da.json":101,"./locales/de.json":101,"./locales/el.json":101,"./locales/en-GB.json":101,"./locales/en-US.json":101,"./locales/en-XA.json":101,"./locales/en-XL.json":101,"./locales/es-419.json":101,"./locales/es.json":101,"./locales/fi.json":101,"./locales/fil.json":101,"./locales/fr.json":101,"./locales/he.json":101,"./locales/hi.json":101,"./locales/hr.json":101,"./locales/hu.json":101,"./locales/id.json":101,"./locales/it.json":101,"./locales/ja.json":101,"./locales/ko.json":101,"./locales/lt.json":101,"./locales/lv.json":101,"./locales/nl.json":101,"./locales/no.json":101,"./locales/pl.json":101,"./locales/pt-PT.json":101,"./locales/pt.json":101,"./locales/ro.json":101,"./locales/ru.json":101,"./locales/sk.json":101,"./locales/sl.json":101,"./locales/sr-Latn.json":101,"./locales/sr.json":101,"./locales/sv.json":101,"./locales/ta.json":101,"./locales/te.json":101,"./locales/th.json":101,"./locales/tr.json":101,"./locales/uk.json":101,"./locales/vi.json":101,"./locales/zh-HK.json":101,"./locales/zh-TW.json":101,"./locales/zh.json":101}],68:[function(require,module,exports){





'use strict';

const URL=require('./url-shim.js');





function doExist(manifest){
if(!manifest||!manifest.icons){
return false;
}
if(manifest.icons.value.length===0){
return false;
}
return true;
}






function pngSizedAtLeast(sizeRequirement,manifest){


const iconValues=manifest.icons.value;

const flattenedSizes=[];
iconValues.
filter(icon=>{
const typeHint=icon.value.type.value;
if(typeHint){

return typeHint==='image/png';
}

const src=icon.value.src.value;
return src&&new URL(src).pathname.endsWith('.png');
}).
forEach(icon=>{

if(icon.value.sizes.value){
flattenedSizes.push(...icon.value.sizes.value);
}
});

return flattenedSizes.

filter(size=>/\d+x\d+/.test(size)).
filter(size=>{

const sizeStrs=size.split(/x/i);

const sizeNums=[parseFloat(sizeStrs[0]),parseFloat(sizeStrs[1])];

const areIconsBigEnough=sizeNums[0]>=sizeRequirement&&sizeNums[1]>=sizeRequirement;

const areIconsSquare=sizeNums[0]===sizeNums[1];
return areIconsBigEnough&&areIconsSquare;
});
}

module.exports={
doExist,
pngSizedAtLeast};


},{"./url-shim.js":"url"}],69:[function(require,module,exports){





'use strict';





function convertNodeTimingsToTrace(nodeTimings){

const traceEvents=[];
const baseTs=1e9;
const baseEvent={pid:1,tid:1,cat:'devtools.timeline'};
const frame='A00001';

const toMicroseconds=ms=>baseTs+ms*1000;

traceEvents.push(createFakeTracingStartedEvent());
traceEvents.push({...createFakeTracingStartedEvent(),name:'TracingStartedInBrowser'});


let requestId=1;
let lastEventEndTime=0;
for(const[node,timing]of nodeTimings.entries()){
lastEventEndTime=Math.max(lastEventEndTime,timing.endTime);
if(node.type==='cpu'){

const cpuNode=node;
traceEvents.push(...createFakeTaskEvents(cpuNode,timing));
}else{
const networkNode=node;

if(/^data/.test(networkNode.record.url))continue;
traceEvents.push(...createFakeNetworkEvents(networkNode.record,timing));
}
}


traceEvents.push(
...createFakeTaskEvents(

{childEvents:[],event:{}},
{
startTime:lastEventEndTime+1000,
endTime:lastEventEndTime+1001}));




return{traceEvents};




function createFakeTracingStartedEvent(){
const argsData={
frameTreeNodeId:1,
sessionId:'1.1',
page:frame,
persistentIds:true,
frames:[{frame,url:'about:blank',name:'',processId:1}]};


return{
...baseEvent,
ts:baseTs-1e5,
ph:'I',
s:'t',
cat:'disabled-by-default-devtools.timeline',
name:'TracingStartedInPage',
args:{data:argsData},
dur:0};

}






function createFakeTaskEvents(cpuNode,timing){
const argsData={
url:'',
frame,
lineNumber:0,
columnNumber:0};


const eventTs=toMicroseconds(timing.startTime);


const events=[
{
...baseEvent,
ph:'X',
name:'Task',
ts:eventTs,
dur:(timing.endTime-timing.startTime)*1000,
args:{data:argsData}}];



const nestedBaseTs=cpuNode.event.ts||0;
const multiplier=(timing.endTime-timing.startTime)*1000/cpuNode.event.dur;

const netReqEvents=new Set(['ResourceSendRequest','ResourceFinish',
'ResourceReceiveResponse','ResourceReceivedData']);
for(const event of cpuNode.childEvents){
if(netReqEvents.has(event.name))continue;
const ts=eventTs+(event.ts-nestedBaseTs)*multiplier;
const newEvent={...event,...{pid:baseEvent.pid,tid:baseEvent.tid},ts};
if(event.dur)newEvent.dur=event.dur*multiplier;
events.push(newEvent);
}

return events;
}






function createFakeNetworkEvents(record,timing){
requestId++;



let{startTime,endTime}=timing;
if(startTime===endTime)endTime+=0.3;

const requestData={requestId:requestId.toString(),frame};

const baseRequestEvent={...baseEvent,ph:'I',s:'t',dur:0};

const sendRequestData={
...requestData,
requestMethod:record.requestMethod,
url:record.url,
priority:record.priority};


const receiveResponseData={
...requestData,
statusCode:record.statusCode,
mimeType:record.mimeType,
encodedDataLength:record.transferSize,
fromCache:record.fromDiskCache,
fromServiceWorker:record.fetchedViaServiceWorker};


const resourceFinishData={
...requestData,
decodedBodyLength:record.resourceSize,
didFail:!!record.failed,
finishTime:endTime};



const events=[
{
...baseRequestEvent,
name:'ResourceSendRequest',
ts:toMicroseconds(startTime),
args:{data:sendRequestData}},

{
...baseRequestEvent,
name:'ResourceFinish',
ts:toMicroseconds(endTime),
args:{data:resourceFinishData}}];



if(!record.failed){
events.push({
...baseRequestEvent,
name:'ResourceReceiveResponse',
ts:toMicroseconds((startTime+endTime)/2),
args:{data:receiveResponseData}});

}

return events;
}
}

module.exports={
simulationNamesToIgnore:[
'unlabeled',

'optimisticFirstCPUIdle',
'optimisticFlexFirstCPUIdle',
'pessimisticFirstCPUIdle',
'optimisticSpeedIndex',
'optimisticFlexSpeedIndex',
'pessimisticSpeedIndex',
'optimisticEstimatedInputLatency',
'optimisticFlexEstimatedInputLatency',
'pessimisticEstimatedInputLatency'],

convertNodeTimingsToTrace};


},{}],70:[function(require,module,exports){





'use strict';

const Driver=require('../gather/driver.js');

class LHElement{




constructor(element,driver){
if(!element||!driver){
throw Error('Driver and element required to create Element');
}
this.driver=driver;
this.element=element;
}





getAttribute(name){
return this.driver.
sendCommand('DOM.getAttributes',{
nodeId:this.element.nodeId}).




then(resp=>{
const attrIndex=resp.attributes.indexOf(name);
if(attrIndex===-1){
return null;
}

return resp.attributes[attrIndex+1];
});
}




getNodeId(){
return this.element.nodeId;
}





getProperty(propName){
return this.driver.
sendCommand('DOM.resolveNode',{
nodeId:this.element.nodeId}).

then(resp=>{
if(!resp.object.objectId){
return null;
}
return this.driver.getObjectProperty(resp.object.objectId,propName);
}).
catch(()=>null);
}}


module.exports=LHElement;

},{"../gather/driver.js":51}],71:[function(require,module,exports){
(function(__filename){





'use strict';

const i18n=require('./i18n/i18n.js');


const UIStrings={




didntCollectScreenshots:`Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse. ({errorCode})`,




badTraceRecording:'Something went wrong with recording the trace over your page load. Please run Lighthouse again. ({errorCode})',




pageLoadTookTooLong:'Your page took too long to load. Please follow the opportunities in the report to reduce your page load time, and then try re-running Lighthouse. ({errorCode})',

pageLoadFailed:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests.',




pageLoadFailedWithStatusCode:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Status code: {statusCode})',




pageLoadFailedWithDetails:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Details: {errorDetails})',




pageLoadFailedInsecure:'The URL you have provided does not have a valid security certificate. {securityMessages}',

pageLoadFailedInterstitial:'Chrome prevented page load with an interstitial. Make sure you are testing the correct URL and that the server is properly responding to all requests.',

internalChromeError:'An internal Chrome error occurred. Please restart Chrome and try re-running Lighthouse.',

requestContentTimeout:'Fetching resource content has exceeded the allotted time',

urlInvalid:'The URL you have provided appears to be invalid.',




protocolTimeout:'Waiting for DevTools protocol response has exceeded the allotted time. (Method: {protocolMethod})',

dnsFailure:'DNS servers could not resolve the provided domain.',

pageLoadFailedHung:'Lighthouse was unable to reliably load the URL you requested because the page stopped responding.',

criTimeout:'Timeout waiting for initial Debugger Protocol connection.',




missingRequiredArtifact:'Required {artifactName} gatherer did not run.',





erroredRequiredArtifact:'Required {artifactName} gatherer encountered an error: {errorMessage}'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);










const LHERROR_SENTINEL='__LighthouseErrorSentinel';
const ERROR_SENTINEL='__ErrorSentinel';





class LighthouseError extends Error{




constructor(errorDefinition,properties){
super(errorDefinition.code);
this.name='LHError';
this.code=errorDefinition.code;


this.friendlyMessage=str_(errorDefinition.message,{errorCode:this.code,...properties});
this.lhrRuntimeError=!!errorDefinition.lhrRuntimeError;
if(properties)Object.assign(this,properties);

Error.captureStackTrace(this,LighthouseError);
}






static fromProtocolMessage(method,protocolError){

const protocolErrors=Object.values(LighthouseError.errors).filter(e=>e.pattern);

const matchedErrorDefinition=protocolErrors.find(e=>e.pattern.test(protocolError.message));
if(matchedErrorDefinition){
return new LighthouseError(matchedErrorDefinition);
}


let errMsg=`(${method}): ${protocolError.message}`;
if(protocolError.data)errMsg+=` (${protocolError.data})`;
const error=new Error(`Protocol error ${errMsg}`);
return Object.assign(error,{protocolMethod:method,protocolError:protocolError.message});
}









static stringifyReplacer(err){
if(err instanceof LighthouseError){


const{name,code,message,friendlyMessage,lhrRuntimeError,stack,...properties}=err;

return{
sentinel:LHERROR_SENTINEL,
code,
stack,
...properties};

}


if(err instanceof Error){
const{message,stack}=err;

const code=err.code;
return{
sentinel:ERROR_SENTINEL,
message,
code,
stack};

}

throw new Error('Invalid value for LHError stringification');
}










static parseReviver(key,possibleError){
if(typeof possibleError==='object'&&possibleError!==null){
if(possibleError.sentinel===LHERROR_SENTINEL){


const{sentinel,code,stack,...properties}=possibleError;
const errorDefinition=LighthouseError.errors[code];
const lhError=new LighthouseError(errorDefinition,properties);
lhError.stack=stack;

return lhError;
}

if(possibleError.sentinel===ERROR_SENTINEL){
const{message,code,stack}=possibleError;
const error=new Error(message);
Object.assign(error,{code,stack});
return error;
}
}

return possibleError;
}}


const ERRORS={

NO_SPEEDLINE_FRAMES:{
code:'NO_SPEEDLINE_FRAMES',
message:UIStrings.didntCollectScreenshots,
lhrRuntimeError:true},

SPEEDINDEX_OF_ZERO:{
code:'SPEEDINDEX_OF_ZERO',
message:UIStrings.didntCollectScreenshots,
lhrRuntimeError:true},

NO_SCREENSHOTS:{
code:'NO_SCREENSHOTS',
message:UIStrings.didntCollectScreenshots,
lhrRuntimeError:true},

INVALID_SPEEDLINE:{
code:'INVALID_SPEEDLINE',
message:UIStrings.didntCollectScreenshots,
lhrRuntimeError:true},



NO_TRACING_STARTED:{
code:'NO_TRACING_STARTED',
message:UIStrings.badTraceRecording,
lhrRuntimeError:true},

NO_NAVSTART:{
code:'NO_NAVSTART',
message:UIStrings.badTraceRecording,
lhrRuntimeError:true},

NO_FCP:{
code:'NO_FCP',
message:UIStrings.badTraceRecording,
lhrRuntimeError:true},

NO_DCL:{
code:'NO_DCL',
message:UIStrings.badTraceRecording,
lhrRuntimeError:true},

NO_FMP:{
code:'NO_FMP',
message:UIStrings.badTraceRecording},

NO_LCP:{
code:'NO_LCP',
message:UIStrings.badTraceRecording},



FMP_TOO_LATE_FOR_FCPUI:{code:'FMP_TOO_LATE_FOR_FCPUI',message:UIStrings.pageLoadTookTooLong},
NO_FCPUI_IDLE_PERIOD:{code:'NO_FCPUI_IDLE_PERIOD',message:UIStrings.pageLoadTookTooLong},
NO_TTI_CPU_IDLE_PERIOD:{code:'NO_TTI_CPU_IDLE_PERIOD',message:UIStrings.pageLoadTookTooLong},
NO_TTI_NETWORK_IDLE_PERIOD:{
code:'NO_TTI_NETWORK_IDLE_PERIOD',
message:UIStrings.pageLoadTookTooLong},



NO_DOCUMENT_REQUEST:{
code:'NO_DOCUMENT_REQUEST',
message:UIStrings.pageLoadFailed,
lhrRuntimeError:true},




FAILED_DOCUMENT_REQUEST:{
code:'FAILED_DOCUMENT_REQUEST',
message:UIStrings.pageLoadFailedWithDetails,
lhrRuntimeError:true},




ERRORED_DOCUMENT_REQUEST:{
code:'ERRORED_DOCUMENT_REQUEST',
message:UIStrings.pageLoadFailedWithStatusCode,
lhrRuntimeError:true},




INSECURE_DOCUMENT_REQUEST:{
code:'INSECURE_DOCUMENT_REQUEST',
message:UIStrings.pageLoadFailedInsecure,
lhrRuntimeError:true},



CHROME_INTERSTITIAL_ERROR:{
code:'CHROME_INTERSTITIAL_ERROR',
message:UIStrings.pageLoadFailedInterstitial,
lhrRuntimeError:true},


PAGE_HUNG:{
code:'PAGE_HUNG',
message:UIStrings.pageLoadFailedHung,
lhrRuntimeError:true},



TRACING_ALREADY_STARTED:{
code:'TRACING_ALREADY_STARTED',
message:UIStrings.internalChromeError,
pattern:/Tracing.*started/,
lhrRuntimeError:true},

PARSING_PROBLEM:{
code:'PARSING_PROBLEM',
message:UIStrings.internalChromeError,
pattern:/Parsing problem/,
lhrRuntimeError:true},

READ_FAILED:{
code:'READ_FAILED',
message:UIStrings.internalChromeError,
pattern:/Read failed/,
lhrRuntimeError:true},



INVALID_URL:{
code:'INVALID_URL',
message:UIStrings.urlInvalid},





PROTOCOL_TIMEOUT:{
code:'PROTOCOL_TIMEOUT',
message:UIStrings.protocolTimeout,
lhrRuntimeError:true},



DNS_FAILURE:{
code:'DNS_FAILURE',
message:UIStrings.dnsFailure,
lhrRuntimeError:true},



CRI_TIMEOUT:{
code:'CRI_TIMEOUT',
message:UIStrings.criTimeout,
lhrRuntimeError:true},






MISSING_REQUIRED_ARTIFACT:{
code:'MISSING_REQUIRED_ARTIFACT',
message:UIStrings.missingRequiredArtifact},






ERRORED_REQUIRED_ARTIFACT:{
code:'ERRORED_REQUIRED_ARTIFACT',
message:UIStrings.erroredRequiredArtifact}};






LighthouseError.errors=ERRORS;
LighthouseError.NO_ERROR='NO_ERROR';
LighthouseError.UNKNOWN_ERROR='UNKNOWN_ERROR';
module.exports=LighthouseError;
module.exports.UIStrings=UIStrings;

}).call(this,"/lighthouse-core/lib/lh-error.js");
},{"./i18n/i18n.js":66}],72:[function(require,module,exports){





'use strict';

const URL=require('./url-shim.js');
const cssParsers=require('cssstyle/lib/parsers');

const ALLOWED_DISPLAY_VALUES=[
'fullscreen',
'standalone',
'minimal-ui',
'browser'];





const DEFAULT_DISPLAY_MODE='browser';

const ALLOWED_ORIENTATION_VALUES=[
'any',
'natural',
'landscape',
'portrait',
'portrait-primary',
'portrait-secondary',
'landscape-primary',
'landscape-secondary'];






function isValidColor(color){
return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
}





function parseString(raw,trim){
let value;
let warning;

if(typeof raw==='string'){
value=trim?raw.trim():raw;
}else{
if(raw!==undefined){
warning='ERROR: expected a string.';
}
value=undefined;
}

return{
raw,
value,
warning};

}




function parseColor(raw){
const color=parseString(raw);


if(color.value===undefined){
return color;
}


if(!isValidColor(color.raw)){
color.value=undefined;
color.warning='ERROR: color parsing failed.';
}

return color;
}




function parseName(jsonInput){
return parseString(jsonInput.name,true);
}




function parseShortName(jsonInput){
return parseString(jsonInput.short_name,true);
}







function checkSameOrigin(url1,url2){
const parsed1=new URL(url1);
const parsed2=new URL(url2);

return parsed1.origin===parsed2.origin;
}








function parseStartUrl(jsonInput,manifestUrl,documentUrl){
const raw=jsonInput.start_url;


if(raw===''){
return{
raw,
value:documentUrl,
warning:'ERROR: start_url string empty'};

}
if(raw===undefined){
return{
raw,
value:documentUrl};

}
if(typeof raw!=='string'){
return{
raw,
value:documentUrl,
warning:'ERROR: expected a string.'};

}


let startUrl;
try{
startUrl=new URL(raw,manifestUrl).href;
}catch(e){

return{
raw,
value:documentUrl,
warning:`ERROR: invalid start_url relative to ${manifestUrl}`};

}


if(!checkSameOrigin(startUrl,documentUrl)){
return{
raw,
value:documentUrl,
warning:'ERROR: start_url must be same-origin as document'};

}

return{
raw,
value:startUrl};

}




function parseDisplay(jsonInput){
const parsedString=parseString(jsonInput.display,true);
const stringValue=parsedString.value;

if(!stringValue){
return{
raw:jsonInput,
value:DEFAULT_DISPLAY_MODE,
warning:parsedString.warning};

}

const displayValue=stringValue.toLowerCase();
if(!ALLOWED_DISPLAY_VALUES.includes(displayValue)){
return{
raw:jsonInput,
value:DEFAULT_DISPLAY_MODE,
warning:'ERROR: \'display\' has invalid value '+displayValue+
`. will fall back to ${DEFAULT_DISPLAY_MODE}.`};

}

return{
raw:jsonInput,
value:displayValue,
warning:undefined};

}




function parseOrientation(jsonInput){
const orientation=parseString(jsonInput.orientation,true);

if(orientation.value&&
!ALLOWED_ORIENTATION_VALUES.includes(orientation.value.toLowerCase())){
orientation.value=undefined;
orientation.warning='ERROR: \'orientation\' has an invalid value, will be ignored.';
}

return orientation;
}






function parseIcon(raw,manifestUrl){

const src=parseString(raw.src,true);

if(src.value===''){
src.value=undefined;
}
if(src.value){
try{

src.value=new URL(src.value,manifestUrl).href;
}catch(_){

src.warning=`ERROR: invalid icon url will be ignored: '${raw.src}'`;
src.value=undefined;
}
}

const type=parseString(raw.type,true);

const density={
raw:raw.density,
value:1,

warning:undefined};

if(density.raw!==undefined){
density.value=parseFloat(density.raw);
if(isNaN(density.value)||!isFinite(density.value)||density.value<=0){
density.value=1;
density.warning='ERROR: icon density cannot be NaN, +∞, or less than or equal to +0.';
}
}

let sizes;
const parsedSizes=parseString(raw.sizes);
if(parsedSizes.value!==undefined){

const set=new Set();
parsedSizes.value.trim().split(/\s+/).forEach(size=>set.add(size.toLowerCase()));
sizes={
raw:raw.sizes,
value:set.size>0?Array.from(set):undefined,
warning:undefined};

}else{
sizes={...parsedSizes,value:undefined};
}

return{
raw,
value:{
src,
type,
density,
sizes},

warning:undefined};

}





function parseIcons(jsonInput,manifestUrl){
const raw=jsonInput.icons;

if(raw===undefined){
return{
raw,

value:[],
warning:undefined};

}

if(!Array.isArray(raw)){
return{
raw,

value:[],
warning:'ERROR: \'icons\' expected to be an array but is not.'};

}

const parsedIcons=raw.

filter(icon=>icon.src!==undefined).

map(icon=>parseIcon(icon,manifestUrl));



const ignoredIconsWithWarnings=parsedIcons.
filter(icon=>{
const possibleWarnings=[icon.warning,icon.value.type.warning,icon.value.src.warning,
icon.value.sizes.warning,icon.value.density.warning].filter(Boolean);
const hasSrc=!!icon.value.src.value;
return!!possibleWarnings.length&&!hasSrc;
});

const value=parsedIcons.

filter(parsedIcon=>parsedIcon.value.src.value!==undefined);

return{
raw,
value,
warning:ignoredIconsWithWarnings.length?
'WARNING: Some icons were ignored due to warnings.':undefined};

}




function parseApplication(raw){
const platform=parseString(raw.platform,true);
const id=parseString(raw.id,true);


const appUrl=parseString(raw.url,true);
if(appUrl.value){
try{

appUrl.value=new URL(appUrl.value).href;
}catch(e){
appUrl.value=undefined;
appUrl.warning=`ERROR: invalid application URL ${raw.url}`;
}
}

return{
raw,
value:{
platform,
id,
url:appUrl},

warning:undefined};

}




function parseRelatedApplications(jsonInput){
const raw=jsonInput.related_applications;

if(raw===undefined){
return{
raw,
value:undefined,
warning:undefined};

}

if(!Array.isArray(raw)){
return{
raw,
value:undefined,
warning:'ERROR: \'related_applications\' expected to be an array but is not.'};

}



const value=raw.
filter(application=>!!application.platform).
map(parseApplication).
filter(parsedApp=>!!parsedApp.value.id.value||!!parsedApp.value.url.value);

return{
raw,
value,
warning:undefined};

}




function parsePreferRelatedApplications(jsonInput){
const raw=jsonInput.prefer_related_applications;
let value;
let warning;

if(typeof raw==='boolean'){
value=raw;
}else{
if(raw!==undefined){
warning='ERROR: \'prefer_related_applications\' expected to be a boolean.';
}
value=undefined;
}

return{
raw,
value,
warning};

}




function parseThemeColor(jsonInput){
return parseColor(jsonInput.theme_color);
}




function parseBackgroundColor(jsonInput){
return parseColor(jsonInput.background_color);
}







function parse(string,manifestUrl,documentUrl){
if(manifestUrl===undefined||documentUrl===undefined){
throw new Error('Manifest and document URLs required for manifest parsing.');
}

let jsonInput;

try{
jsonInput=JSON.parse(string);
}catch(e){
return{
raw:string,
value:undefined,
warning:'ERROR: file isn\'t valid JSON: '+e};

}


const manifest={
name:parseName(jsonInput),
short_name:parseShortName(jsonInput),
start_url:parseStartUrl(jsonInput,manifestUrl,documentUrl),
display:parseDisplay(jsonInput),
orientation:parseOrientation(jsonInput),
icons:parseIcons(jsonInput,manifestUrl),
related_applications:parseRelatedApplications(jsonInput),
prefer_related_applications:parsePreferRelatedApplications(jsonInput),
theme_color:parseThemeColor(jsonInput),
background_color:parseBackgroundColor(jsonInput)};




let manifestUrlWarning;
try{
const manifestUrlParsed=new URL(manifestUrl);
if(!manifestUrlParsed.protocol.startsWith('http')){
manifestUrlWarning=`WARNING: manifest URL not available over a valid network protocol`;
}
}catch(_){
manifestUrlWarning=`ERROR: invalid manifest URL: '${manifestUrl}'`;
}

return{
raw:string,
value:manifest,
warning:manifestUrlWarning};

}

module.exports=parse;

},{"./url-shim.js":"url","cssstyle/lib/parsers":105}],73:[function(require,module,exports){





'use strict';



const PUNCTUATOR_REGEX=/(return|{|\(|\[|\.\.\.|;|,|<|>|<=|>=|==|!=|===|!==|\+|-|\*|%|\*\*|\+\+|--|<<|>>|>>>|&|\||\^|!|~|&&|\|\||\?|:|=|\+=|-=|\*=|%=|\*\*=|<<=|>>=|>>>=|&=|\|=|\^=|=>|\/|\/=|\})$/;
const WHITESPACE_REGEX=/( |\n|\t)+$/;









function hasPunctuatorBefore(content,startPosition){
for(let i=startPosition;i>0;i--){

const sliceStart=Math.max(0,i-6);
const precedingCharacters=content.slice(sliceStart,i);

if(WHITESPACE_REGEX.test(precedingCharacters))continue;

return PUNCTUATOR_REGEX.test(precedingCharacters);
}



return true;
}







function computeTokenLength(content,features){
let totalTokenLength=0;
let isInSinglelineComment=false;
let isInMultilineComment=false;
let isInLicenseComment=false;
let isInString=false;
let isInRegex=false;
let isInRegexCharacterClass=false;
let stringOpenChar=null;

for(let i=0;i<content.length;i++){
const twoChars=content.substr(i,2);
const char=twoChars.charAt(0);

const isWhitespace=char===' '||char==='\n'||char==='\t';
const isAStringOpenChar=char===`'`||char==='"'||char==='`';

if(isInSinglelineComment){
if(char==='\n'){

isInSinglelineComment=false;
}
}else if(isInMultilineComment){

if(isInLicenseComment)totalTokenLength++;

if(twoChars==='*/'){

if(isInLicenseComment)totalTokenLength++;

isInMultilineComment=false;

i++;
}
}else if(isInString){

totalTokenLength++;

if(char==='\\'){

totalTokenLength++;
i++;
}else if(char===stringOpenChar){

isInString=false;

}
}else if(isInRegex){

totalTokenLength++;

if(char==='\\'){

totalTokenLength++;
i++;
}else if(char==='['){

isInRegexCharacterClass=true;
}else if(char===']'&&isInRegexCharacterClass){

isInRegexCharacterClass=false;
}else if(char==='/'&&!isInRegexCharacterClass){

isInRegex=false;

}
}else{

if(twoChars==='/*'){

isInMultilineComment=true;

isInLicenseComment=content.charAt(i+2)==='!';

if(isInLicenseComment)totalTokenLength+=2;

i++;
}else if(twoChars==='//'&&features.singlelineComments){

isInSinglelineComment=true;
isInMultilineComment=false;
isInLicenseComment=false;

i++;
}else if(char==='/'&&features.regex&&hasPunctuatorBefore(content,i)){

isInRegex=true;

totalTokenLength++;
}else if(isAStringOpenChar){

isInString=true;

stringOpenChar=char;

totalTokenLength++;
}else if(!isWhitespace){

totalTokenLength++;
}
}
}



if(isInMultilineComment||isInString){
return content.length;
}

return totalTokenLength;
}




function computeJSTokenLength(content){
return computeTokenLength(content,{singlelineComments:true,regex:true});
}




function computeCSSTokenLength(content){
return computeTokenLength(content,{singlelineComments:false,regex:false});
}

module.exports={computeJSTokenLength,computeCSSTokenLength};

},{}],74:[function(require,module,exports){





'use strict';

const NetworkRequest=require('./network-request.js');
const EventEmitter=require('events').EventEmitter;
const log=require('lighthouse-logger');

const IGNORED_NETWORK_SCHEMES=['data','ws'];



class NetworkRecorder extends EventEmitter{



constructor(){
super();


this._records=[];

this._recordsById=new Map();
}




getInflightRecords(){
return this._records.filter(record=>!record.finished);
}

getRecords(){
return Array.from(this._records);
}





on(event,listener){
return super.on(event,listener);
}





once(event,listener){
return super.once(event,listener);
}

isIdle(){
return this._isActiveIdlePeriod(0);
}

is2Idle(){
return this._isActiveIdlePeriod(2);
}







_isActiveIdlePeriod(allowedRequests){
let inflightRequests=0;

for(let i=0;i<this._records.length;i++){
const record=this._records[i];
if(record.finished)continue;
if(IGNORED_NETWORK_SCHEMES.includes(record.parsedURL.scheme))continue;
inflightRequests++;
}

return inflightRequests<=allowedRequests;
}

_emitNetworkStatus(){
const zeroQuiet=this.isIdle();
const twoQuiet=this.is2Idle();

if(twoQuiet&&zeroQuiet){
log.verbose('NetworkRecorder','network fully-quiet');
this.emit('network-2-idle');
this.emit('networkidle');
}else if(twoQuiet&&!zeroQuiet){
log.verbose('NetworkRecorder','network semi-quiet');
this.emit('network-2-idle');
this.emit('networkbusy');
}else{
log.verbose('NetworkRecorder','network busy');
this.emit('network-2-busy');
this.emit('networkbusy');
}
}









static findNetworkQuietPeriods(networkRecords,allowedConcurrentRequests,endTime=Infinity){


let timeBoundaries=[];
networkRecords.forEach(record=>{
const scheme=record.parsedURL&&record.parsedURL.scheme;
if(IGNORED_NETWORK_SCHEMES.includes(scheme)){
return;
}


timeBoundaries.push({time:record.startTime*1000,isStart:true});
if(record.finished){
timeBoundaries.push({time:record.endTime*1000,isStart:false});
}
});

timeBoundaries=timeBoundaries.
filter(boundary=>boundary.time<=endTime).
sort((a,b)=>a.time-b.time);

let numInflightRequests=0;
let quietPeriodStart=0;

const quietPeriods=[];
timeBoundaries.forEach(boundary=>{
if(boundary.isStart){

if(numInflightRequests===allowedConcurrentRequests){
quietPeriods.push({start:quietPeriodStart,end:boundary.time});
}
numInflightRequests++;
}else{
numInflightRequests--;

if(numInflightRequests===allowedConcurrentRequests){
quietPeriodStart=boundary.time;
}
}
});


if(numInflightRequests<=allowedConcurrentRequests){
quietPeriods.push({start:quietPeriodStart,end:endTime});
}

return quietPeriods.filter(period=>period.start!==period.end);
}







onRequestStarted(request){
this._records.push(request);
this._recordsById.set(request.requestId,request);

this.emit('requeststarted',request);
this._emitNetworkStatus();
}







onRequestFinished(request){
this.emit('requestloaded',request);
this._emitNetworkStatus();
}







onRequestWillBeSent(event){
const data=event.params;
const originalRequest=this._findRealRequestAndSetSession(data.requestId,event.sessionId);

if(!originalRequest){
const request=new NetworkRequest();
request.onRequestWillBeSent(data);
request.sessionId=event.sessionId;
this.onRequestStarted(request);
return;
}


if(!data.redirectResponse){
return;
}



const modifiedData={
...data,

initiator:originalRequest.initiator,
requestId:`${originalRequest.requestId}:redirect`};

const redirectedRequest=new NetworkRequest();

redirectedRequest.onRequestWillBeSent(modifiedData);
originalRequest.onRedirectResponse(data);

originalRequest.redirectDestination=redirectedRequest;
redirectedRequest.redirectSource=originalRequest;


this.onRequestStarted(redirectedRequest);
this.onRequestFinished(originalRequest);
}




onRequestServedFromCache(event){
const data=event.params;
const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
if(!request)return;
request.onRequestServedFromCache();
}




onResponseReceived(event){
const data=event.params;
const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
if(!request)return;
request.onResponseReceived(data);
}




onDataReceived(event){
const data=event.params;
const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
if(!request)return;
request.onDataReceived(data);
}




onLoadingFinished(event){
const data=event.params;
const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
if(!request)return;
request.onLoadingFinished(data);
this.onRequestFinished(request);
}




onLoadingFailed(event){
const data=event.params;
const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
if(!request)return;
request.onLoadingFailed(data);
this.onRequestFinished(request);
}




onResourceChangedPriority(event){
const data=event.params;
const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
if(!request)return;
request.onResourceChangedPriority(data);
}





dispatch(event){
switch(event.method){
case'Network.requestWillBeSent':return this.onRequestWillBeSent(event);
case'Network.requestServedFromCache':return this.onRequestServedFromCache(event);
case'Network.responseReceived':return this.onResponseReceived(event);
case'Network.dataReceived':return this.onDataReceived(event);
case'Network.loadingFinished':return this.onLoadingFinished(event);
case'Network.loadingFailed':return this.onLoadingFailed(event);
case'Network.resourceChangedPriority':return this.onResourceChangedPriority(event);
default:return;}

}











_findRealRequestAndSetSession(requestId,sessionId){
let request=this._recordsById.get(requestId);
if(!request||!request.isValid)return undefined;

while(request.redirectDestination){
request=request.redirectDestination;
}

request.setSession(sessionId);

return request;
}






static recordsFromLogs(devtoolsLog){
const networkRecorder=new NetworkRecorder();

devtoolsLog.forEach(message=>networkRecorder.dispatch(message));


const records=networkRecorder.getRecords().filter(record=>record.isValid);


const recordsByURL=new Map();
for(const record of records){
if(recordsByURL.has(record.url))continue;
recordsByURL.set(record.url,record);
}


for(const record of records){
const stackFrames=record.initiator.stack&&record.initiator.stack.callFrames||[];
const initiatorURL=record.initiator.url||stackFrames[0]&&stackFrames[0].url;


const initiator=record.redirectSource||recordsByURL.get(initiatorURL);
if(initiator){
record.setInitiatorRequest(initiator);
}

let finalRecord=record;
while(finalRecord.redirectDestination)finalRecord=finalRecord.redirectDestination;
if(finalRecord===record||finalRecord.redirects)continue;

const redirects=[];
for(
let redirect=finalRecord.redirectSource;
redirect;
redirect=redirect.redirectSource)
{
redirects.unshift(redirect);
}

finalRecord.redirects=redirects;
}

return records;
}}


module.exports=NetworkRecorder;

},{"./network-request.js":75,"events":108,"lighthouse-logger":125}],75:[function(require,module,exports){
(function(global){





'use strict';







const URL=require('./url-shim.js');

const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];



const HEADER_TCP='X-TCPMs';
const HEADER_SSL='X-SSLMs';
const HEADER_REQ='X-RequestMs';
const HEADER_RES='X-ResponseMs';
const HEADER_TOTAL='X-TotalMs';
const HEADER_FETCHED_SIZE='X-TotalFetchedSize';



























const RESOURCE_TYPES={
XHR:'XHR',
Fetch:'Fetch',
EventSource:'EventSource',
Script:'Script',
Stylesheet:'Stylesheet',
Image:'Image',
Media:'Media',
Font:'Font',
Document:'Document',
TextTrack:'TextTrack',
WebSocket:'WebSocket',
Other:'Other',
Manifest:'Manifest',
SignedExchange:'SignedExchange',
Ping:'Ping',
CSPViolationReport:'CSPViolationReport'};


class NetworkRequest{
constructor(){
this.requestId='';
this.connectionId='0';
this.connectionReused=false;

this.url='';
this.protocol='';
this.isSecure=false;
this.isValid=false;
this.parsedURL={scheme:''};
this.documentURL='';

this.startTime=-1;

this.endTime=-1;

this.responseReceivedTime=-1;


this.transferSize=0;
this.resourceSize=0;
this.fromDiskCache=false;
this.fromMemoryCache=false;


this.lrStatistics=undefined;

this.finished=false;
this.requestMethod='';
this.statusCode=-1;

this.redirectSource=undefined;

this.redirectDestination=undefined;

this.redirects=undefined;
this.failed=false;
this.localizedFailDescription='';

this.initiator={type:'other'};

this.timing=undefined;

this.resourceType=undefined;
this.mimeType='';

this.priority='Low';

this.initiatorRequest=undefined;

this.responseHeaders=[];

this.responseHeadersText='';

this.fetchedViaServiceWorker=false;

this.frameId='';





this.sessionId=undefined;
this.isLinkPreload=false;
}




hasErrorStatusCode(){
return this.statusCode>=400;
}




setInitiatorRequest(initiator){
this.initiatorRequest=initiator;
}




onRequestWillBeSent(data){
this.requestId=data.requestId;
let url;
try{

url=new URL(data.request.url);
}catch(e){

return;
}
this.url=data.request.url;
this.documentURL=data.documentURL;
this.parsedURL={
scheme:url.protocol.split(':')[0],

host:url.hostname,
securityOrigin:url.origin};

this.isSecure=SECURE_SCHEMES.includes(this.parsedURL.scheme);

this.startTime=data.timestamp;

this.requestMethod=data.request.method;

this.initiator=data.initiator;
this.resourceType=data.type&&RESOURCE_TYPES[data.type];
this.priority=data.request.initialPriority;

this.frameId=data.frameId;
this.isLinkPreload=data.initiator.type==='preload'||!!data.request.isLinkPreload;
this.isValid=true;
}

onRequestServedFromCache(){
this.fromMemoryCache=true;
}




onResponseReceived(data){
this._onResponse(data.response,data.timestamp,data.type);
this.frameId=data.frameId;
}




onDataReceived(data){
this.resourceSize+=data.dataLength;
if(data.encodedDataLength!==-1){
this.transferSize+=data.encodedDataLength;
}
}




onLoadingFinished(data){

if(this.finished)return;

this.finished=true;
this.endTime=data.timestamp;
if(data.encodedDataLength>=0){
this.transferSize=data.encodedDataLength;
}

this._updateResponseReceivedTimeIfNecessary();
this._updateTransferSizeForLightrider();
this._updateTimingsForLightrider();
}




onLoadingFailed(data){

if(this.finished)return;

this.finished=true;
this.endTime=data.timestamp;

this.failed=true;
this.resourceType=data.type&&RESOURCE_TYPES[data.type];
this.localizedFailDescription=data.errorText;

this._updateResponseReceivedTimeIfNecessary();
this._updateTransferSizeForLightrider();
this._updateTimingsForLightrider();
}




onResourceChangedPriority(data){
this.priority=data.newPriority;
}




onRedirectResponse(data){
if(!data.redirectResponse)throw new Error('Missing redirectResponse data');
this._onResponse(data.redirectResponse,data.timestamp,data.type);
this.resourceType=undefined;
this.finished=true;
this.endTime=data.timestamp;

this._updateResponseReceivedTimeIfNecessary();
}




setSession(sessionId){
this.sessionId=sessionId;
}






_onResponse(response,timestamp,resourceType){
this.url=response.url;

this.connectionId=String(response.connectionId);
this.connectionReused=response.connectionReused;

if(response.protocol)this.protocol=response.protocol;

this.responseReceivedTime=timestamp;

this.transferSize=response.encodedDataLength;
if(typeof response.fromDiskCache==='boolean')this.fromDiskCache=response.fromDiskCache;

this.statusCode=response.status;

this.timing=response.timing;
if(resourceType)this.resourceType=RESOURCE_TYPES[resourceType];
this.mimeType=response.mimeType;
this.responseHeadersText=response.headersText||'';
this.responseHeaders=NetworkRequest._headersDictToHeadersArray(response.headers);

this.fetchedViaServiceWorker=!!response.fromServiceWorker;

if(this.fromMemoryCache)this.timing=undefined;
if(this.timing)this._recomputeTimesWithResourceTiming(this.timing);
}






_recomputeTimesWithResourceTiming(timing){


if(timing.requestTime===0||timing.receiveHeadersEnd===-1)return;


this.startTime=timing.requestTime;
const headersReceivedTime=timing.requestTime+timing.receiveHeadersEnd/1000;
if(!this.responseReceivedTime||this.responseReceivedTime<0){
this.responseReceivedTime=headersReceivedTime;
}

this.responseReceivedTime=Math.min(this.responseReceivedTime,headersReceivedTime);
this.responseReceivedTime=Math.max(this.responseReceivedTime,this.startTime);


this.endTime=Math.max(this.endTime,this.responseReceivedTime);
}





_updateResponseReceivedTimeIfNecessary(){
this.responseReceivedTime=Math.min(this.endTime,this.responseReceivedTime);
}


















_updateTransferSizeForLightrider(){

if(!global.isLightrider)return;

const totalFetchedSize=this.responseHeaders.find(item=>item.name===HEADER_FETCHED_SIZE);

if(!totalFetchedSize)return;
const floatValue=parseFloat(totalFetchedSize.value);

if(isNaN(floatValue))return;
this.transferSize=floatValue;
}





_updateTimingsForLightrider(){

if(!global.isLightrider)return;

















const totalHeader=this.responseHeaders.find(item=>item.name===HEADER_TOTAL);

if(!totalHeader)return;

const totalMs=parseInt(totalHeader.value);
const TCPMsHeader=this.responseHeaders.find(item=>item.name===HEADER_TCP);
const SSLMsHeader=this.responseHeaders.find(item=>item.name===HEADER_SSL);
const requestMsHeader=this.responseHeaders.find(item=>item.name===HEADER_REQ);
const responseMsHeader=this.responseHeaders.find(item=>item.name===HEADER_RES);


const TCPMs=TCPMsHeader?Math.max(0,parseInt(TCPMsHeader.value)):0;
const SSLMs=SSLMsHeader?Math.max(0,parseInt(SSLMsHeader.value)):0;
const requestMs=requestMsHeader?Math.max(0,parseInt(requestMsHeader.value)):0;
const responseMs=responseMsHeader?Math.max(0,parseInt(responseMsHeader.value)):0;


if(TCPMs+requestMs+responseMs!==totalMs){
return;
}


if(SSLMs>TCPMs){
return;
}

this.lrStatistics={
endTimeDeltaMs:(this.endTime-(this.startTime+totalMs/1000))*1000,
TCPMs:TCPMs,
requestMs:requestMs,
responseMs:responseMs};

}







static getRequestIdForBackend(requestId){
return requestId.replace(/(:redirect)+$/,'');
}







static _headersDictToHeadersArray(headersDict){
const result=[];
for(const name of Object.keys(headersDict)){
const values=headersDict[name].split('\n');
for(let i=0;i<values.length;++i){
result.push({name:name,value:values[i]});
}
}
return result;
}

static get TYPES(){
return RESOURCE_TYPES;
}}


NetworkRequest.HEADER_TCP=HEADER_TCP;
NetworkRequest.HEADER_SSL=HEADER_SSL;
NetworkRequest.HEADER_REQ=HEADER_REQ;
NetworkRequest.HEADER_RES=HEADER_RES;
NetworkRequest.HEADER_TOTAL=HEADER_TOTAL;
NetworkRequest.HEADER_FETCHED_SIZE=HEADER_FETCHED_SIZE;

module.exports=NetworkRequest;

}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
},{"./url-shim.js":"url"}],76:[function(require,module,exports){






'use strict';














function wrapRuntimeEvalErrorInBrowser(err){
err=err||new Error();
const fallbackMessage=typeof err==='string'?err:'unknown error';

return{
__failedInBrowser:true,
name:err.name||'Error',
message:err.message||fallbackMessage,
stack:err.stack||new Error().stack};

}






function registerPerformanceObserverInPage(){
window.____lastLongTask=window.__perfNow();
const observer=new window.PerformanceObserver(entryList=>{
const entries=entryList.getEntries();
for(const entry of entries){
if(entry.entryType==='longtask'){
const taskEnd=entry.startTime+entry.duration;
window.____lastLongTask=Math.max(window.____lastLongTask,taskEnd);
}
}
});

observer.observe({entryTypes:['longtask']});





window.____lhPerformanceObserver=observer;
}





function checkTimeSinceLastLongTask(){


return new window.__nativePromise(resolve=>{
const timeoutRequested=window.__perfNow()+50;

setTimeout(()=>{

const timeoutFired=window.__perfNow();
const timeSinceLongTask=timeoutFired-timeoutRequested<50?
timeoutFired-window.____lastLongTask:0;
resolve(timeSinceLongTask);
},50);
});
}







function getElementsInDocument(selector){
const realMatchesFn=window.__ElementMatches||window.Element.prototype.matches;

const results=[];


const _findAllElements=nodes=>{
for(let i=0,el;el=nodes[i];++i){
if(!selector||realMatchesFn.call(el,selector)){
results.push(el);
}

if(el.shadowRoot){
_findAllElements(el.shadowRoot.querySelectorAll('*'));
}
}
};
_findAllElements(document.querySelectorAll('*'));

return results;
}








function getOuterHTMLSnippet(element,ignoreAttrs=[]){
try{

if(element instanceof ShadowRoot){
element=element.host;
}

const clone=element.cloneNode();
ignoreAttrs.forEach(attribute=>{
clone.removeAttribute(attribute);
});
const reOpeningTag=/^[\s\S]*?>/;
const match=clone.outerHTML.match(reOpeningTag);
return match&&match[0]||'';
}catch(_){

return`<${element.localName}>`;
}
}















function ultradumbBenchmark(){
const start=Date.now();
let iterations=0;

while(Date.now()-start<500){
let s='';
for(let j=0;j<100000;j++)s+='a';

iterations++;
}

const durationInSeconds=(Date.now()-start)/1000;
return Math.round(iterations/durationInSeconds);
}








function getNodePath(node){

function getNodeIndex(node){
let index=0;
let prevNode;
while(prevNode=node.previousSibling){
node=prevNode;

if(node.nodeType===Node.TEXT_NODE&&node.nodeValue.trim().length===0)continue;
index++;
}
return index;
}

const path=[];
while(node&&node.parentNode){
const index=getNodeIndex(node);
path.push([index,node.nodeName]);
node=node.parentNode;
}
path.reverse();
return path.join(',');
}






function getNodeSelector(node){



function getSelectorPart(node){
let part=node.tagName.toLowerCase();
if(node.id){
part+='#'+node.id;
}else if(node.classList.length>0){
part+='.'+node.classList[0];
}
return part;
}

const parts=[];
while(parts.length<4){
parts.unshift(getSelectorPart(node));
if(!node.parentElement){
break;
}
node=node.parentElement;
if(node.tagName==='HTML'){
break;
}
}
return parts.join(' > ');
}









function isPositionFixed(element){





function getStyleAttrValue(element,attr){

return element.style[attr]||window.getComputedStyle(element)[attr];
}


const htmlEl=document.querySelector('html');
if(htmlEl.scrollHeight<=htmlEl.clientHeight||
!['scroll','auto','visible'].includes(getStyleAttrValue(htmlEl,'overflowY'))){
return false;
}

let currentEl=element;
while(currentEl){
const position=getStyleAttrValue(currentEl,'position');
if(position==='fixed'||position==='sticky'){
return true;
}
currentEl=currentEl.parentElement;
}
return false;
}









function getNodeLabel(node){







function truncate(str,maxLength){
if(str.length<=maxLength){
return str;
}
return str.slice(0,maxLength-1)+'…';
}

const tagName=node.tagName.toLowerCase();

if(tagName!=='html'&&tagName!=='body'){
const nodeLabel=node.innerText||node.getAttribute('alt')||node.getAttribute('aria-label');
if(nodeLabel){
return truncate(nodeLabel,80);
}else{


const nodeToUseForLabel=node.querySelector('[alt], [aria-label]');
if(nodeToUseForLabel){
return getNodeLabel(nodeToUseForLabel);
}
}
}
return tagName;
}

module.exports={
wrapRuntimeEvalErrorInBrowserString:wrapRuntimeEvalErrorInBrowser.toString(),
registerPerformanceObserverInPageString:registerPerformanceObserverInPage.toString(),
checkTimeSinceLastLongTaskString:checkTimeSinceLastLongTask.toString(),
getElementsInDocumentString:getElementsInDocument.toString(),
getOuterHTMLSnippetString:getOuterHTMLSnippet.toString(),
getOuterHTMLSnippet:getOuterHTMLSnippet,
ultradumbBenchmark:ultradumbBenchmark,
ultradumbBenchmarkString:ultradumbBenchmark.toString(),
getNodePathString:getNodePath.toString(),
getNodeSelectorString:getNodeSelector.toString(),
getNodeSelector:getNodeSelector,
getNodeLabel:getNodeLabel,
getNodeLabelString:getNodeLabel.toString(),
isPositionFixedString:isPositionFixed.toString()};


},{}],77:[function(require,module,exports){





'use strict';





function rectContainsPoint(rect,{x,y}){
return rect.left<=x&&rect.right>=x&&rect.top<=y&&rect.bottom>=y;
}










function rectContains(rect1,rect2){
return rect2.top>=rect1.top&&
rect2.right<=rect1.right&&
rect2.bottom<=rect1.bottom&&
rect2.left>=rect1.left;
}





function filterOutTinyRects(rects){
return rects.filter(
rect=>rect.width>1&&rect.height>1);

}





function filterOutRectsContainedByOthers(rects){
const rectsToKeep=new Set(rects);

for(const rect of rects){
for(const possiblyContainingRect of rects){
if(rect===possiblyContainingRect)continue;
if(!rectsToKeep.has(possiblyContainingRect))continue;
if(rectContains(possiblyContainingRect,rect)){
rectsToKeep.delete(rect);
break;
}
}
}

return Array.from(rectsToKeep);
}





function getRectCenterPoint(rect){
return{
x:rect.left+rect.width/2,
y:rect.top+rect.height/2};

}






function rectsTouchOrOverlap(rectA,rectB){

return(
rectA.left<=rectB.right&&
rectB.left<=rectA.right&&
rectA.top<=rectB.bottom&&
rectB.top<=rectA.bottom);

}








function getBoundingRectWithPadding(rects,padding){
if(rects.length===0){
throw new Error('No rects to take bounds of');
}

let left=Number.MAX_VALUE;
let right=-Number.MAX_VALUE;
let top=Number.MAX_VALUE;
let bottom=-Number.MAX_VALUE;
for(const rect of rects){
left=Math.min(left,rect.left);
right=Math.max(right,rect.right);
top=Math.min(top,rect.top);
bottom=Math.max(bottom,rect.bottom);
}


const halfMinSize=padding/2;
left-=halfMinSize;
right+=halfMinSize;
top-=halfMinSize;
bottom+=halfMinSize;

return{
left,
right,
top,
bottom,
width:right-left,
height:bottom-top};

}




function getBoundingRect(rects){
return getBoundingRectWithPadding(rects,0);
}





function addRectWidthAndHeight({left,top,right,bottom}){
return{
left,
top,
right,
bottom,
width:right-left,
height:bottom-top};

}





function addRectTopAndBottom({x,y,width,height}){
return{
left:x,
top:y,
right:x+width,
bottom:y+height,
width,
height};

}





function getRectOverlapArea(rect1,rect2){

const rectYOverlap=Math.min(rect1.bottom,rect2.bottom)-Math.max(rect1.top,rect2.top);
if(rectYOverlap<=0)return 0;

const rectXOverlap=Math.min(rect1.right,rect2.right)-Math.max(rect1.left,rect2.left);
if(rectXOverlap<=0)return 0;

return rectXOverlap*rectYOverlap;
}





function getRectAtCenter(rect,centerRectSize){
return addRectWidthAndHeight({
left:rect.left+rect.width/2-centerRectSize/2,
top:rect.top+rect.height/2-centerRectSize/2,
right:rect.right-rect.width/2+centerRectSize/2,
bottom:rect.bottom-rect.height/2+centerRectSize/2});

}





function getRectArea(rect){
return rect.width*rect.height;
}





function getLargestRect(rects){
let largestRect=rects[0];
for(const rect of rects){
if(getRectArea(rect)>getRectArea(largestRect)){
largestRect=rect;
}
}
return largestRect;
}






function allRectsContainedWithinEachOther(rectListA,rectListB){
for(const rectA of rectListA){
for(const rectB of rectListB){
if(!rectContains(rectA,rectB)&&!rectContains(rectB,rectA)){
return false;
}
}
}
return true;
}

module.exports={
rectContainsPoint,
rectContains,
addRectWidthAndHeight,
addRectTopAndBottom,
getRectOverlapArea,
getRectAtCenter,
getLargestRect,
getRectArea,
getRectCenterPoint,
getBoundingRect,
getBoundingRectWithPadding,
rectsTouchOrOverlap,
allRectsContainedWithinEachOther,
filterOutRectsContainedByOthers,
filterOutTinyRects};


},{}],78:[function(require,module,exports){





'use strict';

const log=require('lighthouse-logger');




const SENTRY_URL='https://a6bb0da87ee048cc9ae2a345fc09ab2e:63a7029f46f74265981b7e005e0f69f8@sentry.io/174697';


const SAMPLE_RATE=0.01;


const SAMPLED_ERRORS=[];




const noop=()=>{};





const sentryDelegate={
init,

captureMessage:noop,

captureBreadcrumb:noop,

getContext:noop,

captureException:async()=>{},
_shouldSample(){
return SAMPLE_RATE>=Math.random();
}};






function init(opts){

if(!opts.flags.enableErrorReporting){
return;
}


if(!sentryDelegate._shouldSample()){
return;
}

try{
const Sentry=require('raven');
const sentryConfig=Object.assign({},opts.environmentData,
{captureUnhandledRejections:true});
Sentry.config(SENTRY_URL,sentryConfig).install();


sentryDelegate.captureMessage=(...args)=>Sentry.captureMessage(...args);
sentryDelegate.captureBreadcrumb=(...args)=>Sentry.captureBreadcrumb(...args);
sentryDelegate.getContext=()=>Sentry.getContext();


const sentryExceptionCache=new Map();

sentryDelegate.captureException=async(err,opts={})=>{

if(!err)return;



if(err.expected)return;

const tags=opts.tags||{};
if(tags.audit){
const key=`audit-${tags.audit}-${err.message}`;
if(sentryExceptionCache.has(key))return;
sentryExceptionCache.set(key,true);
}

if(tags.gatherer){
const key=`gatherer-${tags.gatherer}-${err.message}`;
if(sentryExceptionCache.has(key))return;
sentryExceptionCache.set(key,true);
}


const sampledErrorMatch=SAMPLED_ERRORS.find(sample=>sample.pattern.test(err.message));
if(sampledErrorMatch&&sampledErrorMatch.rate<=Math.random())return;



if(err.protocolMethod){

opts.fingerprint=['{{ default }}',err.protocolMethod,err.protocolError];
}

return new Promise(resolve=>{
Sentry.captureException(err,opts,()=>resolve());
});
};

const context=Object.assign({
url:opts.url,
emulatedFormFactor:opts.flags.emulatedFormFactor,
throttlingMethod:opts.flags.throttlingMethod},
opts.flags.throttling);
Sentry.mergeContext({extra:Object.assign({},opts.environmentData.extra,context)});
}catch(e){
log.warn(
'sentry',
'Could not load raven library, errors will not be reported.');

}
}

module.exports=sentryDelegate;

},{"lighthouse-logger":125,"raven":101}],79:[function(require,module,exports){













'use strict';


const libDetectorSource="var UNKNOWN_VERSION = null;\nvar d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests = {\n\n    'GWT': {\n        icon: 'gwt',\n        url: 'http://www.gwtproject.org/',\n        test: function(win) {\n            // pretty complicated, many possible tell tales\n            var doc = win.document,\n                hasHistFrame = doc.getElementById('__gwt_historyFrame'),\n                hasGwtUid = doc.gwt_uid,\n                hasBodyListener = doc.body.__listener,\n                hasBodyEventBits = doc.body.__eventBits,\n                hasModules = win.__gwt_activeModules,\n                hasJsonP = win.__gwt_jsonp__,\n                hasRootWinApp = win.__gwt_scriptsLoaded || win.__gwt_stylesLoaded || win.__gwt_activeModules;\n\n            // use the many possible indicators\n            if(hasHistFrame || hasGwtUid || hasBodyListener || hasBodyEventBits || hasModules || hasJsonP || hasRootWinApp) {\n\n                // carefully look at frames, but only if certain is GWT frame\n                var frames = doc.getElementsByTagName('iframe'),\n                    gwtVersion = UNKNOWN_VERSION;\n                for(var n=0; n<frames.length; n++) {\n                    // catch security access errors\n                    try {\n                        var hasNegativeTabIndex = frames[n].tabIndex < 0; // on for GWT\n                        if(hasNegativeTabIndex && frames[n].contentWindow && frames[n].contentWindow.$gwt_version) {\n                            gwtVersion = frames[n].contentWindow.$gwt_version;\n                            break;\n                        }\n                    }\n                    catch(e) {}\n                }\n\n                if(gwtVersion=='0.0.999') {\n                  gwtVersion = 'Google Internal';\n                }\n\n                return { version: gwtVersion };\n            }\n            return false;\n        }\n    },\n\n    'Ink': {\n        icon: 'ink',\n        url: 'http://ink.sapo.pt/',\n        test: function(win) {\n            if (win.Ink && win.Ink.createModule) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Vaadin': {\n        icon: 'vaadin',\n        url: 'https://vaadin.com/',\n        test: function(win) {\n            if (win.vaadin && win.vaadin.registerWidgetset) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Bootstrap': {\n        icon: 'bootstrap',\n        url: 'http://getbootstrap.com/',\n        npm: 'bootstrap',\n        // look for a function Boostrap has added to jQuery - regex for BS 2 & 3\n        test: function(win) {\n            var jQueryAvailable = win.$ && win.$.fn,\n                RE_PREFIX_V2 = '\\\\$this\\\\.data\\\\((?:\\'|\")',\n                RE_PREFIX_V3 = '\\\\$this\\\\.data\\\\((?:\\'|\")(?:bs\\\\.){1}',\n                bootstrapComponents = [\n                    'affix', 'alert', 'button', 'carousel', 'collapse', 'dropdown',\n                    'modal', 'popover', 'scrollspy', 'tab', 'tooltip'\n                ];\n\n            if(jQueryAvailable) {\n                var bootstrapVersion;\n\n                bootstrapComponents.some(function(component) {\n                    if(win.$.fn[component]) {\n                        // Bootstrap >= 3.2.0 detection\n                        if(win.$.fn[component].Constructor && win.$.fn[component].Constructor.VERSION) {\n                            bootstrapVersion = win.$.fn[component].Constructor.VERSION;\n                            return true;\n                        // Bootstrap >= 2.0.0 and <= 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V3 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 3.0.0 & <= 3.1.1';\n                            return true;\n                        // Bootstrap < 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V2 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 2.0.0 & <= 2.3.2';\n                            return true;\n                        }\n                    }\n\n                    return false;\n                });\n\n                if (bootstrapVersion) {\n                    return { version: bootstrapVersion };\n                }\n            }\n\n            return false;\n        }\n    },\n\n    'Zurb': {\n        icon: 'zurb',\n        url: 'https://foundation.zurb.com/',\n        npm: 'foundation-sites',\n        test: function(win) {\n            if(win.Foundation && win.Foundation.Toggler) {\n                return { version: win.Foundation.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Polymer': {\n        icon: 'polymer',\n        url: 'https://www.polymer-project.org/',\n        npm: '@polymer/polymer',\n        test: function(win) {\n            if(win.Polymer && win.Polymer.dom) {\n                return { version: win.Polymer.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Highcharts': {\n        icon: 'highcharts',\n        url: 'http://www.highcharts.com',\n        npm: 'highcharts',\n        test: function(win) {\n            if(win.Highcharts && win.Highcharts.Point) {\n                return { version: win.Highcharts.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'InfoVis': {\n        icon: 'jit',\n        url: 'http://philogb.github.com/jit/',\n        test: function test(win) {\n            if(win.$jit && win.$jit.PieChart) {\n                return { version: win.$jit.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'FlotCharts': {\n        icon: 'flotcharts',\n        url: 'http://www.flotcharts.org/',\n        npm: 'flot',\n        test: function(win) {\n            if(win.$ && win.$.plot) {\n                return { version: win.$.plot.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'CreateJS': {\n        icon: 'createjs',\n        url: 'https://createjs.com/',\n        npm: 'createjs',\n        test: function(win) {\n            if(win.createjs && win.createjs.promote) {\n                return { version: UNKNOWN_VERSION}; // no version info available\n            }\n            return false;\n        }\n    },\n\n    'Google Maps': {\n        icon: 'gmaps',\n        url: 'https://developers.google.com/maps/',\n        test: function(win) {\n            if (win.google && win.google.maps) {\n                return { version: win.google.maps.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function(win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn && jq.fn.jquery) {\n                return { version: jq.fn.jquery.replace(/[^\\d+\\.+]/g, '') || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery (Fast path)': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function (win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery UI': {\n        icon: 'jquery_ui',\n        url: 'http://jqueryui.com',\n        npm: 'jquery-ui',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.ui) {\n                var plugins = 'accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs'.split(','), concat = [];\n                for (var i=0; i < plugins.length; i++) { if(jq.ui[plugins[i]]) concat.push(plugins[i].substr(0,1).toUpperCase() + plugins[i].substr(1)); }\n                return { version: jq.ui.version || UNKNOWN_VERSION, details: concat.length ? 'Plugins used: '+concat.join(',') : '' };\n            }\n            return false;\n        }\n    },\n\n    'Dojo': {\n        icon: 'dojo',\n        url: 'http://dojotoolkit.org',\n        npm: 'dojo',\n        test: function(win) {\n            if(win.dojo && win.dojo.delegate) {\n                var version = win.dojo.version ? win.dojo.version.toString() : UNKNOWN_VERSION;\n                return { version: version, details: 'Details: '+(win.dijit ? 'Uses Dijit' : 'none') };\n            }\n            return false;\n        }\n    },\n\n    'Prototype': {\n        icon: 'prototype',\n        url: 'http://prototypejs.org',\n        test: function(win) {\n            if(win.Prototype && win.Prototype.BrowserFeatures) {\n                return { version: win.Prototype.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Scriptaculous': {\n        icon: 'scriptaculous',\n        url: 'http://script.aculo.us',\n        test: function(win) {\n            if(win.Scriptaculous && win.Scriptaculous.load) {\n                return { version: win.Scriptaculous.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'MooTools': {\n        icon: 'mootools',\n        url: 'https://mootools.net/',\n        test: function(win) {\n            if(win.MooTools && win.MooTools.build) {\n                return { version: win.MooTools.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spry': {\n        icon: 'spry',\n        url: 'http://labs.adobe.com/technologies/spry',\n        test: function(win) {\n            if (win.Spry && win.Spry.Data) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 2': {\n        icon: 'yui',\n        url: 'http://developer.yahoo.com/yui/2/',\n        test: function(win) {\n            if (win.YAHOO && win.YAHOO.util) {\n                return { version: win.YAHOO.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 3': {\n        icon: 'yui3',\n        url: 'https://yuilibrary.com/',\n        npm: 'yui',\n        test: function(win) {\n            if (win.YUI && win.YUI.Env) {\n                return { version: win.YUI.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Qooxdoo': {\n        icon: 'qooxdoo',\n        url: 'http://www.qooxdoo.org/',\n        npm: 'qooxdoo',\n        test: function(win) {\n            if(win.qx && win.qx.Bootstrap) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ext JS': {\n        icon: 'extjs',\n        url: 'https://www.sencha.com/products/extjs/',\n        test: function(win) {\n            if (win.Ext && win.Ext.versions) {\n                return { version: win.Ext.versions.core.version };\n            }\n            else if(win.Ext) {\n                return { version: win.Ext.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'base2': {\n        icon: 'base2',\n        url: 'http://code.google.com/p/base2',\n        test: function(win) {\n            if(win.base2 && win.base2.dom) {\n                return { version: win.base2.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Closure Library': {\n        icon: 'closure',\n        url: 'https://developers.google.com/closure/library/',\n        npm: 'google-closure-library',\n        test: function(win) {\n            if(win.goog && win.goog.provide) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Rapha&euml;l': {\n        icon: 'raphael',\n        url: 'http://dmitrybaranovskiy.github.io/raphael/',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.circle) {\n                return { version: win.Raphael.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React': {\n        icon: 'react',\n        url: 'https://reactjs.org/',\n        npm: 'react',\n        test: function(win) {\n            function isMatch(node) {\n                return node!=null && node._reactRootContainer!=null;\n            }\n            function nodeFilter(node) {\n                return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            var bodyReactRoot = isMatch(document.body) || isMatch(document.body.firstElementChild);\n            var hasReactRoot = bodyReactRoot|| document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode() != null;\n            if (hasReactRoot || reactRoot && reactRoot.innerText.length > 0 || altHasReact || win.React && win.React.Component) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React (Fast path)': {\n        icon: 'react',\n        url: 'https://reactjs.org/',\n        npm: 'react',\n        test: function (win) {\n            function isMatch(node) {\n                return node != null && node._reactRootContainer != null;\n            }\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            var hasReactRoot = isMatch(document.body) || isMatch(document.body.firstElementChild);\n            if (hasReactRoot || reactRoot || altHasReact || win.React) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Next.js': {\n        icon: 'next',\n        url: 'https://nextjs.org/',\n        npm: 'next',\n        test: function(win) {\n            if (win.__NEXT_DATA__ && win.__NEXT_DATA__.buildId) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Next.js (Fast path)': {\n        icon: 'next',\n        url: 'https://nextjs.org/',\n        npm: 'next',\n        test: function (win) {\n            if (win.__NEXT_DATA__) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Preact': {\n        icon: 'preact',\n        url: 'https://preactjs.com/',\n        npm: 'preact',\n        test: function(win) {\n            var expando = typeof Symbol!='undefined' && Symbol.for && Symbol.for('preactattr');\n            function isMatch(node) {\n                return node._component!=null || node.__preactattr_!=null || expando && node[expando]!=null;\n            }\n            function getMatch(node) {\n                return node!=null && isMatch(node) && node;\n            }\n            function nodeFilter(node) {\n                return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var preactRoot = getMatch(document.body) || getMatch(document.body.firstElementChild);\n            if (!preactRoot) {\n                preactRoot = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode();\n            }\n            if (preactRoot || win.preact) {\n                var version = UNKNOWN_VERSION;\n                if (expando && preactRoot && preactRoot[expando]!=null) {\n                    version = '7';\n                }\n                return { version: version };\n            }\n            return false;\n        }\n    },\n\n    'Preact (Fast path)': {\n        icon: 'preact',\n        url: 'https://preactjs.com/',\n        npm: 'preact',\n        test: function (win) {\n            function isMatch(node) {\n                return node._component != null || node.__preactattr_ != null;\n            }\n            function getMatch(node) {\n                return node != null && isMatch(node);\n            }\n            var preactRoot = getMatch(document.body) || getMatch(document.body.firstElementChild);\n            if (preactRoot || win.preact) {\n                var version = UNKNOWN_VERSION;\n                return { version: version };\n            }\n            return false;\n        }\n    },\n\n    'Modernizr': {\n        icon: 'modernizr',\n        url: 'https://modernizr.com/',\n        npm: 'modernizr',\n        test: function(win) {\n            if (win.Modernizr && win.Modernizr.addTest) {\n                return { version: win.Modernizr._version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Processing.js': {\n        icon: 'processingjs',\n        url: 'http://processingjs.org',\n        npm: 'processing-js',\n        test: function(win) {\n            if(win.Processing && win.Processing.box) {\n                return { version: Processing.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Backbone': {\n        icon: 'backbone',\n        url: 'http://backbonejs.org/',\n        npm: 'backbone',\n        test: function(win) {\n            if (win.Backbone && win.Backbone.Model.extend) {\n                return {version: win.Backbone.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Leaflet': {\n        icon: 'leaflet',\n        url: 'http://leafletjs.com',\n        npm: 'leaflet',\n        test: function(win) {\n            // Leaflet 3.1 uses L.Marker and L.VERSION; later versions use L.marker and L.version\n            if (win.L && win.L.GeoJSON && (win.L.marker || win.L.Marker)) {\n                return { version: win.L.version || win.L.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Mapbox': {\n        icon: 'mapbox',\n        url: 'https://www.mapbox.com/',\n        npm: 'mapbox-gl',\n        test: function(win) {\n            if (win.L && win.L.mapbox && win.L.mapbox.geocoder) {\n                return { version: win.L.mapbox.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Lo-Dash': {\n        icon: 'lodash',\n        url: 'https://lodash.com/',\n        npm: 'lodash',\n        test: function(win) {\n            var _ = typeof (_ = win._) == 'function' && _,\n                chain = typeof (chain = _ && _.chain) == 'function' && chain,\n                wrapper = (chain || _ || function() { return {}; })(1);\n\n            if (_ && wrapper.__wrapped__) {\n                return { version: _.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Underscore': {\n        icon: 'underscore',\n        url: 'http://underscorejs.org/',\n        npm: 'underscore',\n        test: function(win) {\n            if (win._ && typeof win._.tap === 'function' &&\n                !d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests['Lo-Dash'].test(win)) {\n                return {version: win._.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Sammy': {\n        icon: 'sammy',\n        url: 'http://sammyjs.org',\n        test: function(win) {\n            if (win.Sammy && win.Sammy.Application.curry) {\n                return {version: win.Sammy.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Rico': {\n        icon: 'rico',\n        url: 'http://openrico.sourceforge.net/examples/index.html',\n        test:  function(win) {\n            if (win.Rico && window.Rico.checkIfComplete) {\n                return {version: win.Rico.Version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'MochiKit': {\n        icon: 'mochikit',\n        url: 'https://mochi.github.io/mochikit/',\n        test: function(win) {\n            if (win.MochiKit && win.MochiKit.Base.module) {\n                return {version: MochiKit.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'gRapha&euml;l': {\n        icon: 'graphael',\n        url: 'https://github.com/DmitryBaranovskiy/g.raphael',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.fn.g) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Glow': {\n        icon: 'glow',\n        url: 'http://www.bbc.co.uk/glow/',\n        test: function(win) {\n            if (win.gloader && win.gloader.getRequests) {\n                return {version: UNKNOWN_VERSION};\n            }\n            else if (win.glow && win.glow.dom) {\n                return {version: win.glow.VERSION || UNKNOWN_VERSION};\n            }\n            else if (win.Glow) {\n                return {version: win.Glow.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Socket.IO': {\n        icon: 'socketio', // currently has no icon\n        url: 'https://socket.io/',\n        npm: 'socket.io',\n        test: function(win) {\n            // version 0.6.2 uses only io.Socket; more recent versions also have io.sockets\n            if (win.io && (win.io.sockets || win.io.Socket)) {\n                return {version: win.io.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Mustache': {\n        icon: 'mustache',\n        url: 'http://mustache.github.io/',\n        npm: 'mustache',\n        test: function(win) {\n            if (win.Mustache && win.Mustache.to_html) {\n                return {version: win.Mustache.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Fabric.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://fabricjs.com/',\n        npm: 'fabric',\n        test: function(win) {\n            if (win.fabric && win.fabric.util) {\n                return {version: win.fabric.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'FuseJS': {\n        icon: 'fusejs',\n        url: 'http://fusejs.io/',\n        npm: 'fuse.js',\n        test: function(win) {\n            if (win.Fuse) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Tween.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/tweenjs/tween.js',\n        npm: 'tween.js',\n        test: function(win) {\n            if (win.TWEEN && win.TWEEN.Easing) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'SproutCore': {\n       icon: 'sproutcore',\n       url: 'http://sproutcore.com/',\n       test: function(win) {\n           if (win.SC && win.SC.Application) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'Zepto.js': {\n       icon: 'zepto',\n       url: 'http://zeptojs.com',\n       npm: 'zepto',\n       test: function(win) {\n           if (win.Zepto && win.Zepto.fn) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'three.js': {\n       icon: 'icon38', // currently has no icon\n       url: 'https://threejs.org/',\n       npm: 'three',\n       test: function(win) {\n           if (win.THREE && win.THREE.REVISION) {\n               return {version: 'r' + win.THREE.REVISION};\n           }\n           else if (win.THREE) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'PhiloGL': {\n       icon: 'philogl',\n       url: 'http://www.senchalabs.org/philogl/',\n       npm: 'philogl',\n       test: function(win) {\n           if (win.PhiloGL && win.PhiloGL.Camera) {\n               return {version: win.PhiloGL.version || UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'CamanJS': {\n        icon: 'camanjs',\n        url: 'http://camanjs.com/',\n        npm: 'caman',\n        test: function(win) {\n            if (win.Caman && win.Caman.version) {\n                return {version: win.Caman.version.release};\n            }\n            else if (win.Caman) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'yepnope': {\n        icon: 'yepnope',\n        url: 'http://yepnopejs.com/',\n        test: function(win) {\n            if (win.yepnope && win.yepnope.injectJs) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'LABjs': {\n        icon: 'icon38',\n        url: 'https://github.com/getify/LABjs',\n        test: function(win) {\n            if (win.$LAB && win.$LAB.setOptions) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Head JS': {\n        icon: 'headjs',\n        url: 'http://headjs.com/',\n        npm: 'headjs',\n        test: function(win) {\n            if (win.head && win.head.js) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'ControlJS': {\n        icon: 'icon38',\n        url: 'http://stevesouders.com/controljs/',\n        test: function(win) {\n            if (win.CJS && win.CJS.start) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'RequireJS': {\n        icon: 'requirejs',\n        url: 'http://requirejs.org/',\n        npm: 'requirejs',\n        test: function(win) {\n            var req = win.require || win.requirejs;\n            if (req && (req.load || (req.s && req.s.contexts && req.s.contexts._ && (req.s.contexts._.loaded || req.s.contexts._.load)))) {\n                return { version: req.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'RightJS': {\n        icon: 'rightjs',\n        url: 'http://rightjs.org/',\n        test: function(win) {\n            if (win.RightJS && win.RightJS.isNode) {\n                return { version: win.RightJS.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery Tools': {\n       icon: 'jquerytools',\n       url: 'http://jquerytools.github.io/',\n       test: function(win) {\n            var jq = win.jQuery || win.$;\n            if(jq && jq.tools) {\n               return { version: jq.tools.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Pusher': {\n       icon: 'pusher',\n       url: 'https://pusher.com/docs/',\n       npm: 'pusher-js',\n       test: function(win) {\n            if(win.Pusher && win.Pusher.Channel) {\n               return { version: win.Pusher.VERSION || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Paper.js': {\n       icon: 'paperjs',\n       url: 'http://paperjs.org/',\n       npm: 'paper',\n       test: function(win) {\n            if(win.paper && win.paper.Point) {\n               return { version: win.paper.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Swiffy': {\n       icon: 'icon38',\n       url: 'https://developers.google.com/swiffy/',\n       test: function(win) {\n            if(win.swiffy && win.swiffy.Stage) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Move': {\n       icon: 'move',\n       url: 'https://github.com/rsms/move',\n       npm: 'move',\n       test: function(win) {\n            if(win.move && win.move.compile) {\n               return { version: win.move.version() || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'AmplifyJS': {\n       icon: 'amplifyjs',\n       url: 'http://amplifyjs.com/',\n       npm: 'amplifyjs',\n       test: function(win) {\n            if(win.amplify && win.amplify.publish) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Popcorn.js': {\n       icon: 'popcornjs',\n       url: 'https://github.com/mozilla/popcorn-js/',\n       test: function(win) {\n            if (win.Popcorn && win.Popcorn.Events) {\n               return { version: win.Popcorn.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'D3': {\n        icon: 'd3',\n        url: 'https://d3js.org/',\n        npm: 'd3',\n        test: function(win) {\n            if (win.d3 && win.d3.select) {\n                return { version: win.d3.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Handlebars': {\n        icon: 'handlebars',\n        url: 'http://handlebarsjs.com/',\n        npm: 'handlebars',\n        test: function(win) {\n            if(win.Handlebars && win.Handlebars.compile) {\n                return { version: win.Handlebars.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Knockout': {\n        icon: 'knockout',\n        url: 'http://knockoutjs.com/',\n        npm: 'knockout',\n        test: function(win) {\n            if (win.ko && win.ko.applyBindings) {\n                return { version: win.ko.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spine': {\n        icon: 'icon38',\n        url: 'http://spine.github.io/',\n        test: function(win) {\n            if (win.Spine && win.Spine.Controller) {\n                return {version: win.Spine.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery Mobile': {\n        icon: 'jquery_mobile',\n        url: 'http://jquerymobile.com/',\n        npm: 'jquery-mobile',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.mobile) {\n                return { version: jq.mobile.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'WebFont Loader': {\n        icon: 'icon38',\n        url: 'https://github.com/typekit/webfontloader',\n        npm: 'webfontloader',\n        test: function(win) {\n            if(win.WebFont && win.WebFont.load) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Angular': {\n        icon: 'angular',\n        url: 'https://angular.io/',\n        npm: '@angular/core',\n        test: function(win) {\n            var ngVersion = win.document.querySelector('[ng-version]');\n            if (ngVersion) {\n                return { version: ngVersion.getAttribute('ng-version') || UNKNOWN_VERSION };\n            }\n            else if (win.ng && win.ng.probe instanceof Function) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'AngularJS': {\n        icon: 'angularjs',\n        url: 'https://angularjs.org/',\n        npm: 'angular',\n        test: function(win) {\n            var ng = win.angular;\n            if(ng && ng.version && ng.version.full) {\n                return { version: ng.version.full };\n            }\n            else if (ng) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js': {\n        icon: 'emberjs',\n        url: 'https://emberjs.com/',\n        npm: 'ember-source',\n        test: function(win) {\n            var ember = win.Ember || win.Em;\n            if (ember && ember.GUID_KEY) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js (Fast path)': {\n        icon: 'emberjs',\n        url: 'https://emberjs.com/',\n        npm: 'ember-source',\n        test: function (win) {\n            var ember = win.Ember || win.Em;\n            if (ember) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Hammer.js': {\n        icon: 'hammerjs',\n        url: 'http://eightmedia.github.io/hammer.js/',\n        npm: 'hammerjs',\n        test: function(win) {\n            if(win.Hammer && win.Hammer.Pinch) {\n                // Hammer.VERSION available in 1.0.10+\n                return { version: win.Hammer.VERSION || \"&lt; 1.0.10\" };\n            }\n            return false;\n        }\n    },\n\n    'Visibility.js': {\n        icon: 'icon38',\n        url: 'https://github.com/ai/visibilityjs',\n        npm: 'visibilityjs',\n        test: function(win) {\n            if(win.Visibility && win.Visibility.every) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Velocity.js': {\n        icon: 'icon38',\n        url: 'http://velocityjs.org/',\n        npm: 'velocity-animate',\n        test: function(win) {\n            var jq = win.jQuery || win.$,\n                velocity = jq ? jq.Velocity : win.Velocity;\n\n            if(velocity && velocity.RegisterEffect && velocity.version) {\n                return {\n                    version:\n                        velocity.version.major + \".\" +\n                        velocity.version.minor + \".\" +\n                        velocity.version.patch\n                };\n            }\n            else if (velocity && velocity.RegisterEffect) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'IfVisible.js': {\n        icon: 'icon38',\n        url: 'http://serkanyersen.github.io/ifvisible.js/',\n        npm: 'ifvisible.js',\n        test: function(win) {\n            var iv = win.ifvisible;\n            if(iv && iv.__ceGUID === \"ifvisible.object.event.identifier\") {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Pixi.js': {\n        icon: 'pixi',\n        url: 'http://www.pixijs.com/',\n        npm: 'pixi.js',\n        test: function(win) {\n            var px = win.PIXI;\n            if(px && px.WebGLRenderer && px.VERSION) {\n                // version 4.4.3 returns simply \"4.4.3\"; version 1.5.2 returns \"v1.5.2\"\n                return { version: px.VERSION.replace('v', '') || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'DC.js': {\n        icon: 'dcjs',\n        url: 'http://dc-js.github.io/dc.js/',\n        npm: 'dc',\n        test: function(win) {\n            var dc = win.dc;\n            if(dc && dc.registerChart) {\n                return { version: dc.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'GreenSock JS': {\n        icon: 'greensock',\n        url: 'https://greensock.com/gsap',\n        npm: 'gsap',\n        test: function(win) {\n            if (win.TweenMax && win.TweenMax.pauseAll) {\n                return { version: win.TweenMax.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FastClick': {\n        icon: 'fastclick',\n        url: 'https://github.com/ftlabs/fastclick',\n        npm: 'fastclick',\n        test: function(win) {\n            if(win.FastClick && win.FastClick.notNeeded) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Isotope': {\n        icon: 'isotope',\n        url: 'https://isotope.metafizzy.co/',\n        npm: 'isotope-layout',\n        test: function(win) {\n            if(win.Isotope || (win.$ != null && win.$.Isotope)) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marionette': {\n        icon: 'marionette',\n        url: 'https://marionettejs.com/',\n        npm: 'backbone.marionette',\n        test: function(win) {\n            if(win.Marionette && win.Marionette.Application) {\n                return { version: win.Marionette.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Can': {\n        icon: 'canjs',\n        url: 'https://canjs.com/',\n        npm: 'can',\n        test: function (win) {\n            if (win.can && win.can.Construct) {\n                return { version: win.can.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue': {\n        icon: 'vue',\n        url: 'https://vuejs.org/',\n        npm: 'vue',\n        test: function(win) {\n            function isVueNode(node) {\n                return node.__vue__ != null ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var hasVueNode = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, isVueNode).nextNode() !== null;\n            if (hasVueNode) {\n                return { version: win.Vue && win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue (Fast path)': {\n        icon: 'vue',\n        url: 'https://vuejs.org/',\n        npm: 'vue',\n        test: function (win) {\n            if (win.Vue) {\n                return { version: win.Vue && win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Nuxt.js': {\n        icon: 'nuxt',\n        url: 'https://nuxtjs.org/',\n        npm: 'nuxt',\n        test: function(win) {\n            if ((win.__NUXT__ && win.__NUXT__.data != null) || win.$nuxt) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Nuxt.js (Fast path)': {\n        icon: 'nuxt',\n        url: 'https://nuxtjs.org/',\n        npm: 'nuxt',\n        test: function (win) {\n            if (win.__NUXT__  || win.$nuxt) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Two': {\n        icon: 'two',\n        url: 'https://two.js.org/',\n        npm: 'two.js',\n        test: function(win) {\n            if (win.Two && win.Two.Utils) {\n                return { version: win.Two.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Brewser': {\n        icon: 'brewser',\n        url: 'https://robertpataki.github.io/brewser/',\n        npm: 'brewser',\n        test: function(win) {\n            if(win.BREWSER && win.BREWSER.ua) {\n                return { version: BREWSER.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Material Design Lite': {\n        icon: 'mdl',\n        url: 'https://getmdl.io/',\n        npm: 'material-design-lite',\n        test: function(win) {\n            if(win.componentHandler && win.componentHandler.upgradeElement) {\n                return { version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Kendo UI': {\n        icon: 'kendoui',\n        url: 'https://github.com/telerik/kendo-ui-core',\n        npm: 'kendo-ui-core',\n        test: function(win) {\n            if (win.kendo && win.kendo.View && win.kendo.View.extend) {\n                return {version: win.kendo.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Matter.js': {\n        icon: 'matter-js',\n        url: 'http://brm.io/matter-js/',\n        npm: 'matter-js',\n        test: function(win) {\n            if (win.Matter && win.Matter.Engine) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Riot': {\n        icon: 'riot',\n        url: 'http://riotjs.com/',\n        npm: 'riot',\n        test: function(win) {\n            if (win.riot && win.riot.mixin) {\n                return { version: win.riot.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Sea.js': {\n        icon: 'icon38',\n        url: 'https://seajs.github.io/seajs/docs/',\n        npm: 'seajs',\n        test: function(win) {\n            if(win.seajs && win.seajs.use) {\n                return { version: win.seajs.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment.js': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/',\n        npm: 'moment',\n        test: function(win) {\n            if(win.moment && (win.moment.isMoment || win.moment.lang)) {\n                // version 1.0.0 has neither \"isMoment\" nor \"version\"\n                return { version: win.moment.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment Timezone': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/timezone/',\n        npm: 'moment-timezone',\n        test: function(win) {\n            if (win.moment && win.moment.tz) {\n                return { version: win.moment.tz.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'ScrollMagic': {\n        icon: 'scrollmagic',\n        url: 'http://scrollmagic.io/',\n        npm: 'scrollmagic',\n        test: function(win) {\n            if (win.ScrollMagic && win.ScrollMagic.Controller) {\n                return {version: ScrollMagic.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'SWFObject': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/swfobject/swfobject',\n        test: function(win) {\n            if (win.swfobject && win.swfobject.embedSWF) {\n                // 2.x - exact version only for 2.3\n                return { version: win.swfobject.version || UNKNOWN_VERSION };\n            } else if(win.deconcept && win.deconcept.SWFObject) {\n                // 1.x\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FlexSlider': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://woocommerce.com/flexslider/',\n        npm: 'flexslider',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if (jq && jq.fn && jq.fn.jquery && jq.flexslider){\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'SPF': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://youtube.github.io/spfjs/',\n        npm: 'spf',\n        test: function(win) {\n            if (win.spf && win.spf.init) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Numeral.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://numeraljs.com/',\n        npm: 'numeraljs',\n        test: function(win) {\n            if (win.numeral && win.isNumeral) {\n                return { version: win.numeral.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'boomerang.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://soasta.github.io/boomerang/',\n        npm: 'boomerangjs',\n        test: function(win) {\n            if (win.BOOMR && win.BOOMR.utils && win.BOOMR.init) {\n                return { version: win.BOOMR.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Framer': {\n        icon: 'framer',\n        url: 'https://framer.com/',\n        npm: 'framerjs',\n        test: function(win) {\n            if (win.Framer && win.Framer.Layer) {\n                return { version: win.Framer.Version.build || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marko': {\n        icon: 'marko',\n        url: 'https://markojs.com/',\n        npm: 'marko',\n        test: function (win) {\n            var selector = '[data-marko-key], [data-marko]';\n            var markoElement = document.querySelector(selector);\n            if (markoElement) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'AMP': {\n        icon: 'amp',\n        url: 'https://ampproject.org/',\n        npm: null,\n        test: function (win) {\n            var version = win.document.documentElement.getAttribute(\"amp-version\");\n            return version ? { version: version } : false;\n        }\n    },\n    'Gatsby': {\n        icon: 'gatsby',\n        url: 'https://www.gatsbyjs.org/',\n        npm: 'gatsby',\n        test: function (win) {\n            if (document.getElementById('___gatsby')) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Shopify': {\n        icon: 'shopify',\n        url: 'https://www.shopify.com/',\n        npm: null,\n        test: function (win) {\n            if (win.Shopify && win.Shopify.shop) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Magento': {\n        icon: 'magento',\n        url: 'https://magento.com/',\n        npm: null,\n        test: function (win) {\n            // Same detecton used in Magento 2 DevTools: https://github.com/magento/m2-devtools\n            const reRequireScript = /\\/static(?:\\/version\\d+)?\\/frontend\\/.+\\/.+\\/requirejs\\/require(?:\\.min)?\\.js/;\n            const scripts = Array.from(document.querySelectorAll('script[src]') || []);\n            if (scripts.some(s => reRequireScript.test(s.src))) {\n                return { version: 2 }; // Magento 1 is no longer supported and this only verifies version 2\n            }\n            \n            return false;\n        }\n    },\n    'WordPress': {\n        icon: 'wordpress',\n        url: 'https://wordpress.org/',\n        npm: null,\n        test: function (win) {\n            const hasAPILinkElem = !!document.querySelector('link[rel=\"https://api.w.org/\"]');\n            const hasWPIncludes = !!document.querySelectorAll('link[href*=\"wp-includes\"], script[src*=\"wp-includes\"]').length;\n\n            if (!hasAPILinkElem && !hasWPIncludes) return false;\n\n            const generatorMeta = document.querySelector('meta[name=generator][content^=\"WordPress\"]');\n            const version = generatorMeta ? generatorMeta.getAttribute(\"content\").replace(/^\\w+\\s/,'') : UNKNOWN_VERSION;\n            return { version };\n        }\n    },\n    'Wix': {\n        icon: 'wix',\n        url: 'https://www.wix.com/',\n        npm: null,\n        test: function (win) {\n            if (win.wixBiSession) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Workbox': {\n      icon: 'workbox',\n      url: 'https://developers.google.com/web/tools/workbox/',\n      npm: 'workbox-sw',\n      test: async function (win) {\n        var nav = win.navigator;\n        // Service Workers not supported\n        if (!('serviceWorker' in nav)) {\n          return false;\n        }\n        return nav.serviceWorker.getRegistration()\n        .then(function(registration) {\n          var scriptURL = nav.serviceWorker.controller.scriptURL;\n          return fetch(scriptURL, { credentials: 'include',\n            headers: { 'service-worker': 'script' }\n          })\n          .then(function(response) {\n            return response.text();\n          })\n          .then(function(scriptContent) {\n            var workboxRegExp = /new Workbox|new workbox|workbox\\.precaching\\.|workbox\\.strategies/gm;\n            if (workboxRegExp.test(scriptContent)) {\n              // Adapted from\n              // https://github.com/semver/semver/issues/232#issue-48635632\n              var semVerRegExp = /workbox.*?\\b((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?)\\b/gim;\n              var matches = semVerRegExp.exec(scriptContent);\n              var version = UNKNOWN_VERSION;\n              if (Array.isArray(matches) && matches.length > 1 && matches[1]) {\n                version = matches[1];\n              }\n              return { version: version };\n            }\n            return false;\n          });\n        }).catch(function(exception) {\n          return false;\n        });\n      }\n    }\n};\n";






















async function detectLibraries(){

const libraries=[];





const libraryDetectorTests=d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests;

for(const[name,lib]of Object.entries(libraryDetectorTests)){
try{
const result=await lib.test(window);
if(result){
libraries.push({
name:name,
icon:lib.icon,
version:result.version,
npm:lib.npm});

}
}catch(e){}
}

return libraries;
}





async function collectStacks(passContext){
const expression=`(function () {
    ${libDetectorSource};
    return (${detectLibraries.toString()}());
  })()`;


const jsLibraries=await passContext.driver.evaluateAsync(expression);

return jsLibraries.map(lib=>({
detector:'js',
id:lib.npm||lib.icon,
name:lib.name,
version:lib.version||undefined,
npm:lib.npm||undefined}));

}

module.exports=collectStacks;

},{}],80:[function(require,module,exports){





'use strict';

const stackPacks=require('../../stack-packs/index.js');
const log=require('lighthouse-logger');






const stackPacksToInclude=[
{
packId:'wordpress',
requiredStacks:['js:wordpress']},

{
packId:'react',
requiredStacks:['js:react']},

{
packId:'angular',
requiredStacks:['js:@angular/core']},

{
packId:'amp',
requiredStacks:['js:amp']},

{
packId:'magento',
requiredStacks:['js:magento']}];








function getStackPacks(pageStacks){

const packs=[];

for(const pageStack of pageStacks){
const stackPackToIncl=stackPacksToInclude.find(stackPackToIncl=>
stackPackToIncl.requiredStacks.includes(`${pageStack.detector}:${pageStack.id}`));
if(!stackPackToIncl){
continue;
}


const matchedPack=stackPacks.find(pack=>pack.id===stackPackToIncl.packId);
if(!matchedPack){
log.warn('StackPacks',
`'${stackPackToIncl.packId}' stack pack was matched but is not found in stack-packs lib`);
continue;
}

packs.push({
id:matchedPack.id,
title:matchedPack.title,
iconDataURL:matchedPack.iconDataURL,
descriptions:matchedPack.descriptions});

}

return packs;
}

module.exports={
getStackPacks};


},{"../../stack-packs/index.js":193,"lighthouse-logger":125}],81:[function(require,module,exports){





'use strict';








function erf(x){

const sign=Math.sign(x);
x=Math.abs(x);

const a1=0.254829592;
const a2=-0.284496736;
const a3=1.421413741;
const a4=-1.453152027;
const a5=1.061405429;
const p=0.3275911;
const t=1/(1+p*x);
const y=t*(a1+t*(a2+t*(a3+t*(a4+t*a5))));
return sign*(1-y*Math.exp(-x*x));
}















function getLogNormalDistribution(median,falloff){
const location=Math.log(median);




const logRatio=Math.log(falloff/median);
const shape=Math.sqrt(1-3*logRatio-Math.sqrt((logRatio-3)*(logRatio-3)-8))/2;

return{
computeComplementaryPercentile(x){
const standardizedX=(Math.log(x)-location)/(Math.SQRT2*shape);
return(1-erf(standardizedX))/2;
}};

}










function linearInterpolation(x0,y0,x1,y1,x){
const slope=(y1-y0)/(x1-x0);
return y0+(x-x0)*slope;
}

module.exports={
linearInterpolation,
getLogNormalDistribution};


},{}],82:[function(require,module,exports){





'use strict';

const{
filterOutRectsContainedByOthers,
filterOutTinyRects,
rectsTouchOrOverlap,
rectContainsPoint,
getBoundingRect,
getRectCenterPoint}=
require('./rect-helpers.js');







function getTappableRectsFromClientRects(clientRects){


clientRects=filterOutTinyRects(clientRects);
clientRects=filterOutRectsContainedByOthers(clientRects);
clientRects=mergeTouchingClientRects(clientRects);
return clientRects;
}









function almostEqual(a,b){
return Math.abs(a-b)<=10;
}






function mergeTouchingClientRects(clientRects){
for(let i=0;i<clientRects.length;i++){
for(let j=i+1;j<clientRects.length;j++){
const crA=clientRects[i];
const crB=clientRects[j];












const rectsLineUpHorizontally=
almostEqual(crA.top,crB.top)||almostEqual(crA.bottom,crB.bottom);
const rectsLineUpVertically=
almostEqual(crA.left,crB.left)||almostEqual(crA.right,crB.right);
const canMerge=
rectsTouchOrOverlap(crA,crB)&&(
rectsLineUpHorizontally||rectsLineUpVertically);

if(canMerge){
const replacementClientRect=getBoundingRect([crA,crB]);
const mergedRectCenter=getRectCenterPoint(replacementClientRect);

if(
!(
rectContainsPoint(crA,mergedRectCenter)||
rectContainsPoint(crB,mergedRectCenter)))

{



continue;
}


clientRects=clientRects.filter(cr=>cr!==crA&&cr!==crB);
clientRects.push(replacementClientRect);



return mergeTouchingClientRects(clientRects);
}
}
}

return clientRects;
}

module.exports={
getTappableRectsFromClientRects};


},{"./rect-helpers.js":77}],83:[function(require,module,exports){





'use strict';

const{taskGroups,taskNameToGroup}=require('./task-groups.js');




































class MainThreadTasks{





static _createNewTaskNode(event,endEvent){
const isCompleteEvent=event.ph==='X'&&!endEvent;
const isStartEndEventPair=event.ph==='B'&&endEvent&&endEvent.ph==='E';
if(!isCompleteEvent&&!isStartEndEventPair){
throw new Error('Invalid parameters for _createNewTaskNode');
}

const startTime=event.ts;
const endTime=endEvent?endEvent.ts:event.ts+Number(event.dur||0);

const newTask={
event,
startTime,
endTime,
duration:endTime-startTime,


unbounded:false,
parent:undefined,
children:[],
attributableURLs:[],
group:taskGroups.other,
selfTime:NaN};


return newTask;
}








static _assignAllTimersUntilTs(
currentTask,
stopTs,
priorTaskData,
reverseEventsQueue)
{
while(reverseEventsQueue.length){
const nextTimerInstallEvent=reverseEventsQueue.pop();

if(!nextTimerInstallEvent)break;


if(nextTimerInstallEvent.ts>stopTs){
reverseEventsQueue.push(nextTimerInstallEvent);
break;
}


if(nextTimerInstallEvent.ts<currentTask.startTime){
continue;
}




const timerId=nextTimerInstallEvent.args.data.timerId;
priorTaskData.timers.set(timerId,currentTask);
}
}
















static _createTasksFromStartAndEndEvents(taskStartEvents,taskEndEvents,traceEndTs){

const tasks=[];



const taskEndEventsReverseQueue=taskEndEvents.slice().reverse();

for(let i=0;i<taskStartEvents.length;i++){
const taskStartEvent=taskStartEvents[i];
if(taskStartEvent.ph==='X'){

tasks.push(MainThreadTasks._createNewTaskNode(taskStartEvent));
continue;
}


let matchedEventIndex=-1;
let matchingNestedEventCount=0;
let matchingNestedEventIndex=i+1;





for(let j=taskEndEventsReverseQueue.length-1;j>=0;j--){
const endEvent=taskEndEventsReverseQueue[j];

for(;matchingNestedEventIndex<taskStartEvents.length;matchingNestedEventIndex++){
if(taskStartEvents[matchingNestedEventIndex].ts>=endEvent.ts)break;

if(taskStartEvents[matchingNestedEventIndex].name===taskStartEvent.name){
matchingNestedEventCount++;
}
}


if(endEvent.name!==taskStartEvent.name)continue;

if(endEvent.ts<taskStartEvent.ts)continue;


if(matchingNestedEventCount>0){

matchingNestedEventCount--;
continue;
}


matchedEventIndex=j;
break;
}


let taskEndEvent;
let unbounded=false;
if(matchedEventIndex===-1){


taskEndEvent={ph:'E',ts:traceEndTs};
unbounded=true;
}else if(matchedEventIndex===taskEndEventsReverseQueue.length-1){


taskEndEvent=taskEndEventsReverseQueue.pop();
}else{
taskEndEvent=taskEndEventsReverseQueue.splice(matchedEventIndex,1)[0];
}

const task=MainThreadTasks._createNewTaskNode(taskStartEvent,taskEndEvent);
task.unbounded=unbounded;
tasks.push(task);
}

if(taskEndEventsReverseQueue.length){
throw new Error(
`Fatal trace logic error - ${taskEndEventsReverseQueue.length} unmatched end events`);

}

return tasks;
}










static _createTaskRelationships(sortedTasks,timerInstallEvents,priorTaskData){

let currentTask;

const timerInstallEventsReverseQueue=timerInstallEvents.slice().reverse();

for(let i=0;i<sortedTasks.length;i++){
let nextTask=sortedTasks[i];





while(
currentTask&&
Number.isFinite(currentTask.endTime)&&
currentTask.endTime<=nextTask.startTime)
{
MainThreadTasks._assignAllTimersUntilTs(
currentTask,
currentTask.endTime,
priorTaskData,
timerInstallEventsReverseQueue);

currentTask=currentTask.parent;
}



if(currentTask){
if(nextTask.endTime>currentTask.endTime){
const timeDelta=nextTask.endTime-currentTask.endTime;


if(timeDelta<1000){

currentTask.endTime=nextTask.endTime;
currentTask.duration+=timeDelta;
}else if(nextTask.unbounded){

nextTask.endTime=currentTask.endTime;
nextTask.duration=nextTask.endTime-nextTask.startTime;
}else if(
nextTask.startTime-currentTask.startTime<1000&&
!currentTask.children.length)
{








const actualParentTask=nextTask;
const actualChildTask=currentTask;



const grandparentTask=currentTask.parent;
if(grandparentTask){
const lastGrandparentChildIndex=grandparentTask.children.length-1;
if(grandparentTask.children[lastGrandparentChildIndex]!==actualChildTask){


throw new Error('Fatal trace logic error - impossible children');
}

grandparentTask.children.pop();
grandparentTask.children.push(actualParentTask);
}

actualParentTask.parent=grandparentTask;
actualParentTask.startTime=actualChildTask.startTime;
actualParentTask.duration=actualParentTask.endTime-actualParentTask.startTime;
currentTask=actualParentTask;
nextTask=actualChildTask;
}else{







const error=new Error('Fatal trace logic error - child cannot end after parent');
error.timeDelta=timeDelta;
error.nextTaskEvent=nextTask.event;
error.nextTaskEndTime=nextTask.endTime;
error.currentTaskEvent=currentTask.event;
error.currentTaskEndTime=currentTask.endTime;
throw error;
}
}

nextTask.parent=currentTask;
currentTask.children.push(nextTask);
MainThreadTasks._assignAllTimersUntilTs(
currentTask,
nextTask.startTime,
priorTaskData,
timerInstallEventsReverseQueue);

}

currentTask=nextTask;
}

if(currentTask){
MainThreadTasks._assignAllTimersUntilTs(
currentTask,
currentTask.endTime,
priorTaskData,
timerInstallEventsReverseQueue);

}
}
















static _createTasksFromEvents(mainThreadEvents,priorTaskData,traceEndTs){

const taskStartEvents=[];

const taskEndEvents=[];

const timerInstallEvents=[];


for(const event of mainThreadEvents){
if(event.ph==='X'||event.ph==='B')taskStartEvents.push(event);
if(event.ph==='E')taskEndEvents.push(event);
if(event.name==='TimerInstall')timerInstallEvents.push(event);
}


const tasks=MainThreadTasks._createTasksFromStartAndEndEvents(
taskStartEvents,
taskEndEvents,
traceEndTs);



const sortedTasks=tasks.sort(
(taskA,taskB)=>taskA.startTime-taskB.startTime||taskB.duration-taskA.duration);



MainThreadTasks._createTaskRelationships(sortedTasks,timerInstallEvents,priorTaskData);


return sortedTasks.sort(
(taskA,taskB)=>taskA.startTime-taskB.startTime||taskB.duration-taskA.duration);

}






static _computeRecursiveSelfTime(task,parent){
if(parent&&task.endTime>parent.endTime){
throw new Error('Fatal trace logic error - child cannot end after parent');
}

const childTime=task.children.
map(child=>MainThreadTasks._computeRecursiveSelfTime(child,task)).
reduce((sum,child)=>sum+child,0);
task.selfTime=task.duration-childTime;
return task.duration;
}






static _computeRecursiveAttributableURLs(task,parentURLs,priorTaskData){
const argsData=task.event.args.data||{};
const stackFrameURLs=(argsData.stackTrace||[]).map(entry=>entry.url);


let taskURLs=[];
switch(task.event.name){





case'v8.compile':
case'EvaluateScript':
case'FunctionCall':
taskURLs=[argsData.url].concat(stackFrameURLs);
break;
case'v8.compileModule':
taskURLs=[task.event.args.fileName].concat(stackFrameURLs);
break;
case'TimerFire':{


const timerId=task.event.args.data.timerId;
const timerInstallerTaskNode=priorTaskData.timers.get(timerId);
if(!timerInstallerTaskNode)break;
taskURLs=timerInstallerTaskNode.attributableURLs.concat(stackFrameURLs);
break;
}
default:
taskURLs=stackFrameURLs;
break;}



const attributableURLs=Array.from(parentURLs);
for(const url of taskURLs){

if(!url)continue;

if(attributableURLs[attributableURLs.length-1]===url)continue;
attributableURLs.push(url);
}

task.attributableURLs=attributableURLs;
task.children.forEach(child=>
MainThreadTasks._computeRecursiveAttributableURLs(child,attributableURLs,priorTaskData));

}





static _computeRecursiveTaskGroup(task,parentGroup){
const group=taskNameToGroup[task.event.name];
task.group=group||parentGroup||taskGroups.other;
task.children.forEach(child=>MainThreadTasks._computeRecursiveTaskGroup(child,task.group));
}






static getMainThreadTasks(mainThreadEvents,traceEndTs){
const timers=new Map();
const priorTaskData={timers};
const tasks=MainThreadTasks._createTasksFromEvents(
mainThreadEvents,
priorTaskData,
traceEndTs);



for(const task of tasks){
if(task.parent)continue;

MainThreadTasks._computeRecursiveSelfTime(task,undefined);
MainThreadTasks._computeRecursiveAttributableURLs(task,[],priorTaskData);
MainThreadTasks._computeRecursiveTaskGroup(task);
}


const firstTs=(tasks[0]||{startTime:0}).startTime;
for(const task of tasks){
task.startTime=(task.startTime-firstTs)/1000;
task.endTime=(task.endTime-firstTs)/1000;
task.duration/=1000;
task.selfTime/=1000;


if(!Number.isFinite(task.selfTime)){
throw new Error('Invalid task timing data');
}
}

return tasks;
}}


module.exports=MainThreadTasks;

},{"./task-groups.js":84}],84:[function(require,module,exports){





'use strict';
















const taskGroups={
parseHTML:{
id:'parseHTML',
label:'Parse HTML & CSS',
traceEventNames:['ParseHTML','ParseAuthorStyleSheet']},

styleLayout:{
id:'styleLayout',
label:'Style & Layout',
traceEventNames:[
'ScheduleStyleRecalculation',
'UpdateLayoutTree',
'InvalidateLayout',
'Layout']},


paintCompositeRender:{
id:'paintCompositeRender',
label:'Rendering',
traceEventNames:[
'Animation',
'HitTest',
'PaintSetup',
'Paint',
'PaintImage',
'RasterTask',
'ScrollLayer',
'UpdateLayer',
'UpdateLayerTree',
'CompositeLayers']},


scriptParseCompile:{
id:'scriptParseCompile',
label:'Script Parsing & Compilation',
traceEventNames:['v8.compile','v8.compileModule','v8.parseOnBackground']},

scriptEvaluation:{
id:'scriptEvaluation',
label:'Script Evaluation',
traceEventNames:[
'EventDispatch',
'EvaluateScript',
'v8.evaluateModule',
'FunctionCall',
'TimerFire',
'FireIdleCallback',
'FireAnimationFrame',
'RunMicrotasks',
'V8.Execute']},


garbageCollection:{
id:'garbageCollection',
label:'Garbage Collection',
traceEventNames:[
'MinorGC',
'MajorGC',
'BlinkGC.AtomicPhase',


'ThreadState::performIdleLazySweep',
'ThreadState::completeSweep',
'BlinkGCMarking']},


other:{
id:'other',
label:'Other',
traceEventNames:[
'MessageLoop::RunTask',
'TaskQueueManager::ProcessTaskFromWorkQueue',
'ThreadControllerImpl::DoWork']}};





const taskNameToGroup={};
for(const group of Object.values(taskGroups)){
for(const traceEventName of group.traceEventNames){
taskNameToGroup[traceEventName]=group;
}
}

module.exports={
taskGroups,
taskNameToGroup};


},{}],85:[function(require,module,exports){





'use strict';















const log=require('lighthouse-logger');

const ACCEPTABLE_NAVIGATION_URL_REGEX=/^(chrome|https?):/;



const BASE_RESPONSE_LATENCY=16;

const SCHEDULABLE_TASK_TITLE_LH='RunTask';

const SCHEDULABLE_TASK_TITLE_ALT1='ThreadControllerImpl::RunTask';

const SCHEDULABLE_TASK_TITLE_ALT2='ThreadControllerImpl::DoWork';

const SCHEDULABLE_TASK_TITLE_ALT3='TaskQueueManager::ProcessTaskFromWorkQueue';

class TraceProcessor{



static createNoNavstartError(){
return new Error('No navigationStart event found');
}




static createNoTracingStartedError(){
return new Error('No tracingStartedInBrowser event found');
}






static _isNavigationStartOfInterest(event){
return event.name==='navigationStart'&&(
!event.args.data||!event.args.data.documentLoaderURL||
ACCEPTABLE_NAVIGATION_URL_REGEX.test(event.args.data.documentLoaderURL));
}


















static _sortTimestampEventGroup(
tsGroupIndices,
timestampSortedIndices,
indexOfTsGroupIndicesStart,
traceEvents)
{












const lookupArrayIndexByTsIndex=i=>timestampSortedIndices[i];

const lookupEventByTsIndex=i=>traceEvents[lookupArrayIndexByTsIndex(i)];


const eEventIndices=[];

const bxEventIndices=[];

const otherEventIndices=[];

for(const tsIndex of tsGroupIndices){

const arrayIndex=lookupArrayIndexByTsIndex(tsIndex);
const event=lookupEventByTsIndex(tsIndex);
if(event.ph==='E')eEventIndices.push(arrayIndex);else
if(event.ph==='X'||event.ph==='B')bxEventIndices.push(arrayIndex);else
otherEventIndices.push(arrayIndex);
}


const effectiveDuration=new Map();
for(const index of bxEventIndices){
const event=traceEvents[index];
if(event.ph==='X'){
effectiveDuration.set(index,event.dur);
}else{

let duration=Number.MAX_SAFE_INTEGER;

let additionalNestedEventsWithSameName=0;
const startIndex=indexOfTsGroupIndicesStart+tsGroupIndices.length;
for(let j=startIndex;j<timestampSortedIndices.length;j++){
const potentialMatchingEvent=lookupEventByTsIndex(j);
const eventMatches=potentialMatchingEvent.name===event.name&&
potentialMatchingEvent.pid===event.pid&&
potentialMatchingEvent.tid===event.tid;


if(!eventMatches)continue;

if(potentialMatchingEvent.ph==='E'&&additionalNestedEventsWithSameName===0){

duration=potentialMatchingEvent.ts-event.ts;
break;
}else if(potentialMatchingEvent.ph==='E'){

additionalNestedEventsWithSameName--;
}else if(potentialMatchingEvent.ph==='B'){

additionalNestedEventsWithSameName++;
}
}

effectiveDuration.set(index,duration);
}
}

bxEventIndices.sort((indexA,indexB)=>(effectiveDuration.get(indexB)||0)-(
effectiveDuration.get(indexA)||0)||indexA-indexB);

otherEventIndices.sort((indexA,indexB)=>indexA-indexB);

return[...eEventIndices,...bxEventIndices,...otherEventIndices];
}








static filteredTraceSort(traceEvents,filter){

const indices=[];
for(let srcIndex=0;srcIndex<traceEvents.length;srcIndex++){
if(filter(traceEvents[srcIndex])){
indices.push(srcIndex);
}
}


indices.sort((indexA,indexB)=>traceEvents[indexA].ts-traceEvents[indexB].ts);


for(let i=0;i<indices.length-1;i++){
const ts=traceEvents[indices[i]].ts;
const tsGroupIndices=[i];
for(let j=i+1;j<indices.length;j++){
if(traceEvents[indices[j]].ts!==ts)break;
tsGroupIndices.push(j);
}


if(tsGroupIndices.length===1)continue;


const finalIndexOrder=TraceProcessor._sortTimestampEventGroup(
tsGroupIndices,
indices,
i,
traceEvents);

indices.splice(i,finalIndexOrder.length,...finalIndexOrder);


i+=tsGroupIndices.length-1;
}


const sorted=[];
for(let i=0;i<indices.length;i++){
sorted.push(traceEvents[indices[i]]);
}

return sorted;
}







static assertHasToplevelEvents(events){
const hasToplevelTask=events.some(this.isScheduleableTask);
if(!hasToplevelTask){
throw new Error('Could not find any top level events');
}
}


















static _riskPercentiles(durations,totalTime,percentiles,clippedLength=0){
let busyTime=0;
for(let i=0;i<durations.length;i++){
busyTime+=durations[i];
}
busyTime-=clippedLength;


let completedTime=totalTime-busyTime;
let duration=0;
let cdfTime=completedTime;
const results=[];

let durationIndex=-1;
let remainingCount=durations.length+1;
if(clippedLength>0){

remainingCount--;
}


for(const percentile of percentiles){


const percentileTime=percentile*totalTime;
while(cdfTime<percentileTime&&durationIndex<durations.length-1){
completedTime+=duration;
remainingCount-=duration<0?-1:1;

if(clippedLength>0&&clippedLength<durations[durationIndex+1]){
duration=-clippedLength;
clippedLength=0;
}else{
durationIndex++;
duration=durations[durationIndex];
}


cdfTime=completedTime+Math.abs(duration)*remainingCount;
}


results.push({
percentile,
time:Math.max(0,(percentileTime-completedTime)/remainingCount)+
BASE_RESPONSE_LATENCY});

}

return results;
}











static getRiskToResponsiveness(
events,
startTime,
endTime,
percentiles=[0.5,0.75,0.9,0.99,1])
{
const totalTime=endTime-startTime;
percentiles.sort((a,b)=>a-b);

const ret=this.getMainThreadTopLevelEventDurations(events,startTime,endTime);
return this._riskPercentiles(ret.durations,totalTime,percentiles,
ret.clippedLength);
}








static getMainThreadTopLevelEventDurations(topLevelEvents,startTime=0,endTime=Infinity){


const durations=[];
let clippedLength=0;

for(const event of topLevelEvents){
if(event.end<startTime||event.start>endTime){
continue;
}

let duration=event.duration;
let eventStart=event.start;
if(eventStart<startTime){

eventStart=startTime;
duration=event.end-startTime;
}

if(event.end>endTime){

clippedLength=duration-(endTime-eventStart);
}

durations.push(duration);
}
durations.sort((a,b)=>a-b);

return{
durations,
clippedLength};

}









static getMainThreadTopLevelEvents(tabTrace,startTime=0,endTime=Infinity){
const topLevelEvents=[];

for(const event of tabTrace.mainThreadEvents){
if(!this.isScheduleableTask(event)||!event.dur)continue;

const start=(event.ts-tabTrace.navigationStartEvt.ts)/1000;
const end=(event.ts+event.dur-tabTrace.navigationStartEvt.ts)/1000;
if(start>endTime||end<startTime)continue;

topLevelEvents.push({
start,
end,
duration:event.dur/1000});

}

return topLevelEvents;
}





static findMainFrameIds(events){

const startedInBrowserEvt=events.find(e=>e.name==='TracingStartedInBrowser');
if(startedInBrowserEvt&&startedInBrowserEvt.args.data&&
startedInBrowserEvt.args.data.frames){
const mainFrame=startedInBrowserEvt.args.data.frames.find(frame=>!frame.parent);
const frameId=mainFrame&&mainFrame.frame;
const pid=mainFrame&&mainFrame.processId;

const threadNameEvt=events.find(e=>e.pid===pid&&e.ph==='M'&&
e.cat==='__metadata'&&e.name==='thread_name'&&e.args.name==='CrRendererMain');
const tid=threadNameEvt&&threadNameEvt.tid;

if(pid&&tid&&frameId){
return{
pid,
tid,
frameId};

}
}




const startedInPageEvt=events.find(e=>e.name==='TracingStartedInPage');
if(startedInPageEvt&&startedInPageEvt.args&&startedInPageEvt.args.data){
const frameId=startedInPageEvt.args.data.page;
if(frameId){
return{
pid:startedInPageEvt.pid,
tid:startedInPageEvt.tid,
frameId};

}
}





const navStartEvt=events.find(e=>Boolean(e.name==='navigationStart'&&e.args&&
e.args.data&&e.args.data.isLoadingMainFrame&&e.args.data.documentLoaderURL));

const firstResourceSendEvt=events.find(e=>e.name==='ResourceSendRequest');

if(navStartEvt&&navStartEvt.args&&navStartEvt.args.data&&
firstResourceSendEvt&&
firstResourceSendEvt.pid===navStartEvt.pid&&
firstResourceSendEvt.tid===navStartEvt.tid){
const frameId=navStartEvt.args.frame;
if(frameId){
return{
pid:navStartEvt.pid,
tid:navStartEvt.tid,
frameId};

}
}

throw this.createNoTracingStartedError();
}





static isScheduleableTask(evt){
return evt.name===SCHEDULABLE_TASK_TITLE_LH||
evt.name===SCHEDULABLE_TASK_TITLE_ALT1||
evt.name===SCHEDULABLE_TASK_TITLE_ALT2||
evt.name===SCHEDULABLE_TASK_TITLE_ALT3;
}








static computeTraceOfTab(trace){


const keyEvents=this.filteredTraceSort(trace.traceEvents,e=>{
return e.cat.includes('blink.user_timing')||
e.cat.includes('loading')||
e.cat.includes('devtools.timeline')||
e.cat==='__metadata';
});


const mainFrameIds=this.findMainFrameIds(keyEvents);


const frameEvents=keyEvents.filter(e=>e.args.frame===mainFrameIds.frameId);


const navigationStart=frameEvents.filter(this._isNavigationStartOfInterest).pop();
if(!navigationStart)throw this.createNoNavstartError();


const firstPaint=frameEvents.find(e=>e.name==='firstPaint'&&e.ts>navigationStart.ts);


const firstContentfulPaint=frameEvents.find(
e=>e.name==='firstContentfulPaint'&&e.ts>navigationStart.ts);



let firstMeaningfulPaint=frameEvents.find(
e=>e.name==='firstMeaningfulPaint'&&e.ts>navigationStart.ts);

let fmpFellBack=false;





if(!firstMeaningfulPaint){
const fmpCand='firstMeaningfulPaintCandidate';
fmpFellBack=true;
log.verbose('trace-of-tab',`No firstMeaningfulPaint found, falling back to last ${fmpCand}`);
const lastCandidate=frameEvents.filter(e=>e.name===fmpCand).pop();
if(!lastCandidate){
log.verbose('trace-of-tab','No `firstMeaningfulPaintCandidate` events found in trace');
}
firstMeaningfulPaint=lastCandidate;
}




let largestContentfulPaint;
let lcpInvalidated=false;

for(let i=frameEvents.length-1;i>=0;i--){
const e=frameEvents[i];

if(e.ts<=navigationStart.ts)break;

if(e.name==='largestContentfulPaint::Invalidate'){
lcpInvalidated=true;
break;
}

if(e.name!=='largestContentfulPaint::Candidate')continue;

largestContentfulPaint=e;
break;
}

const load=frameEvents.find(e=>e.name==='loadEventEnd'&&e.ts>navigationStart.ts);
const domContentLoaded=frameEvents.find(
e=>e.name==='domContentLoadedEventEnd'&&e.ts>navigationStart.ts);




const processEvents=TraceProcessor.
filteredTraceSort(trace.traceEvents,e=>e.pid===mainFrameIds.pid);

const mainThreadEvents=processEvents.
filter(e=>e.tid===mainFrameIds.tid);


const traceEnd=trace.traceEvents.reduce((max,evt)=>{
return max.ts>evt.ts?max:evt;
});
const fakeEndOfTraceEvt={ts:traceEnd.ts+(traceEnd.dur||0)};


const getTimestamp=event=>event&&event.ts;

const timestamps={
navigationStart:navigationStart.ts,
firstPaint:getTimestamp(firstPaint),
firstContentfulPaint:getTimestamp(firstContentfulPaint),
firstMeaningfulPaint:getTimestamp(firstMeaningfulPaint),
largestContentfulPaint:getTimestamp(largestContentfulPaint),
traceEnd:fakeEndOfTraceEvt.ts,
load:getTimestamp(load),
domContentLoaded:getTimestamp(domContentLoaded)};



const getTiming=ts=>(ts-navigationStart.ts)/1000;

const maybeGetTiming=ts=>ts===undefined?undefined:getTiming(ts);

const timings={
navigationStart:0,
firstPaint:maybeGetTiming(timestamps.firstPaint),
firstContentfulPaint:maybeGetTiming(timestamps.firstContentfulPaint),
firstMeaningfulPaint:maybeGetTiming(timestamps.firstMeaningfulPaint),
largestContentfulPaint:maybeGetTiming(timestamps.largestContentfulPaint),
traceEnd:getTiming(timestamps.traceEnd),
load:maybeGetTiming(timestamps.load),
domContentLoaded:maybeGetTiming(timestamps.domContentLoaded)};


return{
timings,
timestamps,
processEvents,
mainThreadEvents,
mainFrameIds,
navigationStartEvt:navigationStart,
firstPaintEvt:firstPaint,
firstContentfulPaintEvt:firstContentfulPaint,
firstMeaningfulPaintEvt:firstMeaningfulPaint,
largestContentfulPaintEvt:largestContentfulPaint,
loadEvt:load,
domContentLoadedEvt:domContentLoaded,
fmpFellBack,
lcpInvalidated};

}}


module.exports=TraceProcessor;









},{"lighthouse-logger":125}],86:[function(require,module,exports){





'use strict';

const log=require('lighthouse-logger');







function getUberMetrics(auditResults){
const metricsAudit=auditResults.metrics;
if(!metricsAudit||!metricsAudit.details||!('items'in metricsAudit.details))return;

return metricsAudit.details.items[0];
}

class Metrics{




constructor(traceEvents,auditResults){
this._traceEvents=traceEvents;
this._auditResults=auditResults;
}





static get metricsDefinitions(){
return[
{
name:'Navigation Start',
id:'navstart',
tsKey:'observedNavigationStartTs'},

{
name:'First Contentful Paint',
id:'ttfcp',
tsKey:'observedFirstContentfulPaintTs'},

{
name:'First Meaningful Paint',
id:'ttfmp',
tsKey:'observedFirstMeaningfulPaintTs'},

{
name:'Speed Index',
id:'si',
tsKey:'observedSpeedIndexTs'},

{
name:'First Visual Change',
id:'fv',
tsKey:'observedFirstVisualChangeTs'},

{
name:'Visually Complete 100%',
id:'vc100',
tsKey:'observedLastVisualChangeTs'},

{
name:'First CPU Idle',
id:'ttfi',
tsKey:'firstCPUIdleTs'},

{
name:'Interactive',
id:'tti',
tsKey:'interactiveTs'},

{
name:'End of Trace',
id:'eot',
tsKey:'observedTraceEndTs'},

{
name:'On Load',
id:'onload',
tsKey:'observedLoadTs'},

{
name:'DOM Content Loaded',
id:'dcl',
tsKey:'observedDomContentLoadedTs'}];


}





gatherMetrics(){
const uberMetrics=getUberMetrics(this._auditResults);
if(!uberMetrics){
return[];
}


const resolvedMetrics=[];
Metrics.metricsDefinitions.forEach(metric=>{

const ts=uberMetrics[metric.tsKey];
if(ts===undefined){
log.error('pwmetrics-events',`${metric.name} timestamp not found`);
return;
}

resolvedMetrics.push({
id:metric.id,
name:metric.name,
ts});

});

return resolvedMetrics;
}






getNavigationStartEvt(metrics){
const navStartMetric=metrics.find(e=>e.id==='navstart');
if(!navStartMetric)return;
return this._traceEvents.find(
e=>e.name==='navigationStart'&&e.ts===navStartMetric.ts);

}









synthesizeEventPair(metric,navigationStartEvt){

const eventBase={
pid:navigationStartEvt.pid,
tid:navigationStartEvt.tid,
cat:'blink.user_timing',
name:metric.name,
args:{},

id:`0x${(Math.random()*1000000|0).toString(16)}`};

const fakeMeasureStartEvent=Object.assign({},eventBase,{
ts:navigationStartEvt.ts,
ph:'b'});

const fakeMeasureEndEvent=Object.assign({},eventBase,{
ts:metric.ts,
ph:'e'});

return[fakeMeasureStartEvent,fakeMeasureEndEvent];
}




generateFakeEvents(){
const metrics=this.gatherMetrics();
if(metrics.length===0){
log.error('metrics-events','Metrics collection had errors, not synthetizing trace events');
return[];
}

const navigationStartEvt=this.getNavigationStartEvt(metrics);
if(!navigationStartEvt){
log.error('pwmetrics-events','Reference navigationStart not found');
return[];
}


const fakeEvents=[];
metrics.forEach(metric=>{
if(metric.id==='navstart'){
return;
}
if(!metric.ts){
log.error('pwmetrics-events',`(${metric.name}) missing timestamp. Skipping…`);
return;
}
log.verbose('pwmetrics-events',`Sythesizing trace events for ${metric.name}`);
fakeEvents.push(...this.synthesizeEventPair(metric,navigationStartEvt));
});
return fakeEvents;
}}


module.exports=Metrics;

},{"lighthouse-logger":125}],87:[function(require,module,exports){
















'use strict';



const ELLIPSIS='\u2026';
const NBSP='\xa0';
const PASS_THRESHOLD=0.9;
const SCREENSHOT_PREFIX='data:image/jpeg;base64,';

const RATINGS={
PASS:{label:'pass',minScore:PASS_THRESHOLD},
AVERAGE:{label:'average',minScore:0.5},
FAIL:{label:'fail'},
ERROR:{label:'error'}};





const listOfTlds=[
'com','co','gov','edu','ac','org','go','gob','or','net','in','ne','nic','gouv',
'web','spb','blog','jus','kiev','mil','wi','qc','ca','bel','on'];


class Util{
static get PASS_THRESHOLD(){
return PASS_THRESHOLD;
}

static get MS_DISPLAY_VALUE(){
return`%10d${NBSP}ms`;
}










static prepareReportResult(result){

const clone=JSON.parse(JSON.stringify(result));


if(!clone.configSettings.locale){
clone.configSettings.locale='en';
}

for(const audit of Object.values(clone.audits)){




if(audit.scoreDisplayMode==='not_applicable'||audit.scoreDisplayMode==='not-applicable'){
audit.scoreDisplayMode='notApplicable';
}

if(audit.details){



if(audit.details.type===undefined||audit.details.type==='diagnostic'){
audit.details.type='debugdata';
}


if(audit.details.type==='filmstrip'){
for(const screenshot of audit.details.items){
if(!screenshot.data.startsWith(SCREENSHOT_PREFIX)){
screenshot.data=SCREENSHOT_PREFIX+screenshot.data;
}
}
}
}
}


Util.setNumberDateLocale(clone.configSettings.locale);
if(clone.i18n&&clone.i18n.rendererFormattedStrings){
Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
}


if(typeof clone.categories!=='object')throw new Error('No categories provided.');
for(const category of Object.values(clone.categories)){
category.auditRefs.forEach(auditRef=>{
const result=clone.audits[auditRef.id];
auditRef.result=result;


if(clone.stackPacks){
clone.stackPacks.forEach(pack=>{
if(pack.descriptions[auditRef.id]){
auditRef.stackPacks=auditRef.stackPacks||[];
auditRef.stackPacks.push({
title:pack.title,
iconDataURL:pack.iconDataURL,
description:pack.descriptions[auditRef.id]});

}
});
}
});
}

return clone;
}





static updateAllUIStrings(rendererFormattedStrings){

for(const[key,value]of Object.entries(rendererFormattedStrings)){
Util.UIStrings[key]=value;
}
}








static showAsPassed(audit){
switch(audit.scoreDisplayMode){
case'manual':
case'notApplicable':
return true;
case'error':
case'informative':
return false;
case'numeric':
case'binary':
default:
return Number(audit.score)>=RATINGS.PASS.minScore;}

}







static calculateRating(score,scoreDisplayMode){

if(scoreDisplayMode==='manual'||scoreDisplayMode==='notApplicable'){
return RATINGS.PASS.label;
}else if(scoreDisplayMode==='error'){
return RATINGS.ERROR.label;
}else if(score===null){
return RATINGS.FAIL.label;
}


let rating=RATINGS.FAIL.label;
if(score>=RATINGS.PASS.minScore){
rating=RATINGS.PASS.label;
}else if(score>=RATINGS.AVERAGE.minScore){
rating=RATINGS.AVERAGE.label;
}
return rating;
}







static formatNumber(number,granularity=0.1){
const coarseValue=Math.round(number/granularity)*granularity;
return Util.numberFormatter.format(coarseValue);
}






static formatBytesToKB(size,granularity=0.1){
const kbs=Util.numberFormatter.format(Math.round(size/1024/granularity)*granularity);
return`${kbs}${NBSP}KB`;
}






static formatMilliseconds(ms,granularity=10){
const coarseTime=Math.round(ms/granularity)*granularity;
return`${Util.numberFormatter.format(coarseTime)}${NBSP}ms`;
}






static formatSeconds(ms,granularity=0.1){
const coarseTime=Math.round(ms/1000/granularity)*granularity;
return`${Util.numberFormatter.format(coarseTime)}${NBSP}s`;
}






static formatDateTime(date){

const options={
month:'short',day:'numeric',year:'numeric',
hour:'numeric',minute:'numeric',timeZoneName:'short'};

let formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);



const tz=formatter.resolvedOptions().timeZone;
if(!tz||tz.toLowerCase()==='etc/unknown'){
options.timeZone='UTC';
formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);
}
return formatter.format(new Date(date));
}





static formatDuration(timeInMilliseconds){
let timeInSeconds=timeInMilliseconds/1000;
if(Math.round(timeInSeconds)===0){
return'None';
}


const parts=[];
const unitLabels={
d:60*60*24,
h:60*60,
m:60,
s:1};


Object.keys(unitLabels).forEach(label=>{
const unit=unitLabels[label];
const numberOfUnits=Math.floor(timeInSeconds/unit);
if(numberOfUnits>0){
timeInSeconds-=numberOfUnits*unit;
parts.push(`${numberOfUnits}\xa0${label}`);
}
});

return parts.join(' ');
}








static splitMarkdownCodeSpans(text){

const segments=[];


const parts=text.split(/`(.*?)`/g);
for(let i=0;i<parts.length;i++){
const text=parts[i];


if(!text)continue;


const isCode=i%2!==0;
segments.push({
isCode,
text});

}

return segments;
}









static splitMarkdownLink(text){

const segments=[];

const parts=text.split(/\[([^\]]+?)\]\((https?:\/\/.*?)\)/g);
while(parts.length){

const[preambleText,linkText,linkHref]=parts.splice(0,3);

if(preambleText){
segments.push({
isLink:false,
text:preambleText});

}


if(linkText&&linkHref){
segments.push({
isLink:true,
text:linkText,
linkHref});

}
}

return segments;
}






static getURLDisplayName(parsedUrl,options){

options=options||{numPathParts:undefined,preserveQuery:undefined,
preserveHost:undefined};
const numPathParts=options.numPathParts!==undefined?options.numPathParts:2;
const preserveQuery=options.preserveQuery!==undefined?options.preserveQuery:true;
const preserveHost=options.preserveHost||false;

let name;

if(parsedUrl.protocol==='about:'||parsedUrl.protocol==='data:'){

name=parsedUrl.href;
}else{
name=parsedUrl.pathname;
const parts=name.split('/').filter(part=>part.length);
if(numPathParts&&parts.length>numPathParts){
name=ELLIPSIS+parts.slice(-1*numPathParts).join('/');
}

if(preserveHost){
name=`${parsedUrl.host}/${name.replace(/^\//,'')}`;
}
if(preserveQuery){
name=`${name}${parsedUrl.search}`;
}
}

const MAX_LENGTH=64;

name=name.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,`$1${ELLIPSIS}`);

name=name.replace(/([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g,
`$1${ELLIPSIS}`);

name=name.replace(/(\d{3})\d{6,}/g,`$1${ELLIPSIS}`);

name=name.replace(/\u2026+/g,ELLIPSIS);


if(name.length>MAX_LENGTH&&name.includes('?')){

name=name.replace(/\?([^=]*)(=)?.*/,`?$1$2${ELLIPSIS}`);


if(name.length>MAX_LENGTH){
name=name.replace(/\?.*/,`?${ELLIPSIS}`);
}
}


if(name.length>MAX_LENGTH){
const dotIndex=name.lastIndexOf('.');
if(dotIndex>=0){
name=name.slice(0,MAX_LENGTH-1-(name.length-dotIndex))+

`${ELLIPSIS}${name.slice(dotIndex)}`;
}else{
name=name.slice(0,MAX_LENGTH-1)+ELLIPSIS;
}
}

return name;
}






static parseURL(url){
const parsedUrl=new URL(url);
return{
file:Util.getURLDisplayName(parsedUrl),
hostname:parsedUrl.hostname,
origin:parsedUrl.origin};

}





static createOrReturnURL(value){
if(value instanceof URL){
return value;
}

return new URL(value);
}







static getTld(hostname){
const tlds=hostname.split('.').slice(-2);

if(!listOfTlds.includes(tlds[0])){
return`.${tlds[tlds.length-1]}`;
}

return`.${tlds.join('.')}`;
}






static getRootDomain(url){
const hostname=Util.createOrReturnURL(url).hostname;
const tld=Util.getTld(hostname);



const splitTld=tld.split('.');


return hostname.split('.').slice(-splitTld.length).join('.');
}





static getEnvironmentDisplayValues(settings){
const emulationDesc=Util.getEmulationDescriptions(settings);

return[
{
name:'Device',
description:emulationDesc.deviceEmulation},

{
name:'Network throttling',
description:emulationDesc.networkThrottling},

{
name:'CPU throttling',
description:emulationDesc.cpuThrottling}];


}





static getEmulationDescriptions(settings){
let cpuThrottling;
let networkThrottling;
let summary;

const throttling=settings.throttling;

switch(settings.throttlingMethod){
case'provided':
cpuThrottling='Provided by environment';
networkThrottling='Provided by environment';
summary='No throttling applied';
break;
case'devtools':{
const{cpuSlowdownMultiplier,requestLatencyMs}=throttling;
cpuThrottling=`${Util.formatNumber(cpuSlowdownMultiplier)}x slowdown (DevTools)`;
networkThrottling=`${Util.formatNumber(requestLatencyMs)}${NBSP}ms HTTP RTT, `+
`${Util.formatNumber(throttling.downloadThroughputKbps)}${NBSP}Kbps down, `+
`${Util.formatNumber(throttling.uploadThroughputKbps)}${NBSP}Kbps up (DevTools)`;
summary='Throttled Slow 4G network';
break;
}
case'simulate':{
const{cpuSlowdownMultiplier,rttMs,throughputKbps}=throttling;
cpuThrottling=`${Util.formatNumber(cpuSlowdownMultiplier)}x slowdown (Simulated)`;
networkThrottling=`${Util.formatNumber(rttMs)}${NBSP}ms TCP RTT, `+
`${Util.formatNumber(throughputKbps)}${NBSP}Kbps throughput (Simulated)`;
summary='Simulated Slow 4G network';
break;
}
default:
cpuThrottling='Unknown';
networkThrottling='Unknown';
summary='Unknown';}


let deviceEmulation='No emulation';
if(settings.emulatedFormFactor==='mobile')deviceEmulation='Emulated Nexus 5X';
if(settings.emulatedFormFactor==='desktop')deviceEmulation='Emulated Desktop';

return{
deviceEmulation,
cpuThrottling,
networkThrottling,
summary:`${deviceEmulation}, ${summary}`};

}





static setNumberDateLocale(locale){

if(locale==='en-XA')locale='de';

Util.numberDateLocale=locale;
Util.numberFormatter=new Intl.NumberFormat(locale);
}









static filterRelevantLines(lines,lineMessages,surroundingLineCount){
if(lineMessages.length===0){

return lines.slice(0,surroundingLineCount*2+1);
}

const minGapSize=3;
const lineNumbersToKeep=new Set();


lineMessages=lineMessages.sort((a,b)=>(a.lineNumber||0)-(b.lineNumber||0));
lineMessages.forEach(({lineNumber})=>{
let firstSurroundingLineNumber=lineNumber-surroundingLineCount;
let lastSurroundingLineNumber=lineNumber+surroundingLineCount;

while(firstSurroundingLineNumber<1){

firstSurroundingLineNumber++;
lastSurroundingLineNumber++;
}


if(lineNumbersToKeep.has(firstSurroundingLineNumber-minGapSize-1)){
firstSurroundingLineNumber-=minGapSize;
}
for(let i=firstSurroundingLineNumber;i<=lastSurroundingLineNumber;i++){
const surroundingLineNumber=i;
lineNumbersToKeep.add(surroundingLineNumber);
}
});

return lines.filter(line=>lineNumbersToKeep.has(line.lineNumber));
}




static isPluginCategory(categoryId){
return categoryId.startsWith('lighthouse-plugin-');
}}






Util.numberDateLocale='en';





Util.numberFormatter=new Intl.NumberFormat(Util.numberDateLocale);





Util.UIStrings={

varianceDisclaimer:'Values are estimated and may vary. The performance score is [based only on these metrics](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted).',

opportunityResourceColumnLabel:'Opportunity',

opportunitySavingsColumnLabel:'Estimated Savings',


errorMissingAuditInfo:'Report error: no audit information',

errorLabel:'Error!',

warningHeader:'Warnings: ',

auditGroupExpandTooltip:'Show audits',

warningAuditsGroupTitle:'Passed audits but with warnings',

passedAuditsGroupTitle:'Passed audits',

notApplicableAuditsGroupTitle:'Not applicable',

manualAuditsGroupTitle:'Additional items to manually check',


toplevelWarningsMessage:'There were issues affecting this run of Lighthouse:',


crcInitialNavigation:'Initial Navigation',

crcLongestDurationLabel:'Maximum critical path latency:',


snippetExpandButtonLabel:'Expand snippet',

snippetCollapseButtonLabel:'Collapse snippet',


lsPerformanceCategoryDescription:'[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.',

labDataTitle:'Lab Data',


thirdPartyResourcesLabel:'Show 3rd-party resources'};


if(typeof module!=='undefined'&&module.exports){
module.exports=Util;
}else{
self.Util=Util;
}

},{}],88:[function(require,module,exports){





'use strict';

const htmlReportAssets=require('./html/html-report-assets.js');

class ReportGenerator{






static replaceStrings(source,replacements){
if(replacements.length===0){
return source;
}

const firstReplacement=replacements[0];
const nextReplacements=replacements.slice(1);
return source.
split(firstReplacement.search).
map(part=>ReportGenerator.replaceStrings(part,nextReplacements)).
join(firstReplacement.replacement);
}






static generateReportHtml(lhr){
const sanitizedJson=JSON.stringify(lhr).
replace(/</g,'\\u003c').
replace(/\u2028/g,'\\u2028').
replace(/\u2029/g,'\\u2029');
const sanitizedJavascript=htmlReportAssets.REPORT_JAVASCRIPT.replace(/<\//g,'\\u003c/');

return ReportGenerator.replaceStrings(htmlReportAssets.REPORT_TEMPLATE,[
{search:'%%LIGHTHOUSE_JSON%%',replacement:sanitizedJson},
{search:'%%LIGHTHOUSE_JAVASCRIPT%%',replacement:sanitizedJavascript},
{search:'/*%%LIGHTHOUSE_CSS%%*/',replacement:htmlReportAssets.REPORT_CSS},
{search:'%%LIGHTHOUSE_TEMPLATES%%',replacement:htmlReportAssets.REPORT_TEMPLATES}]);

}













static generateReportCSV(lhr){


const CRLF='\r\n';
const separator=',';

const escape=value=>`"${value.replace(/"/g,'""')}"`;


const header=['category','name','title','type','score'];
const table=Object.values(lhr.categories).map(category=>{
return category.auditRefs.map(auditRef=>{
const audit=lhr.audits[auditRef.id];

const numericScore=audit.score===null?-1:audit.score;
return[category.title,audit.id,audit.title,audit.scoreDisplayMode,numericScore].
map(value=>value.toString()).
map(escape);
});
});

return[header].concat(...table).
map(row=>row.join(separator)).join(CRLF);
}







static generateReport(lhr,outputModes){
const outputAsArray=Array.isArray(outputModes);
if(typeof outputModes==='string')outputModes=[outputModes];

const output=outputModes.map(outputMode=>{

if(outputMode==='html'){
return ReportGenerator.generateReportHtml(lhr);
}

if(outputMode==='csv'){
return ReportGenerator.generateReportCSV(lhr);
}

if(outputMode==='json'){
return JSON.stringify(lhr,null,2);
}

throw new Error('Invalid output mode: '+outputMode);
});

return outputAsArray?output:output[0];
}}


module.exports=ReportGenerator;

},{"./html/html-report-assets.js":101}],89:[function(require,module,exports){
(function(process){





'use strict';

const isDeepEqual=require('lodash.isequal');
const Driver=require('./gather/driver.js');
const GatherRunner=require('./gather/gather-runner.js');
const ReportScoring=require('./scoring.js');
const Audit=require('./audits/audit.js');
const log=require('lighthouse-logger');
const i18n=require('./lib/i18n/i18n.js');
const stackPacks=require('./lib/stack-packs.js');
const assetSaver=require('./lib/asset-saver.js');

const path=require('path');
const URL=require('./lib/url-shim.js');
const Sentry=require('./lib/sentry.js');
const generateReport=require('./report/report-generator.js').generateReport;
const LHError=require('./lib/lh-error.js');




class Runner{





static async run(connection,runOpts){
const settings=runOpts.config.settings;
try{
const runnerStatus={msg:'Runner setup',id:'lh:runner:run'};
log.time(runnerStatus,'verbose');





const lighthouseRunWarnings=[];

const sentryContext=Sentry.getContext();
Sentry.captureBreadcrumb({
message:'Run started',
category:'lifecycle',
data:sentryContext&&sentryContext.extra});








let artifacts;
let requestedUrl;
if(settings.auditMode&&!settings.gatherMode){

const path=Runner._getArtifactsPath(settings);
artifacts=assetSaver.loadArtifacts(path);
requestedUrl=artifacts.URL.requestedUrl;

if(!requestedUrl){
throw new Error('Cannot run audit mode on empty URL');
}
if(runOpts.url&&!URL.equalWithExcludedFragments(runOpts.url,requestedUrl)){
throw new Error('Cannot run audit mode on different URL');
}
}else{

if(runOpts.url&&URL.isValid(runOpts.url)&&URL.isProtocolAllowed(runOpts.url)){

requestedUrl=new URL(runOpts.url).href;
}else{
throw new LHError(LHError.errors.INVALID_URL);
}

artifacts=await Runner._gatherArtifactsFromBrowser(requestedUrl,runOpts,connection);

if(settings.gatherMode){
const path=Runner._getArtifactsPath(settings);
await assetSaver.saveArtifacts(artifacts,path);
}
}


if(settings.gatherMode&&!settings.auditMode)return;


if(!runOpts.config.audits){
throw new Error('No audits to evaluate.');
}
const auditResults=await Runner._runAudits(settings,runOpts.config.audits,artifacts,
lighthouseRunWarnings);


const resultsStatus={msg:'Generating results...',id:'lh:runner:generate'};
log.time(resultsStatus);

if(artifacts.LighthouseRunWarnings){
lighthouseRunWarnings.push(...artifacts.LighthouseRunWarnings);
}


const lighthouseVersion=require('../package.json').version;


const resultsById={};
for(const audit of auditResults){
resultsById[audit.id]=audit;
}


let categories={};
if(runOpts.config.categories){
categories=ReportScoring.scoreAllCategories(runOpts.config.categories,resultsById);
}

log.timeEnd(resultsStatus);
log.timeEnd(runnerStatus);


const lhr={
userAgent:artifacts.HostUserAgent,
environment:{
networkUserAgent:artifacts.NetworkUserAgent,
hostUserAgent:artifacts.HostUserAgent,
benchmarkIndex:artifacts.BenchmarkIndex},

lighthouseVersion,
fetchTime:artifacts.fetchTime,
requestedUrl:requestedUrl,
finalUrl:artifacts.URL.finalUrl,
runWarnings:lighthouseRunWarnings,
runtimeError:Runner.getArtifactRuntimeError(artifacts),
audits:resultsById,
configSettings:settings,
categories,
categoryGroups:runOpts.config.groups||undefined,
timing:this._getTiming(artifacts),
i18n:{
rendererFormattedStrings:i18n.getRendererFormattedStrings(settings.locale),
icuMessagePaths:{}},

stackPacks:stackPacks.getStackPacks(artifacts.Stacks)};



lhr.i18n.icuMessagePaths=i18n.replaceIcuMessageInstanceIds(lhr,settings.locale);


const report=generateReport(lhr,settings.output);

return{lhr,artifacts,report};
}catch(err){

err.friendlyMessage=i18n.getFormatted(err.friendlyMessage,settings.locale);
await Sentry.captureException(err,{level:'fatal'});
throw err;
}
}








static _getTiming(artifacts){
const timingEntriesFromArtifacts=artifacts.Timing||[];
const timingEntriesFromRunner=log.takeTimeEntries();
const timingEntriesKeyValues=[
...timingEntriesFromArtifacts,
...timingEntriesFromRunner].

map(entry=>[entry.startTime,entry]);
const timingEntries=Array.from(new Map(timingEntriesKeyValues).values()).


map(entry=>{
return{


startTime:parseFloat(entry.startTime.toFixed(2)),
name:entry.name,
duration:parseFloat(entry.duration.toFixed(2)),
entryType:entry.entryType};

});
const runnerEntry=timingEntries.find(e=>e.name==='lh:runner:run');
return{entries:timingEntries,total:runnerEntry&&runnerEntry.duration||0};
}








static async _gatherArtifactsFromBrowser(requestedUrl,runnerOpts,connection){
if(!runnerOpts.config.passes){
throw new Error('No browser artifacts are either provided or requested.');
}
const driver=runnerOpts.driverMock||new Driver(connection);
const gatherOpts={
driver,
requestedUrl,
settings:runnerOpts.config.settings};

const artifacts=await GatherRunner.run(runnerOpts.config.passes,gatherOpts);
return artifacts;
}









static async _runAudits(settings,audits,artifacts,runWarnings){
const status={msg:'Analyzing and running audits...',id:'lh:runner:auditing'};
log.time(status);

if(artifacts.settings){
const overrides={
locale:undefined,
gatherMode:undefined,
auditMode:undefined,
output:undefined,
channel:undefined,
budgets:undefined};

const normalizedGatherSettings=Object.assign({},artifacts.settings,overrides);
const normalizedAuditSettings=Object.assign({},settings,overrides);

if(!isDeepEqual(normalizedGatherSettings,normalizedAuditSettings)){
throw new Error('Cannot change settings between gathering and auditing');
}
}


const sharedAuditContext={
settings,
LighthouseRunWarnings:runWarnings,
computedCache:new Map()};



const auditResults=[];
for(const auditDefn of audits){
const auditResult=await Runner._runAudit(auditDefn,artifacts,sharedAuditContext);
auditResults.push(auditResult);
}

log.timeEnd(status);
return auditResults;
}










static async _runAudit(auditDefn,artifacts,sharedAuditContext){
const audit=auditDefn.implementation;
const status={
msg:`Auditing: ${i18n.getFormatted(audit.meta.title,'en-US')}`,
id:`lh:audit:${audit.meta.id}`};

log.time(status);

let auditResult;
try{

for(const artifactName of audit.meta.requiredArtifacts){
const noArtifact=artifacts[artifactName]===undefined;



const noRequiredTrace=artifactName==='traces'&&!artifacts.traces[Audit.DEFAULT_PASS];
const noRequiredDevtoolsLog=artifactName==='devtoolsLogs'&&
!artifacts.devtoolsLogs[Audit.DEFAULT_PASS];

if(noArtifact||noRequiredTrace||noRequiredDevtoolsLog){
log.warn('Runner',
`${artifactName} gatherer, required by audit ${audit.meta.id}, did not run.`);
throw new LHError(LHError.errors.MISSING_REQUIRED_ARTIFACT,{artifactName});
}


if(artifacts[artifactName]instanceof Error){


const artifactError=artifacts[artifactName];

Sentry.captureException(artifactError,{
tags:{gatherer:artifactName},
level:'error'});


log.warn('Runner',`${artifactName} gatherer, required by audit ${audit.meta.id},`+
` encountered an error: ${artifactError.message}`);


const error=new LHError(LHError.errors.ERRORED_REQUIRED_ARTIFACT,
{artifactName,errorMessage:artifactError.message});

error.expected=true;
throw error;
}
}


const auditOptions=Object.assign({},audit.defaultOptions,auditDefn.options);
const auditContext={
options:auditOptions,
...sharedAuditContext};





const requiredArtifacts=audit.meta.requiredArtifacts.
reduce((requiredArtifacts,artifactName)=>{
const requiredArtifact=artifacts[artifactName];

requiredArtifacts[artifactName]=requiredArtifact;
return requiredArtifacts;
},{});
const product=await audit.audit(requiredArtifacts,auditContext);
auditResult=Audit.generateAuditResult(audit,product);
}catch(err){

if(err.code!=='MISSING_REQUIRED_ARTIFACT'&&err.code!=='ERRORED_REQUIRED_ARTIFACT'){
log.warn(audit.meta.id,`Caught exception: ${err.message}`);
}

Sentry.captureException(err,{tags:{audit:audit.meta.id},level:'error'});

const errorMessage=err.friendlyMessage?err.friendlyMessage:err.message;
auditResult=Audit.generateErrorAuditResult(audit,errorMessage);
}

log.timeEnd(status);
return auditResult;
}







static getArtifactRuntimeError(artifacts){
const possibleErrorArtifacts=[
artifacts.PageLoadError,
...Object.values(artifacts)];


for(const possibleErrorArtifact of possibleErrorArtifacts){
if(possibleErrorArtifact instanceof LHError&&possibleErrorArtifact.lhrRuntimeError){
const errorMessage=possibleErrorArtifact.friendlyMessage||possibleErrorArtifact.message;

return{
code:possibleErrorArtifact.code,
message:errorMessage};

}
}

return undefined;
}





static getAuditList(){
const ignoredFiles=[
'audit.js',
'violation-audit.js',
'accessibility/axe-audit.js',
'multi-check-audit.js',
'byte-efficiency/byte-efficiency-audit.js',
'manual/manual-audit.js'];


const fileList=[
...["accessibility","apple-touch-icon.js","audit.js","bootup-time.js","byte-efficiency","content-width.js","critical-request-chains.js","deprecations.js","diagnostics.js","dobetterweb","errors-in-console.js","final-screenshot.js","font-display.js","image-aspect-ratio.js","installable-manifest.js","is-on-https.js","load-fast-enough-for-pwa.js","main-thread-tasks.js","mainthread-work-breakdown.js","manual","metrics","metrics.js","mixed-content.js","multi-check-audit.js","network-requests.js","network-rtt.js","network-server-latency.js","offline-start-url.js","performance-budget.js","predictive-perf.js","redirects-http.js","redirects.js","resource-summary.js","screenshot-thumbnails.js","seo","service-worker.js","splash-screen.js","themed-omnibox.js","third-party-summary.js","time-to-first-byte.js","user-timings.js","uses-rel-preconnect.js","uses-rel-preload.js","viewport.js","violation-audit.js","without-javascript.js","works-offline.js"],
...["appcache-manifest.js","doctype.js","dom-size.js","external-anchors-use-rel-noopener.js","geolocation-on-start.js","js-libraries.js","no-document-write.js","no-vulnerable-libraries.js","notification-on-start.js","password-inputs-can-be-pasted-into.js","uses-http2.js","uses-passive-event-listeners.js"].map(f=>`dobetterweb/${f}`),
...["estimated-input-latency.js","first-contentful-paint-3g.js","first-contentful-paint.js","first-cpu-idle.js","first-meaningful-paint.js","interactive.js","max-potential-fid.js","speed-index.js","total-blocking-time.js"].map(f=>`metrics/${f}`),
...["canonical.js","font-size.js","hreflang.js","http-status-code.js","is-crawlable.js","link-text.js","manual","meta-description.js","plugins.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
...["structured-data.js"].map(f=>`seo/manual/${f}`),
...["accesskeys.js","aria-allowed-attr.js","aria-required-attr.js","aria-required-children.js","aria-required-parent.js","aria-roles.js","aria-valid-attr-value.js","aria-valid-attr.js","audio-caption.js","axe-audit.js","button-name.js","bypass.js","color-contrast.js","definition-list.js","dlitem.js","document-title.js","duplicate-id.js","frame-title.js","html-has-lang.js","html-lang-valid.js","image-alt.js","input-image-alt.js","label.js","layout-table.js","link-name.js","list.js","listitem.js","manual","meta-refresh.js","meta-viewport.js","object-alt.js","tabindex.js","td-headers-attr.js","th-has-data-cells.js","valid-lang.js","video-caption.js","video-description.js"].
map(f=>`accessibility/${f}`),
...["custom-controls-labels.js","custom-controls-roles.js","focus-traps.js","focusable-controls.js","heading-levels.js","interactive-element-affordance.js","logical-tab-order.js","managed-focus.js","offscreen-content-hidden.js","use-landmarks.js","visual-order-follows-dom.js"].
map(f=>`accessibility/manual/${f}`),
...["byte-efficiency-audit.js","efficient-animated-content.js","offscreen-images.js","render-blocking-resources.js","total-byte-weight.js","unminified-css.js","unminified-javascript.js","unused-css-rules.js","unused-javascript.js","uses-long-cache-ttl.js","uses-optimized-images.js","uses-responsive-images.js","uses-text-compression.js","uses-webp-images.js"].
map(f=>`byte-efficiency/${f}`),
...["manual-audit.js","pwa-cross-browser.js","pwa-each-page-has-url.js","pwa-page-transitions.js"].map(f=>`manual/${f}`)];

return fileList.filter(f=>{
return /\.js$/.test(f)&&!ignoredFiles.includes(f);
}).sort();
}





static getGathererList(){
const fileList=[
...["accessibility.js","anchor-elements.js","cache-contents.js","console-messages.js","css-usage.js","dobetterweb","gatherer.js","html-without-javascript.js","http-redirect.js","iframe-elements.js","image-elements.js","js-usage.js","link-elements.js","main-document-content.js","meta-elements.js","mixed-content.js","offline.js","runtime-exceptions.js","script-elements.js","seo","service-worker.js","source-maps.js","start-url.js","viewport-dimensions.js"],
...["embedded-content.js","font-size.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
...["appcache.js","doctype.js","domstats.js","optimized-images.js","password-inputs-with-prevented-paste.js","response-compression.js","tags-blocking-first-paint.js"].
map(f=>`dobetterweb/${f}`)];

return fileList.filter(f=>/\.js$/.test(f)&&f!=='gatherer.js').sort();
}






static _getArtifactsPath(settings){
const{auditMode,gatherMode}=settings;


if(typeof auditMode==='string')return path.resolve(process.cwd(),auditMode);
if(typeof gatherMode==='string')return path.resolve(process.cwd(),gatherMode);

return path.join(process.cwd(),'latest-run');
}}


module.exports=Runner;

}).call(this,require('_process'));
},{"../package.json":192,"./audits/audit.js":3,"./gather/driver.js":51,"./gather/gather-runner.js":52,"./lib/asset-saver.js":56,"./lib/i18n/i18n.js":66,"./lib/lh-error.js":71,"./lib/sentry.js":78,"./lib/stack-packs.js":80,"./lib/url-shim.js":"url","./report/report-generator.js":88,"./scoring.js":90,"_process":158,"lighthouse-logger":125,"lodash.isequal":142,"path":156}],90:[function(require,module,exports){






'use strict';

const Audit=require('./audits/audit.js');






const clampTo2Decimals=val=>Math.round(val*100)/100;

class ReportScoring{





static arithmeticMean(items){

items=items.filter(item=>item.weight>0);

if(items.some(item=>item.score===null))return null;

const results=items.reduce(
(result,item)=>{
const score=item.score;
const weight=item.weight;

return{
weight:result.weight+weight,
sum:result.sum+score*weight};

},
{weight:0,sum:0});


return clampTo2Decimals(results.sum/results.weight||0);
}







static scoreAllCategories(configCategories,resultsByAuditId){

const scoredCategories={};

for(const[categoryId,configCategory]of Object.entries(configCategories)){

const auditRefs=configCategory.auditRefs.map(configMember=>{
const member={...configMember};





const result=resultsByAuditId[member.id];
if(result.scoreDisplayMode===Audit.SCORING_MODES.NOT_APPLICABLE||
result.scoreDisplayMode===Audit.SCORING_MODES.INFORMATIVE||
result.scoreDisplayMode===Audit.SCORING_MODES.MANUAL){
member.weight=0;
}

return member;
});

const scores=auditRefs.map(auditRef=>({
score:resultsByAuditId[auditRef.id].score,
weight:auditRef.weight}));

const score=ReportScoring.arithmeticMean(scores);

scoredCategories[categoryId]={
...configCategory,
auditRefs,
id:categoryId,
score};

}

return scoredCategories;
}}


module.exports=ReportScoring;

},{"./audits/audit.js":3}],91:[function(require,module,exports){
const HEADER_REGEXP=/([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?/g;

const STRINGS={
maxAge:'max-age',
sharedMaxAge:'s-maxage',
maxStale:'max-stale',
minFresh:'min-fresh',
immutable:'immutable',
mustRevalidate:'must-revalidate',
noCache:'no-cache',
noStore:'no-store',
noTransform:'no-transform',
onlyIfCached:'only-if-cached',
private:'private',
proxyRevalidate:'proxy-revalidate',
public:'public'};


function parseBooleanOnly(value){
return value===null;
}

function parseDuration(value){
if(!value){
return null;
}

const duration=parseInt(value,10);

if(!Number.isFinite(duration)||duration<0){
return null;
}

return duration;
}

class CacheControl{
constructor(){
this.maxAge=null;
this.sharedMaxAge=null;
this.maxStale=null;
this.maxStaleDuration=null;
this.minFresh=null;
this.immutable=null;
this.mustRevalidate=null;
this.noCache=null;
this.noStore=null;
this.noTransform=null;
this.onlyIfCached=null;
this.private=null;
this.proxyRevalidate=null;
this.public=null;
}

parse(header){
if(!header||header.length===0){
return this;
}

const values={};
const matches=header.match(HEADER_REGEXP)||[];

Array.prototype.forEach.call(matches,match=>{
const tokens=match.split('=',2);

const[key]=tokens;
let value=null;

if(tokens.length>1){
value=tokens[1].trim();
}

values[key.toLowerCase()]=value;
});

this.maxAge=parseDuration(values[STRINGS.maxAge]);
this.sharedMaxAge=parseDuration(values[STRINGS.sharedMaxAge]);

this.maxStale=parseBooleanOnly(values[STRINGS.maxStale]);
this.maxStaleDuration=parseDuration(values[STRINGS.maxStale]);
if(this.maxStaleDuration){
this.maxStale=true;
}

this.minFresh=parseDuration(values[STRINGS.minFresh]);

this.immutable=parseBooleanOnly(values[STRINGS.immutable]);
this.mustRevalidate=parseBooleanOnly(values[STRINGS.mustRevalidate]);
this.noCache=parseBooleanOnly(values[STRINGS.noCache]);
this.noStore=parseBooleanOnly(values[STRINGS.noStore]);
this.noTransform=parseBooleanOnly(values[STRINGS.noTransform]);
this.onlyIfCached=parseBooleanOnly(values[STRINGS.onlyIfCached]);
this.private=parseBooleanOnly(values[STRINGS.private]);
this.proxyRevalidate=parseBooleanOnly(values[STRINGS.proxyRevalidate]);
this.public=parseBooleanOnly(values[STRINGS.public]);

return this;
}

format(){
const tokens=[];

if(this.maxAge){
tokens.push(`${STRINGS.maxAge}=${this.maxAge}`);
}

if(this.sharedMaxAge){
tokens.push(`${STRINGS.sharedMaxAge}=${this.sharedMaxAge}`);
}

if(this.maxStale){
if(this.maxStaleDuration){
tokens.push(`${STRINGS.maxStale}=${this.maxStaleDuration}`);
}else{
tokens.push(STRINGS.maxStale);
}
}

if(this.minFresh){
tokens.push(`${STRINGS.minFresh}=${this.minFresh}`);
}

if(this.immutable){
tokens.push(STRINGS.immutable);
}

if(this.mustRevalidate){
tokens.push(STRINGS.mustRevalidate);
}

if(this.noCache){
tokens.push(STRINGS.noCache);
}

if(this.noStore){
tokens.push(STRINGS.noStore);
}

if(this.noTransform){
tokens.push(STRINGS.noTransform);
}

if(this.onlyIfCached){
tokens.push(STRINGS.onlyIfCached);
}

if(this.private){
tokens.push(STRINGS.private);
}

if(this.proxyRevalidate){
tokens.push(STRINGS.proxyRevalidate);
}

if(this.public){
tokens.push(STRINGS.public);
}

return tokens.join(', ');
}}


function parse(header){
const cc=new CacheControl();
return cc.parse(header);
}

function format(cc){
if(!(cc instanceof CacheControl)){
return CacheControl.prototype.format.call(cc);
}

return cc.format();
}

module.exports={
CacheControl,
parse,
format};


},{}],92:[function(require,module,exports){
(function(global){
'use strict';










function compare(a,b){
if(a===b){
return 0;
}

var x=a.length;
var y=b.length;

for(var i=0,len=Math.min(x,y);i<len;++i){
if(a[i]!==b[i]){
x=a[i];
y=b[i];
break;
}
}

if(x<y){
return-1;
}
if(y<x){
return 1;
}
return 0;
}
function isBuffer(b){
if(global.Buffer&&typeof global.Buffer.isBuffer==='function'){
return global.Buffer.isBuffer(b);
}
return!!(b!=null&&b._isBuffer);
}



























var util=require('util/');
var hasOwn=Object.prototype.hasOwnProperty;
var pSlice=Array.prototype.slice;
var functionsHaveNames=function(){
return function foo(){}.name==='foo';
}();
function pToString(obj){
return Object.prototype.toString.call(obj);
}
function isView(arrbuf){
if(isBuffer(arrbuf)){
return false;
}
if(typeof global.ArrayBuffer!=='function'){
return false;
}
if(typeof ArrayBuffer.isView==='function'){
return ArrayBuffer.isView(arrbuf);
}
if(!arrbuf){
return false;
}
if(arrbuf instanceof DataView){
return true;
}
if(arrbuf.buffer&&arrbuf.buffer instanceof ArrayBuffer){
return true;
}
return false;
}




var assert=module.exports=ok;






var regex=/\s*function\s+([^\(\s]*)\s*/;

function getName(func){
if(!util.isFunction(func)){
return;
}
if(functionsHaveNames){
return func.name;
}
var str=func.toString();
var match=str.match(regex);
return match&&match[1];
}
assert.AssertionError=function AssertionError(options){
this.name='AssertionError';
this.actual=options.actual;
this.expected=options.expected;
this.operator=options.operator;
if(options.message){
this.message=options.message;
this.generatedMessage=false;
}else{
this.message=getMessage(this);
this.generatedMessage=true;
}
var stackStartFunction=options.stackStartFunction||fail;
if(Error.captureStackTrace){
Error.captureStackTrace(this,stackStartFunction);
}else{

var err=new Error();
if(err.stack){
var out=err.stack;


var fn_name=getName(stackStartFunction);
var idx=out.indexOf('\n'+fn_name);
if(idx>=0){


var next_line=out.indexOf('\n',idx+1);
out=out.substring(next_line+1);
}

this.stack=out;
}
}
};


util.inherits(assert.AssertionError,Error);

function truncate(s,n){
if(typeof s==='string'){
return s.length<n?s:s.slice(0,n);
}else{
return s;
}
}
function inspect(something){
if(functionsHaveNames||!util.isFunction(something)){
return util.inspect(something);
}
var rawname=getName(something);
var name=rawname?': '+rawname:'';
return'[Function'+name+']';
}
function getMessage(self){
return truncate(inspect(self.actual),128)+' '+
self.operator+' '+
truncate(inspect(self.expected),128);
}












function fail(actual,expected,message,operator,stackStartFunction){
throw new assert.AssertionError({
message:message,
actual:actual,
expected:expected,
operator:operator,
stackStartFunction:stackStartFunction});

}


assert.fail=fail;








function ok(value,message){
if(!value)fail(value,true,message,'==',assert.ok);
}
assert.ok=ok;





assert.equal=function equal(actual,expected,message){
if(actual!=expected)fail(actual,expected,message,'==',assert.equal);
};




assert.notEqual=function notEqual(actual,expected,message){
if(actual==expected){
fail(actual,expected,message,'!=',assert.notEqual);
}
};




assert.deepEqual=function deepEqual(actual,expected,message){
if(!_deepEqual(actual,expected,false)){
fail(actual,expected,message,'deepEqual',assert.deepEqual);
}
};

assert.deepStrictEqual=function deepStrictEqual(actual,expected,message){
if(!_deepEqual(actual,expected,true)){
fail(actual,expected,message,'deepStrictEqual',assert.deepStrictEqual);
}
};

function _deepEqual(actual,expected,strict,memos){

if(actual===expected){
return true;
}else if(isBuffer(actual)&&isBuffer(expected)){
return compare(actual,expected)===0;



}else if(util.isDate(actual)&&util.isDate(expected)){
return actual.getTime()===expected.getTime();




}else if(util.isRegExp(actual)&&util.isRegExp(expected)){
return actual.source===expected.source&&
actual.global===expected.global&&
actual.multiline===expected.multiline&&
actual.lastIndex===expected.lastIndex&&
actual.ignoreCase===expected.ignoreCase;



}else if((actual===null||typeof actual!=='object')&&(
expected===null||typeof expected!=='object')){
return strict?actual===expected:actual==expected;







}else if(isView(actual)&&isView(expected)&&
pToString(actual)===pToString(expected)&&
!(actual instanceof Float32Array||
actual instanceof Float64Array)){
return compare(new Uint8Array(actual.buffer),
new Uint8Array(expected.buffer))===0;







}else if(isBuffer(actual)!==isBuffer(expected)){
return false;
}else{
memos=memos||{actual:[],expected:[]};

var actualIndex=memos.actual.indexOf(actual);
if(actualIndex!==-1){
if(actualIndex===memos.expected.indexOf(expected)){
return true;
}
}

memos.actual.push(actual);
memos.expected.push(expected);

return objEquiv(actual,expected,strict,memos);
}
}

function isArguments(object){
return Object.prototype.toString.call(object)=='[object Arguments]';
}

function objEquiv(a,b,strict,actualVisitedObjects){
if(a===null||a===undefined||b===null||b===undefined)
return false;

if(util.isPrimitive(a)||util.isPrimitive(b))
return a===b;
if(strict&&Object.getPrototypeOf(a)!==Object.getPrototypeOf(b))
return false;
var aIsArgs=isArguments(a);
var bIsArgs=isArguments(b);
if(aIsArgs&&!bIsArgs||!aIsArgs&&bIsArgs)
return false;
if(aIsArgs){
a=pSlice.call(a);
b=pSlice.call(b);
return _deepEqual(a,b,strict);
}
var ka=objectKeys(a);
var kb=objectKeys(b);
var key,i;


if(ka.length!==kb.length)
return false;

ka.sort();
kb.sort();

for(i=ka.length-1;i>=0;i--){
if(ka[i]!==kb[i])
return false;
}


for(i=ka.length-1;i>=0;i--){
key=ka[i];
if(!_deepEqual(a[key],b[key],strict,actualVisitedObjects))
return false;
}
return true;
}




assert.notDeepEqual=function notDeepEqual(actual,expected,message){
if(_deepEqual(actual,expected,false)){
fail(actual,expected,message,'notDeepEqual',assert.notDeepEqual);
}
};

assert.notDeepStrictEqual=notDeepStrictEqual;
function notDeepStrictEqual(actual,expected,message){
if(_deepEqual(actual,expected,true)){
fail(actual,expected,message,'notDeepStrictEqual',notDeepStrictEqual);
}
}





assert.strictEqual=function strictEqual(actual,expected,message){
if(actual!==expected){
fail(actual,expected,message,'===',assert.strictEqual);
}
};




assert.notStrictEqual=function notStrictEqual(actual,expected,message){
if(actual===expected){
fail(actual,expected,message,'!==',assert.notStrictEqual);
}
};

function expectedException(actual,expected){
if(!actual||!expected){
return false;
}

if(Object.prototype.toString.call(expected)=='[object RegExp]'){
return expected.test(actual);
}

try{
if(actual instanceof expected){
return true;
}
}catch(e){

}

if(Error.isPrototypeOf(expected)){
return false;
}

return expected.call({},actual)===true;
}

function _tryBlock(block){
var error;
try{
block();
}catch(e){
error=e;
}
return error;
}

function _throws(shouldThrow,block,expected,message){
var actual;

if(typeof block!=='function'){
throw new TypeError('"block" argument must be a function');
}

if(typeof expected==='string'){
message=expected;
expected=null;
}

actual=_tryBlock(block);

message=(expected&&expected.name?' ('+expected.name+').':'.')+(
message?' '+message:'.');

if(shouldThrow&&!actual){
fail(actual,expected,'Missing expected exception'+message);
}

var userProvidedMessage=typeof message==='string';
var isUnwantedException=!shouldThrow&&util.isError(actual);
var isUnexpectedException=!shouldThrow&&actual&&!expected;

if(isUnwantedException&&
userProvidedMessage&&
expectedException(actual,expected)||
isUnexpectedException){
fail(actual,expected,'Got unwanted exception'+message);
}

if(shouldThrow&&actual&&expected&&
!expectedException(actual,expected)||!shouldThrow&&actual){
throw actual;
}
}




assert.throws=function(block,error,message){
_throws(true,block,error,message);
};


assert.doesNotThrow=function(block,error,message){
_throws(false,block,error,message);
};

assert.ifError=function(err){if(err)throw err;};

var objectKeys=Object.keys||function(obj){
var keys=[];
for(var key in obj){
if(hasOwn.call(obj,key))keys.push(key);
}
return keys;
};

}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
},{"util/":95}],93:[function(require,module,exports){
if(typeof Object.create==='function'){

module.exports=function inherits(ctor,superCtor){
ctor.super_=superCtor;
ctor.prototype=Object.create(superCtor.prototype,{
constructor:{
value:ctor,
enumerable:false,
writable:true,
configurable:true}});


};
}else{

module.exports=function inherits(ctor,superCtor){
ctor.super_=superCtor;
var TempCtor=function(){};
TempCtor.prototype=superCtor.prototype;
ctor.prototype=new TempCtor();
ctor.prototype.constructor=ctor;
};
}

},{}],94:[function(require,module,exports){
module.exports=function isBuffer(arg){
return arg&&typeof arg==='object'&&
typeof arg.copy==='function'&&
typeof arg.fill==='function'&&
typeof arg.readUInt8==='function';
};
},{}],95:[function(require,module,exports){
(function(process,global){





















var formatRegExp=/%[sdj%]/g;
exports.format=function(f){
if(!isString(f)){
var objects=[];
for(var i=0;i<arguments.length;i++){
objects.push(inspect(arguments[i]));
}
return objects.join(' ');
}

var i=1;
var args=arguments;
var len=args.length;
var str=String(f).replace(formatRegExp,function(x){
if(x==='%%')return'%';
if(i>=len)return x;
switch(x){
case'%s':return String(args[i++]);
case'%d':return Number(args[i++]);
case'%j':
try{
return JSON.stringify(args[i++]);
}catch(_){
return'[Circular]';
}
default:
return x;}

});
for(var x=args[i];i<len;x=args[++i]){
if(isNull(x)||!isObject(x)){
str+=' '+x;
}else{
str+=' '+inspect(x);
}
}
return str;
};





exports.deprecate=function(fn,msg){

if(isUndefined(global.process)){
return function(){
return exports.deprecate(fn,msg).apply(this,arguments);
};
}

if(process.noDeprecation===true){
return fn;
}

var warned=false;
function deprecated(){
if(!warned){
if(process.throwDeprecation){
throw new Error(msg);
}else if(process.traceDeprecation){
console.trace(msg);
}else{
console.error(msg);
}
warned=true;
}
return fn.apply(this,arguments);
}

return deprecated;
};


var debugs={};
var debugEnviron;
exports.debuglog=function(set){
if(isUndefined(debugEnviron))
debugEnviron=process.env.NODE_DEBUG||'';
set=set.toUpperCase();
if(!debugs[set]){
if(new RegExp('\\b'+set+'\\b','i').test(debugEnviron)){
var pid=process.pid;
debugs[set]=function(){
var msg=exports.format.apply(exports,arguments);
console.error('%s %d: %s',set,pid,msg);
};
}else{
debugs[set]=function(){};
}
}
return debugs[set];
};










function inspect(obj,opts){

var ctx={
seen:[],
stylize:stylizeNoColor};


if(arguments.length>=3)ctx.depth=arguments[2];
if(arguments.length>=4)ctx.colors=arguments[3];
if(isBoolean(opts)){

ctx.showHidden=opts;
}else if(opts){

exports._extend(ctx,opts);
}

if(isUndefined(ctx.showHidden))ctx.showHidden=false;
if(isUndefined(ctx.depth))ctx.depth=2;
if(isUndefined(ctx.colors))ctx.colors=false;
if(isUndefined(ctx.customInspect))ctx.customInspect=true;
if(ctx.colors)ctx.stylize=stylizeWithColor;
return formatValue(ctx,obj,ctx.depth);
}
exports.inspect=inspect;



inspect.colors={
'bold':[1,22],
'italic':[3,23],
'underline':[4,24],
'inverse':[7,27],
'white':[37,39],
'grey':[90,39],
'black':[30,39],
'blue':[34,39],
'cyan':[36,39],
'green':[32,39],
'magenta':[35,39],
'red':[31,39],
'yellow':[33,39]};



inspect.styles={
'special':'cyan',
'number':'yellow',
'boolean':'yellow',
'undefined':'grey',
'null':'bold',
'string':'green',
'date':'magenta',

'regexp':'red'};



function stylizeWithColor(str,styleType){
var style=inspect.styles[styleType];

if(style){
return'\u001b['+inspect.colors[style][0]+'m'+str+
'\u001b['+inspect.colors[style][1]+'m';
}else{
return str;
}
}


function stylizeNoColor(str,styleType){
return str;
}


function arrayToHash(array){
var hash={};

array.forEach(function(val,idx){
hash[val]=true;
});

return hash;
}


function formatValue(ctx,value,recurseTimes){


if(ctx.customInspect&&
value&&
isFunction(value.inspect)&&

value.inspect!==exports.inspect&&

!(value.constructor&&value.constructor.prototype===value)){
var ret=value.inspect(recurseTimes,ctx);
if(!isString(ret)){
ret=formatValue(ctx,ret,recurseTimes);
}
return ret;
}


var primitive=formatPrimitive(ctx,value);
if(primitive){
return primitive;
}


var keys=Object.keys(value);
var visibleKeys=arrayToHash(keys);

if(ctx.showHidden){
keys=Object.getOwnPropertyNames(value);
}



if(isError(value)&&(
keys.indexOf('message')>=0||keys.indexOf('description')>=0)){
return formatError(value);
}


if(keys.length===0){
if(isFunction(value)){
var name=value.name?': '+value.name:'';
return ctx.stylize('[Function'+name+']','special');
}
if(isRegExp(value)){
return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
}
if(isDate(value)){
return ctx.stylize(Date.prototype.toString.call(value),'date');
}
if(isError(value)){
return formatError(value);
}
}

var base='',array=false,braces=['{','}'];


if(isArray(value)){
array=true;
braces=['[',']'];
}


if(isFunction(value)){
var n=value.name?': '+value.name:'';
base=' [Function'+n+']';
}


if(isRegExp(value)){
base=' '+RegExp.prototype.toString.call(value);
}


if(isDate(value)){
base=' '+Date.prototype.toUTCString.call(value);
}


if(isError(value)){
base=' '+formatError(value);
}

if(keys.length===0&&(!array||value.length==0)){
return braces[0]+base+braces[1];
}

if(recurseTimes<0){
if(isRegExp(value)){
return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
}else{
return ctx.stylize('[Object]','special');
}
}

ctx.seen.push(value);

var output;
if(array){
output=formatArray(ctx,value,recurseTimes,visibleKeys,keys);
}else{
output=keys.map(function(key){
return formatProperty(ctx,value,recurseTimes,visibleKeys,key,array);
});
}

ctx.seen.pop();

return reduceToSingleString(output,base,braces);
}


function formatPrimitive(ctx,value){
if(isUndefined(value))
return ctx.stylize('undefined','undefined');
if(isString(value)){
var simple='\''+JSON.stringify(value).replace(/^"|"$/g,'').
replace(/'/g,"\\'").
replace(/\\"/g,'"')+'\'';
return ctx.stylize(simple,'string');
}
if(isNumber(value))
return ctx.stylize(''+value,'number');
if(isBoolean(value))
return ctx.stylize(''+value,'boolean');

if(isNull(value))
return ctx.stylize('null','null');
}


function formatError(value){
return'['+Error.prototype.toString.call(value)+']';
}


function formatArray(ctx,value,recurseTimes,visibleKeys,keys){
var output=[];
for(var i=0,l=value.length;i<l;++i){
if(hasOwnProperty(value,String(i))){
output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
String(i),true));
}else{
output.push('');
}
}
keys.forEach(function(key){
if(!key.match(/^\d+$/)){
output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
key,true));
}
});
return output;
}


function formatProperty(ctx,value,recurseTimes,visibleKeys,key,array){
var name,str,desc;
desc=Object.getOwnPropertyDescriptor(value,key)||{value:value[key]};
if(desc.get){
if(desc.set){
str=ctx.stylize('[Getter/Setter]','special');
}else{
str=ctx.stylize('[Getter]','special');
}
}else{
if(desc.set){
str=ctx.stylize('[Setter]','special');
}
}
if(!hasOwnProperty(visibleKeys,key)){
name='['+key+']';
}
if(!str){
if(ctx.seen.indexOf(desc.value)<0){
if(isNull(recurseTimes)){
str=formatValue(ctx,desc.value,null);
}else{
str=formatValue(ctx,desc.value,recurseTimes-1);
}
if(str.indexOf('\n')>-1){
if(array){
str=str.split('\n').map(function(line){
return'  '+line;
}).join('\n').substr(2);
}else{
str='\n'+str.split('\n').map(function(line){
return'   '+line;
}).join('\n');
}
}
}else{
str=ctx.stylize('[Circular]','special');
}
}
if(isUndefined(name)){
if(array&&key.match(/^\d+$/)){
return str;
}
name=JSON.stringify(''+key);
if(name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)){
name=name.substr(1,name.length-2);
name=ctx.stylize(name,'name');
}else{
name=name.replace(/'/g,"\\'").
replace(/\\"/g,'"').
replace(/(^"|"$)/g,"'");
name=ctx.stylize(name,'string');
}
}

return name+': '+str;
}


function reduceToSingleString(output,base,braces){
var numLinesEst=0;
var length=output.reduce(function(prev,cur){
numLinesEst++;
if(cur.indexOf('\n')>=0)numLinesEst++;
return prev+cur.replace(/\u001b\[\d\d?m/g,'').length+1;
},0);

if(length>60){
return braces[0]+(
base===''?'':base+'\n ')+
' '+
output.join(',\n  ')+
' '+
braces[1];
}

return braces[0]+base+' '+output.join(', ')+' '+braces[1];
}




function isArray(ar){
return Array.isArray(ar);
}
exports.isArray=isArray;

function isBoolean(arg){
return typeof arg==='boolean';
}
exports.isBoolean=isBoolean;

function isNull(arg){
return arg===null;
}
exports.isNull=isNull;

function isNullOrUndefined(arg){
return arg==null;
}
exports.isNullOrUndefined=isNullOrUndefined;

function isNumber(arg){
return typeof arg==='number';
}
exports.isNumber=isNumber;

function isString(arg){
return typeof arg==='string';
}
exports.isString=isString;

function isSymbol(arg){
return typeof arg==='symbol';
}
exports.isSymbol=isSymbol;

function isUndefined(arg){
return arg===void 0;
}
exports.isUndefined=isUndefined;

function isRegExp(re){
return isObject(re)&&objectToString(re)==='[object RegExp]';
}
exports.isRegExp=isRegExp;

function isObject(arg){
return typeof arg==='object'&&arg!==null;
}
exports.isObject=isObject;

function isDate(d){
return isObject(d)&&objectToString(d)==='[object Date]';
}
exports.isDate=isDate;

function isError(e){
return isObject(e)&&(
objectToString(e)==='[object Error]'||e instanceof Error);
}
exports.isError=isError;

function isFunction(arg){
return typeof arg==='function';
}
exports.isFunction=isFunction;

function isPrimitive(arg){
return arg===null||
typeof arg==='boolean'||
typeof arg==='number'||
typeof arg==='string'||
typeof arg==='symbol'||
typeof arg==='undefined';
}
exports.isPrimitive=isPrimitive;

exports.isBuffer=require('./support/isBuffer');

function objectToString(o){
return Object.prototype.toString.call(o);
}


function pad(n){
return n<10?'0'+n.toString(10):n.toString(10);
}


var months=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep',
'Oct','Nov','Dec'];


function timestamp(){
var d=new Date();
var time=[pad(d.getHours()),
pad(d.getMinutes()),
pad(d.getSeconds())].join(':');
return[d.getDate(),months[d.getMonth()],time].join(' ');
}



exports.log=function(){
console.log('%s - %s',timestamp(),exports.format.apply(exports,arguments));
};















exports.inherits=require('inherits');

exports._extend=function(origin,add){

if(!add||!isObject(add))return origin;

var keys=Object.keys(add);
var i=keys.length;
while(i--){
origin[keys[i]]=add[keys[i]];
}
return origin;
};

function hasOwnProperty(obj,prop){
return Object.prototype.hasOwnProperty.call(obj,prop);
}

}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
},{"./support/isBuffer":94,"_process":158,"inherits":93}],96:[function(require,module,exports){

const langs=[
'aa',
'ab',
'ae',
'af',
'ak',
'am',
'an',
'ar',
'as',
'av',
'ay',
'az',
'ba',
'be',
'bg',
'bh',
'bi',
'bm',
'bn',
'bo',
'br',
'bs',
'ca',
'ce',
'ch',
'co',
'cr',
'cs',
'cu',
'cv',
'cy',
'da',
'de',
'dv',
'dz',
'ee',
'el',
'en',
'eo',
'es',
'et',
'eu',
'fa',
'ff',
'fi',
'fj',
'fo',
'fr',
'fy',
'ga',
'gd',
'gl',
'gn',
'gu',
'gv',
'ha',
'he',
'hi',
'ho',
'hr',
'ht',
'hu',
'hy',
'hz',
'ia',
'id',
'ie',
'ig',
'ii',
'ik',
'in',
'io',
'is',
'it',
'iu',
'iw',
'ja',
'ji',
'jv',
'jw',
'ka',
'kg',
'ki',
'kj',
'kk',
'kl',
'km',
'kn',
'ko',
'kr',
'ks',
'ku',
'kv',
'kw',
'ky',
'la',
'lb',
'lg',
'li',
'ln',
'lo',
'lt',
'lu',
'lv',
'mg',
'mh',
'mi',
'mk',
'ml',
'mn',
'mo',
'mr',
'ms',
'mt',
'my',
'na',
'nb',
'nd',
'ne',
'ng',
'nl',
'nn',
'no',
'nr',
'nv',
'ny',
'oc',
'oj',
'om',
'or',
'os',
'pa',
'pi',
'pl',
'ps',
'pt',
'qu',
'rm',
'rn',
'ro',
'ru',
'rw',
'sa',
'sc',
'sd',
'se',
'sg',
'sh',
'si',
'sk',
'sl',
'sm',
'sn',
'so',
'sq',
'sr',
'ss',
'st',
'su',
'sv',
'sw',
'ta',
'te',
'tg',
'th',
'ti',
'tk',
'tl',
'tn',
'to',
'tr',
'ts',
'tt',
'tw',
'ty',
'ug',
'uk',
'ur',
'uz',
've',
'vi',
'vo',
'wa',
'wo',
'xh',
'yi',
'yo',
'za',
'zh',
'zu',
'aaa',
'aab',
'aac',
'aad',
'aae',
'aaf',
'aag',
'aah',
'aai',
'aak',
'aal',
'aam',
'aan',
'aao',
'aap',
'aaq',
'aas',
'aat',
'aau',
'aav',
'aaw',
'aax',
'aaz',
'aba',
'abb',
'abc',
'abd',
'abe',
'abf',
'abg',
'abh',
'abi',
'abj',
'abl',
'abm',
'abn',
'abo',
'abp',
'abq',
'abr',
'abs',
'abt',
'abu',
'abv',
'abw',
'abx',
'aby',
'abz',
'aca',
'acb',
'acd',
'ace',
'acf',
'ach',
'aci',
'ack',
'acl',
'acm',
'acn',
'acp',
'acq',
'acr',
'acs',
'act',
'acu',
'acv',
'acw',
'acx',
'acy',
'acz',
'ada',
'adb',
'add',
'ade',
'adf',
'adg',
'adh',
'adi',
'adj',
'adl',
'adn',
'ado',
'adp',
'adq',
'adr',
'ads',
'adt',
'adu',
'adw',
'adx',
'ady',
'adz',
'aea',
'aeb',
'aec',
'aed',
'aee',
'aek',
'ael',
'aem',
'aen',
'aeq',
'aer',
'aes',
'aeu',
'aew',
'aey',
'aez',
'afa',
'afb',
'afd',
'afe',
'afg',
'afh',
'afi',
'afk',
'afn',
'afo',
'afp',
'afs',
'aft',
'afu',
'afz',
'aga',
'agb',
'agc',
'agd',
'age',
'agf',
'agg',
'agh',
'agi',
'agj',
'agk',
'agl',
'agm',
'agn',
'ago',
'agp',
'agq',
'agr',
'ags',
'agt',
'agu',
'agv',
'agw',
'agx',
'agy',
'agz',
'aha',
'ahb',
'ahg',
'ahh',
'ahi',
'ahk',
'ahl',
'ahm',
'ahn',
'aho',
'ahp',
'ahr',
'ahs',
'aht',
'aia',
'aib',
'aic',
'aid',
'aie',
'aif',
'aig',
'aih',
'aii',
'aij',
'aik',
'ail',
'aim',
'ain',
'aio',
'aip',
'aiq',
'air',
'ais',
'ait',
'aiw',
'aix',
'aiy',
'aja',
'ajg',
'aji',
'ajn',
'ajp',
'ajt',
'aju',
'ajw',
'ajz',
'akb',
'akc',
'akd',
'ake',
'akf',
'akg',
'akh',
'aki',
'akj',
'akk',
'akl',
'akm',
'ako',
'akp',
'akq',
'akr',
'aks',
'akt',
'aku',
'akv',
'akw',
'akx',
'aky',
'akz',
'ala',
'alc',
'ald',
'ale',
'alf',
'alg',
'alh',
'ali',
'alj',
'alk',
'all',
'alm',
'aln',
'alo',
'alp',
'alq',
'alr',
'als',
'alt',
'alu',
'alv',
'alw',
'alx',
'aly',
'alz',
'ama',
'amb',
'amc',
'ame',
'amf',
'amg',
'ami',
'amj',
'amk',
'aml',
'amm',
'amn',
'amo',
'amp',
'amq',
'amr',
'ams',
'amt',
'amu',
'amv',
'amw',
'amx',
'amy',
'amz',
'ana',
'anb',
'anc',
'and',
'ane',
'anf',
'ang',
'anh',
'ani',
'anj',
'ank',
'anl',
'anm',
'ann',
'ano',
'anp',
'anq',
'anr',
'ans',
'ant',
'anu',
'anv',
'anw',
'anx',
'any',
'anz',
'aoa',
'aob',
'aoc',
'aod',
'aoe',
'aof',
'aog',
'aoh',
'aoi',
'aoj',
'aok',
'aol',
'aom',
'aon',
'aor',
'aos',
'aot',
'aou',
'aox',
'aoz',
'apa',
'apb',
'apc',
'apd',
'ape',
'apf',
'apg',
'aph',
'api',
'apj',
'apk',
'apl',
'apm',
'apn',
'apo',
'app',
'apq',
'apr',
'aps',
'apt',
'apu',
'apv',
'apw',
'apx',
'apy',
'apz',
'aqa',
'aqc',
'aqd',
'aqg',
'aql',
'aqm',
'aqn',
'aqp',
'aqr',
'aqt',
'aqz',
'arb',
'arc',
'ard',
'are',
'arh',
'ari',
'arj',
'ark',
'arl',
'arn',
'aro',
'arp',
'arq',
'arr',
'ars',
'art',
'aru',
'arv',
'arw',
'arx',
'ary',
'arz',
'asa',
'asb',
'asc',
'asd',
'ase',
'asf',
'asg',
'ash',
'asi',
'asj',
'ask',
'asl',
'asn',
'aso',
'asp',
'asq',
'asr',
'ass',
'ast',
'asu',
'asv',
'asw',
'asx',
'asy',
'asz',
'ata',
'atb',
'atc',
'atd',
'ate',
'atg',
'ath',
'ati',
'atj',
'atk',
'atl',
'atm',
'atn',
'ato',
'atp',
'atq',
'atr',
'ats',
'att',
'atu',
'atv',
'atw',
'atx',
'aty',
'atz',
'aua',
'aub',
'auc',
'aud',
'aue',
'auf',
'aug',
'auh',
'aui',
'auj',
'auk',
'aul',
'aum',
'aun',
'auo',
'aup',
'auq',
'aur',
'aus',
'aut',
'auu',
'auw',
'aux',
'auy',
'auz',
'avb',
'avd',
'avi',
'avk',
'avl',
'avm',
'avn',
'avo',
'avs',
'avt',
'avu',
'avv',
'awa',
'awb',
'awc',
'awd',
'awe',
'awg',
'awh',
'awi',
'awk',
'awm',
'awn',
'awo',
'awr',
'aws',
'awt',
'awu',
'awv',
'aww',
'awx',
'awy',
'axb',
'axe',
'axg',
'axk',
'axl',
'axm',
'axx',
'aya',
'ayb',
'ayc',
'ayd',
'aye',
'ayg',
'ayh',
'ayi',
'ayk',
'ayl',
'ayn',
'ayo',
'ayp',
'ayq',
'ayr',
'ays',
'ayt',
'ayu',
'ayx',
'ayy',
'ayz',
'aza',
'azb',
'azc',
'azd',
'azg',
'azj',
'azm',
'azn',
'azo',
'azt',
'azz',
'baa',
'bab',
'bac',
'bad',
'bae',
'baf',
'bag',
'bah',
'bai',
'baj',
'bal',
'ban',
'bao',
'bap',
'bar',
'bas',
'bat',
'bau',
'bav',
'baw',
'bax',
'bay',
'baz',
'bba',
'bbb',
'bbc',
'bbd',
'bbe',
'bbf',
'bbg',
'bbh',
'bbi',
'bbj',
'bbk',
'bbl',
'bbm',
'bbn',
'bbo',
'bbp',
'bbq',
'bbr',
'bbs',
'bbt',
'bbu',
'bbv',
'bbw',
'bbx',
'bby',
'bbz',
'bca',
'bcb',
'bcc',
'bcd',
'bce',
'bcf',
'bcg',
'bch',
'bci',
'bcj',
'bck',
'bcl',
'bcm',
'bcn',
'bco',
'bcp',
'bcq',
'bcr',
'bcs',
'bct',
'bcu',
'bcv',
'bcw',
'bcy',
'bcz',
'bda',
'bdb',
'bdc',
'bdd',
'bde',
'bdf',
'bdg',
'bdh',
'bdi',
'bdj',
'bdk',
'bdl',
'bdm',
'bdn',
'bdo',
'bdp',
'bdq',
'bdr',
'bds',
'bdt',
'bdu',
'bdv',
'bdw',
'bdx',
'bdy',
'bdz',
'bea',
'beb',
'bec',
'bed',
'bee',
'bef',
'beg',
'beh',
'bei',
'bej',
'bek',
'bem',
'beo',
'bep',
'beq',
'ber',
'bes',
'bet',
'beu',
'bev',
'bew',
'bex',
'bey',
'bez',
'bfa',
'bfb',
'bfc',
'bfd',
'bfe',
'bff',
'bfg',
'bfh',
'bfi',
'bfj',
'bfk',
'bfl',
'bfm',
'bfn',
'bfo',
'bfp',
'bfq',
'bfr',
'bfs',
'bft',
'bfu',
'bfw',
'bfx',
'bfy',
'bfz',
'bga',
'bgb',
'bgc',
'bgd',
'bge',
'bgf',
'bgg',
'bgi',
'bgj',
'bgk',
'bgl',
'bgm',
'bgn',
'bgo',
'bgp',
'bgq',
'bgr',
'bgs',
'bgt',
'bgu',
'bgv',
'bgw',
'bgx',
'bgy',
'bgz',
'bha',
'bhb',
'bhc',
'bhd',
'bhe',
'bhf',
'bhg',
'bhh',
'bhi',
'bhj',
'bhk',
'bhl',
'bhm',
'bhn',
'bho',
'bhp',
'bhq',
'bhr',
'bhs',
'bht',
'bhu',
'bhv',
'bhw',
'bhx',
'bhy',
'bhz',
'bia',
'bib',
'bic',
'bid',
'bie',
'bif',
'big',
'bij',
'bik',
'bil',
'bim',
'bin',
'bio',
'bip',
'biq',
'bir',
'bit',
'biu',
'biv',
'biw',
'bix',
'biy',
'biz',
'bja',
'bjb',
'bjc',
'bjd',
'bje',
'bjf',
'bjg',
'bjh',
'bji',
'bjj',
'bjk',
'bjl',
'bjm',
'bjn',
'bjo',
'bjp',
'bjq',
'bjr',
'bjs',
'bjt',
'bju',
'bjv',
'bjw',
'bjx',
'bjy',
'bjz',
'bka',
'bkb',
'bkc',
'bkd',
'bkf',
'bkg',
'bkh',
'bki',
'bkj',
'bkk',
'bkl',
'bkm',
'bkn',
'bko',
'bkp',
'bkq',
'bkr',
'bks',
'bkt',
'bku',
'bkv',
'bkw',
'bkx',
'bky',
'bkz',
'bla',
'blb',
'blc',
'bld',
'ble',
'blf',
'blg',
'blh',
'bli',
'blj',
'blk',
'bll',
'blm',
'bln',
'blo',
'blp',
'blq',
'blr',
'bls',
'blt',
'blv',
'blw',
'blx',
'bly',
'blz',
'bma',
'bmb',
'bmc',
'bmd',
'bme',
'bmf',
'bmg',
'bmh',
'bmi',
'bmj',
'bmk',
'bml',
'bmm',
'bmn',
'bmo',
'bmp',
'bmq',
'bmr',
'bms',
'bmt',
'bmu',
'bmv',
'bmw',
'bmx',
'bmy',
'bmz',
'bna',
'bnb',
'bnc',
'bnd',
'bne',
'bnf',
'bng',
'bni',
'bnj',
'bnk',
'bnl',
'bnm',
'bnn',
'bno',
'bnp',
'bnq',
'bnr',
'bns',
'bnt',
'bnu',
'bnv',
'bnw',
'bnx',
'bny',
'bnz',
'boa',
'bob',
'boe',
'bof',
'bog',
'boh',
'boi',
'boj',
'bok',
'bol',
'bom',
'bon',
'boo',
'bop',
'boq',
'bor',
'bot',
'bou',
'bov',
'bow',
'box',
'boy',
'boz',
'bpa',
'bpb',
'bpd',
'bpg',
'bph',
'bpi',
'bpj',
'bpk',
'bpl',
'bpm',
'bpn',
'bpo',
'bpp',
'bpq',
'bpr',
'bps',
'bpt',
'bpu',
'bpv',
'bpw',
'bpx',
'bpy',
'bpz',
'bqa',
'bqb',
'bqc',
'bqd',
'bqf',
'bqg',
'bqh',
'bqi',
'bqj',
'bqk',
'bql',
'bqm',
'bqn',
'bqo',
'bqp',
'bqq',
'bqr',
'bqs',
'bqt',
'bqu',
'bqv',
'bqw',
'bqx',
'bqy',
'bqz',
'bra',
'brb',
'brc',
'brd',
'brf',
'brg',
'brh',
'bri',
'brj',
'brk',
'brl',
'brm',
'brn',
'bro',
'brp',
'brq',
'brr',
'brs',
'brt',
'bru',
'brv',
'brw',
'brx',
'bry',
'brz',
'bsa',
'bsb',
'bsc',
'bse',
'bsf',
'bsg',
'bsh',
'bsi',
'bsj',
'bsk',
'bsl',
'bsm',
'bsn',
'bso',
'bsp',
'bsq',
'bsr',
'bss',
'bst',
'bsu',
'bsv',
'bsw',
'bsx',
'bsy',
'bta',
'btb',
'btc',
'btd',
'bte',
'btf',
'btg',
'bth',
'bti',
'btj',
'btk',
'btl',
'btm',
'btn',
'bto',
'btp',
'btq',
'btr',
'bts',
'btt',
'btu',
'btv',
'btw',
'btx',
'bty',
'btz',
'bua',
'bub',
'buc',
'bud',
'bue',
'buf',
'bug',
'buh',
'bui',
'buj',
'buk',
'bum',
'bun',
'buo',
'bup',
'buq',
'bus',
'but',
'buu',
'buv',
'buw',
'bux',
'buy',
'buz',
'bva',
'bvb',
'bvc',
'bvd',
'bve',
'bvf',
'bvg',
'bvh',
'bvi',
'bvj',
'bvk',
'bvl',
'bvm',
'bvn',
'bvo',
'bvp',
'bvq',
'bvr',
'bvt',
'bvu',
'bvv',
'bvw',
'bvx',
'bvy',
'bvz',
'bwa',
'bwb',
'bwc',
'bwd',
'bwe',
'bwf',
'bwg',
'bwh',
'bwi',
'bwj',
'bwk',
'bwl',
'bwm',
'bwn',
'bwo',
'bwp',
'bwq',
'bwr',
'bws',
'bwt',
'bwu',
'bww',
'bwx',
'bwy',
'bwz',
'bxa',
'bxb',
'bxc',
'bxd',
'bxe',
'bxf',
'bxg',
'bxh',
'bxi',
'bxj',
'bxk',
'bxl',
'bxm',
'bxn',
'bxo',
'bxp',
'bxq',
'bxr',
'bxs',
'bxu',
'bxv',
'bxw',
'bxx',
'bxz',
'bya',
'byb',
'byc',
'byd',
'bye',
'byf',
'byg',
'byh',
'byi',
'byj',
'byk',
'byl',
'bym',
'byn',
'byo',
'byp',
'byq',
'byr',
'bys',
'byt',
'byv',
'byw',
'byx',
'byy',
'byz',
'bza',
'bzb',
'bzc',
'bzd',
'bze',
'bzf',
'bzg',
'bzh',
'bzi',
'bzj',
'bzk',
'bzl',
'bzm',
'bzn',
'bzo',
'bzp',
'bzq',
'bzr',
'bzs',
'bzt',
'bzu',
'bzv',
'bzw',
'bzx',
'bzy',
'bzz',
'caa',
'cab',
'cac',
'cad',
'cae',
'caf',
'cag',
'cah',
'cai',
'caj',
'cak',
'cal',
'cam',
'can',
'cao',
'cap',
'caq',
'car',
'cas',
'cau',
'cav',
'caw',
'cax',
'cay',
'caz',
'cba',
'cbb',
'cbc',
'cbd',
'cbe',
'cbg',
'cbh',
'cbi',
'cbj',
'cbk',
'cbl',
'cbn',
'cbo',
'cbq',
'cbr',
'cbs',
'cbt',
'cbu',
'cbv',
'cbw',
'cby',
'cca',
'ccc',
'ccd',
'cce',
'ccg',
'cch',
'ccj',
'ccl',
'ccm',
'ccn',
'cco',
'ccp',
'ccq',
'ccr',
'ccs',
'cda',
'cdc',
'cdd',
'cde',
'cdf',
'cdg',
'cdh',
'cdi',
'cdj',
'cdm',
'cdn',
'cdo',
'cdr',
'cds',
'cdy',
'cdz',
'cea',
'ceb',
'ceg',
'cek',
'cel',
'cen',
'cet',
'cfa',
'cfd',
'cfg',
'cfm',
'cga',
'cgc',
'cgg',
'cgk',
'chb',
'chc',
'chd',
'chf',
'chg',
'chh',
'chj',
'chk',
'chl',
'chm',
'chn',
'cho',
'chp',
'chq',
'chr',
'cht',
'chw',
'chx',
'chy',
'chz',
'cia',
'cib',
'cic',
'cid',
'cie',
'cih',
'cik',
'cim',
'cin',
'cip',
'cir',
'ciw',
'ciy',
'cja',
'cje',
'cjh',
'cji',
'cjk',
'cjm',
'cjn',
'cjo',
'cjp',
'cjr',
'cjs',
'cjv',
'cjy',
'cka',
'ckb',
'ckh',
'ckl',
'ckn',
'cko',
'ckq',
'ckr',
'cks',
'ckt',
'cku',
'ckv',
'ckx',
'cky',
'ckz',
'cla',
'clc',
'cld',
'cle',
'clh',
'cli',
'clj',
'clk',
'cll',
'clm',
'clo',
'clt',
'clu',
'clw',
'cly',
'cma',
'cmc',
'cme',
'cmg',
'cmi',
'cmk',
'cml',
'cmm',
'cmn',
'cmo',
'cmr',
'cms',
'cmt',
'cna',
'cnb',
'cnc',
'cng',
'cnh',
'cni',
'cnk',
'cnl',
'cno',
'cnr',
'cns',
'cnt',
'cnu',
'cnw',
'cnx',
'coa',
'cob',
'coc',
'cod',
'coe',
'cof',
'cog',
'coh',
'coj',
'cok',
'col',
'com',
'con',
'coo',
'cop',
'coq',
'cot',
'cou',
'cov',
'cow',
'cox',
'coy',
'coz',
'cpa',
'cpb',
'cpc',
'cpe',
'cpf',
'cpg',
'cpi',
'cpn',
'cpo',
'cpp',
'cps',
'cpu',
'cpx',
'cpy',
'cqd',
'cqu',
'cra',
'crb',
'crc',
'crd',
'crf',
'crg',
'crh',
'cri',
'crj',
'crk',
'crl',
'crm',
'crn',
'cro',
'crp',
'crq',
'crr',
'crs',
'crt',
'crv',
'crw',
'crx',
'cry',
'crz',
'csa',
'csb',
'csc',
'csd',
'cse',
'csf',
'csg',
'csh',
'csi',
'csj',
'csk',
'csl',
'csm',
'csn',
'cso',
'csq',
'csr',
'css',
'cst',
'csu',
'csv',
'csw',
'csy',
'csz',
'cta',
'ctc',
'ctd',
'cte',
'ctg',
'cth',
'ctl',
'ctm',
'ctn',
'cto',
'ctp',
'cts',
'ctt',
'ctu',
'ctz',
'cua',
'cub',
'cuc',
'cug',
'cuh',
'cui',
'cuj',
'cuk',
'cul',
'cum',
'cuo',
'cup',
'cuq',
'cur',
'cus',
'cut',
'cuu',
'cuv',
'cuw',
'cux',
'cuy',
'cvg',
'cvn',
'cwa',
'cwb',
'cwd',
'cwe',
'cwg',
'cwt',
'cya',
'cyb',
'cyo',
'czh',
'czk',
'czn',
'czo',
'czt',
'daa',
'dac',
'dad',
'dae',
'daf',
'dag',
'dah',
'dai',
'daj',
'dak',
'dal',
'dam',
'dao',
'dap',
'daq',
'dar',
'das',
'dau',
'dav',
'daw',
'dax',
'day',
'daz',
'dba',
'dbb',
'dbd',
'dbe',
'dbf',
'dbg',
'dbi',
'dbj',
'dbl',
'dbm',
'dbn',
'dbo',
'dbp',
'dbq',
'dbr',
'dbt',
'dbu',
'dbv',
'dbw',
'dby',
'dcc',
'dcr',
'dda',
'ddd',
'dde',
'ddg',
'ddi',
'ddj',
'ddn',
'ddo',
'ddr',
'dds',
'ddw',
'dec',
'ded',
'dee',
'def',
'deg',
'deh',
'dei',
'dek',
'del',
'dem',
'den',
'dep',
'deq',
'der',
'des',
'dev',
'dez',
'dga',
'dgb',
'dgc',
'dgd',
'dge',
'dgg',
'dgh',
'dgi',
'dgk',
'dgl',
'dgn',
'dgo',
'dgr',
'dgs',
'dgt',
'dgu',
'dgw',
'dgx',
'dgz',
'dha',
'dhd',
'dhg',
'dhi',
'dhl',
'dhm',
'dhn',
'dho',
'dhr',
'dhs',
'dhu',
'dhv',
'dhw',
'dhx',
'dia',
'dib',
'dic',
'did',
'dif',
'dig',
'dih',
'dii',
'dij',
'dik',
'dil',
'dim',
'din',
'dio',
'dip',
'diq',
'dir',
'dis',
'dit',
'diu',
'diw',
'dix',
'diy',
'diz',
'dja',
'djb',
'djc',
'djd',
'dje',
'djf',
'dji',
'djj',
'djk',
'djl',
'djm',
'djn',
'djo',
'djr',
'dju',
'djw',
'dka',
'dkk',
'dkl',
'dkr',
'dks',
'dkx',
'dlg',
'dlk',
'dlm',
'dln',
'dma',
'dmb',
'dmc',
'dmd',
'dme',
'dmg',
'dmk',
'dml',
'dmm',
'dmn',
'dmo',
'dmr',
'dms',
'dmu',
'dmv',
'dmw',
'dmx',
'dmy',
'dna',
'dnd',
'dne',
'dng',
'dni',
'dnj',
'dnk',
'dnn',
'dnr',
'dnt',
'dnu',
'dnv',
'dnw',
'dny',
'doa',
'dob',
'doc',
'doe',
'dof',
'doh',
'doi',
'dok',
'dol',
'don',
'doo',
'dop',
'doq',
'dor',
'dos',
'dot',
'dov',
'dow',
'dox',
'doy',
'doz',
'dpp',
'dra',
'drb',
'drc',
'drd',
'dre',
'drg',
'drh',
'dri',
'drl',
'drn',
'dro',
'drq',
'drr',
'drs',
'drt',
'dru',
'drw',
'dry',
'dsb',
'dse',
'dsh',
'dsi',
'dsl',
'dsn',
'dso',
'dsq',
'dta',
'dtb',
'dtd',
'dth',
'dti',
'dtk',
'dtm',
'dtn',
'dto',
'dtp',
'dtr',
'dts',
'dtt',
'dtu',
'dty',
'dua',
'dub',
'duc',
'dud',
'due',
'duf',
'dug',
'duh',
'dui',
'duj',
'duk',
'dul',
'dum',
'dun',
'duo',
'dup',
'duq',
'dur',
'dus',
'duu',
'duv',
'duw',
'dux',
'duy',
'duz',
'dva',
'dwa',
'dwl',
'dwr',
'dws',
'dwu',
'dww',
'dwy',
'dya',
'dyb',
'dyd',
'dyg',
'dyi',
'dym',
'dyn',
'dyo',
'dyu',
'dyy',
'dza',
'dzd',
'dze',
'dzg',
'dzl',
'dzn',
'eaa',
'ebg',
'ebk',
'ebo',
'ebr',
'ebu',
'ecr',
'ecs',
'ecy',
'eee',
'efa',
'efe',
'efi',
'ega',
'egl',
'ego',
'egx',
'egy',
'ehu',
'eip',
'eit',
'eiv',
'eja',
'eka',
'ekc',
'eke',
'ekg',
'eki',
'ekk',
'ekl',
'ekm',
'eko',
'ekp',
'ekr',
'eky',
'ele',
'elh',
'eli',
'elk',
'elm',
'elo',
'elp',
'elu',
'elx',
'ema',
'emb',
'eme',
'emg',
'emi',
'emk',
'emm',
'emn',
'emo',
'emp',
'ems',
'emu',
'emw',
'emx',
'emy',
'ena',
'enb',
'enc',
'end',
'enf',
'enh',
'enl',
'enm',
'enn',
'eno',
'enq',
'enr',
'enu',
'env',
'enw',
'enx',
'eot',
'epi',
'era',
'erg',
'erh',
'eri',
'erk',
'ero',
'err',
'ers',
'ert',
'erw',
'ese',
'esg',
'esh',
'esi',
'esk',
'esl',
'esm',
'esn',
'eso',
'esq',
'ess',
'esu',
'esx',
'esy',
'etb',
'etc',
'eth',
'etn',
'eto',
'etr',
'ets',
'ett',
'etu',
'etx',
'etz',
'euq',
'eve',
'evh',
'evn',
'ewo',
'ext',
'eya',
'eyo',
'eza',
'eze',
'faa',
'fab',
'fad',
'faf',
'fag',
'fah',
'fai',
'faj',
'fak',
'fal',
'fam',
'fan',
'fap',
'far',
'fat',
'fau',
'fax',
'fay',
'faz',
'fbl',
'fcs',
'fer',
'ffi',
'ffm',
'fgr',
'fia',
'fie',
'fil',
'fip',
'fir',
'fit',
'fiu',
'fiw',
'fkk',
'fkv',
'fla',
'flh',
'fli',
'fll',
'fln',
'flr',
'fly',
'fmp',
'fmu',
'fnb',
'fng',
'fni',
'fod',
'foi',
'fom',
'fon',
'for',
'fos',
'fox',
'fpe',
'fqs',
'frc',
'frd',
'frk',
'frm',
'fro',
'frp',
'frq',
'frr',
'frs',
'frt',
'fse',
'fsl',
'fss',
'fub',
'fuc',
'fud',
'fue',
'fuf',
'fuh',
'fui',
'fuj',
'fum',
'fun',
'fuq',
'fur',
'fut',
'fuu',
'fuv',
'fuy',
'fvr',
'fwa',
'fwe',
'gaa',
'gab',
'gac',
'gad',
'gae',
'gaf',
'gag',
'gah',
'gai',
'gaj',
'gak',
'gal',
'gam',
'gan',
'gao',
'gap',
'gaq',
'gar',
'gas',
'gat',
'gau',
'gav',
'gaw',
'gax',
'gay',
'gaz',
'gba',
'gbb',
'gbc',
'gbd',
'gbe',
'gbf',
'gbg',
'gbh',
'gbi',
'gbj',
'gbk',
'gbl',
'gbm',
'gbn',
'gbo',
'gbp',
'gbq',
'gbr',
'gbs',
'gbu',
'gbv',
'gbw',
'gbx',
'gby',
'gbz',
'gcc',
'gcd',
'gce',
'gcf',
'gcl',
'gcn',
'gcr',
'gct',
'gda',
'gdb',
'gdc',
'gdd',
'gde',
'gdf',
'gdg',
'gdh',
'gdi',
'gdj',
'gdk',
'gdl',
'gdm',
'gdn',
'gdo',
'gdq',
'gdr',
'gds',
'gdt',
'gdu',
'gdx',
'gea',
'geb',
'gec',
'ged',
'geg',
'geh',
'gei',
'gej',
'gek',
'gel',
'gem',
'geq',
'ges',
'gev',
'gew',
'gex',
'gey',
'gez',
'gfk',
'gft',
'gfx',
'gga',
'ggb',
'ggd',
'gge',
'ggg',
'ggk',
'ggl',
'ggn',
'ggo',
'ggr',
'ggt',
'ggu',
'ggw',
'gha',
'ghc',
'ghe',
'ghh',
'ghk',
'ghl',
'ghn',
'gho',
'ghr',
'ghs',
'ght',
'gia',
'gib',
'gic',
'gid',
'gie',
'gig',
'gih',
'gil',
'gim',
'gin',
'gio',
'gip',
'giq',
'gir',
'gis',
'git',
'giu',
'giw',
'gix',
'giy',
'giz',
'gji',
'gjk',
'gjm',
'gjn',
'gjr',
'gju',
'gka',
'gkd',
'gke',
'gkn',
'gko',
'gkp',
'gku',
'glc',
'gld',
'glh',
'gli',
'glj',
'glk',
'gll',
'glo',
'glr',
'glu',
'glw',
'gly',
'gma',
'gmb',
'gmd',
'gme',
'gmg',
'gmh',
'gml',
'gmm',
'gmn',
'gmq',
'gmu',
'gmv',
'gmw',
'gmx',
'gmy',
'gmz',
'gna',
'gnb',
'gnc',
'gnd',
'gne',
'gng',
'gnh',
'gni',
'gnj',
'gnk',
'gnl',
'gnm',
'gnn',
'gno',
'gnq',
'gnr',
'gnt',
'gnu',
'gnw',
'gnz',
'goa',
'gob',
'goc',
'god',
'goe',
'gof',
'gog',
'goh',
'goi',
'goj',
'gok',
'gol',
'gom',
'gon',
'goo',
'gop',
'goq',
'gor',
'gos',
'got',
'gou',
'gow',
'gox',
'goy',
'goz',
'gpa',
'gpe',
'gpn',
'gqa',
'gqi',
'gqn',
'gqr',
'gqu',
'gra',
'grb',
'grc',
'grd',
'grg',
'grh',
'gri',
'grj',
'grk',
'grm',
'gro',
'grq',
'grr',
'grs',
'grt',
'gru',
'grv',
'grw',
'grx',
'gry',
'grz',
'gse',
'gsg',
'gsl',
'gsm',
'gsn',
'gso',
'gsp',
'gss',
'gsw',
'gta',
'gti',
'gtu',
'gua',
'gub',
'guc',
'gud',
'gue',
'guf',
'gug',
'guh',
'gui',
'guk',
'gul',
'gum',
'gun',
'guo',
'gup',
'guq',
'gur',
'gus',
'gut',
'guu',
'guv',
'guw',
'gux',
'guz',
'gva',
'gvc',
'gve',
'gvf',
'gvj',
'gvl',
'gvm',
'gvn',
'gvo',
'gvp',
'gvr',
'gvs',
'gvy',
'gwa',
'gwb',
'gwc',
'gwd',
'gwe',
'gwf',
'gwg',
'gwi',
'gwj',
'gwm',
'gwn',
'gwr',
'gwt',
'gwu',
'gww',
'gwx',
'gxx',
'gya',
'gyb',
'gyd',
'gye',
'gyf',
'gyg',
'gyi',
'gyl',
'gym',
'gyn',
'gyo',
'gyr',
'gyy',
'gza',
'gzi',
'gzn',
'haa',
'hab',
'hac',
'had',
'hae',
'haf',
'hag',
'hah',
'hai',
'haj',
'hak',
'hal',
'ham',
'han',
'hao',
'hap',
'haq',
'har',
'has',
'hav',
'haw',
'hax',
'hay',
'haz',
'hba',
'hbb',
'hbn',
'hbo',
'hbu',
'hca',
'hch',
'hdn',
'hds',
'hdy',
'hea',
'hed',
'heg',
'heh',
'hei',
'hem',
'hgm',
'hgw',
'hhi',
'hhr',
'hhy',
'hia',
'hib',
'hid',
'hif',
'hig',
'hih',
'hii',
'hij',
'hik',
'hil',
'him',
'hio',
'hir',
'hit',
'hiw',
'hix',
'hji',
'hka',
'hke',
'hkk',
'hkn',
'hks',
'hla',
'hlb',
'hld',
'hle',
'hlt',
'hlu',
'hma',
'hmb',
'hmc',
'hmd',
'hme',
'hmf',
'hmg',
'hmh',
'hmi',
'hmj',
'hmk',
'hml',
'hmm',
'hmn',
'hmp',
'hmq',
'hmr',
'hms',
'hmt',
'hmu',
'hmv',
'hmw',
'hmx',
'hmy',
'hmz',
'hna',
'hnd',
'hne',
'hnh',
'hni',
'hnj',
'hnn',
'hno',
'hns',
'hnu',
'hoa',
'hob',
'hoc',
'hod',
'hoe',
'hoh',
'hoi',
'hoj',
'hok',
'hol',
'hom',
'hoo',
'hop',
'hor',
'hos',
'hot',
'hov',
'how',
'hoy',
'hoz',
'hpo',
'hps',
'hra',
'hrc',
'hre',
'hrk',
'hrm',
'hro',
'hrp',
'hrr',
'hrt',
'hru',
'hrw',
'hrx',
'hrz',
'hsb',
'hsh',
'hsl',
'hsn',
'hss',
'hti',
'hto',
'hts',
'htu',
'htx',
'hub',
'huc',
'hud',
'hue',
'huf',
'hug',
'huh',
'hui',
'huj',
'huk',
'hul',
'hum',
'huo',
'hup',
'huq',
'hur',
'hus',
'hut',
'huu',
'huv',
'huw',
'hux',
'huy',
'huz',
'hvc',
'hve',
'hvk',
'hvn',
'hvv',
'hwa',
'hwc',
'hwo',
'hya',
'hyw',
'hyx',
'iai',
'ian',
'iap',
'iar',
'iba',
'ibb',
'ibd',
'ibe',
'ibg',
'ibh',
'ibi',
'ibl',
'ibm',
'ibn',
'ibr',
'ibu',
'iby',
'ica',
'ich',
'icl',
'icr',
'ida',
'idb',
'idc',
'idd',
'ide',
'idi',
'idr',
'ids',
'idt',
'idu',
'ifa',
'ifb',
'ife',
'iff',
'ifk',
'ifm',
'ifu',
'ify',
'igb',
'ige',
'igg',
'igl',
'igm',
'ign',
'igo',
'igs',
'igw',
'ihb',
'ihi',
'ihp',
'ihw',
'iin',
'iir',
'ijc',
'ije',
'ijj',
'ijn',
'ijo',
'ijs',
'ike',
'iki',
'ikk',
'ikl',
'iko',
'ikp',
'ikr',
'iks',
'ikt',
'ikv',
'ikw',
'ikx',
'ikz',
'ila',
'ilb',
'ilg',
'ili',
'ilk',
'ill',
'ilm',
'ilo',
'ilp',
'ils',
'ilu',
'ilv',
'ilw',
'ima',
'ime',
'imi',
'iml',
'imn',
'imo',
'imr',
'ims',
'imy',
'inb',
'inc',
'ine',
'ing',
'inh',
'inj',
'inl',
'inm',
'inn',
'ino',
'inp',
'ins',
'int',
'inz',
'ior',
'iou',
'iow',
'ipi',
'ipo',
'iqu',
'iqw',
'ira',
'ire',
'irh',
'iri',
'irk',
'irn',
'iro',
'irr',
'iru',
'irx',
'iry',
'isa',
'isc',
'isd',
'ise',
'isg',
'ish',
'isi',
'isk',
'ism',
'isn',
'iso',
'isr',
'ist',
'isu',
'itb',
'itc',
'itd',
'ite',
'iti',
'itk',
'itl',
'itm',
'ito',
'itr',
'its',
'itt',
'itv',
'itw',
'itx',
'ity',
'itz',
'ium',
'ivb',
'ivv',
'iwk',
'iwm',
'iwo',
'iws',
'ixc',
'ixl',
'iya',
'iyo',
'iyx',
'izh',
'izi',
'izr',
'izz',
'jaa',
'jab',
'jac',
'jad',
'jae',
'jaf',
'jah',
'jaj',
'jak',
'jal',
'jam',
'jan',
'jao',
'jaq',
'jar',
'jas',
'jat',
'jau',
'jax',
'jay',
'jaz',
'jbe',
'jbi',
'jbj',
'jbk',
'jbn',
'jbo',
'jbr',
'jbt',
'jbu',
'jbw',
'jcs',
'jct',
'jda',
'jdg',
'jdt',
'jeb',
'jee',
'jeg',
'jeh',
'jei',
'jek',
'jel',
'jen',
'jer',
'jet',
'jeu',
'jgb',
'jge',
'jgk',
'jgo',
'jhi',
'jhs',
'jia',
'jib',
'jic',
'jid',
'jie',
'jig',
'jih',
'jii',
'jil',
'jim',
'jio',
'jiq',
'jit',
'jiu',
'jiv',
'jiy',
'jje',
'jjr',
'jka',
'jkm',
'jko',
'jkp',
'jkr',
'jku',
'jle',
'jls',
'jma',
'jmb',
'jmc',
'jmd',
'jmi',
'jml',
'jmn',
'jmr',
'jms',
'jmw',
'jmx',
'jna',
'jnd',
'jng',
'jni',
'jnj',
'jnl',
'jns',
'job',
'jod',
'jog',
'jor',
'jos',
'jow',
'jpa',
'jpr',
'jpx',
'jqr',
'jra',
'jrb',
'jrr',
'jrt',
'jru',
'jsl',
'jua',
'jub',
'juc',
'jud',
'juh',
'jui',
'juk',
'jul',
'jum',
'jun',
'juo',
'jup',
'jur',
'jus',
'jut',
'juu',
'juw',
'juy',
'jvd',
'jvn',
'jwi',
'jya',
'jye',
'jyy',
'kaa',
'kab',
'kac',
'kad',
'kae',
'kaf',
'kag',
'kah',
'kai',
'kaj',
'kak',
'kam',
'kao',
'kap',
'kaq',
'kar',
'kav',
'kaw',
'kax',
'kay',
'kba',
'kbb',
'kbc',
'kbd',
'kbe',
'kbf',
'kbg',
'kbh',
'kbi',
'kbj',
'kbk',
'kbl',
'kbm',
'kbn',
'kbo',
'kbp',
'kbq',
'kbr',
'kbs',
'kbt',
'kbu',
'kbv',
'kbw',
'kbx',
'kby',
'kbz',
'kca',
'kcb',
'kcc',
'kcd',
'kce',
'kcf',
'kcg',
'kch',
'kci',
'kcj',
'kck',
'kcl',
'kcm',
'kcn',
'kco',
'kcp',
'kcq',
'kcr',
'kcs',
'kct',
'kcu',
'kcv',
'kcw',
'kcx',
'kcy',
'kcz',
'kda',
'kdc',
'kdd',
'kde',
'kdf',
'kdg',
'kdh',
'kdi',
'kdj',
'kdk',
'kdl',
'kdm',
'kdn',
'kdo',
'kdp',
'kdq',
'kdr',
'kdt',
'kdu',
'kdv',
'kdw',
'kdx',
'kdy',
'kdz',
'kea',
'keb',
'kec',
'ked',
'kee',
'kef',
'keg',
'keh',
'kei',
'kej',
'kek',
'kel',
'kem',
'ken',
'keo',
'kep',
'keq',
'ker',
'kes',
'ket',
'keu',
'kev',
'kew',
'kex',
'key',
'kez',
'kfa',
'kfb',
'kfc',
'kfd',
'kfe',
'kff',
'kfg',
'kfh',
'kfi',
'kfj',
'kfk',
'kfl',
'kfm',
'kfn',
'kfo',
'kfp',
'kfq',
'kfr',
'kfs',
'kft',
'kfu',
'kfv',
'kfw',
'kfx',
'kfy',
'kfz',
'kga',
'kgb',
'kgc',
'kgd',
'kge',
'kgf',
'kgg',
'kgh',
'kgi',
'kgj',
'kgk',
'kgl',
'kgm',
'kgn',
'kgo',
'kgp',
'kgq',
'kgr',
'kgs',
'kgt',
'kgu',
'kgv',
'kgw',
'kgx',
'kgy',
'kha',
'khb',
'khc',
'khd',
'khe',
'khf',
'khg',
'khh',
'khi',
'khj',
'khk',
'khl',
'khn',
'kho',
'khp',
'khq',
'khr',
'khs',
'kht',
'khu',
'khv',
'khw',
'khx',
'khy',
'khz',
'kia',
'kib',
'kic',
'kid',
'kie',
'kif',
'kig',
'kih',
'kii',
'kij',
'kil',
'kim',
'kio',
'kip',
'kiq',
'kis',
'kit',
'kiu',
'kiv',
'kiw',
'kix',
'kiy',
'kiz',
'kja',
'kjb',
'kjc',
'kjd',
'kje',
'kjf',
'kjg',
'kjh',
'kji',
'kjj',
'kjk',
'kjl',
'kjm',
'kjn',
'kjo',
'kjp',
'kjq',
'kjr',
'kjs',
'kjt',
'kju',
'kjv',
'kjx',
'kjy',
'kjz',
'kka',
'kkb',
'kkc',
'kkd',
'kke',
'kkf',
'kkg',
'kkh',
'kki',
'kkj',
'kkk',
'kkl',
'kkm',
'kkn',
'kko',
'kkp',
'kkq',
'kkr',
'kks',
'kkt',
'kku',
'kkv',
'kkw',
'kkx',
'kky',
'kkz',
'kla',
'klb',
'klc',
'kld',
'kle',
'klf',
'klg',
'klh',
'kli',
'klj',
'klk',
'kll',
'klm',
'kln',
'klo',
'klp',
'klq',
'klr',
'kls',
'klt',
'klu',
'klv',
'klw',
'klx',
'kly',
'klz',
'kma',
'kmb',
'kmc',
'kmd',
'kme',
'kmf',
'kmg',
'kmh',
'kmi',
'kmj',
'kmk',
'kml',
'kmm',
'kmn',
'kmo',
'kmp',
'kmq',
'kmr',
'kms',
'kmt',
'kmu',
'kmv',
'kmw',
'kmx',
'kmy',
'kmz',
'kna',
'knb',
'knc',
'knd',
'kne',
'knf',
'kng',
'kni',
'knj',
'knk',
'knl',
'knm',
'knn',
'kno',
'knp',
'knq',
'knr',
'kns',
'knt',
'knu',
'knv',
'knw',
'knx',
'kny',
'knz',
'koa',
'koc',
'kod',
'koe',
'kof',
'kog',
'koh',
'koi',
'koj',
'kok',
'kol',
'koo',
'kop',
'koq',
'kos',
'kot',
'kou',
'kov',
'kow',
'kox',
'koy',
'koz',
'kpa',
'kpb',
'kpc',
'kpd',
'kpe',
'kpf',
'kpg',
'kph',
'kpi',
'kpj',
'kpk',
'kpl',
'kpm',
'kpn',
'kpo',
'kpp',
'kpq',
'kpr',
'kps',
'kpt',
'kpu',
'kpv',
'kpw',
'kpx',
'kpy',
'kpz',
'kqa',
'kqb',
'kqc',
'kqd',
'kqe',
'kqf',
'kqg',
'kqh',
'kqi',
'kqj',
'kqk',
'kql',
'kqm',
'kqn',
'kqo',
'kqp',
'kqq',
'kqr',
'kqs',
'kqt',
'kqu',
'kqv',
'kqw',
'kqx',
'kqy',
'kqz',
'kra',
'krb',
'krc',
'krd',
'kre',
'krf',
'krh',
'kri',
'krj',
'krk',
'krl',
'krm',
'krn',
'kro',
'krp',
'krr',
'krs',
'krt',
'kru',
'krv',
'krw',
'krx',
'kry',
'krz',
'ksa',
'ksb',
'ksc',
'ksd',
'kse',
'ksf',
'ksg',
'ksh',
'ksi',
'ksj',
'ksk',
'ksl',
'ksm',
'ksn',
'kso',
'ksp',
'ksq',
'ksr',
'kss',
'kst',
'ksu',
'ksv',
'ksw',
'ksx',
'ksy',
'ksz',
'kta',
'ktb',
'ktc',
'ktd',
'kte',
'ktf',
'ktg',
'kth',
'kti',
'ktj',
'ktk',
'ktl',
'ktm',
'ktn',
'kto',
'ktp',
'ktq',
'ktr',
'kts',
'ktt',
'ktu',
'ktv',
'ktw',
'ktx',
'kty',
'ktz',
'kub',
'kuc',
'kud',
'kue',
'kuf',
'kug',
'kuh',
'kui',
'kuj',
'kuk',
'kul',
'kum',
'kun',
'kuo',
'kup',
'kuq',
'kus',
'kut',
'kuu',
'kuv',
'kuw',
'kux',
'kuy',
'kuz',
'kva',
'kvb',
'kvc',
'kvd',
'kve',
'kvf',
'kvg',
'kvh',
'kvi',
'kvj',
'kvk',
'kvl',
'kvm',
'kvn',
'kvo',
'kvp',
'kvq',
'kvr',
'kvs',
'kvt',
'kvu',
'kvv',
'kvw',
'kvx',
'kvy',
'kvz',
'kwa',
'kwb',
'kwc',
'kwd',
'kwe',
'kwf',
'kwg',
'kwh',
'kwi',
'kwj',
'kwk',
'kwl',
'kwm',
'kwn',
'kwo',
'kwp',
'kwq',
'kwr',
'kws',
'kwt',
'kwu',
'kwv',
'kww',
'kwx',
'kwy',
'kwz',
'kxa',
'kxb',
'kxc',
'kxd',
'kxe',
'kxf',
'kxh',
'kxi',
'kxj',
'kxk',
'kxl',
'kxm',
'kxn',
'kxo',
'kxp',
'kxq',
'kxr',
'kxs',
'kxt',
'kxu',
'kxv',
'kxw',
'kxx',
'kxy',
'kxz',
'kya',
'kyb',
'kyc',
'kyd',
'kye',
'kyf',
'kyg',
'kyh',
'kyi',
'kyj',
'kyk',
'kyl',
'kym',
'kyn',
'kyo',
'kyp',
'kyq',
'kyr',
'kys',
'kyt',
'kyu',
'kyv',
'kyw',
'kyx',
'kyy',
'kyz',
'kza',
'kzb',
'kzc',
'kzd',
'kze',
'kzf',
'kzg',
'kzh',
'kzi',
'kzj',
'kzk',
'kzl',
'kzm',
'kzn',
'kzo',
'kzp',
'kzq',
'kzr',
'kzs',
'kzt',
'kzu',
'kzv',
'kzw',
'kzx',
'kzy',
'kzz',
'laa',
'lab',
'lac',
'lad',
'lae',
'laf',
'lag',
'lah',
'lai',
'laj',
'lak',
'lal',
'lam',
'lan',
'lap',
'laq',
'lar',
'las',
'lau',
'law',
'lax',
'lay',
'laz',
'lba',
'lbb',
'lbc',
'lbe',
'lbf',
'lbg',
'lbi',
'lbj',
'lbk',
'lbl',
'lbm',
'lbn',
'lbo',
'lbq',
'lbr',
'lbs',
'lbt',
'lbu',
'lbv',
'lbw',
'lbx',
'lby',
'lbz',
'lcc',
'lcd',
'lce',
'lcf',
'lch',
'lcl',
'lcm',
'lcp',
'lcq',
'lcs',
'lda',
'ldb',
'ldd',
'ldg',
'ldh',
'ldi',
'ldj',
'ldk',
'ldl',
'ldm',
'ldn',
'ldo',
'ldp',
'ldq',
'lea',
'leb',
'lec',
'led',
'lee',
'lef',
'leg',
'leh',
'lei',
'lej',
'lek',
'lel',
'lem',
'len',
'leo',
'lep',
'leq',
'ler',
'les',
'let',
'leu',
'lev',
'lew',
'lex',
'ley',
'lez',
'lfa',
'lfn',
'lga',
'lgb',
'lgg',
'lgh',
'lgi',
'lgk',
'lgl',
'lgm',
'lgn',
'lgq',
'lgr',
'lgt',
'lgu',
'lgz',
'lha',
'lhh',
'lhi',
'lhl',
'lhm',
'lhn',
'lhp',
'lhs',
'lht',
'lhu',
'lia',
'lib',
'lic',
'lid',
'lie',
'lif',
'lig',
'lih',
'lii',
'lij',
'lik',
'lil',
'lio',
'lip',
'liq',
'lir',
'lis',
'liu',
'liv',
'liw',
'lix',
'liy',
'liz',
'lja',
'lje',
'lji',
'ljl',
'ljp',
'ljw',
'ljx',
'lka',
'lkb',
'lkc',
'lkd',
'lke',
'lkh',
'lki',
'lkj',
'lkl',
'lkm',
'lkn',
'lko',
'lkr',
'lks',
'lkt',
'lku',
'lky',
'lla',
'llb',
'llc',
'lld',
'lle',
'llf',
'llg',
'llh',
'lli',
'llj',
'llk',
'lll',
'llm',
'lln',
'llo',
'llp',
'llq',
'lls',
'llu',
'llx',
'lma',
'lmb',
'lmc',
'lmd',
'lme',
'lmf',
'lmg',
'lmh',
'lmi',
'lmj',
'lmk',
'lml',
'lmm',
'lmn',
'lmo',
'lmp',
'lmq',
'lmr',
'lmu',
'lmv',
'lmw',
'lmx',
'lmy',
'lmz',
'lna',
'lnb',
'lnd',
'lng',
'lnh',
'lni',
'lnj',
'lnl',
'lnm',
'lnn',
'lno',
'lns',
'lnu',
'lnw',
'lnz',
'loa',
'lob',
'loc',
'loe',
'lof',
'log',
'loh',
'loi',
'loj',
'lok',
'lol',
'lom',
'lon',
'loo',
'lop',
'loq',
'lor',
'los',
'lot',
'lou',
'lov',
'low',
'lox',
'loy',
'loz',
'lpa',
'lpe',
'lpn',
'lpo',
'lpx',
'lra',
'lrc',
'lre',
'lrg',
'lri',
'lrk',
'lrl',
'lrm',
'lrn',
'lro',
'lrr',
'lrt',
'lrv',
'lrz',
'lsa',
'lsd',
'lse',
'lsg',
'lsh',
'lsi',
'lsl',
'lsm',
'lso',
'lsp',
'lsr',
'lss',
'lst',
'lsy',
'ltc',
'ltg',
'lth',
'lti',
'ltn',
'lto',
'lts',
'ltu',
'lua',
'luc',
'lud',
'lue',
'luf',
'lui',
'luj',
'luk',
'lul',
'lum',
'lun',
'luo',
'lup',
'luq',
'lur',
'lus',
'lut',
'luu',
'luv',
'luw',
'luy',
'luz',
'lva',
'lvk',
'lvs',
'lvu',
'lwa',
'lwe',
'lwg',
'lwh',
'lwl',
'lwm',
'lwo',
'lws',
'lwt',
'lwu',
'lww',
'lya',
'lyg',
'lyn',
'lzh',
'lzl',
'lzn',
'lzz',
'maa',
'mab',
'mad',
'mae',
'maf',
'mag',
'mai',
'maj',
'mak',
'mam',
'man',
'map',
'maq',
'mas',
'mat',
'mau',
'mav',
'maw',
'max',
'maz',
'mba',
'mbb',
'mbc',
'mbd',
'mbe',
'mbf',
'mbh',
'mbi',
'mbj',
'mbk',
'mbl',
'mbm',
'mbn',
'mbo',
'mbp',
'mbq',
'mbr',
'mbs',
'mbt',
'mbu',
'mbv',
'mbw',
'mbx',
'mby',
'mbz',
'mca',
'mcb',
'mcc',
'mcd',
'mce',
'mcf',
'mcg',
'mch',
'mci',
'mcj',
'mck',
'mcl',
'mcm',
'mcn',
'mco',
'mcp',
'mcq',
'mcr',
'mcs',
'mct',
'mcu',
'mcv',
'mcw',
'mcx',
'mcy',
'mcz',
'mda',
'mdb',
'mdc',
'mdd',
'mde',
'mdf',
'mdg',
'mdh',
'mdi',
'mdj',
'mdk',
'mdl',
'mdm',
'mdn',
'mdp',
'mdq',
'mdr',
'mds',
'mdt',
'mdu',
'mdv',
'mdw',
'mdx',
'mdy',
'mdz',
'mea',
'meb',
'mec',
'med',
'mee',
'mef',
'meg',
'meh',
'mei',
'mej',
'mek',
'mel',
'mem',
'men',
'meo',
'mep',
'meq',
'mer',
'mes',
'met',
'meu',
'mev',
'mew',
'mey',
'mez',
'mfa',
'mfb',
'mfc',
'mfd',
'mfe',
'mff',
'mfg',
'mfh',
'mfi',
'mfj',
'mfk',
'mfl',
'mfm',
'mfn',
'mfo',
'mfp',
'mfq',
'mfr',
'mfs',
'mft',
'mfu',
'mfv',
'mfw',
'mfx',
'mfy',
'mfz',
'mga',
'mgb',
'mgc',
'mgd',
'mge',
'mgf',
'mgg',
'mgh',
'mgi',
'mgj',
'mgk',
'mgl',
'mgm',
'mgn',
'mgo',
'mgp',
'mgq',
'mgr',
'mgs',
'mgt',
'mgu',
'mgv',
'mgw',
'mgx',
'mgy',
'mgz',
'mha',
'mhb',
'mhc',
'mhd',
'mhe',
'mhf',
'mhg',
'mhh',
'mhi',
'mhj',
'mhk',
'mhl',
'mhm',
'mhn',
'mho',
'mhp',
'mhq',
'mhr',
'mhs',
'mht',
'mhu',
'mhw',
'mhx',
'mhy',
'mhz',
'mia',
'mib',
'mic',
'mid',
'mie',
'mif',
'mig',
'mih',
'mii',
'mij',
'mik',
'mil',
'mim',
'min',
'mio',
'mip',
'miq',
'mir',
'mis',
'mit',
'miu',
'miw',
'mix',
'miy',
'miz',
'mja',
'mjb',
'mjc',
'mjd',
'mje',
'mjg',
'mjh',
'mji',
'mjj',
'mjk',
'mjl',
'mjm',
'mjn',
'mjo',
'mjp',
'mjq',
'mjr',
'mjs',
'mjt',
'mju',
'mjv',
'mjw',
'mjx',
'mjy',
'mjz',
'mka',
'mkb',
'mkc',
'mke',
'mkf',
'mkg',
'mkh',
'mki',
'mkj',
'mkk',
'mkl',
'mkm',
'mkn',
'mko',
'mkp',
'mkq',
'mkr',
'mks',
'mkt',
'mku',
'mkv',
'mkw',
'mkx',
'mky',
'mkz',
'mla',
'mlb',
'mlc',
'mld',
'mle',
'mlf',
'mlh',
'mli',
'mlj',
'mlk',
'mll',
'mlm',
'mln',
'mlo',
'mlp',
'mlq',
'mlr',
'mls',
'mlu',
'mlv',
'mlw',
'mlx',
'mlz',
'mma',
'mmb',
'mmc',
'mmd',
'mme',
'mmf',
'mmg',
'mmh',
'mmi',
'mmj',
'mmk',
'mml',
'mmm',
'mmn',
'mmo',
'mmp',
'mmq',
'mmr',
'mmt',
'mmu',
'mmv',
'mmw',
'mmx',
'mmy',
'mmz',
'mna',
'mnb',
'mnc',
'mnd',
'mne',
'mnf',
'mng',
'mnh',
'mni',
'mnj',
'mnk',
'mnl',
'mnm',
'mnn',
'mno',
'mnp',
'mnq',
'mnr',
'mns',
'mnt',
'mnu',
'mnv',
'mnw',
'mnx',
'mny',
'mnz',
'moa',
'moc',
'mod',
'moe',
'mof',
'mog',
'moh',
'moi',
'moj',
'mok',
'mom',
'moo',
'mop',
'moq',
'mor',
'mos',
'mot',
'mou',
'mov',
'mow',
'mox',
'moy',
'moz',
'mpa',
'mpb',
'mpc',
'mpd',
'mpe',
'mpg',
'mph',
'mpi',
'mpj',
'mpk',
'mpl',
'mpm',
'mpn',
'mpo',
'mpp',
'mpq',
'mpr',
'mps',
'mpt',
'mpu',
'mpv',
'mpw',
'mpx',
'mpy',
'mpz',
'mqa',
'mqb',
'mqc',
'mqe',
'mqf',
'mqg',
'mqh',
'mqi',
'mqj',
'mqk',
'mql',
'mqm',
'mqn',
'mqo',
'mqp',
'mqq',
'mqr',
'mqs',
'mqt',
'mqu',
'mqv',
'mqw',
'mqx',
'mqy',
'mqz',
'mra',
'mrb',
'mrc',
'mrd',
'mre',
'mrf',
'mrg',
'mrh',
'mrj',
'mrk',
'mrl',
'mrm',
'mrn',
'mro',
'mrp',
'mrq',
'mrr',
'mrs',
'mrt',
'mru',
'mrv',
'mrw',
'mrx',
'mry',
'mrz',
'msb',
'msc',
'msd',
'mse',
'msf',
'msg',
'msh',
'msi',
'msj',
'msk',
'msl',
'msm',
'msn',
'mso',
'msp',
'msq',
'msr',
'mss',
'mst',
'msu',
'msv',
'msw',
'msx',
'msy',
'msz',
'mta',
'mtb',
'mtc',
'mtd',
'mte',
'mtf',
'mtg',
'mth',
'mti',
'mtj',
'mtk',
'mtl',
'mtm',
'mtn',
'mto',
'mtp',
'mtq',
'mtr',
'mts',
'mtt',
'mtu',
'mtv',
'mtw',
'mtx',
'mty',
'mua',
'mub',
'muc',
'mud',
'mue',
'mug',
'muh',
'mui',
'muj',
'muk',
'mul',
'mum',
'mun',
'muo',
'mup',
'muq',
'mur',
'mus',
'mut',
'muu',
'muv',
'mux',
'muy',
'muz',
'mva',
'mvb',
'mvd',
'mve',
'mvf',
'mvg',
'mvh',
'mvi',
'mvk',
'mvl',
'mvm',
'mvn',
'mvo',
'mvp',
'mvq',
'mvr',
'mvs',
'mvt',
'mvu',
'mvv',
'mvw',
'mvx',
'mvy',
'mvz',
'mwa',
'mwb',
'mwc',
'mwd',
'mwe',
'mwf',
'mwg',
'mwh',
'mwi',
'mwj',
'mwk',
'mwl',
'mwm',
'mwn',
'mwo',
'mwp',
'mwq',
'mwr',
'mws',
'mwt',
'mwu',
'mwv',
'mww',
'mwx',
'mwy',
'mwz',
'mxa',
'mxb',
'mxc',
'mxd',
'mxe',
'mxf',
'mxg',
'mxh',
'mxi',
'mxj',
'mxk',
'mxl',
'mxm',
'mxn',
'mxo',
'mxp',
'mxq',
'mxr',
'mxs',
'mxt',
'mxu',
'mxv',
'mxw',
'mxx',
'mxy',
'mxz',
'myb',
'myc',
'myd',
'mye',
'myf',
'myg',
'myh',
'myi',
'myj',
'myk',
'myl',
'mym',
'myn',
'myo',
'myp',
'myq',
'myr',
'mys',
'myt',
'myu',
'myv',
'myw',
'myx',
'myy',
'myz',
'mza',
'mzb',
'mzc',
'mzd',
'mze',
'mzg',
'mzh',
'mzi',
'mzj',
'mzk',
'mzl',
'mzm',
'mzn',
'mzo',
'mzp',
'mzq',
'mzr',
'mzs',
'mzt',
'mzu',
'mzv',
'mzw',
'mzx',
'mzy',
'mzz',
'naa',
'nab',
'nac',
'nad',
'nae',
'naf',
'nag',
'nah',
'nai',
'naj',
'nak',
'nal',
'nam',
'nan',
'nao',
'nap',
'naq',
'nar',
'nas',
'nat',
'naw',
'nax',
'nay',
'naz',
'nba',
'nbb',
'nbc',
'nbd',
'nbe',
'nbf',
'nbg',
'nbh',
'nbi',
'nbj',
'nbk',
'nbm',
'nbn',
'nbo',
'nbp',
'nbq',
'nbr',
'nbs',
'nbt',
'nbu',
'nbv',
'nbw',
'nbx',
'nby',
'nca',
'ncb',
'ncc',
'ncd',
'nce',
'ncf',
'ncg',
'nch',
'nci',
'ncj',
'nck',
'ncl',
'ncm',
'ncn',
'nco',
'ncp',
'ncq',
'ncr',
'ncs',
'nct',
'ncu',
'ncx',
'ncz',
'nda',
'ndb',
'ndc',
'ndd',
'ndf',
'ndg',
'ndh',
'ndi',
'ndj',
'ndk',
'ndl',
'ndm',
'ndn',
'ndp',
'ndq',
'ndr',
'nds',
'ndt',
'ndu',
'ndv',
'ndw',
'ndx',
'ndy',
'ndz',
'nea',
'neb',
'nec',
'ned',
'nee',
'nef',
'neg',
'neh',
'nei',
'nej',
'nek',
'nem',
'nen',
'neo',
'neq',
'ner',
'nes',
'net',
'neu',
'nev',
'new',
'nex',
'ney',
'nez',
'nfa',
'nfd',
'nfl',
'nfr',
'nfu',
'nga',
'ngb',
'ngc',
'ngd',
'nge',
'ngf',
'ngg',
'ngh',
'ngi',
'ngj',
'ngk',
'ngl',
'ngm',
'ngn',
'ngo',
'ngp',
'ngq',
'ngr',
'ngs',
'ngt',
'ngu',
'ngv',
'ngw',
'ngx',
'ngy',
'ngz',
'nha',
'nhb',
'nhc',
'nhd',
'nhe',
'nhf',
'nhg',
'nhh',
'nhi',
'nhk',
'nhm',
'nhn',
'nho',
'nhp',
'nhq',
'nhr',
'nht',
'nhu',
'nhv',
'nhw',
'nhx',
'nhy',
'nhz',
'nia',
'nib',
'nic',
'nid',
'nie',
'nif',
'nig',
'nih',
'nii',
'nij',
'nik',
'nil',
'nim',
'nin',
'nio',
'niq',
'nir',
'nis',
'nit',
'niu',
'niv',
'niw',
'nix',
'niy',
'niz',
'nja',
'njb',
'njd',
'njh',
'nji',
'njj',
'njl',
'njm',
'njn',
'njo',
'njr',
'njs',
'njt',
'nju',
'njx',
'njy',
'njz',
'nka',
'nkb',
'nkc',
'nkd',
'nke',
'nkf',
'nkg',
'nkh',
'nki',
'nkj',
'nkk',
'nkm',
'nkn',
'nko',
'nkp',
'nkq',
'nkr',
'nks',
'nkt',
'nku',
'nkv',
'nkw',
'nkx',
'nkz',
'nla',
'nlc',
'nle',
'nlg',
'nli',
'nlj',
'nlk',
'nll',
'nlm',
'nln',
'nlo',
'nlq',
'nlr',
'nlu',
'nlv',
'nlw',
'nlx',
'nly',
'nlz',
'nma',
'nmb',
'nmc',
'nmd',
'nme',
'nmf',
'nmg',
'nmh',
'nmi',
'nmj',
'nmk',
'nml',
'nmm',
'nmn',
'nmo',
'nmp',
'nmq',
'nmr',
'nms',
'nmt',
'nmu',
'nmv',
'nmw',
'nmx',
'nmy',
'nmz',
'nna',
'nnb',
'nnc',
'nnd',
'nne',
'nnf',
'nng',
'nnh',
'nni',
'nnj',
'nnk',
'nnl',
'nnm',
'nnn',
'nnp',
'nnq',
'nnr',
'nns',
'nnt',
'nnu',
'nnv',
'nnw',
'nnx',
'nny',
'nnz',
'noa',
'noc',
'nod',
'noe',
'nof',
'nog',
'noh',
'noi',
'noj',
'nok',
'nol',
'nom',
'non',
'noo',
'nop',
'noq',
'nos',
'not',
'nou',
'nov',
'now',
'noy',
'noz',
'npa',
'npb',
'npg',
'nph',
'npi',
'npl',
'npn',
'npo',
'nps',
'npu',
'npx',
'npy',
'nqg',
'nqk',
'nql',
'nqm',
'nqn',
'nqo',
'nqq',
'nqy',
'nra',
'nrb',
'nrc',
'nre',
'nrf',
'nrg',
'nri',
'nrk',
'nrl',
'nrm',
'nrn',
'nrp',
'nrr',
'nrt',
'nru',
'nrx',
'nrz',
'nsa',
'nsc',
'nsd',
'nse',
'nsf',
'nsg',
'nsh',
'nsi',
'nsk',
'nsl',
'nsm',
'nsn',
'nso',
'nsp',
'nsq',
'nsr',
'nss',
'nst',
'nsu',
'nsv',
'nsw',
'nsx',
'nsy',
'nsz',
'ntd',
'nte',
'ntg',
'nti',
'ntj',
'ntk',
'ntm',
'nto',
'ntp',
'ntr',
'nts',
'ntu',
'ntw',
'ntx',
'nty',
'ntz',
'nua',
'nub',
'nuc',
'nud',
'nue',
'nuf',
'nug',
'nuh',
'nui',
'nuj',
'nuk',
'nul',
'num',
'nun',
'nuo',
'nup',
'nuq',
'nur',
'nus',
'nut',
'nuu',
'nuv',
'nuw',
'nux',
'nuy',
'nuz',
'nvh',
'nvm',
'nvo',
'nwa',
'nwb',
'nwc',
'nwe',
'nwg',
'nwi',
'nwm',
'nwo',
'nwr',
'nwx',
'nwy',
'nxa',
'nxd',
'nxe',
'nxg',
'nxi',
'nxk',
'nxl',
'nxm',
'nxn',
'nxo',
'nxq',
'nxr',
'nxu',
'nxx',
'nyb',
'nyc',
'nyd',
'nye',
'nyf',
'nyg',
'nyh',
'nyi',
'nyj',
'nyk',
'nyl',
'nym',
'nyn',
'nyo',
'nyp',
'nyq',
'nyr',
'nys',
'nyt',
'nyu',
'nyv',
'nyw',
'nyx',
'nyy',
'nza',
'nzb',
'nzd',
'nzi',
'nzk',
'nzm',
'nzs',
'nzu',
'nzy',
'nzz',
'oaa',
'oac',
'oar',
'oav',
'obi',
'obk',
'obl',
'obm',
'obo',
'obr',
'obt',
'obu',
'oca',
'och',
'oco',
'ocu',
'oda',
'odk',
'odt',
'odu',
'ofo',
'ofs',
'ofu',
'ogb',
'ogc',
'oge',
'ogg',
'ogo',
'ogu',
'oht',
'ohu',
'oia',
'oin',
'ojb',
'ojc',
'ojg',
'ojp',
'ojs',
'ojv',
'ojw',
'oka',
'okb',
'okd',
'oke',
'okg',
'okh',
'oki',
'okj',
'okk',
'okl',
'okm',
'okn',
'oko',
'okr',
'oks',
'oku',
'okv',
'okx',
'ola',
'old',
'ole',
'olk',
'olm',
'olo',
'olr',
'olt',
'olu',
'oma',
'omb',
'omc',
'ome',
'omg',
'omi',
'omk',
'oml',
'omn',
'omo',
'omp',
'omq',
'omr',
'omt',
'omu',
'omv',
'omw',
'omx',
'ona',
'onb',
'one',
'ong',
'oni',
'onj',
'onk',
'onn',
'ono',
'onp',
'onr',
'ons',
'ont',
'onu',
'onw',
'onx',
'ood',
'oog',
'oon',
'oor',
'oos',
'opa',
'opk',
'opm',
'opo',
'opt',
'opy',
'ora',
'orc',
'ore',
'org',
'orh',
'orn',
'oro',
'orr',
'ors',
'ort',
'oru',
'orv',
'orw',
'orx',
'ory',
'orz',
'osa',
'osc',
'osi',
'oso',
'osp',
'ost',
'osu',
'osx',
'ota',
'otb',
'otd',
'ote',
'oti',
'otk',
'otl',
'otm',
'otn',
'oto',
'otq',
'otr',
'ots',
'ott',
'otu',
'otw',
'otx',
'oty',
'otz',
'oua',
'oub',
'oue',
'oui',
'oum',
'oun',
'ovd',
'owi',
'owl',
'oyb',
'oyd',
'oym',
'oyy',
'ozm',
'paa',
'pab',
'pac',
'pad',
'pae',
'paf',
'pag',
'pah',
'pai',
'pak',
'pal',
'pam',
'pao',
'pap',
'paq',
'par',
'pas',
'pat',
'pau',
'pav',
'paw',
'pax',
'pay',
'paz',
'pbb',
'pbc',
'pbe',
'pbf',
'pbg',
'pbh',
'pbi',
'pbl',
'pbm',
'pbn',
'pbo',
'pbp',
'pbr',
'pbs',
'pbt',
'pbu',
'pbv',
'pby',
'pbz',
'pca',
'pcb',
'pcc',
'pcd',
'pce',
'pcf',
'pcg',
'pch',
'pci',
'pcj',
'pck',
'pcl',
'pcm',
'pcn',
'pcp',
'pcr',
'pcw',
'pda',
'pdc',
'pdi',
'pdn',
'pdo',
'pdt',
'pdu',
'pea',
'peb',
'ped',
'pee',
'pef',
'peg',
'peh',
'pei',
'pej',
'pek',
'pel',
'pem',
'peo',
'pep',
'peq',
'pes',
'pev',
'pex',
'pey',
'pez',
'pfa',
'pfe',
'pfl',
'pga',
'pgd',
'pgg',
'pgi',
'pgk',
'pgl',
'pgn',
'pgs',
'pgu',
'pgy',
'pgz',
'pha',
'phd',
'phg',
'phh',
'phi',
'phk',
'phl',
'phm',
'phn',
'pho',
'phq',
'phr',
'pht',
'phu',
'phv',
'phw',
'pia',
'pib',
'pic',
'pid',
'pie',
'pif',
'pig',
'pih',
'pii',
'pij',
'pil',
'pim',
'pin',
'pio',
'pip',
'pir',
'pis',
'pit',
'piu',
'piv',
'piw',
'pix',
'piy',
'piz',
'pjt',
'pka',
'pkb',
'pkc',
'pkg',
'pkh',
'pkn',
'pko',
'pkp',
'pkr',
'pks',
'pkt',
'pku',
'pla',
'plb',
'plc',
'pld',
'ple',
'plf',
'plg',
'plh',
'plj',
'plk',
'pll',
'pln',
'plo',
'plp',
'plq',
'plr',
'pls',
'plt',
'plu',
'plv',
'plw',
'ply',
'plz',
'pma',
'pmb',
'pmc',
'pmd',
'pme',
'pmf',
'pmh',
'pmi',
'pmj',
'pmk',
'pml',
'pmm',
'pmn',
'pmo',
'pmq',
'pmr',
'pms',
'pmt',
'pmu',
'pmw',
'pmx',
'pmy',
'pmz',
'pna',
'pnb',
'pnc',
'pne',
'png',
'pnh',
'pni',
'pnj',
'pnk',
'pnl',
'pnm',
'pnn',
'pno',
'pnp',
'pnq',
'pnr',
'pns',
'pnt',
'pnu',
'pnv',
'pnw',
'pnx',
'pny',
'pnz',
'poc',
'pod',
'poe',
'pof',
'pog',
'poh',
'poi',
'pok',
'pom',
'pon',
'poo',
'pop',
'poq',
'pos',
'pot',
'pov',
'pow',
'pox',
'poy',
'poz',
'ppa',
'ppe',
'ppi',
'ppk',
'ppl',
'ppm',
'ppn',
'ppo',
'ppp',
'ppq',
'ppr',
'pps',
'ppt',
'ppu',
'pqa',
'pqe',
'pqm',
'pqw',
'pra',
'prb',
'prc',
'prd',
'pre',
'prf',
'prg',
'prh',
'pri',
'prk',
'prl',
'prm',
'prn',
'pro',
'prp',
'prq',
'prr',
'prs',
'prt',
'pru',
'prw',
'prx',
'pry',
'prz',
'psa',
'psc',
'psd',
'pse',
'psg',
'psh',
'psi',
'psl',
'psm',
'psn',
'pso',
'psp',
'psq',
'psr',
'pss',
'pst',
'psu',
'psw',
'psy',
'pta',
'pth',
'pti',
'ptn',
'pto',
'ptp',
'ptq',
'ptr',
'ptt',
'ptu',
'ptv',
'ptw',
'pty',
'pua',
'pub',
'puc',
'pud',
'pue',
'puf',
'pug',
'pui',
'puj',
'puk',
'pum',
'puo',
'pup',
'puq',
'pur',
'put',
'puu',
'puw',
'pux',
'puy',
'puz',
'pwa',
'pwb',
'pwg',
'pwi',
'pwm',
'pwn',
'pwo',
'pwr',
'pww',
'pxm',
'pye',
'pym',
'pyn',
'pys',
'pyu',
'pyx',
'pyy',
'pzn',
'qaa..qtz',
'qua',
'qub',
'quc',
'qud',
'quf',
'qug',
'quh',
'qui',
'quk',
'qul',
'qum',
'qun',
'qup',
'quq',
'qur',
'qus',
'quv',
'quw',
'qux',
'quy',
'quz',
'qva',
'qvc',
'qve',
'qvh',
'qvi',
'qvj',
'qvl',
'qvm',
'qvn',
'qvo',
'qvp',
'qvs',
'qvw',
'qvy',
'qvz',
'qwa',
'qwc',
'qwe',
'qwh',
'qwm',
'qws',
'qwt',
'qxa',
'qxc',
'qxh',
'qxl',
'qxn',
'qxo',
'qxp',
'qxq',
'qxr',
'qxs',
'qxt',
'qxu',
'qxw',
'qya',
'qyp',
'raa',
'rab',
'rac',
'rad',
'raf',
'rag',
'rah',
'rai',
'raj',
'rak',
'ral',
'ram',
'ran',
'rao',
'rap',
'raq',
'rar',
'ras',
'rat',
'rau',
'rav',
'raw',
'rax',
'ray',
'raz',
'rbb',
'rbk',
'rbl',
'rbp',
'rcf',
'rdb',
'rea',
'reb',
'ree',
'reg',
'rei',
'rej',
'rel',
'rem',
'ren',
'rer',
'res',
'ret',
'rey',
'rga',
'rge',
'rgk',
'rgn',
'rgr',
'rgs',
'rgu',
'rhg',
'rhp',
'ria',
'rie',
'rif',
'ril',
'rim',
'rin',
'rir',
'rit',
'riu',
'rjg',
'rji',
'rjs',
'rka',
'rkb',
'rkh',
'rki',
'rkm',
'rkt',
'rkw',
'rma',
'rmb',
'rmc',
'rmd',
'rme',
'rmf',
'rmg',
'rmh',
'rmi',
'rmk',
'rml',
'rmm',
'rmn',
'rmo',
'rmp',
'rmq',
'rmr',
'rms',
'rmt',
'rmu',
'rmv',
'rmw',
'rmx',
'rmy',
'rmz',
'rna',
'rnd',
'rng',
'rnl',
'rnn',
'rnp',
'rnr',
'rnw',
'roa',
'rob',
'roc',
'rod',
'roe',
'rof',
'rog',
'rol',
'rom',
'roo',
'rop',
'ror',
'rou',
'row',
'rpn',
'rpt',
'rri',
'rro',
'rrt',
'rsb',
'rsi',
'rsl',
'rsm',
'rtc',
'rth',
'rtm',
'rts',
'rtw',
'rub',
'ruc',
'rue',
'ruf',
'rug',
'ruh',
'rui',
'ruk',
'ruo',
'rup',
'ruq',
'rut',
'ruu',
'ruy',
'ruz',
'rwa',
'rwk',
'rwm',
'rwo',
'rwr',
'rxd',
'rxw',
'ryn',
'rys',
'ryu',
'rzh',
'saa',
'sab',
'sac',
'sad',
'sae',
'saf',
'sah',
'sai',
'saj',
'sak',
'sal',
'sam',
'sao',
'sap',
'saq',
'sar',
'sas',
'sat',
'sau',
'sav',
'saw',
'sax',
'say',
'saz',
'sba',
'sbb',
'sbc',
'sbd',
'sbe',
'sbf',
'sbg',
'sbh',
'sbi',
'sbj',
'sbk',
'sbl',
'sbm',
'sbn',
'sbo',
'sbp',
'sbq',
'sbr',
'sbs',
'sbt',
'sbu',
'sbv',
'sbw',
'sbx',
'sby',
'sbz',
'sca',
'scb',
'sce',
'scf',
'scg',
'sch',
'sci',
'sck',
'scl',
'scn',
'sco',
'scp',
'scq',
'scs',
'sct',
'scu',
'scv',
'scw',
'scx',
'sda',
'sdb',
'sdc',
'sde',
'sdf',
'sdg',
'sdh',
'sdj',
'sdk',
'sdl',
'sdm',
'sdn',
'sdo',
'sdp',
'sdr',
'sds',
'sdt',
'sdu',
'sdv',
'sdx',
'sdz',
'sea',
'seb',
'sec',
'sed',
'see',
'sef',
'seg',
'seh',
'sei',
'sej',
'sek',
'sel',
'sem',
'sen',
'seo',
'sep',
'seq',
'ser',
'ses',
'set',
'seu',
'sev',
'sew',
'sey',
'sez',
'sfb',
'sfe',
'sfm',
'sfs',
'sfw',
'sga',
'sgb',
'sgc',
'sgd',
'sge',
'sgg',
'sgh',
'sgi',
'sgj',
'sgk',
'sgl',
'sgm',
'sgn',
'sgo',
'sgp',
'sgr',
'sgs',
'sgt',
'sgu',
'sgw',
'sgx',
'sgy',
'sgz',
'sha',
'shb',
'shc',
'shd',
'she',
'shg',
'shh',
'shi',
'shj',
'shk',
'shl',
'shm',
'shn',
'sho',
'shp',
'shq',
'shr',
'shs',
'sht',
'shu',
'shv',
'shw',
'shx',
'shy',
'shz',
'sia',
'sib',
'sid',
'sie',
'sif',
'sig',
'sih',
'sii',
'sij',
'sik',
'sil',
'sim',
'sio',
'sip',
'siq',
'sir',
'sis',
'sit',
'siu',
'siv',
'siw',
'six',
'siy',
'siz',
'sja',
'sjb',
'sjd',
'sje',
'sjg',
'sjk',
'sjl',
'sjm',
'sjn',
'sjo',
'sjp',
'sjr',
'sjs',
'sjt',
'sju',
'sjw',
'ska',
'skb',
'skc',
'skd',
'ske',
'skf',
'skg',
'skh',
'ski',
'skj',
'skk',
'skm',
'skn',
'sko',
'skp',
'skq',
'skr',
'sks',
'skt',
'sku',
'skv',
'skw',
'skx',
'sky',
'skz',
'sla',
'slc',
'sld',
'sle',
'slf',
'slg',
'slh',
'sli',
'slj',
'sll',
'slm',
'sln',
'slp',
'slq',
'slr',
'sls',
'slt',
'slu',
'slw',
'slx',
'sly',
'slz',
'sma',
'smb',
'smc',
'smd',
'smf',
'smg',
'smh',
'smi',
'smj',
'smk',
'sml',
'smm',
'smn',
'smp',
'smq',
'smr',
'sms',
'smt',
'smu',
'smv',
'smw',
'smx',
'smy',
'smz',
'snb',
'snc',
'sne',
'snf',
'sng',
'snh',
'sni',
'snj',
'snk',
'snl',
'snm',
'snn',
'sno',
'snp',
'snq',
'snr',
'sns',
'snu',
'snv',
'snw',
'snx',
'sny',
'snz',
'soa',
'sob',
'soc',
'sod',
'soe',
'sog',
'soh',
'soi',
'soj',
'sok',
'sol',
'son',
'soo',
'sop',
'soq',
'sor',
'sos',
'sou',
'sov',
'sow',
'sox',
'soy',
'soz',
'spb',
'spc',
'spd',
'spe',
'spg',
'spi',
'spk',
'spl',
'spm',
'spn',
'spo',
'spp',
'spq',
'spr',
'sps',
'spt',
'spu',
'spv',
'spx',
'spy',
'sqa',
'sqh',
'sqj',
'sqk',
'sqm',
'sqn',
'sqo',
'sqq',
'sqr',
'sqs',
'sqt',
'squ',
'sra',
'srb',
'src',
'sre',
'srf',
'srg',
'srh',
'sri',
'srk',
'srl',
'srm',
'srn',
'sro',
'srq',
'srr',
'srs',
'srt',
'sru',
'srv',
'srw',
'srx',
'sry',
'srz',
'ssa',
'ssb',
'ssc',
'ssd',
'sse',
'ssf',
'ssg',
'ssh',
'ssi',
'ssj',
'ssk',
'ssl',
'ssm',
'ssn',
'sso',
'ssp',
'ssq',
'ssr',
'sss',
'sst',
'ssu',
'ssv',
'ssx',
'ssy',
'ssz',
'sta',
'stb',
'std',
'ste',
'stf',
'stg',
'sth',
'sti',
'stj',
'stk',
'stl',
'stm',
'stn',
'sto',
'stp',
'stq',
'str',
'sts',
'stt',
'stu',
'stv',
'stw',
'sty',
'sua',
'sub',
'suc',
'sue',
'sug',
'sui',
'suj',
'suk',
'sul',
'sum',
'suq',
'sur',
'sus',
'sut',
'suv',
'suw',
'sux',
'suy',
'suz',
'sva',
'svb',
'svc',
'sve',
'svk',
'svm',
'svr',
'svs',
'svx',
'swb',
'swc',
'swf',
'swg',
'swh',
'swi',
'swj',
'swk',
'swl',
'swm',
'swn',
'swo',
'swp',
'swq',
'swr',
'sws',
'swt',
'swu',
'swv',
'sww',
'swx',
'swy',
'sxb',
'sxc',
'sxe',
'sxg',
'sxk',
'sxl',
'sxm',
'sxn',
'sxo',
'sxr',
'sxs',
'sxu',
'sxw',
'sya',
'syb',
'syc',
'syd',
'syi',
'syk',
'syl',
'sym',
'syn',
'syo',
'syr',
'sys',
'syw',
'syx',
'syy',
'sza',
'szb',
'szc',
'szd',
'sze',
'szg',
'szl',
'szn',
'szp',
'szs',
'szv',
'szw',
'taa',
'tab',
'tac',
'tad',
'tae',
'taf',
'tag',
'tai',
'taj',
'tak',
'tal',
'tan',
'tao',
'tap',
'taq',
'tar',
'tas',
'tau',
'tav',
'taw',
'tax',
'tay',
'taz',
'tba',
'tbb',
'tbc',
'tbd',
'tbe',
'tbf',
'tbg',
'tbh',
'tbi',
'tbj',
'tbk',
'tbl',
'tbm',
'tbn',
'tbo',
'tbp',
'tbq',
'tbr',
'tbs',
'tbt',
'tbu',
'tbv',
'tbw',
'tbx',
'tby',
'tbz',
'tca',
'tcb',
'tcc',
'tcd',
'tce',
'tcf',
'tcg',
'tch',
'tci',
'tck',
'tcl',
'tcm',
'tcn',
'tco',
'tcp',
'tcq',
'tcs',
'tct',
'tcu',
'tcw',
'tcx',
'tcy',
'tcz',
'tda',
'tdb',
'tdc',
'tdd',
'tde',
'tdf',
'tdg',
'tdh',
'tdi',
'tdj',
'tdk',
'tdl',
'tdm',
'tdn',
'tdo',
'tdq',
'tdr',
'tds',
'tdt',
'tdu',
'tdv',
'tdx',
'tdy',
'tea',
'teb',
'tec',
'ted',
'tee',
'tef',
'teg',
'teh',
'tei',
'tek',
'tem',
'ten',
'teo',
'tep',
'teq',
'ter',
'tes',
'tet',
'teu',
'tev',
'tew',
'tex',
'tey',
'tez',
'tfi',
'tfn',
'tfo',
'tfr',
'tft',
'tga',
'tgb',
'tgc',
'tgd',
'tge',
'tgf',
'tgg',
'tgh',
'tgi',
'tgj',
'tgn',
'tgo',
'tgp',
'tgq',
'tgr',
'tgs',
'tgt',
'tgu',
'tgv',
'tgw',
'tgx',
'tgy',
'tgz',
'thc',
'thd',
'the',
'thf',
'thh',
'thi',
'thk',
'thl',
'thm',
'thn',
'thp',
'thq',
'thr',
'ths',
'tht',
'thu',
'thv',
'thw',
'thx',
'thy',
'thz',
'tia',
'tic',
'tid',
'tie',
'tif',
'tig',
'tih',
'tii',
'tij',
'tik',
'til',
'tim',
'tin',
'tio',
'tip',
'tiq',
'tis',
'tit',
'tiu',
'tiv',
'tiw',
'tix',
'tiy',
'tiz',
'tja',
'tjg',
'tji',
'tjl',
'tjm',
'tjn',
'tjo',
'tjs',
'tju',
'tjw',
'tka',
'tkb',
'tkd',
'tke',
'tkf',
'tkg',
'tkk',
'tkl',
'tkm',
'tkn',
'tkp',
'tkq',
'tkr',
'tks',
'tkt',
'tku',
'tkv',
'tkw',
'tkx',
'tkz',
'tla',
'tlb',
'tlc',
'tld',
'tlf',
'tlg',
'tlh',
'tli',
'tlj',
'tlk',
'tll',
'tlm',
'tln',
'tlo',
'tlp',
'tlq',
'tlr',
'tls',
'tlt',
'tlu',
'tlv',
'tlw',
'tlx',
'tly',
'tma',
'tmb',
'tmc',
'tmd',
'tme',
'tmf',
'tmg',
'tmh',
'tmi',
'tmj',
'tmk',
'tml',
'tmm',
'tmn',
'tmo',
'tmp',
'tmq',
'tmr',
'tms',
'tmt',
'tmu',
'tmv',
'tmw',
'tmy',
'tmz',
'tna',
'tnb',
'tnc',
'tnd',
'tne',
'tnf',
'tng',
'tnh',
'tni',
'tnk',
'tnl',
'tnm',
'tnn',
'tno',
'tnp',
'tnq',
'tnr',
'tns',
'tnt',
'tnu',
'tnv',
'tnw',
'tnx',
'tny',
'tnz',
'tob',
'toc',
'tod',
'toe',
'tof',
'tog',
'toh',
'toi',
'toj',
'tol',
'tom',
'too',
'top',
'toq',
'tor',
'tos',
'tou',
'tov',
'tow',
'tox',
'toy',
'toz',
'tpa',
'tpc',
'tpe',
'tpf',
'tpg',
'tpi',
'tpj',
'tpk',
'tpl',
'tpm',
'tpn',
'tpo',
'tpp',
'tpq',
'tpr',
'tpt',
'tpu',
'tpv',
'tpw',
'tpx',
'tpy',
'tpz',
'tqb',
'tql',
'tqm',
'tqn',
'tqo',
'tqp',
'tqq',
'tqr',
'tqt',
'tqu',
'tqw',
'tra',
'trb',
'trc',
'trd',
'tre',
'trf',
'trg',
'trh',
'tri',
'trj',
'trk',
'trl',
'trm',
'trn',
'tro',
'trp',
'trq',
'trr',
'trs',
'trt',
'tru',
'trv',
'trw',
'trx',
'try',
'trz',
'tsa',
'tsb',
'tsc',
'tsd',
'tse',
'tsf',
'tsg',
'tsh',
'tsi',
'tsj',
'tsk',
'tsl',
'tsm',
'tsp',
'tsq',
'tsr',
'tss',
'tst',
'tsu',
'tsv',
'tsw',
'tsx',
'tsy',
'tsz',
'tta',
'ttb',
'ttc',
'ttd',
'tte',
'ttf',
'ttg',
'tth',
'tti',
'ttj',
'ttk',
'ttl',
'ttm',
'ttn',
'tto',
'ttp',
'ttq',
'ttr',
'tts',
'ttt',
'ttu',
'ttv',
'ttw',
'tty',
'ttz',
'tua',
'tub',
'tuc',
'tud',
'tue',
'tuf',
'tug',
'tuh',
'tui',
'tuj',
'tul',
'tum',
'tun',
'tuo',
'tup',
'tuq',
'tus',
'tut',
'tuu',
'tuv',
'tuw',
'tux',
'tuy',
'tuz',
'tva',
'tvd',
'tve',
'tvk',
'tvl',
'tvm',
'tvn',
'tvo',
'tvs',
'tvt',
'tvu',
'tvw',
'tvy',
'twa',
'twb',
'twc',
'twd',
'twe',
'twf',
'twg',
'twh',
'twl',
'twm',
'twn',
'two',
'twp',
'twq',
'twr',
'twt',
'twu',
'tww',
'twx',
'twy',
'txa',
'txb',
'txc',
'txe',
'txg',
'txh',
'txi',
'txj',
'txm',
'txn',
'txo',
'txq',
'txr',
'txs',
'txt',
'txu',
'txx',
'txy',
'tya',
'tye',
'tyh',
'tyi',
'tyj',
'tyl',
'tyn',
'typ',
'tyr',
'tys',
'tyt',
'tyu',
'tyv',
'tyx',
'tyz',
'tza',
'tzh',
'tzj',
'tzl',
'tzm',
'tzn',
'tzo',
'tzx',
'uam',
'uan',
'uar',
'uba',
'ubi',
'ubl',
'ubr',
'ubu',
'uby',
'uda',
'ude',
'udg',
'udi',
'udj',
'udl',
'udm',
'udu',
'ues',
'ufi',
'uga',
'ugb',
'uge',
'ugn',
'ugo',
'ugy',
'uha',
'uhn',
'uis',
'uiv',
'uji',
'uka',
'ukg',
'ukh',
'ukk',
'ukl',
'ukp',
'ukq',
'uks',
'uku',
'ukw',
'uky',
'ula',
'ulb',
'ulc',
'ule',
'ulf',
'uli',
'ulk',
'ull',
'ulm',
'uln',
'ulu',
'ulw',
'uma',
'umb',
'umc',
'umd',
'umg',
'umi',
'umm',
'umn',
'umo',
'ump',
'umr',
'ums',
'umu',
'una',
'und',
'une',
'ung',
'unk',
'unm',
'unn',
'unp',
'unr',
'unu',
'unx',
'unz',
'uok',
'upi',
'upv',
'ura',
'urb',
'urc',
'ure',
'urf',
'urg',
'urh',
'uri',
'urj',
'urk',
'url',
'urm',
'urn',
'uro',
'urp',
'urr',
'urt',
'uru',
'urv',
'urw',
'urx',
'ury',
'urz',
'usa',
'ush',
'usi',
'usk',
'usp',
'usu',
'uta',
'ute',
'utp',
'utr',
'utu',
'uum',
'uun',
'uur',
'uuu',
'uve',
'uvh',
'uvl',
'uwa',
'uya',
'uzn',
'uzs',
'vaa',
'vae',
'vaf',
'vag',
'vah',
'vai',
'vaj',
'val',
'vam',
'van',
'vao',
'vap',
'var',
'vas',
'vau',
'vav',
'vay',
'vbb',
'vbk',
'vec',
'ved',
'vel',
'vem',
'veo',
'vep',
'ver',
'vgr',
'vgt',
'vic',
'vid',
'vif',
'vig',
'vil',
'vin',
'vis',
'vit',
'viv',
'vka',
'vki',
'vkj',
'vkk',
'vkl',
'vkm',
'vko',
'vkp',
'vkt',
'vku',
'vlp',
'vls',
'vma',
'vmb',
'vmc',
'vmd',
'vme',
'vmf',
'vmg',
'vmh',
'vmi',
'vmj',
'vmk',
'vml',
'vmm',
'vmp',
'vmq',
'vmr',
'vms',
'vmu',
'vmv',
'vmw',
'vmx',
'vmy',
'vmz',
'vnk',
'vnm',
'vnp',
'vor',
'vot',
'vra',
'vro',
'vrs',
'vrt',
'vsi',
'vsl',
'vsv',
'vto',
'vum',
'vun',
'vut',
'vwa',
'waa',
'wab',
'wac',
'wad',
'wae',
'waf',
'wag',
'wah',
'wai',
'waj',
'wak',
'wal',
'wam',
'wan',
'wao',
'wap',
'waq',
'war',
'was',
'wat',
'wau',
'wav',
'waw',
'wax',
'way',
'waz',
'wba',
'wbb',
'wbe',
'wbf',
'wbh',
'wbi',
'wbj',
'wbk',
'wbl',
'wbm',
'wbp',
'wbq',
'wbr',
'wbs',
'wbt',
'wbv',
'wbw',
'wca',
'wci',
'wdd',
'wdg',
'wdj',
'wdk',
'wdu',
'wdy',
'wea',
'wec',
'wed',
'weg',
'weh',
'wei',
'wem',
'wen',
'weo',
'wep',
'wer',
'wes',
'wet',
'weu',
'wew',
'wfg',
'wga',
'wgb',
'wgg',
'wgi',
'wgo',
'wgu',
'wgw',
'wgy',
'wha',
'whg',
'whk',
'whu',
'wib',
'wic',
'wie',
'wif',
'wig',
'wih',
'wii',
'wij',
'wik',
'wil',
'wim',
'win',
'wir',
'wit',
'wiu',
'wiv',
'wiw',
'wiy',
'wja',
'wji',
'wka',
'wkb',
'wkd',
'wkl',
'wku',
'wkw',
'wky',
'wla',
'wlc',
'wle',
'wlg',
'wli',
'wlk',
'wll',
'wlm',
'wlo',
'wlr',
'wls',
'wlu',
'wlv',
'wlw',
'wlx',
'wly',
'wma',
'wmb',
'wmc',
'wmd',
'wme',
'wmh',
'wmi',
'wmm',
'wmn',
'wmo',
'wms',
'wmt',
'wmw',
'wmx',
'wnb',
'wnc',
'wnd',
'wne',
'wng',
'wni',
'wnk',
'wnm',
'wnn',
'wno',
'wnp',
'wnu',
'wnw',
'wny',
'woa',
'wob',
'woc',
'wod',
'woe',
'wof',
'wog',
'woi',
'wok',
'wom',
'won',
'woo',
'wor',
'wos',
'wow',
'woy',
'wpc',
'wra',
'wrb',
'wrd',
'wrg',
'wrh',
'wri',
'wrk',
'wrl',
'wrm',
'wrn',
'wro',
'wrp',
'wrr',
'wrs',
'wru',
'wrv',
'wrw',
'wrx',
'wry',
'wrz',
'wsa',
'wsg',
'wsi',
'wsk',
'wsr',
'wss',
'wsu',
'wsv',
'wtf',
'wth',
'wti',
'wtk',
'wtm',
'wtw',
'wua',
'wub',
'wud',
'wuh',
'wul',
'wum',
'wun',
'wur',
'wut',
'wuu',
'wuv',
'wux',
'wuy',
'wwa',
'wwb',
'wwo',
'wwr',
'www',
'wxa',
'wxw',
'wya',
'wyb',
'wyi',
'wym',
'wyr',
'wyy',
'xaa',
'xab',
'xac',
'xad',
'xae',
'xag',
'xai',
'xaj',
'xak',
'xal',
'xam',
'xan',
'xao',
'xap',
'xaq',
'xar',
'xas',
'xat',
'xau',
'xav',
'xaw',
'xay',
'xba',
'xbb',
'xbc',
'xbd',
'xbe',
'xbg',
'xbi',
'xbj',
'xbm',
'xbn',
'xbo',
'xbp',
'xbr',
'xbw',
'xbx',
'xby',
'xcb',
'xcc',
'xce',
'xcg',
'xch',
'xcl',
'xcm',
'xcn',
'xco',
'xcr',
'xct',
'xcu',
'xcv',
'xcw',
'xcy',
'xda',
'xdc',
'xdk',
'xdm',
'xdo',
'xdy',
'xeb',
'xed',
'xeg',
'xel',
'xem',
'xep',
'xer',
'xes',
'xet',
'xeu',
'xfa',
'xga',
'xgb',
'xgd',
'xgf',
'xgg',
'xgi',
'xgl',
'xgm',
'xgn',
'xgr',
'xgu',
'xgw',
'xha',
'xhc',
'xhd',
'xhe',
'xhr',
'xht',
'xhu',
'xhv',
'xia',
'xib',
'xii',
'xil',
'xin',
'xip',
'xir',
'xis',
'xiv',
'xiy',
'xjb',
'xjt',
'xka',
'xkb',
'xkc',
'xkd',
'xke',
'xkf',
'xkg',
'xkh',
'xki',
'xkj',
'xkk',
'xkl',
'xkn',
'xko',
'xkp',
'xkq',
'xkr',
'xks',
'xkt',
'xku',
'xkv',
'xkw',
'xkx',
'xky',
'xkz',
'xla',
'xlb',
'xlc',
'xld',
'xle',
'xlg',
'xli',
'xln',
'xlo',
'xlp',
'xls',
'xlu',
'xly',
'xma',
'xmb',
'xmc',
'xmd',
'xme',
'xmf',
'xmg',
'xmh',
'xmj',
'xmk',
'xml',
'xmm',
'xmn',
'xmo',
'xmp',
'xmq',
'xmr',
'xms',
'xmt',
'xmu',
'xmv',
'xmw',
'xmx',
'xmy',
'xmz',
'xna',
'xnb',
'xnd',
'xng',
'xnh',
'xni',
'xnk',
'xnn',
'xno',
'xnr',
'xns',
'xnt',
'xnu',
'xny',
'xnz',
'xoc',
'xod',
'xog',
'xoi',
'xok',
'xom',
'xon',
'xoo',
'xop',
'xor',
'xow',
'xpa',
'xpc',
'xpe',
'xpg',
'xpi',
'xpj',
'xpk',
'xpm',
'xpn',
'xpo',
'xpp',
'xpq',
'xpr',
'xps',
'xpt',
'xpu',
'xpy',
'xqa',
'xqt',
'xra',
'xrb',
'xrd',
'xre',
'xrg',
'xri',
'xrm',
'xrn',
'xrq',
'xrr',
'xrt',
'xru',
'xrw',
'xsa',
'xsb',
'xsc',
'xsd',
'xse',
'xsh',
'xsi',
'xsj',
'xsl',
'xsm',
'xsn',
'xso',
'xsp',
'xsq',
'xsr',
'xss',
'xsu',
'xsv',
'xsy',
'xta',
'xtb',
'xtc',
'xtd',
'xte',
'xtg',
'xth',
'xti',
'xtj',
'xtl',
'xtm',
'xtn',
'xto',
'xtp',
'xtq',
'xtr',
'xts',
'xtt',
'xtu',
'xtv',
'xtw',
'xty',
'xtz',
'xua',
'xub',
'xud',
'xug',
'xuj',
'xul',
'xum',
'xun',
'xuo',
'xup',
'xur',
'xut',
'xuu',
'xve',
'xvi',
'xvn',
'xvo',
'xvs',
'xwa',
'xwc',
'xwd',
'xwe',
'xwg',
'xwj',
'xwk',
'xwl',
'xwo',
'xwr',
'xwt',
'xww',
'xxb',
'xxk',
'xxm',
'xxr',
'xxt',
'xya',
'xyb',
'xyj',
'xyk',
'xyl',
'xyt',
'xyy',
'xzh',
'xzm',
'xzp',
'yaa',
'yab',
'yac',
'yad',
'yae',
'yaf',
'yag',
'yah',
'yai',
'yaj',
'yak',
'yal',
'yam',
'yan',
'yao',
'yap',
'yaq',
'yar',
'yas',
'yat',
'yau',
'yav',
'yaw',
'yax',
'yay',
'yaz',
'yba',
'ybb',
'ybd',
'ybe',
'ybh',
'ybi',
'ybj',
'ybk',
'ybl',
'ybm',
'ybn',
'ybo',
'ybx',
'yby',
'ych',
'ycl',
'ycn',
'ycp',
'yda',
'ydd',
'yde',
'ydg',
'ydk',
'yds',
'yea',
'yec',
'yee',
'yei',
'yej',
'yel',
'yen',
'yer',
'yes',
'yet',
'yeu',
'yev',
'yey',
'yga',
'ygi',
'ygl',
'ygm',
'ygp',
'ygr',
'ygs',
'ygu',
'ygw',
'yha',
'yhd',
'yhl',
'yhs',
'yia',
'yif',
'yig',
'yih',
'yii',
'yij',
'yik',
'yil',
'yim',
'yin',
'yip',
'yiq',
'yir',
'yis',
'yit',
'yiu',
'yiv',
'yix',
'yiy',
'yiz',
'yka',
'ykg',
'yki',
'ykk',
'ykl',
'ykm',
'ykn',
'yko',
'ykr',
'ykt',
'yku',
'yky',
'yla',
'ylb',
'yle',
'ylg',
'yli',
'yll',
'ylm',
'yln',
'ylo',
'ylr',
'ylu',
'yly',
'yma',
'ymb',
'ymc',
'ymd',
'yme',
'ymg',
'ymh',
'ymi',
'ymk',
'yml',
'ymm',
'ymn',
'ymo',
'ymp',
'ymq',
'ymr',
'yms',
'ymt',
'ymx',
'ymz',
'yna',
'ynd',
'yne',
'yng',
'ynh',
'ynk',
'ynl',
'ynn',
'yno',
'ynq',
'yns',
'ynu',
'yob',
'yog',
'yoi',
'yok',
'yol',
'yom',
'yon',
'yos',
'yot',
'yox',
'yoy',
'ypa',
'ypb',
'ypg',
'yph',
'ypk',
'ypm',
'ypn',
'ypo',
'ypp',
'ypz',
'yra',
'yrb',
'yre',
'yri',
'yrk',
'yrl',
'yrm',
'yrn',
'yro',
'yrs',
'yrw',
'yry',
'ysc',
'ysd',
'ysg',
'ysl',
'ysn',
'yso',
'ysp',
'ysr',
'yss',
'ysy',
'yta',
'ytl',
'ytp',
'ytw',
'yty',
'yua',
'yub',
'yuc',
'yud',
'yue',
'yuf',
'yug',
'yui',
'yuj',
'yuk',
'yul',
'yum',
'yun',
'yup',
'yuq',
'yur',
'yut',
'yuu',
'yuw',
'yux',
'yuy',
'yuz',
'yva',
'yvt',
'ywa',
'ywg',
'ywl',
'ywn',
'ywq',
'ywr',
'ywt',
'ywu',
'yww',
'yxa',
'yxg',
'yxl',
'yxm',
'yxu',
'yxy',
'yyr',
'yyu',
'yyz',
'yzg',
'yzk',
'zaa',
'zab',
'zac',
'zad',
'zae',
'zaf',
'zag',
'zah',
'zai',
'zaj',
'zak',
'zal',
'zam',
'zao',
'zap',
'zaq',
'zar',
'zas',
'zat',
'zau',
'zav',
'zaw',
'zax',
'zay',
'zaz',
'zbc',
'zbe',
'zbl',
'zbt',
'zbw',
'zca',
'zch',
'zdj',
'zea',
'zeg',
'zeh',
'zen',
'zga',
'zgb',
'zgh',
'zgm',
'zgn',
'zgr',
'zhb',
'zhd',
'zhi',
'zhn',
'zhw',
'zhx',
'zia',
'zib',
'zik',
'zil',
'zim',
'zin',
'zir',
'ziw',
'ziz',
'zka',
'zkb',
'zkd',
'zkg',
'zkh',
'zkk',
'zkn',
'zko',
'zkp',
'zkr',
'zkt',
'zku',
'zkv',
'zkz',
'zle',
'zlj',
'zlm',
'zln',
'zlq',
'zls',
'zlw',
'zma',
'zmb',
'zmc',
'zmd',
'zme',
'zmf',
'zmg',
'zmh',
'zmi',
'zmj',
'zmk',
'zml',
'zmm',
'zmn',
'zmo',
'zmp',
'zmq',
'zmr',
'zms',
'zmt',
'zmu',
'zmv',
'zmw',
'zmx',
'zmy',
'zmz',
'zna',
'znd',
'zne',
'zng',
'znk',
'zns',
'zoc',
'zoh',
'zom',
'zoo',
'zoq',
'zor',
'zos',
'zpa',
'zpb',
'zpc',
'zpd',
'zpe',
'zpf',
'zpg',
'zph',
'zpi',
'zpj',
'zpk',
'zpl',
'zpm',
'zpn',
'zpo',
'zpp',
'zpq',
'zpr',
'zps',
'zpt',
'zpu',
'zpv',
'zpw',
'zpx',
'zpy',
'zpz',
'zqe',
'zra',
'zrg',
'zrn',
'zro',
'zrp',
'zrs',
'zsa',
'zsk',
'zsl',
'zsm',
'zsr',
'zsu',
'zte',
'ztg',
'ztl',
'ztm',
'ztn',
'ztp',
'ztq',
'zts',
'ztt',
'ztu',
'ztx',
'zty',
'zua',
'zuh',
'zum',
'zun',
'zuy',
'zwa',
'zxx',
'zyb',
'zyg',
'zyj',
'zyn',
'zyp',
'zza',
'zzj'];








axe.utils.validLangs=function(){
'use strict';
return langs;
};

},{}],97:[function(require,module,exports){
'use strict';

exports.byteLength=byteLength;
exports.toByteArray=toByteArray;
exports.fromByteArray=fromByteArray;

var lookup=[];
var revLookup=[];
var Arr=typeof Uint8Array!=='undefined'?Uint8Array:Array;

var code='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
for(var i=0,len=code.length;i<len;++i){
lookup[i]=code[i];
revLookup[code.charCodeAt(i)]=i;
}



revLookup['-'.charCodeAt(0)]=62;
revLookup['_'.charCodeAt(0)]=63;

function getLens(b64){
var len=b64.length;

if(len%4>0){
throw new Error('Invalid string. Length must be a multiple of 4');
}



var validLen=b64.indexOf('=');
if(validLen===-1)validLen=len;

var placeHoldersLen=validLen===len?
0:
4-validLen%4;

return[validLen,placeHoldersLen];
}


function byteLength(b64){
var lens=getLens(b64);
var validLen=lens[0];
var placeHoldersLen=lens[1];
return(validLen+placeHoldersLen)*3/4-placeHoldersLen;
}

function _byteLength(b64,validLen,placeHoldersLen){
return(validLen+placeHoldersLen)*3/4-placeHoldersLen;
}

function toByteArray(b64){
var tmp;
var lens=getLens(b64);
var validLen=lens[0];
var placeHoldersLen=lens[1];

var arr=new Arr(_byteLength(b64,validLen,placeHoldersLen));

var curByte=0;


var len=placeHoldersLen>0?
validLen-4:
validLen;

for(var i=0;i<len;i+=4){
tmp=
revLookup[b64.charCodeAt(i)]<<18|
revLookup[b64.charCodeAt(i+1)]<<12|
revLookup[b64.charCodeAt(i+2)]<<6|
revLookup[b64.charCodeAt(i+3)];
arr[curByte++]=tmp>>16&0xFF;
arr[curByte++]=tmp>>8&0xFF;
arr[curByte++]=tmp&0xFF;
}

if(placeHoldersLen===2){
tmp=
revLookup[b64.charCodeAt(i)]<<2|
revLookup[b64.charCodeAt(i+1)]>>4;
arr[curByte++]=tmp&0xFF;
}

if(placeHoldersLen===1){
tmp=
revLookup[b64.charCodeAt(i)]<<10|
revLookup[b64.charCodeAt(i+1)]<<4|
revLookup[b64.charCodeAt(i+2)]>>2;
arr[curByte++]=tmp>>8&0xFF;
arr[curByte++]=tmp&0xFF;
}

return arr;
}

function tripletToBase64(num){
return lookup[num>>18&0x3F]+
lookup[num>>12&0x3F]+
lookup[num>>6&0x3F]+
lookup[num&0x3F];
}

function encodeChunk(uint8,start,end){
var tmp;
var output=[];
for(var i=start;i<end;i+=3){
tmp=
(uint8[i]<<16&0xFF0000)+(
uint8[i+1]<<8&0xFF00)+(
uint8[i+2]&0xFF);
output.push(tripletToBase64(tmp));
}
return output.join('');
}

function fromByteArray(uint8){
var tmp;
var len=uint8.length;
var extraBytes=len%3;
var parts=[];
var maxChunkLength=16383;


for(var i=0,len2=len-extraBytes;i<len2;i+=maxChunkLength){
parts.push(encodeChunk(
uint8,i,i+maxChunkLength>len2?len2:i+maxChunkLength));

}


if(extraBytes===1){
tmp=uint8[len-1];
parts.push(
lookup[tmp>>2]+
lookup[tmp<<4&0x3F]+
'==');

}else if(extraBytes===2){
tmp=(uint8[len-2]<<8)+uint8[len-1];
parts.push(
lookup[tmp>>10]+
lookup[tmp>>4&0x3F]+
lookup[tmp<<2&0x3F]+
'=');

}

return parts.join('');
}

},{}],98:[function(require,module,exports){

},{}],99:[function(require,module,exports){
(function(process,Buffer){
'use strict';


var assert=require('assert');

var Zstream=require('pako/lib/zlib/zstream');
var zlib_deflate=require('pako/lib/zlib/deflate.js');
var zlib_inflate=require('pako/lib/zlib/inflate.js');
var constants=require('pako/lib/zlib/constants');

for(var key in constants){
exports[key]=constants[key];
}


exports.NONE=0;
exports.DEFLATE=1;
exports.INFLATE=2;
exports.GZIP=3;
exports.GUNZIP=4;
exports.DEFLATERAW=5;
exports.INFLATERAW=6;
exports.UNZIP=7;

var GZIP_HEADER_ID1=0x1f;
var GZIP_HEADER_ID2=0x8b;




function Zlib(mode){
if(typeof mode!=='number'||mode<exports.DEFLATE||mode>exports.UNZIP){
throw new TypeError('Bad argument');
}

this.dictionary=null;
this.err=0;
this.flush=0;
this.init_done=false;
this.level=0;
this.memLevel=0;
this.mode=mode;
this.strategy=0;
this.windowBits=0;
this.write_in_progress=false;
this.pending_close=false;
this.gzip_id_bytes_read=0;
}

Zlib.prototype.close=function(){
if(this.write_in_progress){
this.pending_close=true;
return;
}

this.pending_close=false;

assert(this.init_done,'close before init');
assert(this.mode<=exports.UNZIP);

if(this.mode===exports.DEFLATE||this.mode===exports.GZIP||this.mode===exports.DEFLATERAW){
zlib_deflate.deflateEnd(this.strm);
}else if(this.mode===exports.INFLATE||this.mode===exports.GUNZIP||this.mode===exports.INFLATERAW||this.mode===exports.UNZIP){
zlib_inflate.inflateEnd(this.strm);
}

this.mode=exports.NONE;

this.dictionary=null;
};

Zlib.prototype.write=function(flush,input,in_off,in_len,out,out_off,out_len){
return this._write(true,flush,input,in_off,in_len,out,out_off,out_len);
};

Zlib.prototype.writeSync=function(flush,input,in_off,in_len,out,out_off,out_len){
return this._write(false,flush,input,in_off,in_len,out,out_off,out_len);
};

Zlib.prototype._write=function(async,flush,input,in_off,in_len,out,out_off,out_len){
assert.equal(arguments.length,8);

assert(this.init_done,'write before init');
assert(this.mode!==exports.NONE,'already finalized');
assert.equal(false,this.write_in_progress,'write already in progress');
assert.equal(false,this.pending_close,'close is pending');

this.write_in_progress=true;

assert.equal(false,flush===undefined,'must provide flush value');

this.write_in_progress=true;

if(flush!==exports.Z_NO_FLUSH&&flush!==exports.Z_PARTIAL_FLUSH&&flush!==exports.Z_SYNC_FLUSH&&flush!==exports.Z_FULL_FLUSH&&flush!==exports.Z_FINISH&&flush!==exports.Z_BLOCK){
throw new Error('Invalid flush value');
}

if(input==null){
input=Buffer.alloc(0);
in_len=0;
in_off=0;
}

this.strm.avail_in=in_len;
this.strm.input=input;
this.strm.next_in=in_off;
this.strm.avail_out=out_len;
this.strm.output=out;
this.strm.next_out=out_off;
this.flush=flush;

if(!async){

this._process();

if(this._checkError()){
return this._afterSync();
}
return;
}


var self=this;
process.nextTick(function(){
self._process();
self._after();
});

return this;
};

Zlib.prototype._afterSync=function(){
var avail_out=this.strm.avail_out;
var avail_in=this.strm.avail_in;

this.write_in_progress=false;

return[avail_in,avail_out];
};

Zlib.prototype._process=function(){
var next_expected_header_byte=null;




switch(this.mode){
case exports.DEFLATE:
case exports.GZIP:
case exports.DEFLATERAW:
this.err=zlib_deflate.deflate(this.strm,this.flush);
break;
case exports.UNZIP:
if(this.strm.avail_in>0){
next_expected_header_byte=this.strm.next_in;
}

switch(this.gzip_id_bytes_read){
case 0:
if(next_expected_header_byte===null){
break;
}

if(this.strm.input[next_expected_header_byte]===GZIP_HEADER_ID1){
this.gzip_id_bytes_read=1;
next_expected_header_byte++;

if(this.strm.avail_in===1){

break;
}
}else{
this.mode=exports.INFLATE;
break;
}


case 1:
if(next_expected_header_byte===null){
break;
}

if(this.strm.input[next_expected_header_byte]===GZIP_HEADER_ID2){
this.gzip_id_bytes_read=2;
this.mode=exports.GUNZIP;
}else{


this.mode=exports.INFLATE;
}

break;
default:
throw new Error('invalid number of gzip magic number bytes read');}



case exports.INFLATE:
case exports.GUNZIP:
case exports.INFLATERAW:
this.err=zlib_inflate.inflate(this.strm,this.flush);


if(this.err===exports.Z_NEED_DICT&&this.dictionary){

this.err=zlib_inflate.inflateSetDictionary(this.strm,this.dictionary);
if(this.err===exports.Z_OK){

this.err=zlib_inflate.inflate(this.strm,this.flush);
}else if(this.err===exports.Z_DATA_ERROR){



this.err=exports.Z_NEED_DICT;
}
}
while(this.strm.avail_in>0&&this.mode===exports.GUNZIP&&this.err===exports.Z_STREAM_END&&this.strm.next_in[0]!==0x00){





this.reset();
this.err=zlib_inflate.inflate(this.strm,this.flush);
}
break;
default:
throw new Error('Unknown mode '+this.mode);}

};

Zlib.prototype._checkError=function(){

switch(this.err){
case exports.Z_OK:
case exports.Z_BUF_ERROR:
if(this.strm.avail_out!==0&&this.flush===exports.Z_FINISH){
this._error('unexpected end of file');
return false;
}
break;
case exports.Z_STREAM_END:

break;
case exports.Z_NEED_DICT:
if(this.dictionary==null){
this._error('Missing dictionary');
}else{
this._error('Bad dictionary');
}
return false;
default:

this._error('Zlib error');
return false;}


return true;
};

Zlib.prototype._after=function(){
if(!this._checkError()){
return;
}

var avail_out=this.strm.avail_out;
var avail_in=this.strm.avail_in;

this.write_in_progress=false;


this.callback(avail_in,avail_out);

if(this.pending_close){
this.close();
}
};

Zlib.prototype._error=function(message){
if(this.strm.msg){
message=this.strm.msg;
}
this.onerror(message,this.err);


this.write_in_progress=false;
if(this.pending_close){
this.close();
}
};

Zlib.prototype.init=function(windowBits,level,memLevel,strategy,dictionary){
assert(arguments.length===4||arguments.length===5,'init(windowBits, level, memLevel, strategy, [dictionary])');

assert(windowBits>=8&&windowBits<=15,'invalid windowBits');
assert(level>=-1&&level<=9,'invalid compression level');

assert(memLevel>=1&&memLevel<=9,'invalid memlevel');

assert(strategy===exports.Z_FILTERED||strategy===exports.Z_HUFFMAN_ONLY||strategy===exports.Z_RLE||strategy===exports.Z_FIXED||strategy===exports.Z_DEFAULT_STRATEGY,'invalid strategy');

this._init(level,windowBits,memLevel,strategy,dictionary);
this._setDictionary();
};

Zlib.prototype.params=function(){
throw new Error('deflateParams Not supported');
};

Zlib.prototype.reset=function(){
this._reset();
this._setDictionary();
};

Zlib.prototype._init=function(level,windowBits,memLevel,strategy,dictionary){
this.level=level;
this.windowBits=windowBits;
this.memLevel=memLevel;
this.strategy=strategy;

this.flush=exports.Z_NO_FLUSH;

this.err=exports.Z_OK;

if(this.mode===exports.GZIP||this.mode===exports.GUNZIP){
this.windowBits+=16;
}

if(this.mode===exports.UNZIP){
this.windowBits+=32;
}

if(this.mode===exports.DEFLATERAW||this.mode===exports.INFLATERAW){
this.windowBits=-1*this.windowBits;
}

this.strm=new Zstream();

switch(this.mode){
case exports.DEFLATE:
case exports.GZIP:
case exports.DEFLATERAW:
this.err=zlib_deflate.deflateInit2(this.strm,this.level,exports.Z_DEFLATED,this.windowBits,this.memLevel,this.strategy);
break;
case exports.INFLATE:
case exports.GUNZIP:
case exports.INFLATERAW:
case exports.UNZIP:
this.err=zlib_inflate.inflateInit2(this.strm,this.windowBits);
break;
default:
throw new Error('Unknown mode '+this.mode);}


if(this.err!==exports.Z_OK){
this._error('Init error');
}

this.dictionary=dictionary;

this.write_in_progress=false;
this.init_done=true;
};

Zlib.prototype._setDictionary=function(){
if(this.dictionary==null){
return;
}

this.err=exports.Z_OK;

switch(this.mode){
case exports.DEFLATE:
case exports.DEFLATERAW:
this.err=zlib_deflate.deflateSetDictionary(this.strm,this.dictionary);
break;
default:
break;}


if(this.err!==exports.Z_OK){
this._error('Failed to set dictionary');
}
};

Zlib.prototype._reset=function(){
this.err=exports.Z_OK;

switch(this.mode){
case exports.DEFLATE:
case exports.DEFLATERAW:
case exports.GZIP:
this.err=zlib_deflate.deflateReset(this.strm);
break;
case exports.INFLATE:
case exports.INFLATERAW:
case exports.GUNZIP:
this.err=zlib_inflate.inflateReset(this.strm);
break;
default:
break;}


if(this.err!==exports.Z_OK){
this._error('Failed to reset stream');
}
};

exports.Zlib=Zlib;
}).call(this,require('_process'),require("buffer").Buffer);
},{"_process":158,"assert":92,"buffer":102,"pako/lib/zlib/constants":149,"pako/lib/zlib/deflate.js":151,"pako/lib/zlib/inflate.js":101,"pako/lib/zlib/zstream":154}],100:[function(require,module,exports){
(function(process){
'use strict';

var Buffer=require('buffer').Buffer;
var Transform=require('stream').Transform;
var binding=require('./binding');
var util=require('util');
var assert=require('assert').ok;
var kMaxLength=require('buffer').kMaxLength;
var kRangeErrorMessage='Cannot create final Buffer. It would be larger '+'than 0x'+kMaxLength.toString(16)+' bytes';



binding.Z_MIN_WINDOWBITS=8;
binding.Z_MAX_WINDOWBITS=15;
binding.Z_DEFAULT_WINDOWBITS=15;




binding.Z_MIN_CHUNK=64;
binding.Z_MAX_CHUNK=Infinity;
binding.Z_DEFAULT_CHUNK=16*1024;

binding.Z_MIN_MEMLEVEL=1;
binding.Z_MAX_MEMLEVEL=9;
binding.Z_DEFAULT_MEMLEVEL=8;

binding.Z_MIN_LEVEL=-1;
binding.Z_MAX_LEVEL=9;
binding.Z_DEFAULT_LEVEL=binding.Z_DEFAULT_COMPRESSION;


var bkeys=Object.keys(binding);
for(var bk=0;bk<bkeys.length;bk++){
var bkey=bkeys[bk];
if(bkey.match(/^Z/)){
Object.defineProperty(exports,bkey,{
enumerable:true,value:binding[bkey],writable:false});

}
}


var codes={
Z_OK:binding.Z_OK,
Z_STREAM_END:binding.Z_STREAM_END,
Z_NEED_DICT:binding.Z_NEED_DICT,
Z_ERRNO:binding.Z_ERRNO,
Z_STREAM_ERROR:binding.Z_STREAM_ERROR,
Z_DATA_ERROR:binding.Z_DATA_ERROR,
Z_MEM_ERROR:binding.Z_MEM_ERROR,
Z_BUF_ERROR:binding.Z_BUF_ERROR,
Z_VERSION_ERROR:binding.Z_VERSION_ERROR};


var ckeys=Object.keys(codes);
for(var ck=0;ck<ckeys.length;ck++){
var ckey=ckeys[ck];
codes[codes[ckey]]=ckey;
}

Object.defineProperty(exports,'codes',{
enumerable:true,value:Object.freeze(codes),writable:false});


exports.Deflate=Deflate;
exports.Inflate=Inflate;
exports.Gzip=Gzip;
exports.Gunzip=Gunzip;
exports.DeflateRaw=DeflateRaw;
exports.InflateRaw=InflateRaw;
exports.Unzip=Unzip;

exports.createDeflate=function(o){
return new Deflate(o);
};

exports.createInflate=function(o){
return new Inflate(o);
};

exports.createDeflateRaw=function(o){
return new DeflateRaw(o);
};

exports.createInflateRaw=function(o){
return new InflateRaw(o);
};

exports.createGzip=function(o){
return new Gzip(o);
};

exports.createGunzip=function(o){
return new Gunzip(o);
};

exports.createUnzip=function(o){
return new Unzip(o);
};



exports.deflate=function(buffer,opts,callback){
if(typeof opts==='function'){
callback=opts;
opts={};
}
return zlibBuffer(new Deflate(opts),buffer,callback);
};

exports.deflateSync=function(buffer,opts){
return zlibBufferSync(new Deflate(opts),buffer);
};

exports.gzip=function(buffer,opts,callback){
if(typeof opts==='function'){
callback=opts;
opts={};
}
return zlibBuffer(new Gzip(opts),buffer,callback);
};

exports.gzipSync=function(buffer,opts){
return zlibBufferSync(new Gzip(opts),buffer);
};

exports.deflateRaw=function(buffer,opts,callback){
if(typeof opts==='function'){
callback=opts;
opts={};
}
return zlibBuffer(new DeflateRaw(opts),buffer,callback);
};

exports.deflateRawSync=function(buffer,opts){
return zlibBufferSync(new DeflateRaw(opts),buffer);
};

exports.unzip=function(buffer,opts,callback){
if(typeof opts==='function'){
callback=opts;
opts={};
}
return zlibBuffer(new Unzip(opts),buffer,callback);
};

exports.unzipSync=function(buffer,opts){
return zlibBufferSync(new Unzip(opts),buffer);
};

exports.inflate=function(buffer,opts,callback){
if(typeof opts==='function'){
callback=opts;
opts={};
}
return zlibBuffer(new Inflate(opts),buffer,callback);
};

exports.inflateSync=function(buffer,opts){
return zlibBufferSync(new Inflate(opts),buffer);
};

exports.gunzip=function(buffer,opts,callback){
if(typeof opts==='function'){
callback=opts;
opts={};
}
return zlibBuffer(new Gunzip(opts),buffer,callback);
};

exports.gunzipSync=function(buffer,opts){
return zlibBufferSync(new Gunzip(opts),buffer);
};

exports.inflateRaw=function(buffer,opts,callback){
if(typeof opts==='function'){
callback=opts;
opts={};
}
return zlibBuffer(new InflateRaw(opts),buffer,callback);
};

exports.inflateRawSync=function(buffer,opts){
return zlibBufferSync(new InflateRaw(opts),buffer);
};

function zlibBuffer(engine,buffer,callback){
var buffers=[];
var nread=0;

engine.on('error',onError);
engine.on('end',onEnd);

engine.end(buffer);
flow();

function flow(){
var chunk;
while(null!==(chunk=engine.read())){
buffers.push(chunk);
nread+=chunk.length;
}
engine.once('readable',flow);
}

function onError(err){
engine.removeListener('end',onEnd);
engine.removeListener('readable',flow);
callback(err);
}

function onEnd(){
var buf;
var err=null;

if(nread>=kMaxLength){
err=new RangeError(kRangeErrorMessage);
}else{
buf=Buffer.concat(buffers,nread);
}

buffers=[];
engine.close();
callback(err,buf);
}
}

function zlibBufferSync(engine,buffer){
if(typeof buffer==='string')buffer=Buffer.from(buffer);

if(!Buffer.isBuffer(buffer))throw new TypeError('Not a string or buffer');

var flushFlag=engine._finishFlushFlag;

return engine._processChunk(buffer,flushFlag);
}



function Deflate(opts){
if(!(this instanceof Deflate))return new Deflate(opts);
Zlib.call(this,opts,binding.DEFLATE);
}

function Inflate(opts){
if(!(this instanceof Inflate))return new Inflate(opts);
Zlib.call(this,opts,binding.INFLATE);
}


function Gzip(opts){
if(!(this instanceof Gzip))return new Gzip(opts);
Zlib.call(this,opts,binding.GZIP);
}

function Gunzip(opts){
if(!(this instanceof Gunzip))return new Gunzip(opts);
Zlib.call(this,opts,binding.GUNZIP);
}


function DeflateRaw(opts){
if(!(this instanceof DeflateRaw))return new DeflateRaw(opts);
Zlib.call(this,opts,binding.DEFLATERAW);
}

function InflateRaw(opts){
if(!(this instanceof InflateRaw))return new InflateRaw(opts);
Zlib.call(this,opts,binding.INFLATERAW);
}


function Unzip(opts){
if(!(this instanceof Unzip))return new Unzip(opts);
Zlib.call(this,opts,binding.UNZIP);
}

function isValidFlushFlag(flag){
return flag===binding.Z_NO_FLUSH||flag===binding.Z_PARTIAL_FLUSH||flag===binding.Z_SYNC_FLUSH||flag===binding.Z_FULL_FLUSH||flag===binding.Z_FINISH||flag===binding.Z_BLOCK;
}






function Zlib(opts,mode){
var _this=this;

this._opts=opts=opts||{};
this._chunkSize=opts.chunkSize||exports.Z_DEFAULT_CHUNK;

Transform.call(this,opts);

if(opts.flush&&!isValidFlushFlag(opts.flush)){
throw new Error('Invalid flush flag: '+opts.flush);
}
if(opts.finishFlush&&!isValidFlushFlag(opts.finishFlush)){
throw new Error('Invalid flush flag: '+opts.finishFlush);
}

this._flushFlag=opts.flush||binding.Z_NO_FLUSH;
this._finishFlushFlag=typeof opts.finishFlush!=='undefined'?opts.finishFlush:binding.Z_FINISH;

if(opts.chunkSize){
if(opts.chunkSize<exports.Z_MIN_CHUNK||opts.chunkSize>exports.Z_MAX_CHUNK){
throw new Error('Invalid chunk size: '+opts.chunkSize);
}
}

if(opts.windowBits){
if(opts.windowBits<exports.Z_MIN_WINDOWBITS||opts.windowBits>exports.Z_MAX_WINDOWBITS){
throw new Error('Invalid windowBits: '+opts.windowBits);
}
}

if(opts.level){
if(opts.level<exports.Z_MIN_LEVEL||opts.level>exports.Z_MAX_LEVEL){
throw new Error('Invalid compression level: '+opts.level);
}
}

if(opts.memLevel){
if(opts.memLevel<exports.Z_MIN_MEMLEVEL||opts.memLevel>exports.Z_MAX_MEMLEVEL){
throw new Error('Invalid memLevel: '+opts.memLevel);
}
}

if(opts.strategy){
if(opts.strategy!=exports.Z_FILTERED&&opts.strategy!=exports.Z_HUFFMAN_ONLY&&opts.strategy!=exports.Z_RLE&&opts.strategy!=exports.Z_FIXED&&opts.strategy!=exports.Z_DEFAULT_STRATEGY){
throw new Error('Invalid strategy: '+opts.strategy);
}
}

if(opts.dictionary){
if(!Buffer.isBuffer(opts.dictionary)){
throw new Error('Invalid dictionary: it should be a Buffer instance');
}
}

this._handle=new binding.Zlib(mode);

var self=this;
this._hadError=false;
this._handle.onerror=function(message,errno){


_close(self);
self._hadError=true;

var error=new Error(message);
error.errno=errno;
error.code=exports.codes[errno];
self.emit('error',error);
};

var level=exports.Z_DEFAULT_COMPRESSION;
if(typeof opts.level==='number')level=opts.level;

var strategy=exports.Z_DEFAULT_STRATEGY;
if(typeof opts.strategy==='number')strategy=opts.strategy;

this._handle.init(opts.windowBits||exports.Z_DEFAULT_WINDOWBITS,level,opts.memLevel||exports.Z_DEFAULT_MEMLEVEL,strategy,opts.dictionary);

this._buffer=Buffer.allocUnsafe(this._chunkSize);
this._offset=0;
this._level=level;
this._strategy=strategy;

this.once('end',this.close);

Object.defineProperty(this,'_closed',{
get:function(){
return!_this._handle;
},
configurable:true,
enumerable:true});

}

util.inherits(Zlib,Transform);

Zlib.prototype.params=function(level,strategy,callback){
if(level<exports.Z_MIN_LEVEL||level>exports.Z_MAX_LEVEL){
throw new RangeError('Invalid compression level: '+level);
}
if(strategy!=exports.Z_FILTERED&&strategy!=exports.Z_HUFFMAN_ONLY&&strategy!=exports.Z_RLE&&strategy!=exports.Z_FIXED&&strategy!=exports.Z_DEFAULT_STRATEGY){
throw new TypeError('Invalid strategy: '+strategy);
}

if(this._level!==level||this._strategy!==strategy){
var self=this;
this.flush(binding.Z_SYNC_FLUSH,function(){
assert(self._handle,'zlib binding closed');
self._handle.params(level,strategy);
if(!self._hadError){
self._level=level;
self._strategy=strategy;
if(callback)callback();
}
});
}else{
process.nextTick(callback);
}
};

Zlib.prototype.reset=function(){
assert(this._handle,'zlib binding closed');
return this._handle.reset();
};



Zlib.prototype._flush=function(callback){
this._transform(Buffer.alloc(0),'',callback);
};

Zlib.prototype.flush=function(kind,callback){
var _this2=this;

var ws=this._writableState;

if(typeof kind==='function'||kind===undefined&&!callback){
callback=kind;
kind=binding.Z_FULL_FLUSH;
}

if(ws.ended){
if(callback)process.nextTick(callback);
}else if(ws.ending){
if(callback)this.once('end',callback);
}else if(ws.needDrain){
if(callback){
this.once('drain',function(){
return _this2.flush(kind,callback);
});
}
}else{
this._flushFlag=kind;
this.write(Buffer.alloc(0),'',callback);
}
};

Zlib.prototype.close=function(callback){
_close(this,callback);
process.nextTick(emitCloseNT,this);
};

function _close(engine,callback){
if(callback)process.nextTick(callback);


if(!engine._handle)return;

engine._handle.close();
engine._handle=null;
}

function emitCloseNT(self){
self.emit('close');
}

Zlib.prototype._transform=function(chunk,encoding,cb){
var flushFlag;
var ws=this._writableState;
var ending=ws.ending||ws.ended;
var last=ending&&(!chunk||ws.length===chunk.length);

if(chunk!==null&&!Buffer.isBuffer(chunk))return cb(new Error('invalid input'));

if(!this._handle)return cb(new Error('zlib binding closed'));






if(last)flushFlag=this._finishFlushFlag;else{
flushFlag=this._flushFlag;


if(chunk.length>=ws.length){
this._flushFlag=this._opts.flush||binding.Z_NO_FLUSH;
}
}

this._processChunk(chunk,flushFlag,cb);
};

Zlib.prototype._processChunk=function(chunk,flushFlag,cb){
var availInBefore=chunk&&chunk.length;
var availOutBefore=this._chunkSize-this._offset;
var inOff=0;

var self=this;

var async=typeof cb==='function';

if(!async){
var buffers=[];
var nread=0;

var error;
this.on('error',function(er){
error=er;
});

assert(this._handle,'zlib binding closed');
do{
var res=this._handle.writeSync(flushFlag,chunk,
inOff,
availInBefore,
this._buffer,
this._offset,
availOutBefore);
}while(!this._hadError&&callback(res[0],res[1]));

if(this._hadError){
throw error;
}

if(nread>=kMaxLength){
_close(this);
throw new RangeError(kRangeErrorMessage);
}

var buf=Buffer.concat(buffers,nread);
_close(this);

return buf;
}

assert(this._handle,'zlib binding closed');
var req=this._handle.write(flushFlag,chunk,
inOff,
availInBefore,
this._buffer,
this._offset,
availOutBefore);

req.buffer=chunk;
req.callback=callback;

function callback(availInAfter,availOutAfter){





if(this){
this.buffer=null;
this.callback=null;
}

if(self._hadError)return;

var have=availOutBefore-availOutAfter;
assert(have>=0,'have should not go down');

if(have>0){
var out=self._buffer.slice(self._offset,self._offset+have);
self._offset+=have;

if(async){
self.push(out);
}else{
buffers.push(out);
nread+=out.length;
}
}


if(availOutAfter===0||self._offset>=self._chunkSize){
availOutBefore=self._chunkSize;
self._offset=0;
self._buffer=Buffer.allocUnsafe(self._chunkSize);
}

if(availOutAfter===0){




inOff+=availInBefore-availInAfter;
availInBefore=availInAfter;

if(!async)return true;

var newReq=self._handle.write(flushFlag,chunk,inOff,availInBefore,self._buffer,self._offset,self._chunkSize);
newReq.callback=callback;
newReq.buffer=chunk;
return;
}

if(!async)return false;


cb();
}
};

util.inherits(Deflate,Zlib);
util.inherits(Inflate,Zlib);
util.inherits(Gzip,Zlib);
util.inherits(Gunzip,Zlib);
util.inherits(DeflateRaw,Zlib);
util.inherits(InflateRaw,Zlib);
util.inherits(Unzip,Zlib);
}).call(this,require('_process'));
},{"./binding":99,"_process":158,"assert":92,"buffer":102,"stream":183,"util":191}],101:[function(require,module,exports){
arguments[4][98][0].apply(exports,arguments);
},{"dup":98}],102:[function(require,module,exports){
(function(Buffer){








'use strict';

var base64=require('base64-js');
var ieee754=require('ieee754');

exports.Buffer=Buffer;
exports.SlowBuffer=SlowBuffer;
exports.INSPECT_MAX_BYTES=50;

var K_MAX_LENGTH=0x7fffffff;
exports.kMaxLength=K_MAX_LENGTH;















Buffer.TYPED_ARRAY_SUPPORT=typedArraySupport();

if(!Buffer.TYPED_ARRAY_SUPPORT&&typeof console!=='undefined'&&
typeof console.error==='function'){
console.error(
'This browser lacks typed array (Uint8Array) support which is required by '+
'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.');

}

function typedArraySupport(){

try{
var arr=new Uint8Array(1);
arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42;}};
return arr.foo()===42;
}catch(e){
return false;
}
}

Object.defineProperty(Buffer.prototype,'parent',{
enumerable:true,
get:function(){
if(!Buffer.isBuffer(this))return undefined;
return this.buffer;
}});


Object.defineProperty(Buffer.prototype,'offset',{
enumerable:true,
get:function(){
if(!Buffer.isBuffer(this))return undefined;
return this.byteOffset;
}});


function createBuffer(length){
if(length>K_MAX_LENGTH){
throw new RangeError('The value "'+length+'" is invalid for option "size"');
}

var buf=new Uint8Array(length);
buf.__proto__=Buffer.prototype;
return buf;
}











function Buffer(arg,encodingOrOffset,length){

if(typeof arg==='number'){
if(typeof encodingOrOffset==='string'){
throw new TypeError(
'The "string" argument must be of type string. Received type number');

}
return allocUnsafe(arg);
}
return from(arg,encodingOrOffset,length);
}


if(typeof Symbol!=='undefined'&&Symbol.species!=null&&
Buffer[Symbol.species]===Buffer){
Object.defineProperty(Buffer,Symbol.species,{
value:null,
configurable:true,
enumerable:false,
writable:false});

}

Buffer.poolSize=8192;

function from(value,encodingOrOffset,length){
if(typeof value==='string'){
return fromString(value,encodingOrOffset);
}

if(ArrayBuffer.isView(value)){
return fromArrayLike(value);
}

if(value==null){
throw TypeError(
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, '+
'or Array-like Object. Received type '+typeof value);

}

if(isInstance(value,ArrayBuffer)||
value&&isInstance(value.buffer,ArrayBuffer)){
return fromArrayBuffer(value,encodingOrOffset,length);
}

if(typeof value==='number'){
throw new TypeError(
'The "value" argument must not be of type number. Received type number');

}

var valueOf=value.valueOf&&value.valueOf();
if(valueOf!=null&&valueOf!==value){
return Buffer.from(valueOf,encodingOrOffset,length);
}

var b=fromObject(value);
if(b)return b;

if(typeof Symbol!=='undefined'&&Symbol.toPrimitive!=null&&
typeof value[Symbol.toPrimitive]==='function'){
return Buffer.from(
value[Symbol.toPrimitive]('string'),encodingOrOffset,length);

}

throw new TypeError(
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, '+
'or Array-like Object. Received type '+typeof value);

}









Buffer.from=function(value,encodingOrOffset,length){
return from(value,encodingOrOffset,length);
};



Buffer.prototype.__proto__=Uint8Array.prototype;
Buffer.__proto__=Uint8Array;

function assertSize(size){
if(typeof size!=='number'){
throw new TypeError('"size" argument must be of type number');
}else if(size<0){
throw new RangeError('The value "'+size+'" is invalid for option "size"');
}
}

function alloc(size,fill,encoding){
assertSize(size);
if(size<=0){
return createBuffer(size);
}
if(fill!==undefined){



return typeof encoding==='string'?
createBuffer(size).fill(fill,encoding):
createBuffer(size).fill(fill);
}
return createBuffer(size);
}





Buffer.alloc=function(size,fill,encoding){
return alloc(size,fill,encoding);
};

function allocUnsafe(size){
assertSize(size);
return createBuffer(size<0?0:checked(size)|0);
}




Buffer.allocUnsafe=function(size){
return allocUnsafe(size);
};



Buffer.allocUnsafeSlow=function(size){
return allocUnsafe(size);
};

function fromString(string,encoding){
if(typeof encoding!=='string'||encoding===''){
encoding='utf8';
}

if(!Buffer.isEncoding(encoding)){
throw new TypeError('Unknown encoding: '+encoding);
}

var length=byteLength(string,encoding)|0;
var buf=createBuffer(length);

var actual=buf.write(string,encoding);

if(actual!==length){



buf=buf.slice(0,actual);
}

return buf;
}

function fromArrayLike(array){
var length=array.length<0?0:checked(array.length)|0;
var buf=createBuffer(length);
for(var i=0;i<length;i+=1){
buf[i]=array[i]&255;
}
return buf;
}

function fromArrayBuffer(array,byteOffset,length){
if(byteOffset<0||array.byteLength<byteOffset){
throw new RangeError('"offset" is outside of buffer bounds');
}

if(array.byteLength<byteOffset+(length||0)){
throw new RangeError('"length" is outside of buffer bounds');
}

var buf;
if(byteOffset===undefined&&length===undefined){
buf=new Uint8Array(array);
}else if(length===undefined){
buf=new Uint8Array(array,byteOffset);
}else{
buf=new Uint8Array(array,byteOffset,length);
}


buf.__proto__=Buffer.prototype;
return buf;
}

function fromObject(obj){
if(Buffer.isBuffer(obj)){
var len=checked(obj.length)|0;
var buf=createBuffer(len);

if(buf.length===0){
return buf;
}

obj.copy(buf,0,0,len);
return buf;
}

if(obj.length!==undefined){
if(typeof obj.length!=='number'||numberIsNaN(obj.length)){
return createBuffer(0);
}
return fromArrayLike(obj);
}

if(obj.type==='Buffer'&&Array.isArray(obj.data)){
return fromArrayLike(obj.data);
}
}

function checked(length){


if(length>=K_MAX_LENGTH){
throw new RangeError('Attempt to allocate Buffer larger than maximum '+
'size: 0x'+K_MAX_LENGTH.toString(16)+' bytes');
}
return length|0;
}

function SlowBuffer(length){
if(+length!=length){
length=0;
}
return Buffer.alloc(+length);
}

Buffer.isBuffer=function isBuffer(b){
return b!=null&&b._isBuffer===true&&
b!==Buffer.prototype;
};

Buffer.compare=function compare(a,b){
if(isInstance(a,Uint8Array))a=Buffer.from(a,a.offset,a.byteLength);
if(isInstance(b,Uint8Array))b=Buffer.from(b,b.offset,b.byteLength);
if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){
throw new TypeError(
'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');

}

if(a===b)return 0;

var x=a.length;
var y=b.length;

for(var i=0,len=Math.min(x,y);i<len;++i){
if(a[i]!==b[i]){
x=a[i];
y=b[i];
break;
}
}

if(x<y)return-1;
if(y<x)return 1;
return 0;
};

Buffer.isEncoding=function isEncoding(encoding){
switch(String(encoding).toLowerCase()){
case'hex':
case'utf8':
case'utf-8':
case'ascii':
case'latin1':
case'binary':
case'base64':
case'ucs2':
case'ucs-2':
case'utf16le':
case'utf-16le':
return true;
default:
return false;}

};

Buffer.concat=function concat(list,length){
if(!Array.isArray(list)){
throw new TypeError('"list" argument must be an Array of Buffers');
}

if(list.length===0){
return Buffer.alloc(0);
}

var i;
if(length===undefined){
length=0;
for(i=0;i<list.length;++i){
length+=list[i].length;
}
}

var buffer=Buffer.allocUnsafe(length);
var pos=0;
for(i=0;i<list.length;++i){
var buf=list[i];
if(isInstance(buf,Uint8Array)){
buf=Buffer.from(buf);
}
if(!Buffer.isBuffer(buf)){
throw new TypeError('"list" argument must be an Array of Buffers');
}
buf.copy(buffer,pos);
pos+=buf.length;
}
return buffer;
};

function byteLength(string,encoding){
if(Buffer.isBuffer(string)){
return string.length;
}
if(ArrayBuffer.isView(string)||isInstance(string,ArrayBuffer)){
return string.byteLength;
}
if(typeof string!=='string'){
throw new TypeError(
'The "string" argument must be one of type string, Buffer, or ArrayBuffer. '+
'Received type '+typeof string);

}

var len=string.length;
var mustMatch=arguments.length>2&&arguments[2]===true;
if(!mustMatch&&len===0)return 0;


var loweredCase=false;
for(;;){
switch(encoding){
case'ascii':
case'latin1':
case'binary':
return len;
case'utf8':
case'utf-8':
return utf8ToBytes(string).length;
case'ucs2':
case'ucs-2':
case'utf16le':
case'utf-16le':
return len*2;
case'hex':
return len>>>1;
case'base64':
return base64ToBytes(string).length;
default:
if(loweredCase){
return mustMatch?-1:utf8ToBytes(string).length;
}
encoding=(''+encoding).toLowerCase();
loweredCase=true;}

}
}
Buffer.byteLength=byteLength;

function slowToString(encoding,start,end){
var loweredCase=false;








if(start===undefined||start<0){
start=0;
}


if(start>this.length){
return'';
}

if(end===undefined||end>this.length){
end=this.length;
}

if(end<=0){
return'';
}


end>>>=0;
start>>>=0;

if(end<=start){
return'';
}

if(!encoding)encoding='utf8';

while(true){
switch(encoding){
case'hex':
return hexSlice(this,start,end);

case'utf8':
case'utf-8':
return utf8Slice(this,start,end);

case'ascii':
return asciiSlice(this,start,end);

case'latin1':
case'binary':
return latin1Slice(this,start,end);

case'base64':
return base64Slice(this,start,end);

case'ucs2':
case'ucs-2':
case'utf16le':
case'utf-16le':
return utf16leSlice(this,start,end);

default:
if(loweredCase)throw new TypeError('Unknown encoding: '+encoding);
encoding=(encoding+'').toLowerCase();
loweredCase=true;}

}
}







Buffer.prototype._isBuffer=true;

function swap(b,n,m){
var i=b[n];
b[n]=b[m];
b[m]=i;
}

Buffer.prototype.swap16=function swap16(){
var len=this.length;
if(len%2!==0){
throw new RangeError('Buffer size must be a multiple of 16-bits');
}
for(var i=0;i<len;i+=2){
swap(this,i,i+1);
}
return this;
};

Buffer.prototype.swap32=function swap32(){
var len=this.length;
if(len%4!==0){
throw new RangeError('Buffer size must be a multiple of 32-bits');
}
for(var i=0;i<len;i+=4){
swap(this,i,i+3);
swap(this,i+1,i+2);
}
return this;
};

Buffer.prototype.swap64=function swap64(){
var len=this.length;
if(len%8!==0){
throw new RangeError('Buffer size must be a multiple of 64-bits');
}
for(var i=0;i<len;i+=8){
swap(this,i,i+7);
swap(this,i+1,i+6);
swap(this,i+2,i+5);
swap(this,i+3,i+4);
}
return this;
};

Buffer.prototype.toString=function toString(){
var length=this.length;
if(length===0)return'';
if(arguments.length===0)return utf8Slice(this,0,length);
return slowToString.apply(this,arguments);
};

Buffer.prototype.toLocaleString=Buffer.prototype.toString;

Buffer.prototype.equals=function equals(b){
if(!Buffer.isBuffer(b))throw new TypeError('Argument must be a Buffer');
if(this===b)return true;
return Buffer.compare(this,b)===0;
};

Buffer.prototype.inspect=function inspect(){
var str='';
var max=exports.INSPECT_MAX_BYTES;
str=this.toString('hex',0,max).replace(/(.{2})/g,'$1 ').trim();
if(this.length>max)str+=' ... ';
return'<Buffer '+str+'>';
};

Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){
if(isInstance(target,Uint8Array)){
target=Buffer.from(target,target.offset,target.byteLength);
}
if(!Buffer.isBuffer(target)){
throw new TypeError(
'The "target" argument must be one of type Buffer or Uint8Array. '+
'Received type '+typeof target);

}

if(start===undefined){
start=0;
}
if(end===undefined){
end=target?target.length:0;
}
if(thisStart===undefined){
thisStart=0;
}
if(thisEnd===undefined){
thisEnd=this.length;
}

if(start<0||end>target.length||thisStart<0||thisEnd>this.length){
throw new RangeError('out of range index');
}

if(thisStart>=thisEnd&&start>=end){
return 0;
}
if(thisStart>=thisEnd){
return-1;
}
if(start>=end){
return 1;
}

start>>>=0;
end>>>=0;
thisStart>>>=0;
thisEnd>>>=0;

if(this===target)return 0;

var x=thisEnd-thisStart;
var y=end-start;
var len=Math.min(x,y);

var thisCopy=this.slice(thisStart,thisEnd);
var targetCopy=target.slice(start,end);

for(var i=0;i<len;++i){
if(thisCopy[i]!==targetCopy[i]){
x=thisCopy[i];
y=targetCopy[i];
break;
}
}

if(x<y)return-1;
if(y<x)return 1;
return 0;
};










function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){

if(buffer.length===0)return-1;


if(typeof byteOffset==='string'){
encoding=byteOffset;
byteOffset=0;
}else if(byteOffset>0x7fffffff){
byteOffset=0x7fffffff;
}else if(byteOffset<-0x80000000){
byteOffset=-0x80000000;
}
byteOffset=+byteOffset;
if(numberIsNaN(byteOffset)){

byteOffset=dir?0:buffer.length-1;
}


if(byteOffset<0)byteOffset=buffer.length+byteOffset;
if(byteOffset>=buffer.length){
if(dir)return-1;else
byteOffset=buffer.length-1;
}else if(byteOffset<0){
if(dir)byteOffset=0;else
return-1;
}


if(typeof val==='string'){
val=Buffer.from(val,encoding);
}


if(Buffer.isBuffer(val)){

if(val.length===0){
return-1;
}
return arrayIndexOf(buffer,val,byteOffset,encoding,dir);
}else if(typeof val==='number'){
val=val&0xFF;
if(typeof Uint8Array.prototype.indexOf==='function'){
if(dir){
return Uint8Array.prototype.indexOf.call(buffer,val,byteOffset);
}else{
return Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset);
}
}
return arrayIndexOf(buffer,[val],byteOffset,encoding,dir);
}

throw new TypeError('val must be string, number or Buffer');
}

function arrayIndexOf(arr,val,byteOffset,encoding,dir){
var indexSize=1;
var arrLength=arr.length;
var valLength=val.length;

if(encoding!==undefined){
encoding=String(encoding).toLowerCase();
if(encoding==='ucs2'||encoding==='ucs-2'||
encoding==='utf16le'||encoding==='utf-16le'){
if(arr.length<2||val.length<2){
return-1;
}
indexSize=2;
arrLength/=2;
valLength/=2;
byteOffset/=2;
}
}

function read(buf,i){
if(indexSize===1){
return buf[i];
}else{
return buf.readUInt16BE(i*indexSize);
}
}

var i;
if(dir){
var foundIndex=-1;
for(i=byteOffset;i<arrLength;i++){
if(read(arr,i)===read(val,foundIndex===-1?0:i-foundIndex)){
if(foundIndex===-1)foundIndex=i;
if(i-foundIndex+1===valLength)return foundIndex*indexSize;
}else{
if(foundIndex!==-1)i-=i-foundIndex;
foundIndex=-1;
}
}
}else{
if(byteOffset+valLength>arrLength)byteOffset=arrLength-valLength;
for(i=byteOffset;i>=0;i--){
var found=true;
for(var j=0;j<valLength;j++){
if(read(arr,i+j)!==read(val,j)){
found=false;
break;
}
}
if(found)return i;
}
}

return-1;
}

Buffer.prototype.includes=function includes(val,byteOffset,encoding){
return this.indexOf(val,byteOffset,encoding)!==-1;
};

Buffer.prototype.indexOf=function indexOf(val,byteOffset,encoding){
return bidirectionalIndexOf(this,val,byteOffset,encoding,true);
};

Buffer.prototype.lastIndexOf=function lastIndexOf(val,byteOffset,encoding){
return bidirectionalIndexOf(this,val,byteOffset,encoding,false);
};

function hexWrite(buf,string,offset,length){
offset=Number(offset)||0;
var remaining=buf.length-offset;
if(!length){
length=remaining;
}else{
length=Number(length);
if(length>remaining){
length=remaining;
}
}

var strLen=string.length;

if(length>strLen/2){
length=strLen/2;
}
for(var i=0;i<length;++i){
var parsed=parseInt(string.substr(i*2,2),16);
if(numberIsNaN(parsed))return i;
buf[offset+i]=parsed;
}
return i;
}

function utf8Write(buf,string,offset,length){
return blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length);
}

function asciiWrite(buf,string,offset,length){
return blitBuffer(asciiToBytes(string),buf,offset,length);
}

function latin1Write(buf,string,offset,length){
return asciiWrite(buf,string,offset,length);
}

function base64Write(buf,string,offset,length){
return blitBuffer(base64ToBytes(string),buf,offset,length);
}

function ucs2Write(buf,string,offset,length){
return blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length);
}

Buffer.prototype.write=function write(string,offset,length,encoding){

if(offset===undefined){
encoding='utf8';
length=this.length;
offset=0;

}else if(length===undefined&&typeof offset==='string'){
encoding=offset;
length=this.length;
offset=0;

}else if(isFinite(offset)){
offset=offset>>>0;
if(isFinite(length)){
length=length>>>0;
if(encoding===undefined)encoding='utf8';
}else{
encoding=length;
length=undefined;
}
}else{
throw new Error(
'Buffer.write(string, encoding, offset[, length]) is no longer supported');

}

var remaining=this.length-offset;
if(length===undefined||length>remaining)length=remaining;

if(string.length>0&&(length<0||offset<0)||offset>this.length){
throw new RangeError('Attempt to write outside buffer bounds');
}

if(!encoding)encoding='utf8';

var loweredCase=false;
for(;;){
switch(encoding){
case'hex':
return hexWrite(this,string,offset,length);

case'utf8':
case'utf-8':
return utf8Write(this,string,offset,length);

case'ascii':
return asciiWrite(this,string,offset,length);

case'latin1':
case'binary':
return latin1Write(this,string,offset,length);

case'base64':

return base64Write(this,string,offset,length);

case'ucs2':
case'ucs-2':
case'utf16le':
case'utf-16le':
return ucs2Write(this,string,offset,length);

default:
if(loweredCase)throw new TypeError('Unknown encoding: '+encoding);
encoding=(''+encoding).toLowerCase();
loweredCase=true;}

}
};

Buffer.prototype.toJSON=function toJSON(){
return{
type:'Buffer',
data:Array.prototype.slice.call(this._arr||this,0)};

};

function base64Slice(buf,start,end){
if(start===0&&end===buf.length){
return base64.fromByteArray(buf);
}else{
return base64.fromByteArray(buf.slice(start,end));
}
}

function utf8Slice(buf,start,end){
end=Math.min(buf.length,end);
var res=[];

var i=start;
while(i<end){
var firstByte=buf[i];
var codePoint=null;
var bytesPerSequence=firstByte>0xEF?4:
firstByte>0xDF?3:
firstByte>0xBF?2:
1;

if(i+bytesPerSequence<=end){
var secondByte,thirdByte,fourthByte,tempCodePoint;

switch(bytesPerSequence){
case 1:
if(firstByte<0x80){
codePoint=firstByte;
}
break;
case 2:
secondByte=buf[i+1];
if((secondByte&0xC0)===0x80){
tempCodePoint=(firstByte&0x1F)<<0x6|secondByte&0x3F;
if(tempCodePoint>0x7F){
codePoint=tempCodePoint;
}
}
break;
case 3:
secondByte=buf[i+1];
thirdByte=buf[i+2];
if((secondByte&0xC0)===0x80&&(thirdByte&0xC0)===0x80){
tempCodePoint=(firstByte&0xF)<<0xC|(secondByte&0x3F)<<0x6|thirdByte&0x3F;
if(tempCodePoint>0x7FF&&(tempCodePoint<0xD800||tempCodePoint>0xDFFF)){
codePoint=tempCodePoint;
}
}
break;
case 4:
secondByte=buf[i+1];
thirdByte=buf[i+2];
fourthByte=buf[i+3];
if((secondByte&0xC0)===0x80&&(thirdByte&0xC0)===0x80&&(fourthByte&0xC0)===0x80){
tempCodePoint=(firstByte&0xF)<<0x12|(secondByte&0x3F)<<0xC|(thirdByte&0x3F)<<0x6|fourthByte&0x3F;
if(tempCodePoint>0xFFFF&&tempCodePoint<0x110000){
codePoint=tempCodePoint;
}
}}

}

if(codePoint===null){


codePoint=0xFFFD;
bytesPerSequence=1;
}else if(codePoint>0xFFFF){

codePoint-=0x10000;
res.push(codePoint>>>10&0x3FF|0xD800);
codePoint=0xDC00|codePoint&0x3FF;
}

res.push(codePoint);
i+=bytesPerSequence;
}

return decodeCodePointsArray(res);
}




var MAX_ARGUMENTS_LENGTH=0x1000;

function decodeCodePointsArray(codePoints){
var len=codePoints.length;
if(len<=MAX_ARGUMENTS_LENGTH){
return String.fromCharCode.apply(String,codePoints);
}


var res='';
var i=0;
while(i<len){
res+=String.fromCharCode.apply(
String,
codePoints.slice(i,i+=MAX_ARGUMENTS_LENGTH));

}
return res;
}

function asciiSlice(buf,start,end){
var ret='';
end=Math.min(buf.length,end);

for(var i=start;i<end;++i){
ret+=String.fromCharCode(buf[i]&0x7F);
}
return ret;
}

function latin1Slice(buf,start,end){
var ret='';
end=Math.min(buf.length,end);

for(var i=start;i<end;++i){
ret+=String.fromCharCode(buf[i]);
}
return ret;
}

function hexSlice(buf,start,end){
var len=buf.length;

if(!start||start<0)start=0;
if(!end||end<0||end>len)end=len;

var out='';
for(var i=start;i<end;++i){
out+=toHex(buf[i]);
}
return out;
}

function utf16leSlice(buf,start,end){
var bytes=buf.slice(start,end);
var res='';
for(var i=0;i<bytes.length;i+=2){
res+=String.fromCharCode(bytes[i]+bytes[i+1]*256);
}
return res;
}

Buffer.prototype.slice=function slice(start,end){
var len=this.length;
start=~~start;
end=end===undefined?len:~~end;

if(start<0){
start+=len;
if(start<0)start=0;
}else if(start>len){
start=len;
}

if(end<0){
end+=len;
if(end<0)end=0;
}else if(end>len){
end=len;
}

if(end<start)end=start;

var newBuf=this.subarray(start,end);

newBuf.__proto__=Buffer.prototype;
return newBuf;
};




function checkOffset(offset,ext,length){
if(offset%1!==0||offset<0)throw new RangeError('offset is not uint');
if(offset+ext>length)throw new RangeError('Trying to access beyond buffer length');
}

Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){
offset=offset>>>0;
byteLength=byteLength>>>0;
if(!noAssert)checkOffset(offset,byteLength,this.length);

var val=this[offset];
var mul=1;
var i=0;
while(++i<byteLength&&(mul*=0x100)){
val+=this[offset+i]*mul;
}

return val;
};

Buffer.prototype.readUIntBE=function readUIntBE(offset,byteLength,noAssert){
offset=offset>>>0;
byteLength=byteLength>>>0;
if(!noAssert){
checkOffset(offset,byteLength,this.length);
}

var val=this[offset+--byteLength];
var mul=1;
while(byteLength>0&&(mul*=0x100)){
val+=this[offset+--byteLength]*mul;
}

return val;
};

Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,1,this.length);
return this[offset];
};

Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,2,this.length);
return this[offset]|this[offset+1]<<8;
};

Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,2,this.length);
return this[offset]<<8|this[offset+1];
};

Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,4,this.length);

return(this[offset]|
this[offset+1]<<8|
this[offset+2]<<16)+
this[offset+3]*0x1000000;
};

Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,4,this.length);

return this[offset]*0x1000000+(
this[offset+1]<<16|
this[offset+2]<<8|
this[offset+3]);
};

Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){
offset=offset>>>0;
byteLength=byteLength>>>0;
if(!noAssert)checkOffset(offset,byteLength,this.length);

var val=this[offset];
var mul=1;
var i=0;
while(++i<byteLength&&(mul*=0x100)){
val+=this[offset+i]*mul;
}
mul*=0x80;

if(val>=mul)val-=Math.pow(2,8*byteLength);

return val;
};

Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){
offset=offset>>>0;
byteLength=byteLength>>>0;
if(!noAssert)checkOffset(offset,byteLength,this.length);

var i=byteLength;
var mul=1;
var val=this[offset+--i];
while(i>0&&(mul*=0x100)){
val+=this[offset+--i]*mul;
}
mul*=0x80;

if(val>=mul)val-=Math.pow(2,8*byteLength);

return val;
};

Buffer.prototype.readInt8=function readInt8(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,1,this.length);
if(!(this[offset]&0x80))return this[offset];
return(0xff-this[offset]+1)*-1;
};

Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,2,this.length);
var val=this[offset]|this[offset+1]<<8;
return val&0x8000?val|0xFFFF0000:val;
};

Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,2,this.length);
var val=this[offset+1]|this[offset]<<8;
return val&0x8000?val|0xFFFF0000:val;
};

Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,4,this.length);

return this[offset]|
this[offset+1]<<8|
this[offset+2]<<16|
this[offset+3]<<24;
};

Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,4,this.length);

return this[offset]<<24|
this[offset+1]<<16|
this[offset+2]<<8|
this[offset+3];
};

Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,4,this.length);
return ieee754.read(this,offset,true,23,4);
};

Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,4,this.length);
return ieee754.read(this,offset,false,23,4);
};

Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,8,this.length);
return ieee754.read(this,offset,true,52,8);
};

Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){
offset=offset>>>0;
if(!noAssert)checkOffset(offset,8,this.length);
return ieee754.read(this,offset,false,52,8);
};

function checkInt(buf,value,offset,ext,max,min){
if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');
if(value>max||value<min)throw new RangeError('"value" argument is out of bounds');
if(offset+ext>buf.length)throw new RangeError('Index out of range');
}

Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){
value=+value;
offset=offset>>>0;
byteLength=byteLength>>>0;
if(!noAssert){
var maxBytes=Math.pow(2,8*byteLength)-1;
checkInt(this,value,offset,byteLength,maxBytes,0);
}

var mul=1;
var i=0;
this[offset]=value&0xFF;
while(++i<byteLength&&(mul*=0x100)){
this[offset+i]=value/mul&0xFF;
}

return offset+byteLength;
};

Buffer.prototype.writeUIntBE=function writeUIntBE(value,offset,byteLength,noAssert){
value=+value;
offset=offset>>>0;
byteLength=byteLength>>>0;
if(!noAssert){
var maxBytes=Math.pow(2,8*byteLength)-1;
checkInt(this,value,offset,byteLength,maxBytes,0);
}

var i=byteLength-1;
var mul=1;
this[offset+i]=value&0xFF;
while(--i>=0&&(mul*=0x100)){
this[offset+i]=value/mul&0xFF;
}

return offset+byteLength;
};

Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,1,0xff,0);
this[offset]=value&0xff;
return offset+1;
};

Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,2,0xffff,0);
this[offset]=value&0xff;
this[offset+1]=value>>>8;
return offset+2;
};

Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,2,0xffff,0);
this[offset]=value>>>8;
this[offset+1]=value&0xff;
return offset+2;
};

Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,4,0xffffffff,0);
this[offset+3]=value>>>24;
this[offset+2]=value>>>16;
this[offset+1]=value>>>8;
this[offset]=value&0xff;
return offset+4;
};

Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,4,0xffffffff,0);
this[offset]=value>>>24;
this[offset+1]=value>>>16;
this[offset+2]=value>>>8;
this[offset+3]=value&0xff;
return offset+4;
};

Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert){
var limit=Math.pow(2,8*byteLength-1);

checkInt(this,value,offset,byteLength,limit-1,-limit);
}

var i=0;
var mul=1;
var sub=0;
this[offset]=value&0xFF;
while(++i<byteLength&&(mul*=0x100)){
if(value<0&&sub===0&&this[offset+i-1]!==0){
sub=1;
}
this[offset+i]=(value/mul>>0)-sub&0xFF;
}

return offset+byteLength;
};

Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert){
var limit=Math.pow(2,8*byteLength-1);

checkInt(this,value,offset,byteLength,limit-1,-limit);
}

var i=byteLength-1;
var mul=1;
var sub=0;
this[offset+i]=value&0xFF;
while(--i>=0&&(mul*=0x100)){
if(value<0&&sub===0&&this[offset+i+1]!==0){
sub=1;
}
this[offset+i]=(value/mul>>0)-sub&0xFF;
}

return offset+byteLength;
};

Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,1,0x7f,-0x80);
if(value<0)value=0xff+value+1;
this[offset]=value&0xff;
return offset+1;
};

Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,2,0x7fff,-0x8000);
this[offset]=value&0xff;
this[offset+1]=value>>>8;
return offset+2;
};

Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,2,0x7fff,-0x8000);
this[offset]=value>>>8;
this[offset+1]=value&0xff;
return offset+2;
};

Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,4,0x7fffffff,-0x80000000);
this[offset]=value&0xff;
this[offset+1]=value>>>8;
this[offset+2]=value>>>16;
this[offset+3]=value>>>24;
return offset+4;
};

Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert)checkInt(this,value,offset,4,0x7fffffff,-0x80000000);
if(value<0)value=0xffffffff+value+1;
this[offset]=value>>>24;
this[offset+1]=value>>>16;
this[offset+2]=value>>>8;
this[offset+3]=value&0xff;
return offset+4;
};

function checkIEEE754(buf,value,offset,ext,max,min){
if(offset+ext>buf.length)throw new RangeError('Index out of range');
if(offset<0)throw new RangeError('Index out of range');
}

function writeFloat(buf,value,offset,littleEndian,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert){
checkIEEE754(buf,value,offset,4,3.4028234663852886e+38,-3.4028234663852886e+38);
}
ieee754.write(buf,value,offset,littleEndian,23,4);
return offset+4;
}

Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){
return writeFloat(this,value,offset,true,noAssert);
};

Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){
return writeFloat(this,value,offset,false,noAssert);
};

function writeDouble(buf,value,offset,littleEndian,noAssert){
value=+value;
offset=offset>>>0;
if(!noAssert){
checkIEEE754(buf,value,offset,8,1.7976931348623157E+308,-1.7976931348623157E+308);
}
ieee754.write(buf,value,offset,littleEndian,52,8);
return offset+8;
}

Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){
return writeDouble(this,value,offset,true,noAssert);
};

Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){
return writeDouble(this,value,offset,false,noAssert);
};


Buffer.prototype.copy=function copy(target,targetStart,start,end){
if(!Buffer.isBuffer(target))throw new TypeError('argument should be a Buffer');
if(!start)start=0;
if(!end&&end!==0)end=this.length;
if(targetStart>=target.length)targetStart=target.length;
if(!targetStart)targetStart=0;
if(end>0&&end<start)end=start;


if(end===start)return 0;
if(target.length===0||this.length===0)return 0;


if(targetStart<0){
throw new RangeError('targetStart out of bounds');
}
if(start<0||start>=this.length)throw new RangeError('Index out of range');
if(end<0)throw new RangeError('sourceEnd out of bounds');


if(end>this.length)end=this.length;
if(target.length-targetStart<end-start){
end=target.length-targetStart+start;
}

var len=end-start;

if(this===target&&typeof Uint8Array.prototype.copyWithin==='function'){

this.copyWithin(targetStart,start,end);
}else if(this===target&&start<targetStart&&targetStart<end){

for(var i=len-1;i>=0;--i){
target[i+targetStart]=this[i+start];
}
}else{
Uint8Array.prototype.set.call(
target,
this.subarray(start,end),
targetStart);

}

return len;
};





Buffer.prototype.fill=function fill(val,start,end,encoding){

if(typeof val==='string'){
if(typeof start==='string'){
encoding=start;
start=0;
end=this.length;
}else if(typeof end==='string'){
encoding=end;
end=this.length;
}
if(encoding!==undefined&&typeof encoding!=='string'){
throw new TypeError('encoding must be a string');
}
if(typeof encoding==='string'&&!Buffer.isEncoding(encoding)){
throw new TypeError('Unknown encoding: '+encoding);
}
if(val.length===1){
var code=val.charCodeAt(0);
if(encoding==='utf8'&&code<128||
encoding==='latin1'){

val=code;
}
}
}else if(typeof val==='number'){
val=val&255;
}


if(start<0||this.length<start||this.length<end){
throw new RangeError('Out of range index');
}

if(end<=start){
return this;
}

start=start>>>0;
end=end===undefined?this.length:end>>>0;

if(!val)val=0;

var i;
if(typeof val==='number'){
for(i=start;i<end;++i){
this[i]=val;
}
}else{
var bytes=Buffer.isBuffer(val)?
val:
Buffer.from(val,encoding);
var len=bytes.length;
if(len===0){
throw new TypeError('The value "'+val+
'" is invalid for argument "value"');
}
for(i=0;i<end-start;++i){
this[i+start]=bytes[i%len];
}
}

return this;
};




var INVALID_BASE64_RE=/[^+/0-9A-Za-z-_]/g;

function base64clean(str){

str=str.split('=')[0];

str=str.trim().replace(INVALID_BASE64_RE,'');

if(str.length<2)return'';

while(str.length%4!==0){
str=str+'=';
}
return str;
}

function toHex(n){
if(n<16)return'0'+n.toString(16);
return n.toString(16);
}

function utf8ToBytes(string,units){
units=units||Infinity;
var codePoint;
var length=string.length;
var leadSurrogate=null;
var bytes=[];

for(var i=0;i<length;++i){
codePoint=string.charCodeAt(i);


if(codePoint>0xD7FF&&codePoint<0xE000){

if(!leadSurrogate){

if(codePoint>0xDBFF){

if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
continue;
}else if(i+1===length){

if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
continue;
}


leadSurrogate=codePoint;

continue;
}


if(codePoint<0xDC00){
if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
leadSurrogate=codePoint;
continue;
}


codePoint=(leadSurrogate-0xD800<<10|codePoint-0xDC00)+0x10000;
}else if(leadSurrogate){

if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
}

leadSurrogate=null;


if(codePoint<0x80){
if((units-=1)<0)break;
bytes.push(codePoint);
}else if(codePoint<0x800){
if((units-=2)<0)break;
bytes.push(
codePoint>>0x6|0xC0,
codePoint&0x3F|0x80);

}else if(codePoint<0x10000){
if((units-=3)<0)break;
bytes.push(
codePoint>>0xC|0xE0,
codePoint>>0x6&0x3F|0x80,
codePoint&0x3F|0x80);

}else if(codePoint<0x110000){
if((units-=4)<0)break;
bytes.push(
codePoint>>0x12|0xF0,
codePoint>>0xC&0x3F|0x80,
codePoint>>0x6&0x3F|0x80,
codePoint&0x3F|0x80);

}else{
throw new Error('Invalid code point');
}
}

return bytes;
}

function asciiToBytes(str){
var byteArray=[];
for(var i=0;i<str.length;++i){

byteArray.push(str.charCodeAt(i)&0xFF);
}
return byteArray;
}

function utf16leToBytes(str,units){
var c,hi,lo;
var byteArray=[];
for(var i=0;i<str.length;++i){
if((units-=2)<0)break;

c=str.charCodeAt(i);
hi=c>>8;
lo=c%256;
byteArray.push(lo);
byteArray.push(hi);
}

return byteArray;
}

function base64ToBytes(str){
return base64.toByteArray(base64clean(str));
}

function blitBuffer(src,dst,offset,length){
for(var i=0;i<length;++i){
if(i+offset>=dst.length||i>=src.length)break;
dst[i+offset]=src[i];
}
return i;
}




function isInstance(obj,type){
return obj instanceof type||
obj!=null&&obj.constructor!=null&&obj.constructor.name!=null&&
obj.constructor.name===type.name;
}
function numberIsNaN(obj){

return obj!==obj;
}

}).call(this,require("buffer").Buffer);
},{"base64-js":97,"buffer":102,"ieee754":111}],103:[function(require,module,exports){
(function(Buffer){
























function isArray(arg){
if(Array.isArray){
return Array.isArray(arg);
}
return objectToString(arg)==='[object Array]';
}
exports.isArray=isArray;

function isBoolean(arg){
return typeof arg==='boolean';
}
exports.isBoolean=isBoolean;

function isNull(arg){
return arg===null;
}
exports.isNull=isNull;

function isNullOrUndefined(arg){
return arg==null;
}
exports.isNullOrUndefined=isNullOrUndefined;

function isNumber(arg){
return typeof arg==='number';
}
exports.isNumber=isNumber;

function isString(arg){
return typeof arg==='string';
}
exports.isString=isString;

function isSymbol(arg){
return typeof arg==='symbol';
}
exports.isSymbol=isSymbol;

function isUndefined(arg){
return arg===void 0;
}
exports.isUndefined=isUndefined;

function isRegExp(re){
return objectToString(re)==='[object RegExp]';
}
exports.isRegExp=isRegExp;

function isObject(arg){
return typeof arg==='object'&&arg!==null;
}
exports.isObject=isObject;

function isDate(d){
return objectToString(d)==='[object Date]';
}
exports.isDate=isDate;

function isError(e){
return objectToString(e)==='[object Error]'||e instanceof Error;
}
exports.isError=isError;

function isFunction(arg){
return typeof arg==='function';
}
exports.isFunction=isFunction;

function isPrimitive(arg){
return arg===null||
typeof arg==='boolean'||
typeof arg==='number'||
typeof arg==='string'||
typeof arg==='symbol'||
typeof arg==='undefined';
}
exports.isPrimitive=isPrimitive;

exports.isBuffer=Buffer.isBuffer;

function objectToString(o){
return Object.prototype.toString.call(o);
}

}).call(this,{"isBuffer":require("../../is-buffer/index.js")});
},{"../../is-buffer/index.js":120}],104:[function(require,module,exports){
module.exports=[
"aliceblue",
"antiquewhite",
"aqua",
"aquamarine",
"azure",
"beige",
"bisque",
"black",
"blanchedalmond",
"blue",
"blueviolet",
"brown",
"burlywood",
"cadetblue",
"chartreuse",
"chocolate",
"coral",
"cornflowerblue",
"cornsilk",
"crimson",
"cyan",
"darkblue",
"darkcyan",
"darkgoldenrod",
"darkgray",
"darkgreen",
"darkgrey",
"darkkhaki",
"darkmagenta",
"darkolivegreen",
"darkorange",
"darkorchid",
"darkred",
"darksalmon",
"darkseagreen",
"darkslateblue",
"darkslategray",
"darkslategrey",
"darkturquoise",
"darkviolet",
"deeppink",
"deepskyblue",
"dimgray",
"dimgrey",
"dodgerblue",
"firebrick",
"floralwhite",
"forestgreen",
"fuchsia",
"gainsboro",
"ghostwhite",
"gold",
"goldenrod",
"gray",
"green",
"greenyellow",
"grey",
"honeydew",
"hotpink",
"indianred",
"indigo",
"ivory",
"khaki",
"lavender",
"lavenderblush",
"lawngreen",
"lemonchiffon",
"lightblue",
"lightcoral",
"lightcyan",
"lightgoldenrodyellow",
"lightgray",
"lightgreen",
"lightgrey",
"lightpink",
"lightsalmon",
"lightseagreen",
"lightskyblue",
"lightslategray",
"lightslategrey",
"lightsteelblue",
"lightyellow",
"lime",
"limegreen",
"linen",
"magenta",
"maroon",
"mediumaquamarine",
"mediumblue",
"mediumorchid",
"mediumpurple",
"mediumseagreen",
"mediumslateblue",
"mediumspringgreen",
"mediumturquoise",
"mediumvioletred",
"midnightblue",
"mintcream",
"mistyrose",
"moccasin",
"navajowhite",
"navy",
"oldlace",
"olive",
"olivedrab",
"orange",
"orangered",
"orchid",
"palegoldenrod",
"palegreen",
"paleturquoise",
"palevioletred",
"papayawhip",
"peachpuff",
"peru",
"pink",
"plum",
"powderblue",
"purple",
"rebeccapurple",
"red",
"rosybrown",
"royalblue",
"saddlebrown",
"salmon",
"sandybrown",
"seagreen",
"seashell",
"sienna",
"silver",
"skyblue",
"slateblue",
"slategray",
"slategrey",
"snow",
"springgreen",
"steelblue",
"tan",
"teal",
"thistle",
"tomato",
"turquoise",
"violet",
"wheat",
"white",
"whitesmoke",
"yellow",
"yellowgreen"];


},{}],105:[function(require,module,exports){




'use strict';

const namedColors=require('./named_colors.json');

exports.TYPES={
INTEGER:1,
NUMBER:2,
LENGTH:3,
PERCENT:4,
URL:5,
COLOR:6,
STRING:7,
ANGLE:8,
KEYWORD:9,
NULL_OR_EMPTY_STR:10};



var integerRegEx=/^[-+]?[0-9]+$/;
var numberRegEx=/^[-+]?[0-9]*\.[0-9]+$/;
var lengthRegEx=/^(0|[-+]?[0-9]*\.?[0-9]+(in|cm|em|mm|pt|pc|px|ex|rem|vh|vw))$/;
var percentRegEx=/^[-+]?[0-9]*\.?[0-9]+%$/;
var urlRegEx=/^url\(\s*([^)]*)\s*\)$/;
var stringRegEx=/^("[^"]*"|'[^']*')$/;
var colorRegEx1=/^#[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])?$/;
var colorRegEx2=/^rgb\(([^)]*)\)$/;
var colorRegEx3=/^rgba\(([^)]*)\)$/;
var colorRegEx4=/^hsla?\(\s*(-?\d+|-?\d*.\d+)\s*,\s*(-?\d+|-?\d*.\d+)%\s*,\s*(-?\d+|-?\d*.\d+)%\s*(,\s*(-?\d+|-?\d*.\d+)\s*)?\)/;
var angleRegEx=/^([-+]?[0-9]*\.?[0-9]+)(deg|grad|rad)$/;


exports.valueType=function valueType(val){
if(val===''||val===null){
return exports.TYPES.NULL_OR_EMPTY_STR;
}
if(typeof val==='number'){
val=val.toString();
}

if(typeof val!=='string'){
return undefined;
}

if(integerRegEx.test(val)){
return exports.TYPES.INTEGER;
}
if(numberRegEx.test(val)){
return exports.TYPES.NUMBER;
}
if(lengthRegEx.test(val)){
return exports.TYPES.LENGTH;
}
if(percentRegEx.test(val)){
return exports.TYPES.PERCENT;
}
if(urlRegEx.test(val)){
return exports.TYPES.URL;
}
if(stringRegEx.test(val)){
return exports.TYPES.STRING;
}
if(angleRegEx.test(val)){
return exports.TYPES.ANGLE;
}
if(colorRegEx1.test(val)){
return exports.TYPES.COLOR;
}
var res=colorRegEx2.exec(val);
var parts;
if(res!==null){
parts=res[1].split(/\s*,\s*/);
if(parts.length!==3){
return undefined;
}
if(
parts.every(percentRegEx.test.bind(percentRegEx))||
parts.every(integerRegEx.test.bind(integerRegEx)))
{
return exports.TYPES.COLOR;
}
return undefined;
}
res=colorRegEx3.exec(val);
if(res!==null){
parts=res[1].split(/\s*,\s*/);
if(parts.length!==4){
return undefined;
}
if(
parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))||
parts.every(integerRegEx.test.bind(integerRegEx)))
{
if(numberRegEx.test(parts[3])){
return exports.TYPES.COLOR;
}
}
return undefined;
}

if(colorRegEx4.test(val)){
return exports.TYPES.COLOR;
}


val=val.toLowerCase();

if(namedColors.includes(val)){
return exports.TYPES.COLOR;
}

switch(val){

case'activeborder':
case'activecaption':
case'appworkspace':
case'background':
case'buttonface':
case'buttonhighlight':
case'buttonshadow':
case'buttontext':
case'captiontext':
case'graytext':
case'highlight':
case'highlighttext':
case'inactiveborder':
case'inactivecaption':
case'inactivecaptiontext':
case'infobackground':
case'infotext':
case'menu':
case'menutext':
case'scrollbar':
case'threeddarkshadow':
case'threedface':
case'threedhighlight':
case'threedlightshadow':
case'threedshadow':
case'window':
case'windowframe':
case'windowtext':
return exports.TYPES.COLOR;
default:
return exports.TYPES.KEYWORD;}

};

exports.parseInteger=function parseInteger(val){
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
if(type!==exports.TYPES.INTEGER){
return undefined;
}
return String(parseInt(val,10));
};

exports.parseNumber=function parseNumber(val){
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
if(type!==exports.TYPES.NUMBER&&type!==exports.TYPES.INTEGER){
return undefined;
}
return String(parseFloat(val));
};

exports.parseLength=function parseLength(val){
if(val===0||val==='0'){
return'0px';
}
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
if(type!==exports.TYPES.LENGTH){
return undefined;
}
return val;
};

exports.parsePercent=function parsePercent(val){
if(val===0||val==='0'){
return'0%';
}
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
if(type!==exports.TYPES.PERCENT){
return undefined;
}
return val;
};


exports.parseMeasurement=function parseMeasurement(val){
var length=exports.parseLength(val);
if(length!==undefined){
return length;
}
return exports.parsePercent(val);
};

exports.parseUrl=function parseUrl(val){
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
var res=urlRegEx.exec(val);

if(!res){
return undefined;
}
var str=res[1];

if((str[0]==='"'||str[0]==="'")&&str[0]!==str[str.length-1]){
return undefined;
}
if(str[0]==='"'||str[0]==="'"){
str=str.substr(1,str.length-2);
}

var i;
for(i=0;i<str.length;i++){
switch(str[i]){
case'(':
case')':
case' ':
case'\t':
case'\n':
case"'":
case'"':
return undefined;
case'\\':
i++;
break;}

}

return'url('+str+')';
};

exports.parseString=function parseString(val){
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
if(type!==exports.TYPES.STRING){
return undefined;
}
var i;
for(i=1;i<val.length-1;i++){
switch(val[i]){
case val[0]:
return undefined;
case'\\':
i++;
while(i<val.length-1&&/[0-9A-Fa-f]/.test(val[i])){
i++;
}
break;}

}
if(i>=val.length){
return undefined;
}
return val;
};

exports.parseColor=function parseColor(val){
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
var red,
green,
blue,
hue,
saturation,
lightness,
alpha=1;
var parts;
var res=colorRegEx1.exec(val);

if(res){
var hex=val.substr(1);
if(hex.length===3){
hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
}
red=parseInt(hex.substr(0,2),16);
green=parseInt(hex.substr(2,2),16);
blue=parseInt(hex.substr(4,2),16);
return'rgb('+red+', '+green+', '+blue+')';
}

res=colorRegEx2.exec(val);
if(res){
parts=res[1].split(/\s*,\s*/);
if(parts.length!==3){
return undefined;
}
if(parts.every(percentRegEx.test.bind(percentRegEx))){
red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
}else if(parts.every(integerRegEx.test.bind(integerRegEx))){
red=parseInt(parts[0],10);
green=parseInt(parts[1],10);
blue=parseInt(parts[2],10);
}else{
return undefined;
}
red=Math.min(255,Math.max(0,red));
green=Math.min(255,Math.max(0,green));
blue=Math.min(255,Math.max(0,blue));
return'rgb('+red+', '+green+', '+blue+')';
}

res=colorRegEx3.exec(val);
if(res){
parts=res[1].split(/\s*,\s*/);
if(parts.length!==4){
return undefined;
}
if(parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))){
red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
alpha=parseFloat(parts[3]);
}else if(parts.slice(0,3).every(integerRegEx.test.bind(integerRegEx))){
red=parseInt(parts[0],10);
green=parseInt(parts[1],10);
blue=parseInt(parts[2],10);
alpha=parseFloat(parts[3]);
}else{
return undefined;
}
if(isNaN(alpha)){
alpha=1;
}
red=Math.min(255,Math.max(0,red));
green=Math.min(255,Math.max(0,green));
blue=Math.min(255,Math.max(0,blue));
alpha=Math.min(1,Math.max(0,alpha));
if(alpha===1){
return'rgb('+red+', '+green+', '+blue+')';
}
return'rgba('+red+', '+green+', '+blue+', '+alpha+')';
}

res=colorRegEx4.exec(val);
if(res){
const[,_hue,_saturation,_lightness,_alphaString='']=res;
const _alpha=parseFloat(_alphaString.replace(',','').trim());
if(!_hue||!_saturation||!_lightness){
return undefined;
}
hue=parseFloat(_hue);
saturation=parseInt(_saturation,10);
lightness=parseInt(_lightness,10);
if(_alpha&&numberRegEx.test(_alpha)){
alpha=parseFloat(_alpha);
}
if(!_alphaString||alpha===1){
return'hsl('+hue+', '+saturation+'%, '+lightness+'%)';
}
return'hsla('+hue+', '+saturation+'%, '+lightness+'%, '+alpha+')';
}

if(type===exports.TYPES.COLOR){
return val;
}
return undefined;
};

exports.parseAngle=function parseAngle(val){
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
if(type!==exports.TYPES.ANGLE){
return undefined;
}
var res=angleRegEx.exec(val);
var flt=parseFloat(res[1]);
if(res[2]==='rad'){
flt*=180/Math.PI;
}else if(res[2]==='grad'){
flt*=360/400;
}

while(flt<0){
flt+=360;
}
while(flt>360){
flt-=360;
}
return flt+'deg';
};

exports.parseKeyword=function parseKeyword(val,valid_keywords){
var type=exports.valueType(val);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
return val;
}
if(type!==exports.TYPES.KEYWORD){
return undefined;
}
val=val.toString().toLowerCase();
var i;
for(i=0;i<valid_keywords.length;i++){
if(valid_keywords[i].toLowerCase()===val){
return valid_keywords[i];
}
}
return undefined;
};


var dashedToCamelCase=function(dashed){
var i;
var camel='';
var nextCap=false;
for(i=0;i<dashed.length;i++){
if(dashed[i]!=='-'){
camel+=nextCap?dashed[i].toUpperCase():dashed[i];
nextCap=false;
}else{
nextCap=true;
}
}
return camel;
};
exports.dashedToCamelCase=dashedToCamelCase;

var is_space=/\s/;
var opening_deliminators=['"',"'",'('];
var closing_deliminators=['"',"'",')'];

var getParts=function(str){
var deliminator_stack=[];
var length=str.length;
var i;
var parts=[];
var current_part='';
var opening_index;
var closing_index;
for(i=0;i<length;i++){
opening_index=opening_deliminators.indexOf(str[i]);
closing_index=closing_deliminators.indexOf(str[i]);
if(is_space.test(str[i])){
if(deliminator_stack.length===0){
if(current_part!==''){
parts.push(current_part);
}
current_part='';
}else{
current_part+=str[i];
}
}else{
if(str[i]==='\\'){
i++;
current_part+=str[i];
}else{
current_part+=str[i];
if(
closing_index!==-1&&
closing_index===deliminator_stack[deliminator_stack.length-1])
{
deliminator_stack.pop();
}else if(opening_index!==-1){
deliminator_stack.push(opening_index);
}
}
}
}
if(current_part!==''){
parts.push(current_part);
}
return parts;
};







exports.shorthandParser=function parse(v,shorthand_for){
var obj={};
var type=exports.valueType(v);
if(type===exports.TYPES.NULL_OR_EMPTY_STR){
Object.keys(shorthand_for).forEach(function(property){
obj[property]='';
});
return obj;
}

if(typeof v==='number'){
v=v.toString();
}

if(typeof v!=='string'){
return undefined;
}

if(v.toLowerCase()==='inherit'){
return{};
}
var parts=getParts(v);
var valid=true;
parts.forEach(function(part,i){
var part_valid=false;
Object.keys(shorthand_for).forEach(function(property){
if(shorthand_for[property].isValid(part,i)){
part_valid=true;
obj[property]=part;
}
});
valid=valid&&part_valid;
});
if(!valid){
return undefined;
}
return obj;
};

exports.shorthandSetter=function(property,shorthand_for){
return function(v){
var obj=exports.shorthandParser(v,shorthand_for);
if(obj===undefined){
return;
}

Object.keys(obj).forEach(function(subprop){


var camel=dashedToCamelCase(subprop);
this[camel]=obj[subprop];

obj[subprop]=this[camel];
this.removeProperty(subprop);

if(obj[subprop]!==''){
this._values[subprop]=obj[subprop];
}
},this);
Object.keys(shorthand_for).forEach(function(subprop){
if(!obj.hasOwnProperty(subprop)){
this.removeProperty(subprop);
delete this._values[subprop];
}
},this);




this.removeProperty(property);
var calculated=exports.shorthandGetter(property,shorthand_for).call(this);
if(calculated!==''){
this._setProperty(property,calculated);
}
};
};

exports.shorthandGetter=function(property,shorthand_for){
return function(){
if(this._values[property]!==undefined){
return this.getPropertyValue(property);
}
return Object.keys(shorthand_for).
map(function(subprop){
return this.getPropertyValue(subprop);
},this).
filter(function(value){
return value!=='';
}).
join(' ');
};
};






exports.implicitSetter=function(property_before,property_after,isValid,parser){
property_after=property_after||'';
if(property_after!==''){
property_after='-'+property_after;
}
var part_names=['top','right','bottom','left'];

return function(v){
if(typeof v==='number'){
v=v.toString();
}
if(typeof v!=='string'){
return undefined;
}
var parts;
if(v.toLowerCase()==='inherit'||v===''){
parts=[v];
}else{
parts=getParts(v);
}
if(parts.length<1||parts.length>4){
return undefined;
}

if(!parts.every(isValid)){
return undefined;
}

parts=parts.map(function(part){
return parser(part);
});
this._setProperty(property_before+property_after,parts.join(' '));
if(parts.length===1){
parts[1]=parts[0];
}
if(parts.length===2){
parts[2]=parts[0];
}
if(parts.length===3){
parts[3]=parts[1];
}

for(var i=0;i<4;i++){
var property=property_before+'-'+part_names[i]+property_after;
this.removeProperty(property);
if(parts[i]!==''){
this._values[property]=parts[i];
}
}
return v;
};
};







exports.subImplicitSetter=function(prefix,part,isValid,parser){
var property=prefix+'-'+part;
var subparts=[prefix+'-top',prefix+'-right',prefix+'-bottom',prefix+'-left'];

return function(v){
if(typeof v==='number'){
v=v.toString();
}
if(typeof v!=='string'){
return undefined;
}
if(!isValid(v)){
return undefined;
}
v=parser(v);
this._setProperty(property,v);
var parts=[];
for(var i=0;i<4;i++){
if(this._values[subparts[i]]==null||this._values[subparts[i]]===''){
break;
}
parts.push(this._values[subparts[i]]);
}
if(parts.length===4){
for(i=0;i<4;i++){
this.removeProperty(subparts[i]);
this._values[subparts[i]]=parts[i];
}
this._setProperty(prefix,parts.join(' '));
}
return v;
};
};

var camel_to_dashed=/[A-Z]/g;
var first_segment=/^\([^-]\)-/;
var vendor_prefixes=['o','moz','ms','webkit'];
exports.camelToDashed=function(camel_case){
var match;
var dashed=camel_case.replace(camel_to_dashed,'-$&').toLowerCase();
match=dashed.match(first_segment);
if(match&&vendor_prefixes.indexOf(match[1])!==-1){
dashed='-'+dashed;
}
return dashed;
};

},{"./named_colors.json":104}],106:[function(require,module,exports){
(function(process){






exports=module.exports=require('./debug');
exports.log=log;
exports.formatArgs=formatArgs;
exports.save=save;
exports.load=load;
exports.useColors=useColors;
exports.storage='undefined'!=typeof chrome&&
'undefined'!=typeof chrome.storage?
chrome.storage.local:
localstorage();





exports.colors=[
'lightseagreen',
'forestgreen',
'goldenrod',
'dodgerblue',
'darkorchid',
'crimson'];










function useColors(){



if(typeof window!=='undefined'&&window.process&&window.process.type==='renderer'){
return true;
}



return typeof document!=='undefined'&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||

typeof window!=='undefined'&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||


typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||

typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
}





exports.formatters.j=function(v){
try{
return JSON.stringify(v);
}catch(err){
return'[UnexpectedJSONParseError]: '+err.message;
}
};








function formatArgs(args){
var useColors=this.useColors;

args[0]=(useColors?'%c':'')+
this.namespace+(
useColors?' %c':' ')+
args[0]+(
useColors?'%c ':' ')+
'+'+exports.humanize(this.diff);

if(!useColors)return;

var c='color: '+this.color;
args.splice(1,0,c,'color: inherit');




var index=0;
var lastC=0;
args[0].replace(/%[a-zA-Z%]/g,function(match){
if('%%'===match)return;
index++;
if('%c'===match){


lastC=index;
}
});

args.splice(lastC,0,c);
}








function log(){


return'object'===typeof console&&
console.log&&
Function.prototype.apply.call(console.log,console,arguments);
}








function save(namespaces){
try{
if(null==namespaces){
exports.storage.removeItem('debug');
}else{
exports.storage.debug=namespaces;
}
}catch(e){}
}








function load(){
var r;
try{
r=exports.storage.debug;
}catch(e){}


if(!r&&typeof process!=='undefined'&&'env'in process){
r=process.env.DEBUG;
}

return r;
}





exports.enable(load());












function localstorage(){
try{
return window.localStorage;
}catch(e){}
}

}).call(this,require('_process'));
},{"./debug":107,"_process":158}],107:[function(require,module,exports){








exports=module.exports=createDebug.debug=createDebug['default']=createDebug;
exports.coerce=coerce;
exports.disable=disable;
exports.enable=enable;
exports.enabled=enabled;
exports.humanize=require('ms');





exports.names=[];
exports.skips=[];







exports.formatters={};





var prevTime;








function selectColor(namespace){
var hash=0,i;

for(i in namespace){
hash=(hash<<5)-hash+namespace.charCodeAt(i);
hash|=0;
}

return exports.colors[Math.abs(hash)%exports.colors.length];
}









function createDebug(namespace){

function debug(){

if(!debug.enabled)return;

var self=debug;


var curr=+new Date();
var ms=curr-(prevTime||curr);
self.diff=ms;
self.prev=prevTime;
self.curr=curr;
prevTime=curr;


var args=new Array(arguments.length);
for(var i=0;i<args.length;i++){
args[i]=arguments[i];
}

args[0]=exports.coerce(args[0]);

if('string'!==typeof args[0]){

args.unshift('%O');
}


var index=0;
args[0]=args[0].replace(/%([a-zA-Z%])/g,function(match,format){

if(match==='%%')return match;
index++;
var formatter=exports.formatters[format];
if('function'===typeof formatter){
var val=args[index];
match=formatter.call(self,val);


args.splice(index,1);
index--;
}
return match;
});


exports.formatArgs.call(self,args);

var logFn=debug.log||exports.log||console.log.bind(console);
logFn.apply(self,args);
}

debug.namespace=namespace;
debug.enabled=exports.enabled(namespace);
debug.useColors=exports.useColors();
debug.color=selectColor(namespace);


if('function'===typeof exports.init){
exports.init(debug);
}

return debug;
}









function enable(namespaces){
exports.save(namespaces);

exports.names=[];
exports.skips=[];

var split=(typeof namespaces==='string'?namespaces:'').split(/[\s,]+/);
var len=split.length;

for(var i=0;i<len;i++){
if(!split[i])continue;
namespaces=split[i].replace(/\*/g,'.*?');
if(namespaces[0]==='-'){
exports.skips.push(new RegExp('^'+namespaces.substr(1)+'$'));
}else{
exports.names.push(new RegExp('^'+namespaces+'$'));
}
}
}







function disable(){
exports.enable('');
}









function enabled(name){
var i,len;
for(i=0,len=exports.skips.length;i<len;i++){
if(exports.skips[i].test(name)){
return false;
}
}
for(i=0,len=exports.names.length;i<len;i++){
if(exports.names[i].test(name)){
return true;
}
}
return false;
}









function coerce(val){
if(val instanceof Error)return val.stack||val.message;
return val;
}

},{"ms":146}],108:[function(require,module,exports){





















var objectCreate=Object.create||objectCreatePolyfill;
var objectKeys=Object.keys||objectKeysPolyfill;
var bind=Function.prototype.bind||functionBindPolyfill;

function EventEmitter(){
if(!this._events||!Object.prototype.hasOwnProperty.call(this,'_events')){
this._events=objectCreate(null);
this._eventsCount=0;
}

this._maxListeners=this._maxListeners||undefined;
}
module.exports=EventEmitter;


EventEmitter.EventEmitter=EventEmitter;

EventEmitter.prototype._events=undefined;
EventEmitter.prototype._maxListeners=undefined;



var defaultMaxListeners=10;

var hasDefineProperty;
try{
var o={};
if(Object.defineProperty)Object.defineProperty(o,'x',{value:0});
hasDefineProperty=o.x===0;
}catch(err){hasDefineProperty=false;}
if(hasDefineProperty){
Object.defineProperty(EventEmitter,'defaultMaxListeners',{
enumerable:true,
get:function(){
return defaultMaxListeners;
},
set:function(arg){


if(typeof arg!=='number'||arg<0||arg!==arg)
throw new TypeError('"defaultMaxListeners" must be a positive number');
defaultMaxListeners=arg;
}});

}else{
EventEmitter.defaultMaxListeners=defaultMaxListeners;
}



EventEmitter.prototype.setMaxListeners=function setMaxListeners(n){
if(typeof n!=='number'||n<0||isNaN(n))
throw new TypeError('"n" argument must be a positive number');
this._maxListeners=n;
return this;
};

function $getMaxListeners(that){
if(that._maxListeners===undefined)
return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}

EventEmitter.prototype.getMaxListeners=function getMaxListeners(){
return $getMaxListeners(this);
};






function emitNone(handler,isFn,self){
if(isFn)
handler.call(self);else
{
var len=handler.length;
var listeners=arrayClone(handler,len);
for(var i=0;i<len;++i)
listeners[i].call(self);
}
}
function emitOne(handler,isFn,self,arg1){
if(isFn)
handler.call(self,arg1);else
{
var len=handler.length;
var listeners=arrayClone(handler,len);
for(var i=0;i<len;++i)
listeners[i].call(self,arg1);
}
}
function emitTwo(handler,isFn,self,arg1,arg2){
if(isFn)
handler.call(self,arg1,arg2);else
{
var len=handler.length;
var listeners=arrayClone(handler,len);
for(var i=0;i<len;++i)
listeners[i].call(self,arg1,arg2);
}
}
function emitThree(handler,isFn,self,arg1,arg2,arg3){
if(isFn)
handler.call(self,arg1,arg2,arg3);else
{
var len=handler.length;
var listeners=arrayClone(handler,len);
for(var i=0;i<len;++i)
listeners[i].call(self,arg1,arg2,arg3);
}
}

function emitMany(handler,isFn,self,args){
if(isFn)
handler.apply(self,args);else
{
var len=handler.length;
var listeners=arrayClone(handler,len);
for(var i=0;i<len;++i)
listeners[i].apply(self,args);
}
}

EventEmitter.prototype.emit=function emit(type){
var er,handler,len,args,i,events;
var doError=type==='error';

events=this._events;
if(events)
doError=doError&&events.error==null;else
if(!doError)
return false;


if(doError){
if(arguments.length>1)
er=arguments[1];
if(er instanceof Error){
throw er;
}else{

var err=new Error('Unhandled "error" event. ('+er+')');
err.context=er;
throw err;
}
return false;
}

handler=events[type];

if(!handler)
return false;

var isFn=typeof handler==='function';
len=arguments.length;
switch(len){

case 1:
emitNone(handler,isFn,this);
break;
case 2:
emitOne(handler,isFn,this,arguments[1]);
break;
case 3:
emitTwo(handler,isFn,this,arguments[1],arguments[2]);
break;
case 4:
emitThree(handler,isFn,this,arguments[1],arguments[2],arguments[3]);
break;

default:
args=new Array(len-1);
for(i=1;i<len;i++)
args[i-1]=arguments[i];
emitMany(handler,isFn,this,args);}


return true;
};

function _addListener(target,type,listener,prepend){
var m;
var events;
var existing;

if(typeof listener!=='function')
throw new TypeError('"listener" argument must be a function');

events=target._events;
if(!events){
events=target._events=objectCreate(null);
target._eventsCount=0;
}else{


if(events.newListener){
target.emit('newListener',type,
listener.listener?listener.listener:listener);



events=target._events;
}
existing=events[type];
}

if(!existing){

existing=events[type]=listener;
++target._eventsCount;
}else{
if(typeof existing==='function'){

existing=events[type]=
prepend?[listener,existing]:[existing,listener];
}else{

if(prepend){
existing.unshift(listener);
}else{
existing.push(listener);
}
}


if(!existing.warned){
m=$getMaxListeners(target);
if(m&&m>0&&existing.length>m){
existing.warned=true;
var w=new Error('Possible EventEmitter memory leak detected. '+
existing.length+' "'+String(type)+'" listeners '+
'added. Use emitter.setMaxListeners() to '+
'increase limit.');
w.name='MaxListenersExceededWarning';
w.emitter=target;
w.type=type;
w.count=existing.length;
if(typeof console==='object'&&console.warn){
console.warn('%s: %s',w.name,w.message);
}
}
}
}

return target;
}

EventEmitter.prototype.addListener=function addListener(type,listener){
return _addListener(this,type,listener,false);
};

EventEmitter.prototype.on=EventEmitter.prototype.addListener;

EventEmitter.prototype.prependListener=
function prependListener(type,listener){
return _addListener(this,type,listener,true);
};

function onceWrapper(){
if(!this.fired){
this.target.removeListener(this.type,this.wrapFn);
this.fired=true;
switch(arguments.length){
case 0:
return this.listener.call(this.target);
case 1:
return this.listener.call(this.target,arguments[0]);
case 2:
return this.listener.call(this.target,arguments[0],arguments[1]);
case 3:
return this.listener.call(this.target,arguments[0],arguments[1],
arguments[2]);
default:
var args=new Array(arguments.length);
for(var i=0;i<args.length;++i)
args[i]=arguments[i];
this.listener.apply(this.target,args);}

}
}

function _onceWrap(target,type,listener){
var state={fired:false,wrapFn:undefined,target:target,type:type,listener:listener};
var wrapped=bind.call(onceWrapper,state);
wrapped.listener=listener;
state.wrapFn=wrapped;
return wrapped;
}

EventEmitter.prototype.once=function once(type,listener){
if(typeof listener!=='function')
throw new TypeError('"listener" argument must be a function');
this.on(type,_onceWrap(this,type,listener));
return this;
};

EventEmitter.prototype.prependOnceListener=
function prependOnceListener(type,listener){
if(typeof listener!=='function')
throw new TypeError('"listener" argument must be a function');
this.prependListener(type,_onceWrap(this,type,listener));
return this;
};


EventEmitter.prototype.removeListener=
function removeListener(type,listener){
var list,events,position,i,originalListener;

if(typeof listener!=='function')
throw new TypeError('"listener" argument must be a function');

events=this._events;
if(!events)
return this;

list=events[type];
if(!list)
return this;

if(list===listener||list.listener===listener){
if(--this._eventsCount===0)
this._events=objectCreate(null);else
{
delete events[type];
if(events.removeListener)
this.emit('removeListener',type,list.listener||listener);
}
}else if(typeof list!=='function'){
position=-1;

for(i=list.length-1;i>=0;i--){
if(list[i]===listener||list[i].listener===listener){
originalListener=list[i].listener;
position=i;
break;
}
}

if(position<0)
return this;

if(position===0)
list.shift();else

spliceOne(list,position);

if(list.length===1)
events[type]=list[0];

if(events.removeListener)
this.emit('removeListener',type,originalListener||listener);
}

return this;
};

EventEmitter.prototype.removeAllListeners=
function removeAllListeners(type){
var listeners,events,i;

events=this._events;
if(!events)
return this;


if(!events.removeListener){
if(arguments.length===0){
this._events=objectCreate(null);
this._eventsCount=0;
}else if(events[type]){
if(--this._eventsCount===0)
this._events=objectCreate(null);else

delete events[type];
}
return this;
}


if(arguments.length===0){
var keys=objectKeys(events);
var key;
for(i=0;i<keys.length;++i){
key=keys[i];
if(key==='removeListener')continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events=objectCreate(null);
this._eventsCount=0;
return this;
}

listeners=events[type];

if(typeof listeners==='function'){
this.removeListener(type,listeners);
}else if(listeners){

for(i=listeners.length-1;i>=0;i--){
this.removeListener(type,listeners[i]);
}
}

return this;
};

function _listeners(target,type,unwrap){
var events=target._events;

if(!events)
return[];

var evlistener=events[type];
if(!evlistener)
return[];

if(typeof evlistener==='function')
return unwrap?[evlistener.listener||evlistener]:[evlistener];

return unwrap?unwrapListeners(evlistener):arrayClone(evlistener,evlistener.length);
}

EventEmitter.prototype.listeners=function listeners(type){
return _listeners(this,type,true);
};

EventEmitter.prototype.rawListeners=function rawListeners(type){
return _listeners(this,type,false);
};

EventEmitter.listenerCount=function(emitter,type){
if(typeof emitter.listenerCount==='function'){
return emitter.listenerCount(type);
}else{
return listenerCount.call(emitter,type);
}
};

EventEmitter.prototype.listenerCount=listenerCount;
function listenerCount(type){
var events=this._events;

if(events){
var evlistener=events[type];

if(typeof evlistener==='function'){
return 1;
}else if(evlistener){
return evlistener.length;
}
}

return 0;
}

EventEmitter.prototype.eventNames=function eventNames(){
return this._eventsCount>0?Reflect.ownKeys(this._events):[];
};


function spliceOne(list,index){
for(var i=index,k=i+1,n=list.length;k<n;i+=1,k+=1)
list[i]=list[k];
list.pop();
}

function arrayClone(arr,n){
var copy=new Array(n);
for(var i=0;i<n;++i)
copy[i]=arr[i];
return copy;
}

function unwrapListeners(arr){
var ret=new Array(arr.length);
for(var i=0;i<ret.length;++i){
ret[i]=arr[i].listener||arr[i];
}
return ret;
}

function objectCreatePolyfill(proto){
var F=function(){};
F.prototype=proto;
return new F();
}
function objectKeysPolyfill(obj){
var keys=[];
for(var k in obj)if(Object.prototype.hasOwnProperty.call(obj,k)){
keys.push(k);
}
return k;
}
function functionBindPolyfill(context){
var fn=this;
return function(){
return fn.apply(context,arguments);
};
}

},{}],109:[function(require,module,exports){
(function(Buffer){
var querystring=require('querystring');
var trim=require('./trim');






function Link(value){

if(!(this instanceof Link)){
return new Link(value);
}


this.refs=[];

}





Link.pattern=/(?:\<([^\>]+)\>)((\s*;\s*([a-z\*]+)=(("[^"]+")|('[^']+')|([^\,\;]+)))*)(\s*,\s*|$)/gi;





Link.attrPattern=/([a-z\*]+)=(?:(?:"([^"]+)")|(?:'([^']+)')|([^\,\;]+))/gi;







Link.isCompatibleEncoding=function(value){
return /^utf-?8|ascii|utf-?16-?le|ucs-?2|base-?64|latin-?1$/i.test(value);
};







Link.formatExtendedAttribute=function(attr,data){

var encoding=(data.encoding||'utf-8').toUpperCase();
var language=data.language||'en';

var encodedValue='';

if(Buffer.isBuffer(data.value)&&Link.isCompatibleEncoding(encoding)){
encodedValue=data.value.toString(encoding);
}else if(Buffer.isBuffer(data.value)){
encodedValue=data.value.toString('hex').
replace(/[0-9a-f]{2}/gi,'%$1');
}else{
encodedValue=querystring.escape(data.value);
}

return attr+'='+encoding+'\''+
language+'\''+encodedValue;

};







Link.formatAttribute=function(attr,value){


if(/\*$/.test(attr)||typeof value!=='string')
return Link.formatExtendedAttribute(attr,value);



var needsQuotes=/[^a-z]/i.test(value);

if(needsQuotes){

value=querystring.escape(value).
replace(/%20/g,' ').
replace(/%2C/g,',').
replace(/%3B/g,';');

value='"'+value+'"';
}

return attr+'='+value;

};







Link.parseExtendedValue=function(value){
var parts=/([^']+)?(?:'([^']+)')?(.+)/.exec(value);
return{
language:parts[2].toLowerCase(),
encoding:Link.isCompatibleEncoding(parts[1])?
null:parts[1].toLowerCase(),
value:Link.isCompatibleEncoding(parts[1])?
querystring.unescape(parts[3]):parts[3]};

};







Link.setAttr=function(link,attr,value){



if(attr==='rel'&&link[attr]!=null)
return link;

if(Array.isArray(link[attr])){
link[attr].push(value);
}else if(link[attr]!=null){
link[attr]=[link[attr],value];
}else{
link[attr]=value;
}

return link;

};




Link.parseParams=function(link,uri){

var kvs={};
var params=/(.+)\?(.+)/gi.exec(uri);

if(!params){
return link;
}

params=params[2].split('&');

for(var i=0;i<params.length;i++){
var param=params[i].split('=');
kvs[param[0]]=param[1];
}

Link.setAttr(link,'params',kvs);

return link;

};








Link.parseAttrs=function(link,parts){

var match=null;
var attr='';
var value='';
var attrs='';

var uriAttrs=/<(.*)>;\s*(.*)/gi.exec(parts);
if(uriAttrs){
attrs=uriAttrs[2];
link=Link.parseParams(link,uriAttrs[1]);
}

while(match=Link.attrPattern.exec(attrs)){
attr=match[1].toLowerCase();
value=match[4]||match[3]||match[2];
if(/\*$/.test(attr)){
Link.setAttr(link,attr,Link.parseExtendedValue(value));
}else if(/%/.test(value)){
Link.setAttr(link,attr,querystring.unescape(value));
}else{
Link.setAttr(link,attr,value);
}
}

return link;

};

Link.parse=function(value){
return new Link().parse(value);
};





Link.prototype={

constructor:Link,






rel:function(value){

var links=[];

for(var i=0;i<this.refs.length;i++){
if(this.refs[i].rel===value){
links.push(this.refs[i]);
}
}

return links;

},







get:function(attr,value){

attr=attr.toLowerCase();

var links=[];

for(var i=0;i<this.refs.length;i++){
if(this.refs[i][attr]===value){
links.push(this.refs[i]);
}
}

return links;

},

set:function(link){
this.refs.push(link);
return this;
},

has:function(attr,value){
return this.get(attr,value)!=null;
},

parse:function(value){


value=trim(value).
replace(/\r?\n[\x20\x09]+/g,'');

var match=null;

while(match=Link.pattern.exec(value)){
var link=Link.parseAttrs({uri:match[1]},match[0]);
this.refs.push(link);
}

return this;

},

toString:function(){

var refs=[];
var link='';
var ref=null;

for(var i=0;i<this.refs.length;i++){
ref=this.refs[i];
link=Object.keys(this.refs[i]).reduce(function(link,attr){
if(attr==='uri')return link;
return link+'; '+Link.formatAttribute(attr,ref[attr]);
},'<'+ref.uri+'>');
refs.push(link);
}

return refs.join(', ');

}};




module.exports=Link;

}).call(this,{"isBuffer":require("../../is-buffer/index.js")});
},{"../../is-buffer/index.js":120,"./trim":110,"querystring":161}],110:[function(require,module,exports){
module.exports=function trim(value){
return value.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,'');
};

},{}],111:[function(require,module,exports){
exports.read=function(buffer,offset,isLE,mLen,nBytes){
var e,m;
var eLen=nBytes*8-mLen-1;
var eMax=(1<<eLen)-1;
var eBias=eMax>>1;
var nBits=-7;
var i=isLE?nBytes-1:0;
var d=isLE?-1:1;
var s=buffer[offset+i];

i+=d;

e=s&(1<<-nBits)-1;
s>>=-nBits;
nBits+=eLen;
for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}

m=e&(1<<-nBits)-1;
e>>=-nBits;
nBits+=mLen;
for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}

if(e===0){
e=1-eBias;
}else if(e===eMax){
return m?NaN:(s?-1:1)*Infinity;
}else{
m=m+Math.pow(2,mLen);
e=e-eBias;
}
return(s?-1:1)*m*Math.pow(2,e-mLen);
};

exports.write=function(buffer,value,offset,isLE,mLen,nBytes){
var e,m,c;
var eLen=nBytes*8-mLen-1;
var eMax=(1<<eLen)-1;
var eBias=eMax>>1;
var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;
var i=isLE?0:nBytes-1;
var d=isLE?1:-1;
var s=value<0||value===0&&1/value<0?1:0;

value=Math.abs(value);

if(isNaN(value)||value===Infinity){
m=isNaN(value)?1:0;
e=eMax;
}else{
e=Math.floor(Math.log(value)/Math.LN2);
if(value*(c=Math.pow(2,-e))<1){
e--;
c*=2;
}
if(e+eBias>=1){
value+=rt/c;
}else{
value+=rt*Math.pow(2,1-eBias);
}
if(value*c>=2){
e++;
c/=2;
}

if(e+eBias>=eMax){
m=0;
e=eMax;
}else if(e+eBias>=1){
m=(value*c-1)*Math.pow(2,mLen);
e=e+eBias;
}else{
m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);
e=0;
}
}

for(;mLen>=8;buffer[offset+i]=m&0xff,i+=d,m/=256,mLen-=8){}

e=e<<mLen|m;
eLen+=mLen;
for(;eLen>0;buffer[offset+i]=e&0xff,i+=d,e/=256,eLen-=8){}

buffer[offset+i-d]|=s*128;
};

},{}],112:[function(require,module,exports){













var ImageSSIM;
(function(ImageSSIM){
'use strict';



(function(Channels){
Channels[Channels["Grey"]=1]="Grey";
Channels[Channels["GreyAlpha"]=2]="GreyAlpha";
Channels[Channels["RGB"]=3]="RGB";
Channels[Channels["RGBAlpha"]=4]="RGBAlpha";
})(ImageSSIM.Channels||(ImageSSIM.Channels={}));
var Channels=ImageSSIM.Channels;




function compare(image1,image2,windowSize,K1,K2,luminance,bitsPerComponent){
if(windowSize===void 0){windowSize=8;}
if(K1===void 0){K1=0.01;}
if(K2===void 0){K2=0.03;}
if(luminance===void 0){luminance=true;}
if(bitsPerComponent===void 0){bitsPerComponent=8;}
if(image1.width!==image2.width||image1.height!==image2.height){
throw new Error('Images have different sizes!');
}

var L=(1<<bitsPerComponent)-1;

var c1=Math.pow(K1*L,2),c2=Math.pow(K2*L,2),numWindows=0,mssim=0.0;
var mcs=0.0;
function iteration(lumaValues1,lumaValues2,averageLumaValue1,averageLumaValue2){

var sigxy,sigsqx,sigsqy;
sigxy=sigsqx=sigsqy=0.0;
for(var i=0;i<lumaValues1.length;i++){
sigsqx+=Math.pow(lumaValues1[i]-averageLumaValue1,2);
sigsqy+=Math.pow(lumaValues2[i]-averageLumaValue2,2);
sigxy+=(lumaValues1[i]-averageLumaValue1)*(lumaValues2[i]-averageLumaValue2);
}
var numPixelsInWin=lumaValues1.length-1;
sigsqx/=numPixelsInWin;
sigsqy/=numPixelsInWin;
sigxy/=numPixelsInWin;

var numerator=(2*averageLumaValue1*averageLumaValue2+c1)*(2*sigxy+c2);
var denominator=(Math.pow(averageLumaValue1,2)+Math.pow(averageLumaValue2,2)+c1)*(sigsqx+sigsqy+c2);
mssim+=numerator/denominator;
mcs+=(2*sigxy+c2)/(sigsqx+sigsqy+c2);
numWindows++;
}

Internals._iterate(image1,image2,windowSize,luminance,iteration);
return{ssim:mssim/numWindows,mcs:mcs/numWindows};
}
ImageSSIM.compare=compare;



var Internals;
(function(Internals){
function _iterate(image1,image2,windowSize,luminance,callback){
var width=image1.width,height=image1.height;
for(var y=0;y<height;y+=windowSize){
for(var x=0;x<width;x+=windowSize){

var windowWidth=Math.min(windowSize,width-x),windowHeight=Math.min(windowSize,height-y);
var lumaValues1=_lumaValuesForWindow(image1,x,y,windowWidth,windowHeight,luminance),lumaValues2=_lumaValuesForWindow(image2,x,y,windowWidth,windowHeight,luminance),averageLuma1=_averageLuma(lumaValues1),averageLuma2=_averageLuma(lumaValues2);
callback(lumaValues1,lumaValues2,averageLuma1,averageLuma2);
}
}
}
Internals._iterate=_iterate;
function _lumaValuesForWindow(image,x,y,width,height,luminance){
var array=image.data,lumaValues=new Float32Array(new ArrayBuffer(width*height*4)),counter=0;
var maxj=y+height;
for(var j=y;j<maxj;j++){
var offset=j*image.width;
var i=(offset+x)*image.channels;
var maxi=(offset+x+width)*image.channels;
switch(image.channels){
case 1:
while(i<maxi){

lumaValues[counter++]=array[i++];
}
break;
case 2:
while(i<maxi){
lumaValues[counter++]=array[i++]*(array[i++]/255);
}
break;
case 3:
if(luminance){
while(i<maxi){
lumaValues[counter++]=array[i++]*0.212655+array[i++]*0.715158+array[i++]*0.072187;
}
}else
{
while(i<maxi){
lumaValues[counter++]=array[i++]+array[i++]+array[i++];
}
}
break;
case 4:
if(luminance){
while(i<maxi){
lumaValues[counter++]=(array[i++]*0.212655+array[i++]*0.715158+array[i++]*0.072187)*(array[i++]/255);
}
}else
{
while(i<maxi){
lumaValues[counter++]=(array[i++]+array[i++]+array[i++])*(array[i++]/255);
}
}
break;}

}
return lumaValues;
}
function _averageLuma(lumaValues){
var sumLuma=0.0;
for(var i=0;i<lumaValues.length;i++){
sumLuma+=lumaValues[i];
}
return sumLuma/lumaValues.length;
}
})(Internals||(Internals={}));
})(ImageSSIM||(ImageSSIM={}));
module.exports=ImageSSIM;

},{}],113:[function(require,module,exports){
arguments[4][93][0].apply(exports,arguments);
},{"dup":93}],114:[function(require,module,exports){
'use strict';

var parser=require('./lib/parser');

module.exports=parser;
module.exports['default']=parser;

},{"./lib/parser":115}],115:[function(require,module,exports){






"use strict";

function peg$subclass(child,parent){
function ctor(){this.constructor=child;}
ctor.prototype=parent.prototype;
child.prototype=new ctor();
}

function peg$SyntaxError(message,expected,found,location){
this.message=message;
this.expected=expected;
this.found=found;
this.location=location;
this.name="SyntaxError";

if(typeof Error.captureStackTrace==="function"){
Error.captureStackTrace(this,peg$SyntaxError);
}
}

peg$subclass(peg$SyntaxError,Error);

peg$SyntaxError.buildMessage=function(expected,found){
var DESCRIBE_EXPECTATION_FNS={
literal:function(expectation){
return"\""+literalEscape(expectation.text)+"\"";
},

"class":function(expectation){
var escapedParts="",
i;

for(i=0;i<expectation.parts.length;i++){
escapedParts+=expectation.parts[i]instanceof Array?
classEscape(expectation.parts[i][0])+"-"+classEscape(expectation.parts[i][1]):
classEscape(expectation.parts[i]);
}

return"["+(expectation.inverted?"^":"")+escapedParts+"]";
},

any:function(expectation){
return"any character";
},

end:function(expectation){
return"end of input";
},

other:function(expectation){
return expectation.description;
}};


function hex(ch){
return ch.charCodeAt(0).toString(16).toUpperCase();
}

function literalEscape(s){
return s.
replace(/\\/g,'\\\\').
replace(/"/g,'\\"').
replace(/\0/g,'\\0').
replace(/\t/g,'\\t').
replace(/\n/g,'\\n').
replace(/\r/g,'\\r').
replace(/[\x00-\x0F]/g,function(ch){return'\\x0'+hex(ch);}).
replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return'\\x'+hex(ch);});
}

function classEscape(s){
return s.
replace(/\\/g,'\\\\').
replace(/\]/g,'\\]').
replace(/\^/g,'\\^').
replace(/-/g,'\\-').
replace(/\0/g,'\\0').
replace(/\t/g,'\\t').
replace(/\n/g,'\\n').
replace(/\r/g,'\\r').
replace(/[\x00-\x0F]/g,function(ch){return'\\x0'+hex(ch);}).
replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return'\\x'+hex(ch);});
}

function describeExpectation(expectation){
return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
}

function describeExpected(expected){
var descriptions=new Array(expected.length),
i,j;

for(i=0;i<expected.length;i++){
descriptions[i]=describeExpectation(expected[i]);
}

descriptions.sort();

if(descriptions.length>0){
for(i=1,j=1;i<descriptions.length;i++){
if(descriptions[i-1]!==descriptions[i]){
descriptions[j]=descriptions[i];
j++;
}
}
descriptions.length=j;
}

switch(descriptions.length){
case 1:
return descriptions[0];

case 2:
return descriptions[0]+" or "+descriptions[1];

default:
return descriptions.slice(0,-1).join(", ")+
", or "+
descriptions[descriptions.length-1];}

}

function describeFound(found){
return found?"\""+literalEscape(found)+"\"":"end of input";
}

return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found.";
};

function peg$parse(input,options){
options=options!==void 0?options:{};

var peg$FAILED={},

peg$startRuleFunctions={start:peg$parsestart},
peg$startRuleFunction=peg$parsestart,

peg$c0=function(elements){
return{
type:'messageFormatPattern',
elements:elements,
location:location()};

},
peg$c1=function(chunks){
return chunks.reduce(function(all,chunk){
return all.concat(chunk);
},[]).join('');
},
peg$c2=function(messageText){
return{
type:'messageTextElement',
value:messageText,
location:location()};

},
peg$c3=function(chars){return chars.join('');},
peg$c4="{",
peg$c5=peg$literalExpectation("{",false),
peg$c6=",",
peg$c7=peg$literalExpectation(",",false),
peg$c8="}",
peg$c9=peg$literalExpectation("}",false),
peg$c10=function(id,format){
return{
type:'argumentElement',
id:id,
format:format&&format[2],
location:location()};

},
peg$c11="number",
peg$c12=peg$literalExpectation("number",false),
peg$c13="date",
peg$c14=peg$literalExpectation("date",false),
peg$c15="time",
peg$c16=peg$literalExpectation("time",false),
peg$c17=function(type,style){
return{
type:type+'Format',
style:style&&style[2],
location:location()};

},
peg$c18="plural",
peg$c19=peg$literalExpectation("plural",false),
peg$c20=function(pluralStyle){
return{
type:pluralStyle.type,
ordinal:false,
offset:pluralStyle.offset||0,
options:pluralStyle.options,
location:location()};

},
peg$c21="selectordinal",
peg$c22=peg$literalExpectation("selectordinal",false),
peg$c23=function(pluralStyle){
return{
type:pluralStyle.type,
ordinal:true,
offset:pluralStyle.offset||0,
options:pluralStyle.options,
location:location()};

},
peg$c24="select",
peg$c25=peg$literalExpectation("select",false),
peg$c26=function(options){
return{
type:'selectFormat',
options:options,
location:location()};

},
peg$c27="=",
peg$c28=peg$literalExpectation("=",false),
peg$c29=function(selector,pattern){
return{
type:'optionalFormatPattern',
selector:selector,
value:pattern,
location:location()};

},
peg$c30="offset:",
peg$c31=peg$literalExpectation("offset:",false),
peg$c32=function(number){
return number;
},
peg$c33=function(offset,options){
return{
type:'pluralFormat',
offset:offset,
options:options,
location:location()};

},
peg$c34=peg$otherExpectation("whitespace"),
peg$c35=/^[ \t\n\r]/,
peg$c36=peg$classExpectation([" ","\t","\n","\r"],false,false),
peg$c37=peg$otherExpectation("optionalWhitespace"),
peg$c38=/^[0-9]/,
peg$c39=peg$classExpectation([["0","9"]],false,false),
peg$c40=/^[0-9a-f]/i,
peg$c41=peg$classExpectation([["0","9"],["a","f"]],false,true),
peg$c42="0",
peg$c43=peg$literalExpectation("0",false),
peg$c44=/^[1-9]/,
peg$c45=peg$classExpectation([["1","9"]],false,false),
peg$c46=function(digits){
return parseInt(digits,10);
},
peg$c47="'",
peg$c48=peg$literalExpectation("'",false),
peg$c49=/^[ \t\n\r,.+={}#]/,
peg$c50=peg$classExpectation([" ","\t","\n","\r",",",".","+","=","{","}","#"],false,false),
peg$c51=peg$anyExpectation(),
peg$c52=function(char){return char;},
peg$c53=function(sequence){return sequence;},
peg$c54=/^[^{}\\\0-\x1F\x7F \t\n\r]/,
peg$c55=peg$classExpectation(["{","}","\\",["\0","\x1F"],"\x7F"," ","\t","\n","\r"],true,false),
peg$c56="\\\\",
peg$c57=peg$literalExpectation("\\\\",false),
peg$c58=function(){return'\\';},
peg$c59="\\#",
peg$c60=peg$literalExpectation("\\#",false),
peg$c61=function(){return'\\#';},
peg$c62="\\{",
peg$c63=peg$literalExpectation("\\{",false),
peg$c64=function(){return'\u007B';},
peg$c65="\\}",
peg$c66=peg$literalExpectation("\\}",false),
peg$c67=function(){return'\u007D';},
peg$c68="\\u",
peg$c69=peg$literalExpectation("\\u",false),
peg$c70=function(digits){
return String.fromCharCode(parseInt(digits,16));
},

peg$currPos=0,
peg$savedPos=0,
peg$posDetailsCache=[{line:1,column:1}],
peg$maxFailPos=0,
peg$maxFailExpected=[],
peg$silentFails=0,

peg$result;

if("startRule"in options){
if(!(options.startRule in peg$startRuleFunctions)){
throw new Error("Can't start parsing from rule \""+options.startRule+"\".");
}

peg$startRuleFunction=peg$startRuleFunctions[options.startRule];
}

function text(){
return input.substring(peg$savedPos,peg$currPos);
}

function location(){
return peg$computeLocation(peg$savedPos,peg$currPos);
}

function expected(description,location){
location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);

throw peg$buildStructuredError(
[peg$otherExpectation(description)],
input.substring(peg$savedPos,peg$currPos),
location);

}

function error(message,location){
location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);

throw peg$buildSimpleError(message,location);
}

function peg$literalExpectation(text,ignoreCase){
return{type:"literal",text:text,ignoreCase:ignoreCase};
}

function peg$classExpectation(parts,inverted,ignoreCase){
return{type:"class",parts:parts,inverted:inverted,ignoreCase:ignoreCase};
}

function peg$anyExpectation(){
return{type:"any"};
}

function peg$endExpectation(){
return{type:"end"};
}

function peg$otherExpectation(description){
return{type:"other",description:description};
}

function peg$computePosDetails(pos){
var details=peg$posDetailsCache[pos],p;

if(details){
return details;
}else{
p=pos-1;
while(!peg$posDetailsCache[p]){
p--;
}

details=peg$posDetailsCache[p];
details={
line:details.line,
column:details.column};


while(p<pos){
if(input.charCodeAt(p)===10){
details.line++;
details.column=1;
}else{
details.column++;
}

p++;
}

peg$posDetailsCache[pos]=details;
return details;
}
}

function peg$computeLocation(startPos,endPos){
var startPosDetails=peg$computePosDetails(startPos),
endPosDetails=peg$computePosDetails(endPos);

return{
start:{
offset:startPos,
line:startPosDetails.line,
column:startPosDetails.column},

end:{
offset:endPos,
line:endPosDetails.line,
column:endPosDetails.column}};


}

function peg$fail(expected){
if(peg$currPos<peg$maxFailPos){return;}

if(peg$currPos>peg$maxFailPos){
peg$maxFailPos=peg$currPos;
peg$maxFailExpected=[];
}

peg$maxFailExpected.push(expected);
}

function peg$buildSimpleError(message,location){
return new peg$SyntaxError(message,null,null,location);
}

function peg$buildStructuredError(expected,found,location){
return new peg$SyntaxError(
peg$SyntaxError.buildMessage(expected,found),
expected,
found,
location);

}

function peg$parsestart(){
var s0;

s0=peg$parsemessageFormatPattern();

return s0;
}

function peg$parsemessageFormatPattern(){
var s0,s1,s2;

s0=peg$currPos;
s1=[];
s2=peg$parsemessageFormatElement();
while(s2!==peg$FAILED){
s1.push(s2);
s2=peg$parsemessageFormatElement();
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c0(s1);
}
s0=s1;

return s0;
}

function peg$parsemessageFormatElement(){
var s0;

s0=peg$parsemessageTextElement();
if(s0===peg$FAILED){
s0=peg$parseargumentElement();
}

return s0;
}

function peg$parsemessageText(){
var s0,s1,s2,s3,s4,s5;

s0=peg$currPos;
s1=[];
s2=peg$currPos;
s3=peg$parse_();
if(s3!==peg$FAILED){
s4=peg$parsechars();
if(s4!==peg$FAILED){
s5=peg$parse_();
if(s5!==peg$FAILED){
s3=[s3,s4,s5];
s2=s3;
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
if(s2!==peg$FAILED){
while(s2!==peg$FAILED){
s1.push(s2);
s2=peg$currPos;
s3=peg$parse_();
if(s3!==peg$FAILED){
s4=peg$parsechars();
if(s4!==peg$FAILED){
s5=peg$parse_();
if(s5!==peg$FAILED){
s3=[s3,s4,s5];
s2=s3;
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
}
}else{
s1=peg$FAILED;
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c1(s1);
}
s0=s1;
if(s0===peg$FAILED){
s0=peg$currPos;
s1=peg$parsews();
if(s1!==peg$FAILED){
s0=input.substring(s0,peg$currPos);
}else{
s0=s1;
}
}

return s0;
}

function peg$parsemessageTextElement(){
var s0,s1;

s0=peg$currPos;
s1=peg$parsemessageText();
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c2(s1);
}
s0=s1;

return s0;
}

function peg$parseargument(){
var s0,s1,s2;

s0=peg$parsenumber();
if(s0===peg$FAILED){
s0=peg$currPos;
s1=[];
s2=peg$parsequoteEscapedChar();
while(s2!==peg$FAILED){
s1.push(s2);
s2=peg$parsequoteEscapedChar();
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c3(s1);
}
s0=s1;
}

return s0;
}

function peg$parseargumentElement(){
var s0,s1,s2,s3,s4,s5,s6,s7,s8;

s0=peg$currPos;
if(input.charCodeAt(peg$currPos)===123){
s1=peg$c4;
peg$currPos++;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c5);}
}
if(s1!==peg$FAILED){
s2=peg$parse_();
if(s2!==peg$FAILED){
s3=peg$parseargument();
if(s3!==peg$FAILED){
s4=peg$parse_();
if(s4!==peg$FAILED){
s5=peg$currPos;
if(input.charCodeAt(peg$currPos)===44){
s6=peg$c6;
peg$currPos++;
}else{
s6=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c7);}
}
if(s6!==peg$FAILED){
s7=peg$parse_();
if(s7!==peg$FAILED){
s8=peg$parseelementFormat();
if(s8!==peg$FAILED){
s6=[s6,s7,s8];
s5=s6;
}else{
peg$currPos=s5;
s5=peg$FAILED;
}
}else{
peg$currPos=s5;
s5=peg$FAILED;
}
}else{
peg$currPos=s5;
s5=peg$FAILED;
}
if(s5===peg$FAILED){
s5=null;
}
if(s5!==peg$FAILED){
s6=peg$parse_();
if(s6!==peg$FAILED){
if(input.charCodeAt(peg$currPos)===125){
s7=peg$c8;
peg$currPos++;
}else{
s7=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c9);}
}
if(s7!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c10(s3,s5);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parseelementFormat(){
var s0;

s0=peg$parsesimpleFormat();
if(s0===peg$FAILED){
s0=peg$parsepluralFormat();
if(s0===peg$FAILED){
s0=peg$parseselectOrdinalFormat();
if(s0===peg$FAILED){
s0=peg$parseselectFormat();
}
}
}

return s0;
}

function peg$parsesimpleFormat(){
var s0,s1,s2,s3,s4,s5,s6;

s0=peg$currPos;
if(input.substr(peg$currPos,6)===peg$c11){
s1=peg$c11;
peg$currPos+=6;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c12);}
}
if(s1===peg$FAILED){
if(input.substr(peg$currPos,4)===peg$c13){
s1=peg$c13;
peg$currPos+=4;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c14);}
}
if(s1===peg$FAILED){
if(input.substr(peg$currPos,4)===peg$c15){
s1=peg$c15;
peg$currPos+=4;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c16);}
}
}
}
if(s1!==peg$FAILED){
s2=peg$parse_();
if(s2!==peg$FAILED){
s3=peg$currPos;
if(input.charCodeAt(peg$currPos)===44){
s4=peg$c6;
peg$currPos++;
}else{
s4=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c7);}
}
if(s4!==peg$FAILED){
s5=peg$parse_();
if(s5!==peg$FAILED){
s6=peg$parsechars();
if(s6!==peg$FAILED){
s4=[s4,s5,s6];
s3=s4;
}else{
peg$currPos=s3;
s3=peg$FAILED;
}
}else{
peg$currPos=s3;
s3=peg$FAILED;
}
}else{
peg$currPos=s3;
s3=peg$FAILED;
}
if(s3===peg$FAILED){
s3=null;
}
if(s3!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c17(s1,s3);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parsepluralFormat(){
var s0,s1,s2,s3,s4,s5;

s0=peg$currPos;
if(input.substr(peg$currPos,6)===peg$c18){
s1=peg$c18;
peg$currPos+=6;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c19);}
}
if(s1!==peg$FAILED){
s2=peg$parse_();
if(s2!==peg$FAILED){
if(input.charCodeAt(peg$currPos)===44){
s3=peg$c6;
peg$currPos++;
}else{
s3=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c7);}
}
if(s3!==peg$FAILED){
s4=peg$parse_();
if(s4!==peg$FAILED){
s5=peg$parsepluralStyle();
if(s5!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c20(s5);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parseselectOrdinalFormat(){
var s0,s1,s2,s3,s4,s5;

s0=peg$currPos;
if(input.substr(peg$currPos,13)===peg$c21){
s1=peg$c21;
peg$currPos+=13;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c22);}
}
if(s1!==peg$FAILED){
s2=peg$parse_();
if(s2!==peg$FAILED){
if(input.charCodeAt(peg$currPos)===44){
s3=peg$c6;
peg$currPos++;
}else{
s3=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c7);}
}
if(s3!==peg$FAILED){
s4=peg$parse_();
if(s4!==peg$FAILED){
s5=peg$parsepluralStyle();
if(s5!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c23(s5);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parseselectFormat(){
var s0,s1,s2,s3,s4,s5,s6;

s0=peg$currPos;
if(input.substr(peg$currPos,6)===peg$c24){
s1=peg$c24;
peg$currPos+=6;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c25);}
}
if(s1!==peg$FAILED){
s2=peg$parse_();
if(s2!==peg$FAILED){
if(input.charCodeAt(peg$currPos)===44){
s3=peg$c6;
peg$currPos++;
}else{
s3=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c7);}
}
if(s3!==peg$FAILED){
s4=peg$parse_();
if(s4!==peg$FAILED){
s5=[];
s6=peg$parseoptionalFormatPattern();
if(s6!==peg$FAILED){
while(s6!==peg$FAILED){
s5.push(s6);
s6=peg$parseoptionalFormatPattern();
}
}else{
s5=peg$FAILED;
}
if(s5!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c26(s5);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parseselector(){
var s0,s1,s2,s3;

s0=peg$currPos;
s1=peg$currPos;
if(input.charCodeAt(peg$currPos)===61){
s2=peg$c27;
peg$currPos++;
}else{
s2=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c28);}
}
if(s2!==peg$FAILED){
s3=peg$parsenumber();
if(s3!==peg$FAILED){
s2=[s2,s3];
s1=s2;
}else{
peg$currPos=s1;
s1=peg$FAILED;
}
}else{
peg$currPos=s1;
s1=peg$FAILED;
}
if(s1!==peg$FAILED){
s0=input.substring(s0,peg$currPos);
}else{
s0=s1;
}
if(s0===peg$FAILED){
s0=peg$parsechars();
}

return s0;
}

function peg$parseoptionalFormatPattern(){
var s0,s1,s2,s3,s4,s5,s6;

s0=peg$currPos;
s1=peg$parse_();
if(s1!==peg$FAILED){
s2=peg$parseselector();
if(s2!==peg$FAILED){
s3=peg$parse_();
if(s3!==peg$FAILED){
if(input.charCodeAt(peg$currPos)===123){
s4=peg$c4;
peg$currPos++;
}else{
s4=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c5);}
}
if(s4!==peg$FAILED){
s5=peg$parsemessageFormatPattern();
if(s5!==peg$FAILED){
if(input.charCodeAt(peg$currPos)===125){
s6=peg$c8;
peg$currPos++;
}else{
s6=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c9);}
}
if(s6!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c29(s2,s5);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parseoffset(){
var s0,s1,s2,s3;

s0=peg$currPos;
if(input.substr(peg$currPos,7)===peg$c30){
s1=peg$c30;
peg$currPos+=7;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c31);}
}
if(s1!==peg$FAILED){
s2=peg$parse_();
if(s2!==peg$FAILED){
s3=peg$parsenumber();
if(s3!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c32(s3);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parsepluralStyle(){
var s0,s1,s2,s3,s4;

s0=peg$currPos;
s1=peg$parseoffset();
if(s1===peg$FAILED){
s1=null;
}
if(s1!==peg$FAILED){
s2=peg$parse_();
if(s2!==peg$FAILED){
s3=[];
s4=peg$parseoptionalFormatPattern();
if(s4!==peg$FAILED){
while(s4!==peg$FAILED){
s3.push(s4);
s4=peg$parseoptionalFormatPattern();
}
}else{
s3=peg$FAILED;
}
if(s3!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c33(s1,s3);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}

return s0;
}

function peg$parsews(){
var s0,s1;

peg$silentFails++;
s0=[];
if(peg$c35.test(input.charAt(peg$currPos))){
s1=input.charAt(peg$currPos);
peg$currPos++;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c36);}
}
if(s1!==peg$FAILED){
while(s1!==peg$FAILED){
s0.push(s1);
if(peg$c35.test(input.charAt(peg$currPos))){
s1=input.charAt(peg$currPos);
peg$currPos++;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c36);}
}
}
}else{
s0=peg$FAILED;
}
peg$silentFails--;
if(s0===peg$FAILED){
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c34);}
}

return s0;
}

function peg$parse_(){
var s0,s1,s2;

peg$silentFails++;
s0=peg$currPos;
s1=[];
s2=peg$parsews();
while(s2!==peg$FAILED){
s1.push(s2);
s2=peg$parsews();
}
if(s1!==peg$FAILED){
s0=input.substring(s0,peg$currPos);
}else{
s0=s1;
}
peg$silentFails--;
if(s0===peg$FAILED){
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c37);}
}

return s0;
}

function peg$parsedigit(){
var s0;

if(peg$c38.test(input.charAt(peg$currPos))){
s0=input.charAt(peg$currPos);
peg$currPos++;
}else{
s0=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c39);}
}

return s0;
}

function peg$parsehexDigit(){
var s0;

if(peg$c40.test(input.charAt(peg$currPos))){
s0=input.charAt(peg$currPos);
peg$currPos++;
}else{
s0=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c41);}
}

return s0;
}

function peg$parsenumber(){
var s0,s1,s2,s3,s4,s5;

s0=peg$currPos;
if(input.charCodeAt(peg$currPos)===48){
s1=peg$c42;
peg$currPos++;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c43);}
}
if(s1===peg$FAILED){
s1=peg$currPos;
s2=peg$currPos;
if(peg$c44.test(input.charAt(peg$currPos))){
s3=input.charAt(peg$currPos);
peg$currPos++;
}else{
s3=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c45);}
}
if(s3!==peg$FAILED){
s4=[];
s5=peg$parsedigit();
while(s5!==peg$FAILED){
s4.push(s5);
s5=peg$parsedigit();
}
if(s4!==peg$FAILED){
s3=[s3,s4];
s2=s3;
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
}else{
peg$currPos=s2;
s2=peg$FAILED;
}
if(s2!==peg$FAILED){
s1=input.substring(s1,peg$currPos);
}else{
s1=s2;
}
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c46(s1);
}
s0=s1;

return s0;
}

function peg$parsequoteEscapedChar(){
var s0,s1,s2;

s0=peg$currPos;
s1=peg$currPos;
peg$silentFails++;
if(input.charCodeAt(peg$currPos)===39){
s2=peg$c47;
peg$currPos++;
}else{
s2=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c48);}
}
if(s2===peg$FAILED){
if(peg$c49.test(input.charAt(peg$currPos))){
s2=input.charAt(peg$currPos);
peg$currPos++;
}else{
s2=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c50);}
}
}
peg$silentFails--;
if(s2===peg$FAILED){
s1=void 0;
}else{
peg$currPos=s1;
s1=peg$FAILED;
}
if(s1!==peg$FAILED){
if(input.length>peg$currPos){
s2=input.charAt(peg$currPos);
peg$currPos++;
}else{
s2=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c51);}
}
if(s2!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c52(s2);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
if(s0===peg$FAILED){
s0=peg$currPos;
if(input.charCodeAt(peg$currPos)===39){
s1=peg$c47;
peg$currPos++;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c48);}
}
if(s1!==peg$FAILED){
s2=peg$parseescape();
if(s2!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c53(s2);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}

return s0;
}

function peg$parseapostrophe(){
var s0;

if(input.charCodeAt(peg$currPos)===39){
s0=peg$c47;
peg$currPos++;
}else{
s0=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c48);}
}

return s0;
}

function peg$parseescape(){
var s0;

if(peg$c49.test(input.charAt(peg$currPos))){
s0=input.charAt(peg$currPos);
peg$currPos++;
}else{
s0=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c50);}
}
if(s0===peg$FAILED){
s0=peg$parseapostrophe();
}

return s0;
}

function peg$parsechar(){
var s0,s1,s2,s3,s4,s5,s6,s7;

s0=peg$currPos;
if(input.charCodeAt(peg$currPos)===39){
s1=peg$c47;
peg$currPos++;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c48);}
}
if(s1!==peg$FAILED){
s2=peg$parseapostrophe();
if(s2!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c53(s2);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
if(s0===peg$FAILED){
if(peg$c54.test(input.charAt(peg$currPos))){
s0=input.charAt(peg$currPos);
peg$currPos++;
}else{
s0=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c55);}
}
if(s0===peg$FAILED){
s0=peg$currPos;
if(input.substr(peg$currPos,2)===peg$c56){
s1=peg$c56;
peg$currPos+=2;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c57);}
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c58();
}
s0=s1;
if(s0===peg$FAILED){
s0=peg$currPos;
if(input.substr(peg$currPos,2)===peg$c59){
s1=peg$c59;
peg$currPos+=2;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c60);}
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c61();
}
s0=s1;
if(s0===peg$FAILED){
s0=peg$currPos;
if(input.substr(peg$currPos,2)===peg$c62){
s1=peg$c62;
peg$currPos+=2;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c63);}
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c64();
}
s0=s1;
if(s0===peg$FAILED){
s0=peg$currPos;
if(input.substr(peg$currPos,2)===peg$c65){
s1=peg$c65;
peg$currPos+=2;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c66);}
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c67();
}
s0=s1;
if(s0===peg$FAILED){
s0=peg$currPos;
if(input.substr(peg$currPos,2)===peg$c68){
s1=peg$c68;
peg$currPos+=2;
}else{
s1=peg$FAILED;
if(peg$silentFails===0){peg$fail(peg$c69);}
}
if(s1!==peg$FAILED){
s2=peg$currPos;
s3=peg$currPos;
s4=peg$parsehexDigit();
if(s4!==peg$FAILED){
s5=peg$parsehexDigit();
if(s5!==peg$FAILED){
s6=peg$parsehexDigit();
if(s6!==peg$FAILED){
s7=peg$parsehexDigit();
if(s7!==peg$FAILED){
s4=[s4,s5,s6,s7];
s3=s4;
}else{
peg$currPos=s3;
s3=peg$FAILED;
}
}else{
peg$currPos=s3;
s3=peg$FAILED;
}
}else{
peg$currPos=s3;
s3=peg$FAILED;
}
}else{
peg$currPos=s3;
s3=peg$FAILED;
}
if(s3!==peg$FAILED){
s2=input.substring(s2,peg$currPos);
}else{
s2=s3;
}
if(s2!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c70(s2);
s0=s1;
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}else{
peg$currPos=s0;
s0=peg$FAILED;
}
}
}
}
}
}
}

return s0;
}

function peg$parsechars(){
var s0,s1,s2;

s0=peg$currPos;
s1=[];
s2=peg$parsechar();
if(s2!==peg$FAILED){
while(s2!==peg$FAILED){
s1.push(s2);
s2=peg$parsechar();
}
}else{
s1=peg$FAILED;
}
if(s1!==peg$FAILED){
peg$savedPos=s0;
s1=peg$c3(s1);
}
s0=s1;

return s0;
}

peg$result=peg$startRuleFunction();

if(peg$result!==peg$FAILED&&peg$currPos===input.length){
return peg$result;
}else{
if(peg$result!==peg$FAILED&&peg$currPos<input.length){
peg$fail(peg$endExpectation());
}

throw peg$buildStructuredError(
peg$maxFailExpected,
peg$maxFailPos<input.length?input.charAt(peg$maxFailPos):null,
peg$maxFailPos<input.length?
peg$computeLocation(peg$maxFailPos,peg$maxFailPos+1):
peg$computeLocation(peg$maxFailPos,peg$maxFailPos));

}
}

module.exports={
SyntaxError:peg$SyntaxError,
parse:peg$parse};


},{}],116:[function(require,module,exports){
"use strict";





var __extends=this&&this.__extends||function(){
var extendStatics=function(d,b){
extendStatics=Object.setPrototypeOf||
{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b;}||
function(d,b){for(var p in b)if(b.hasOwnProperty(p))d[p]=b[p];};
return extendStatics(d,b);
};
return function(d,b){
extendStatics(d,b);
function __(){this.constructor=d;}
d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __());
};
}();
Object.defineProperty(exports,"__esModule",{value:true});
var Compiler=function(){
function Compiler(locales,formats,formatters){
this.locales=[];
this.formats={
number:{},
date:{},
time:{}};

this.pluralNumberFormat=null;
this.currentPlural=null;
this.pluralStack=[];
this.locales=locales;
this.formats=formats;
this.formatters=formatters;
}
Compiler.prototype.compile=function(ast){
this.pluralStack=[];
this.currentPlural=null;
this.pluralNumberFormat=null;
return this.compileMessage(ast);
};
Compiler.prototype.compileMessage=function(ast){
var _this=this;
if(!(ast&&ast.type==='messageFormatPattern')){
throw new Error('Message AST is not of type: "messageFormatPattern"');
}
var elements=ast.elements;
var pattern=elements.
filter(function(el){
return el.type==='messageTextElement'||el.type==='argumentElement';
}).
map(function(el){
return el.type==='messageTextElement'?
_this.compileMessageText(el):
_this.compileArgument(el);
});
if(pattern.length!==elements.length){
throw new Error('Message element does not have a valid type');
}
return pattern;
};
Compiler.prototype.compileMessageText=function(element){



if(this.currentPlural&&/(^|[^\\])#/g.test(element.value)){


if(!this.pluralNumberFormat){
this.pluralNumberFormat=new Intl.NumberFormat(this.locales);
}
return new PluralOffsetString(this.currentPlural.id,this.currentPlural.format.offset,this.pluralNumberFormat,element.value);
}

return element.value.replace(/\\#/g,'#');
};
Compiler.prototype.compileArgument=function(element){
var format=element.format,id=element.id;
var formatters=this.formatters;
if(!format){
return new StringFormat(id);
}
var _a=this,formats=_a.formats,locales=_a.locales;
switch(format.type){
case'numberFormat':
return{
id:id,
format:formatters.getNumberFormat(locales,formats.number[format.style]).format};

case'dateFormat':
return{
id:id,
format:formatters.getDateTimeFormat(locales,formats.date[format.style]).format};

case'timeFormat':
return{
id:id,
format:formatters.getDateTimeFormat(locales,formats.time[format.style]).format};

case'pluralFormat':
return new PluralFormat(id,format.offset,this.compileOptions(element),formatters.getPluralRules(locales,{
type:format.ordinal?'ordinal':'cardinal'}));

case'selectFormat':
return new SelectFormat(id,this.compileOptions(element));
default:
throw new Error('Message element does not have a valid format type');}

};
Compiler.prototype.compileOptions=function(element){
var _this=this;
var format=element.format;
var options=format.options;



this.pluralStack.push(this.currentPlural);
this.currentPlural=format.type==='pluralFormat'?element:null;
var optionsHash=options.reduce(function(all,option){

all[option.selector]=_this.compileMessage(option.value);
return all;
},{});

this.currentPlural=this.pluralStack.pop();
return optionsHash;
};
return Compiler;
}();
exports.default=Compiler;

var Formatter=function(){
function Formatter(id){
this.id=id;
}
return Formatter;
}();
var StringFormat=function(_super){
__extends(StringFormat,_super);
function StringFormat(){
return _super!==null&&_super.apply(this,arguments)||this;
}
StringFormat.prototype.format=function(value){
if(!value&&typeof value!=='number'){
return'';
}
return typeof value==='string'?value:String(value);
};
return StringFormat;
}(Formatter);
var PluralFormat=function(){
function PluralFormat(id,offset,options,pluralRules){
this.id=id;
this.offset=offset;
this.options=options;
this.pluralRules=pluralRules;
}
PluralFormat.prototype.getOption=function(value){
var options=this.options;
var option=options['='+value]||
options[this.pluralRules.select(value-this.offset)];
return option||options.other;
};
return PluralFormat;
}();
var PluralOffsetString=function(_super){
__extends(PluralOffsetString,_super);
function PluralOffsetString(id,offset,numberFormat,string){
var _this=_super.call(this,id)||this;
_this.offset=offset;
_this.numberFormat=numberFormat;
_this.string=string;
return _this;
}
PluralOffsetString.prototype.format=function(value){
var number=this.numberFormat.format(value-this.offset);
return this.string.
replace(/(^|[^\\])#/g,'$1'+number).
replace(/\\#/g,'#');
};
return PluralOffsetString;
}(Formatter);
exports.PluralOffsetString=PluralOffsetString;
var SelectFormat=function(){
function SelectFormat(id,options){
this.id=id;
this.options=options;
}
SelectFormat.prototype.getOption=function(value){
var options=this.options;
return options[value]||options.other;
};
return SelectFormat;
}();
exports.SelectFormat=SelectFormat;
function isSelectOrPluralFormat(f){
return!!f.options;
}
exports.isSelectOrPluralFormat=isSelectOrPluralFormat;

},{}],117:[function(require,module,exports){
"use strict";





var __extends=this&&this.__extends||function(){
var extendStatics=function(d,b){
extendStatics=Object.setPrototypeOf||
{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b;}||
function(d,b){for(var p in b)if(b.hasOwnProperty(p))d[p]=b[p];};
return extendStatics(d,b);
};
return function(d,b){
extendStatics(d,b);
function __(){this.constructor=d;}
d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __());
};
}();
var __assign=this&&this.__assign||function(){
__assign=Object.assign||function(t){
for(var s,i=1,n=arguments.length;i<n;i++){
s=arguments[i];
for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))
t[p]=s[p];
}
return t;
};
return __assign.apply(this,arguments);
};
Object.defineProperty(exports,"__esModule",{value:true});

var compiler_1=require("./compiler");

function resolveLocale(locales){
if(typeof locales==='string'){
locales=[locales];
}
try{
return Intl.NumberFormat.supportedLocalesOf(locales,{


localeMatcher:'best fit'})[
0];
}
catch(e){
return IntlMessageFormat.defaultLocale;
}
}
function formatPatterns(pattern,values){
var result='';
for(var _i=0,pattern_1=pattern;_i<pattern_1.length;_i++){
var part=pattern_1[_i];

if(typeof part==='string'){
result+=part;
continue;
}
var id=part.id;

if(!(values&&id in values)){
throw new FormatError("A value must be provided for: "+id,id);
}
var value=values[id];



if(compiler_1.isSelectOrPluralFormat(part)){
result+=formatPatterns(part.getOption(value),values);
}else
{
result+=part.format(value);
}
}
return result;
}
function mergeConfig(c1,c2){
if(!c2){
return c1;
}
return __assign({},c1||{},c2||{},Object.keys(c1).reduce(function(all,k){
all[k]=__assign({},c1[k],c2[k]||{});
return all;
},{}));
}
function mergeConfigs(defaultConfig,configs){
if(!configs){
return defaultConfig;
}
return Object.keys(defaultConfig).reduce(function(all,k){
all[k]=mergeConfig(defaultConfig[k],configs[k]);
return all;
},__assign({},defaultConfig));
}
var FormatError=function(_super){
__extends(FormatError,_super);
function FormatError(msg,variableId){
var _this=_super.call(this,msg)||this;
_this.variableId=variableId;
return _this;
}
return FormatError;
}(Error);
function createDefaultFormatters(){
return{
getNumberFormat:function(){
var _a;
var args=[];
for(var _i=0;_i<arguments.length;_i++){
args[_i]=arguments[_i];
}
return new((_a=Intl.NumberFormat).bind.apply(_a,[void 0].concat(args)))();
},
getDateTimeFormat:function(){
var _a;
var args=[];
for(var _i=0;_i<arguments.length;_i++){
args[_i]=arguments[_i];
}
return new((_a=Intl.DateTimeFormat).bind.apply(_a,[void 0].concat(args)))();
},
getPluralRules:function(){
var _a;
var args=[];
for(var _i=0;_i<arguments.length;_i++){
args[_i]=arguments[_i];
}
return new((_a=Intl.PluralRules).bind.apply(_a,[void 0].concat(args)))();
}};

}
exports.createDefaultFormatters=createDefaultFormatters;
var IntlMessageFormat=function(){
function IntlMessageFormat(message,locales,overrideFormats,opts){
var _this=this;
if(locales===void 0){locales=IntlMessageFormat.defaultLocale;}
this.format=function(values){
try{
return formatPatterns(_this.pattern,values);
}
catch(e){
if(e.variableId){
throw new Error("The intl string context variable '"+e.variableId+"' was not provided to the string '"+_this.message+"'");
}else
{
throw e;
}
}
};
if(typeof message==='string'){
if(!IntlMessageFormat.__parse){
throw new TypeError('IntlMessageFormat.__parse must be set to process `message` of type `string`');
}

this.ast=IntlMessageFormat.__parse(message);
}else
{
this.ast=message;
}
this.message=message;
if(!(this.ast&&this.ast.type==='messageFormatPattern')){
throw new TypeError('A message must be provided as a String or AST.');
}


var formats=mergeConfigs(IntlMessageFormat.formats,overrideFormats);

this.locale=resolveLocale(locales||[]);
var formatters=opts&&opts.formatters||createDefaultFormatters();



this.pattern=new compiler_1.default(locales,formats,formatters).compile(this.ast);


}
IntlMessageFormat.prototype.resolvedOptions=function(){
return{locale:this.locale};
};
IntlMessageFormat.prototype.getAst=function(){
return this.ast;
};
IntlMessageFormat.defaultLocale='en';
IntlMessageFormat.__parse=undefined;



IntlMessageFormat.formats={
number:{
currency:{
style:'currency'},

percent:{
style:'percent'}},


date:{
short:{
month:'numeric',
day:'numeric',
year:'2-digit'},

medium:{
month:'short',
day:'numeric',
year:'numeric'},

long:{
month:'long',
day:'numeric',
year:'numeric'},

full:{
weekday:'long',
month:'long',
day:'numeric',
year:'numeric'}},


time:{
short:{
hour:'numeric',
minute:'numeric'},

medium:{
hour:'numeric',
minute:'numeric',
second:'numeric'},

long:{
hour:'numeric',
minute:'numeric',
second:'numeric',
timeZoneName:'short'},

full:{
hour:'numeric',
minute:'numeric',
second:'numeric',
timeZoneName:'short'}}};



return IntlMessageFormat;
}();
exports.IntlMessageFormat=IntlMessageFormat;
exports.default=IntlMessageFormat;

},{"./compiler":116}],118:[function(require,module,exports){
"use strict";





function __export(m){
for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p];
}
Object.defineProperty(exports,"__esModule",{value:true});
var intl_messageformat_parser_1=require("intl-messageformat-parser");
var core_1=require("./core");
core_1.default.__parse=intl_messageformat_parser_1.default.parse;
__export(require("./core"));
exports.default=core_1.default;

},{"./core":117,"intl-messageformat-parser":114}],119:[function(require,module,exports){
'use strict';
var IntlMessageFormat=require('./dist').default;




exports=module.exports=IntlMessageFormat;
exports['default']=exports;

},{"./dist":118}],120:[function(require,module,exports){









module.exports=function(obj){
return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer);
};

function isBuffer(obj){
return!!obj.constructor&&typeof obj.constructor.isBuffer==='function'&&obj.constructor.isBuffer(obj);
}


function isSlowBuffer(obj){
return typeof obj.readFloatLE==='function'&&typeof obj.slice==='function'&&isBuffer(obj.slice(0,0));
}

},{}],121:[function(require,module,exports){
var toString={}.toString;

module.exports=Array.isArray||function(arr){
return toString.call(arr)=='[object Array]';
};

},{}],122:[function(require,module,exports){
var encode=require('./lib/encoder'),
decode=require('./lib/decoder');

module.exports={
encode:encode,
decode:decode};


},{"./lib/decoder":123,"./lib/encoder":124}],123:[function(require,module,exports){
(function(Buffer){


























var JpegImage=function jpegImage(){
"use strict";
var dctZigZag=new Int32Array([
0,
1,8,
16,9,2,
3,10,17,24,
32,25,18,11,4,
5,12,19,26,33,40,
48,41,34,27,20,13,6,
7,14,21,28,35,42,49,56,
57,50,43,36,29,22,15,
23,30,37,44,51,58,
59,52,45,38,31,
39,46,53,60,
61,54,47,
55,62,
63]);


var dctCos1=4017;
var dctSin1=799;
var dctCos3=3406;
var dctSin3=2276;
var dctCos6=1567;
var dctSin6=3784;
var dctSqrt2=5793;
var dctSqrt1d2=2896;

function constructor(){
}

function buildHuffmanTable(codeLengths,values){
var k=0,code=[],i,j,length=16;
while(length>0&&!codeLengths[length-1])
length--;
code.push({children:[],index:0});
var p=code[0],q;
for(i=0;i<length;i++){
for(j=0;j<codeLengths[i];j++){
p=code.pop();
p.children[p.index]=values[k];
while(p.index>0){
p=code.pop();
}
p.index++;
code.push(p);
while(code.length<=i){
code.push(q={children:[],index:0});
p.children[p.index]=q.children;
p=q;
}
k++;
}
if(i+1<length){

code.push(q={children:[],index:0});
p.children[p.index]=q.children;
p=q;
}
}
return code[0].children;
}

function decodeScan(data,offset,
frame,components,resetInterval,
spectralStart,spectralEnd,
successivePrev,successive){
var precision=frame.precision;
var samplesPerLine=frame.samplesPerLine;
var scanLines=frame.scanLines;
var mcusPerLine=frame.mcusPerLine;
var progressive=frame.progressive;
var maxH=frame.maxH,maxV=frame.maxV;

var startOffset=offset,bitsData=0,bitsCount=0;
function readBit(){
if(bitsCount>0){
bitsCount--;
return bitsData>>bitsCount&1;
}
bitsData=data[offset++];
if(bitsData==0xFF){
var nextByte=data[offset++];
if(nextByte){
throw"unexpected marker: "+(bitsData<<8|nextByte).toString(16);
}

}
bitsCount=7;
return bitsData>>>7;
}
function decodeHuffman(tree){
var node=tree,bit;
while((bit=readBit())!==null){
node=node[bit];
if(typeof node==='number')
return node;
if(typeof node!=='object')
throw"invalid huffman sequence";
}
return null;
}
function receive(length){
var n=0;
while(length>0){
var bit=readBit();
if(bit===null)return;
n=n<<1|bit;
length--;
}
return n;
}
function receiveAndExtend(length){
var n=receive(length);
if(n>=1<<length-1)
return n;
return n+(-1<<length)+1;
}
function decodeBaseline(component,zz){
var t=decodeHuffman(component.huffmanTableDC);
var diff=t===0?0:receiveAndExtend(t);
zz[0]=component.pred+=diff;
var k=1;
while(k<64){
var rs=decodeHuffman(component.huffmanTableAC);
var s=rs&15,r=rs>>4;
if(s===0){
if(r<15)
break;
k+=16;
continue;
}
k+=r;
var z=dctZigZag[k];
zz[z]=receiveAndExtend(s);
k++;
}
}
function decodeDCFirst(component,zz){
var t=decodeHuffman(component.huffmanTableDC);
var diff=t===0?0:receiveAndExtend(t)<<successive;
zz[0]=component.pred+=diff;
}
function decodeDCSuccessive(component,zz){
zz[0]|=readBit()<<successive;
}
var eobrun=0;
function decodeACFirst(component,zz){
if(eobrun>0){
eobrun--;
return;
}
var k=spectralStart,e=spectralEnd;
while(k<=e){
var rs=decodeHuffman(component.huffmanTableAC);
var s=rs&15,r=rs>>4;
if(s===0){
if(r<15){
eobrun=receive(r)+(1<<r)-1;
break;
}
k+=16;
continue;
}
k+=r;
var z=dctZigZag[k];
zz[z]=receiveAndExtend(s)*(1<<successive);
k++;
}
}
var successiveACState=0,successiveACNextValue;
function decodeACSuccessive(component,zz){
var k=spectralStart,e=spectralEnd,r=0;
while(k<=e){
var z=dctZigZag[k];
switch(successiveACState){
case 0:
var rs=decodeHuffman(component.huffmanTableAC);
var s=rs&15,r=rs>>4;
if(s===0){
if(r<15){
eobrun=receive(r)+(1<<r);
successiveACState=4;
}else{
r=16;
successiveACState=1;
}
}else{
if(s!==1)
throw"invalid ACn encoding";
successiveACNextValue=receiveAndExtend(s);
successiveACState=r?2:3;
}
continue;
case 1:
case 2:
if(zz[z])
zz[z]+=readBit()<<successive;else
{
r--;
if(r===0)
successiveACState=successiveACState==2?3:0;
}
break;
case 3:
if(zz[z])
zz[z]+=readBit()<<successive;else
{
zz[z]=successiveACNextValue<<successive;
successiveACState=0;
}
break;
case 4:
if(zz[z])
zz[z]+=readBit()<<successive;
break;}

k++;
}
if(successiveACState===4){
eobrun--;
if(eobrun===0)
successiveACState=0;
}
}
function decodeMcu(component,decode,mcu,row,col){
var mcuRow=mcu/mcusPerLine|0;
var mcuCol=mcu%mcusPerLine;
var blockRow=mcuRow*component.v+row;
var blockCol=mcuCol*component.h+col;
decode(component,component.blocks[blockRow][blockCol]);
}
function decodeBlock(component,decode,mcu){
var blockRow=mcu/component.blocksPerLine|0;
var blockCol=mcu%component.blocksPerLine;
decode(component,component.blocks[blockRow][blockCol]);
}

var componentsLength=components.length;
var component,i,j,k,n;
var decodeFn;
if(progressive){
if(spectralStart===0)
decodeFn=successivePrev===0?decodeDCFirst:decodeDCSuccessive;else

decodeFn=successivePrev===0?decodeACFirst:decodeACSuccessive;
}else{
decodeFn=decodeBaseline;
}

var mcu=0,marker;
var mcuExpected;
if(componentsLength==1){
mcuExpected=components[0].blocksPerLine*components[0].blocksPerColumn;
}else{
mcuExpected=mcusPerLine*frame.mcusPerColumn;
}
if(!resetInterval)resetInterval=mcuExpected;

var h,v;
while(mcu<mcuExpected){

for(i=0;i<componentsLength;i++)
components[i].pred=0;
eobrun=0;

if(componentsLength==1){
component=components[0];
for(n=0;n<resetInterval;n++){
decodeBlock(component,decodeFn,mcu);
mcu++;
}
}else{
for(n=0;n<resetInterval;n++){
for(i=0;i<componentsLength;i++){
component=components[i];
h=component.h;
v=component.v;
for(j=0;j<v;j++){
for(k=0;k<h;k++){
decodeMcu(component,decodeFn,mcu,j,k);
}
}
}
mcu++;


if(mcu===mcuExpected)break;
}
}


bitsCount=0;
marker=data[offset]<<8|data[offset+1];
if(marker<0xFF00){
throw"marker was not found";
}

if(marker>=0xFFD0&&marker<=0xFFD7){
offset+=2;
}else

break;
}

return offset-startOffset;
}

function buildComponentData(frame,component){
var lines=[];
var blocksPerLine=component.blocksPerLine;
var blocksPerColumn=component.blocksPerColumn;
var samplesPerLine=blocksPerLine<<3;
var R=new Int32Array(64),r=new Uint8Array(64);






function quantizeAndInverse(zz,dataOut,dataIn){
var qt=component.quantizationTable;
var v0,v1,v2,v3,v4,v5,v6,v7,t;
var p=dataIn;
var i;


for(i=0;i<64;i++)
p[i]=zz[i]*qt[i];


for(i=0;i<8;++i){
var row=8*i;


if(p[1+row]==0&&p[2+row]==0&&p[3+row]==0&&
p[4+row]==0&&p[5+row]==0&&p[6+row]==0&&
p[7+row]==0){
t=dctSqrt2*p[0+row]+512>>10;
p[0+row]=t;
p[1+row]=t;
p[2+row]=t;
p[3+row]=t;
p[4+row]=t;
p[5+row]=t;
p[6+row]=t;
p[7+row]=t;
continue;
}


v0=dctSqrt2*p[0+row]+128>>8;
v1=dctSqrt2*p[4+row]+128>>8;
v2=p[2+row];
v3=p[6+row];
v4=dctSqrt1d2*(p[1+row]-p[7+row])+128>>8;
v7=dctSqrt1d2*(p[1+row]+p[7+row])+128>>8;
v5=p[3+row]<<4;
v6=p[5+row]<<4;


t=v0-v1+1>>1;
v0=v0+v1+1>>1;
v1=t;
t=v2*dctSin6+v3*dctCos6+128>>8;
v2=v2*dctCos6-v3*dctSin6+128>>8;
v3=t;
t=v4-v6+1>>1;
v4=v4+v6+1>>1;
v6=t;
t=v7+v5+1>>1;
v5=v7-v5+1>>1;
v7=t;


t=v0-v3+1>>1;
v0=v0+v3+1>>1;
v3=t;
t=v1-v2+1>>1;
v1=v1+v2+1>>1;
v2=t;
t=v4*dctSin3+v7*dctCos3+2048>>12;
v4=v4*dctCos3-v7*dctSin3+2048>>12;
v7=t;
t=v5*dctSin1+v6*dctCos1+2048>>12;
v5=v5*dctCos1-v6*dctSin1+2048>>12;
v6=t;


p[0+row]=v0+v7;
p[7+row]=v0-v7;
p[1+row]=v1+v6;
p[6+row]=v1-v6;
p[2+row]=v2+v5;
p[5+row]=v2-v5;
p[3+row]=v3+v4;
p[4+row]=v3-v4;
}


for(i=0;i<8;++i){
var col=i;


if(p[1*8+col]==0&&p[2*8+col]==0&&p[3*8+col]==0&&
p[4*8+col]==0&&p[5*8+col]==0&&p[6*8+col]==0&&
p[7*8+col]==0){
t=dctSqrt2*dataIn[i+0]+8192>>14;
p[0*8+col]=t;
p[1*8+col]=t;
p[2*8+col]=t;
p[3*8+col]=t;
p[4*8+col]=t;
p[5*8+col]=t;
p[6*8+col]=t;
p[7*8+col]=t;
continue;
}


v0=dctSqrt2*p[0*8+col]+2048>>12;
v1=dctSqrt2*p[4*8+col]+2048>>12;
v2=p[2*8+col];
v3=p[6*8+col];
v4=dctSqrt1d2*(p[1*8+col]-p[7*8+col])+2048>>12;
v7=dctSqrt1d2*(p[1*8+col]+p[7*8+col])+2048>>12;
v5=p[3*8+col];
v6=p[5*8+col];


t=v0-v1+1>>1;
v0=v0+v1+1>>1;
v1=t;
t=v2*dctSin6+v3*dctCos6+2048>>12;
v2=v2*dctCos6-v3*dctSin6+2048>>12;
v3=t;
t=v4-v6+1>>1;
v4=v4+v6+1>>1;
v6=t;
t=v7+v5+1>>1;
v5=v7-v5+1>>1;
v7=t;


t=v0-v3+1>>1;
v0=v0+v3+1>>1;
v3=t;
t=v1-v2+1>>1;
v1=v1+v2+1>>1;
v2=t;
t=v4*dctSin3+v7*dctCos3+2048>>12;
v4=v4*dctCos3-v7*dctSin3+2048>>12;
v7=t;
t=v5*dctSin1+v6*dctCos1+2048>>12;
v5=v5*dctCos1-v6*dctSin1+2048>>12;
v6=t;


p[0*8+col]=v0+v7;
p[7*8+col]=v0-v7;
p[1*8+col]=v1+v6;
p[6*8+col]=v1-v6;
p[2*8+col]=v2+v5;
p[5*8+col]=v2-v5;
p[3*8+col]=v3+v4;
p[4*8+col]=v3-v4;
}


for(i=0;i<64;++i){
var sample=128+(p[i]+8>>4);
dataOut[i]=sample<0?0:sample>0xFF?0xFF:sample;
}
}

var i,j;
for(var blockRow=0;blockRow<blocksPerColumn;blockRow++){
var scanLine=blockRow<<3;
for(i=0;i<8;i++)
lines.push(new Uint8Array(samplesPerLine));
for(var blockCol=0;blockCol<blocksPerLine;blockCol++){
quantizeAndInverse(component.blocks[blockRow][blockCol],r,R);

var offset=0,sample=blockCol<<3;
for(j=0;j<8;j++){
var line=lines[scanLine+j];
for(i=0;i<8;i++)
line[sample+i]=r[offset++];
}
}
}
return lines;
}

function clampTo8bit(a){
return a<0?0:a>255?255:a;
}

constructor.prototype={
load:function load(path){
var xhr=new XMLHttpRequest();
xhr.open("GET",path,true);
xhr.responseType="arraybuffer";
xhr.onload=function(){

var data=new Uint8Array(xhr.response||xhr.mozResponseArrayBuffer);
this.parse(data);
if(this.onload)
this.onload();
}.bind(this);
xhr.send(null);
},
parse:function parse(data){
var offset=0,length=data.length;
function readUint16(){
var value=data[offset]<<8|data[offset+1];
offset+=2;
return value;
}
function readDataBlock(){
var length=readUint16();
var array=data.subarray(offset,offset+length-2);
offset+=array.length;
return array;
}
function prepareComponents(frame){
var maxH=0,maxV=0;
var component,componentId;
for(componentId in frame.components){
if(frame.components.hasOwnProperty(componentId)){
component=frame.components[componentId];
if(maxH<component.h)maxH=component.h;
if(maxV<component.v)maxV=component.v;
}
}
var mcusPerLine=Math.ceil(frame.samplesPerLine/8/maxH);
var mcusPerColumn=Math.ceil(frame.scanLines/8/maxV);
for(componentId in frame.components){
if(frame.components.hasOwnProperty(componentId)){
component=frame.components[componentId];
var blocksPerLine=Math.ceil(Math.ceil(frame.samplesPerLine/8)*component.h/maxH);
var blocksPerColumn=Math.ceil(Math.ceil(frame.scanLines/8)*component.v/maxV);
var blocksPerLineForMcu=mcusPerLine*component.h;
var blocksPerColumnForMcu=mcusPerColumn*component.v;
var blocks=[];
for(var i=0;i<blocksPerColumnForMcu;i++){
var row=[];
for(var j=0;j<blocksPerLineForMcu;j++)
row.push(new Int32Array(64));
blocks.push(row);
}
component.blocksPerLine=blocksPerLine;
component.blocksPerColumn=blocksPerColumn;
component.blocks=blocks;
}
}
frame.maxH=maxH;
frame.maxV=maxV;
frame.mcusPerLine=mcusPerLine;
frame.mcusPerColumn=mcusPerColumn;
}
var jfif=null;
var adobe=null;
var pixels=null;
var frame,resetInterval;
var quantizationTables=[],frames=[];
var huffmanTablesAC=[],huffmanTablesDC=[];
var fileMarker=readUint16();
if(fileMarker!=0xFFD8){
throw"SOI not found";
}

fileMarker=readUint16();
while(fileMarker!=0xFFD9){
var i,j,l;
switch(fileMarker){
case 0xFF00:break;
case 0xFFE0:
case 0xFFE1:
case 0xFFE2:
case 0xFFE3:
case 0xFFE4:
case 0xFFE5:
case 0xFFE6:
case 0xFFE7:
case 0xFFE8:
case 0xFFE9:
case 0xFFEA:
case 0xFFEB:
case 0xFFEC:
case 0xFFED:
case 0xFFEE:
case 0xFFEF:
case 0xFFFE:
var appData=readDataBlock();

if(fileMarker===0xFFE0){
if(appData[0]===0x4A&&appData[1]===0x46&&appData[2]===0x49&&
appData[3]===0x46&&appData[4]===0){
jfif={
version:{major:appData[5],minor:appData[6]},
densityUnits:appData[7],
xDensity:appData[8]<<8|appData[9],
yDensity:appData[10]<<8|appData[11],
thumbWidth:appData[12],
thumbHeight:appData[13],
thumbData:appData.subarray(14,14+3*appData[12]*appData[13])};

}
}

if(fileMarker===0xFFEE){
if(appData[0]===0x41&&appData[1]===0x64&&appData[2]===0x6F&&
appData[3]===0x62&&appData[4]===0x65&&appData[5]===0){
adobe={
version:appData[6],
flags0:appData[7]<<8|appData[8],
flags1:appData[9]<<8|appData[10],
transformCode:appData[11]};

}
}
break;

case 0xFFDB:
var quantizationTablesLength=readUint16();
var quantizationTablesEnd=quantizationTablesLength+offset-2;
while(offset<quantizationTablesEnd){
var quantizationTableSpec=data[offset++];
var tableData=new Int32Array(64);
if(quantizationTableSpec>>4===0){
for(j=0;j<64;j++){
var z=dctZigZag[j];
tableData[z]=data[offset++];
}
}else if(quantizationTableSpec>>4===1){
for(j=0;j<64;j++){
var z=dctZigZag[j];
tableData[z]=readUint16();
}
}else
throw"DQT: invalid table spec";
quantizationTables[quantizationTableSpec&15]=tableData;
}
break;

case 0xFFC0:
case 0xFFC1:
case 0xFFC2:
readUint16();
frame={};
frame.extended=fileMarker===0xFFC1;
frame.progressive=fileMarker===0xFFC2;
frame.precision=data[offset++];
frame.scanLines=readUint16();
frame.samplesPerLine=readUint16();
frame.components={};
frame.componentsOrder=[];
var componentsCount=data[offset++],componentId;
var maxH=0,maxV=0;
for(i=0;i<componentsCount;i++){
componentId=data[offset];
var h=data[offset+1]>>4;
var v=data[offset+1]&15;
var qId=data[offset+2];
frame.componentsOrder.push(componentId);
frame.components[componentId]={
h:h,
v:v,
quantizationIdx:qId};

offset+=3;
}
prepareComponents(frame);
frames.push(frame);
break;

case 0xFFC4:
var huffmanLength=readUint16();
for(i=2;i<huffmanLength;){
var huffmanTableSpec=data[offset++];
var codeLengths=new Uint8Array(16);
var codeLengthSum=0;
for(j=0;j<16;j++,offset++)
codeLengthSum+=codeLengths[j]=data[offset];
var huffmanValues=new Uint8Array(codeLengthSum);
for(j=0;j<codeLengthSum;j++,offset++)
huffmanValues[j]=data[offset];
i+=17+codeLengthSum;

(huffmanTableSpec>>4===0?
huffmanTablesDC:huffmanTablesAC)[huffmanTableSpec&15]=
buildHuffmanTable(codeLengths,huffmanValues);
}
break;

case 0xFFDD:
readUint16();
resetInterval=readUint16();
break;

case 0xFFDA:
var scanLength=readUint16();
var selectorsCount=data[offset++];
var components=[],component;
for(i=0;i<selectorsCount;i++){
component=frame.components[data[offset++]];
var tableSpec=data[offset++];
component.huffmanTableDC=huffmanTablesDC[tableSpec>>4];
component.huffmanTableAC=huffmanTablesAC[tableSpec&15];
components.push(component);
}
var spectralStart=data[offset++];
var spectralEnd=data[offset++];
var successiveApproximation=data[offset++];
var processed=decodeScan(data,offset,
frame,components,resetInterval,
spectralStart,spectralEnd,
successiveApproximation>>4,successiveApproximation&15);
offset+=processed;
break;
default:
if(data[offset-3]==0xFF&&
data[offset-2]>=0xC0&&data[offset-2]<=0xFE){


offset-=3;
break;
}
throw"unknown JPEG marker "+fileMarker.toString(16);}

fileMarker=readUint16();
}
if(frames.length!=1)
throw"only single frame JPEGs supported";


for(var i=0;i<frames.length;i++){
var cp=frames[i].components;
for(var j in cp){
cp[j].quantizationTable=quantizationTables[cp[j].quantizationIdx];
delete cp[j].quantizationIdx;
}
}

this.width=frame.samplesPerLine;
this.height=frame.scanLines;
this.jfif=jfif;
this.adobe=adobe;
this.components=[];
for(var i=0;i<frame.componentsOrder.length;i++){
var component=frame.components[frame.componentsOrder[i]];
this.components.push({
lines:buildComponentData(frame,component),
scaleX:component.h/frame.maxH,
scaleY:component.v/frame.maxV});

}
},
getData:function getData(width,height){
var scaleX=this.width/width,scaleY=this.height/height;

var component1,component2,component3,component4;
var component1Line,component2Line,component3Line,component4Line;
var x,y;
var offset=0;
var Y,Cb,Cr,K,C,M,Ye,R,G,B;
var colorTransform;
var dataLength=width*height*this.components.length;
var data=new Uint8Array(dataLength);
switch(this.components.length){
case 1:
component1=this.components[0];
for(y=0;y<height;y++){
component1Line=component1.lines[0|y*component1.scaleY*scaleY];
for(x=0;x<width;x++){
Y=component1Line[0|x*component1.scaleX*scaleX];

data[offset++]=Y;
}
}
break;
case 2:

component1=this.components[0];
component2=this.components[1];
for(y=0;y<height;y++){
component1Line=component1.lines[0|y*component1.scaleY*scaleY];
component2Line=component2.lines[0|y*component2.scaleY*scaleY];
for(x=0;x<width;x++){
Y=component1Line[0|x*component1.scaleX*scaleX];
data[offset++]=Y;
Y=component2Line[0|x*component2.scaleX*scaleX];
data[offset++]=Y;
}
}
break;
case 3:

colorTransform=true;

if(this.adobe&&this.adobe.transformCode)
colorTransform=true;else
if(typeof this.colorTransform!=='undefined')
colorTransform=!!this.colorTransform;

component1=this.components[0];
component2=this.components[1];
component3=this.components[2];
for(y=0;y<height;y++){
component1Line=component1.lines[0|y*component1.scaleY*scaleY];
component2Line=component2.lines[0|y*component2.scaleY*scaleY];
component3Line=component3.lines[0|y*component3.scaleY*scaleY];
for(x=0;x<width;x++){
if(!colorTransform){
R=component1Line[0|x*component1.scaleX*scaleX];
G=component2Line[0|x*component2.scaleX*scaleX];
B=component3Line[0|x*component3.scaleX*scaleX];
}else{
Y=component1Line[0|x*component1.scaleX*scaleX];
Cb=component2Line[0|x*component2.scaleX*scaleX];
Cr=component3Line[0|x*component3.scaleX*scaleX];

R=clampTo8bit(Y+1.402*(Cr-128));
G=clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));
B=clampTo8bit(Y+1.772*(Cb-128));
}

data[offset++]=R;
data[offset++]=G;
data[offset++]=B;
}
}
break;
case 4:
if(!this.adobe)
throw'Unsupported color mode (4 components)';

colorTransform=false;

if(this.adobe&&this.adobe.transformCode)
colorTransform=true;else
if(typeof this.colorTransform!=='undefined')
colorTransform=!!this.colorTransform;

component1=this.components[0];
component2=this.components[1];
component3=this.components[2];
component4=this.components[3];
for(y=0;y<height;y++){
component1Line=component1.lines[0|y*component1.scaleY*scaleY];
component2Line=component2.lines[0|y*component2.scaleY*scaleY];
component3Line=component3.lines[0|y*component3.scaleY*scaleY];
component4Line=component4.lines[0|y*component4.scaleY*scaleY];
for(x=0;x<width;x++){
if(!colorTransform){
C=component1Line[0|x*component1.scaleX*scaleX];
M=component2Line[0|x*component2.scaleX*scaleX];
Ye=component3Line[0|x*component3.scaleX*scaleX];
K=component4Line[0|x*component4.scaleX*scaleX];
}else{
Y=component1Line[0|x*component1.scaleX*scaleX];
Cb=component2Line[0|x*component2.scaleX*scaleX];
Cr=component3Line[0|x*component3.scaleX*scaleX];
K=component4Line[0|x*component4.scaleX*scaleX];

C=255-clampTo8bit(Y+1.402*(Cr-128));
M=255-clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));
Ye=255-clampTo8bit(Y+1.772*(Cb-128));
}
data[offset++]=255-C;
data[offset++]=255-M;
data[offset++]=255-Ye;
data[offset++]=255-K;
}
}
break;
default:
throw'Unsupported color mode';}

return data;
},
copyToImageData:function copyToImageData(imageData){
var width=imageData.width,height=imageData.height;
var imageDataArray=imageData.data;
var data=this.getData(width,height);
var i=0,j=0,x,y;
var Y,K,C,M,R,G,B;
switch(this.components.length){
case 1:
for(y=0;y<height;y++){
for(x=0;x<width;x++){
Y=data[i++];

imageDataArray[j++]=Y;
imageDataArray[j++]=Y;
imageDataArray[j++]=Y;
imageDataArray[j++]=255;
}
}
break;
case 3:
for(y=0;y<height;y++){
for(x=0;x<width;x++){
R=data[i++];
G=data[i++];
B=data[i++];

imageDataArray[j++]=R;
imageDataArray[j++]=G;
imageDataArray[j++]=B;
imageDataArray[j++]=255;
}
}
break;
case 4:
for(y=0;y<height;y++){
for(x=0;x<width;x++){
C=data[i++];
M=data[i++];
Y=data[i++];
K=data[i++];

R=255-clampTo8bit(C*(1-K/255)+K);
G=255-clampTo8bit(M*(1-K/255)+K);
B=255-clampTo8bit(Y*(1-K/255)+K);

imageDataArray[j++]=R;
imageDataArray[j++]=G;
imageDataArray[j++]=B;
imageDataArray[j++]=255;
}
}
break;
default:
throw'Unsupported color mode';}

}};


return constructor;
}();
module.exports=decode;

function decode(jpegData){
var arr=new Uint8Array(jpegData);
var decoder=new JpegImage();
decoder.parse(arr);

var image={
width:decoder.width,
height:decoder.height,
data:new Buffer(decoder.width*decoder.height*4)};


decoder.copyToImageData(image);

return image;
}

}).call(this,require("buffer").Buffer);
},{"buffer":102}],124:[function(require,module,exports){
(function(Buffer){





































var btoa=btoa||function(buf){
return new Buffer(buf).toString('base64');
};

function JPEGEncoder(quality){
var self=this;
var fround=Math.round;
var ffloor=Math.floor;
var YTable=new Array(64);
var UVTable=new Array(64);
var fdtbl_Y=new Array(64);
var fdtbl_UV=new Array(64);
var YDC_HT;
var UVDC_HT;
var YAC_HT;
var UVAC_HT;

var bitcode=new Array(65535);
var category=new Array(65535);
var outputfDCTQuant=new Array(64);
var DU=new Array(64);
var byteout=[];
var bytenew=0;
var bytepos=7;

var YDU=new Array(64);
var UDU=new Array(64);
var VDU=new Array(64);
var clt=new Array(256);
var RGB_YUV_TABLE=new Array(2048);
var currentQuality;

var ZigZag=[
0,1,5,6,14,15,27,28,
2,4,7,13,16,26,29,42,
3,8,12,17,25,30,41,43,
9,11,18,24,31,40,44,53,
10,19,23,32,39,45,52,54,
20,22,33,38,46,51,55,60,
21,34,37,47,50,56,59,61,
35,36,48,49,57,58,62,63];


var std_dc_luminance_nrcodes=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
var std_dc_luminance_values=[0,1,2,3,4,5,6,7,8,9,10,11];
var std_ac_luminance_nrcodes=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
var std_ac_luminance_values=[
0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
0xf9,0xfa];


var std_dc_chrominance_nrcodes=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
var std_dc_chrominance_values=[0,1,2,3,4,5,6,7,8,9,10,11];
var std_ac_chrominance_nrcodes=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
var std_ac_chrominance_values=[
0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
0xf9,0xfa];


function initQuantTables(sf){
var YQT=[
16,11,10,16,24,40,51,61,
12,12,14,19,26,58,60,55,
14,13,16,24,40,57,69,56,
14,17,22,29,51,87,80,62,
18,22,37,56,68,109,103,77,
24,35,55,64,81,104,113,92,
49,64,78,87,103,121,120,101,
72,92,95,98,112,100,103,99];


for(var i=0;i<64;i++){
var t=ffloor((YQT[i]*sf+50)/100);
if(t<1){
t=1;
}else if(t>255){
t=255;
}
YTable[ZigZag[i]]=t;
}
var UVQT=[
17,18,24,47,99,99,99,99,
18,21,26,66,99,99,99,99,
24,26,56,99,99,99,99,99,
47,66,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99];

for(var j=0;j<64;j++){
var u=ffloor((UVQT[j]*sf+50)/100);
if(u<1){
u=1;
}else if(u>255){
u=255;
}
UVTable[ZigZag[j]]=u;
}
var aasf=[
1.0,1.387039845,1.306562965,1.175875602,
1.0,0.785694958,0.541196100,0.275899379];

var k=0;
for(var row=0;row<8;row++)
{
for(var col=0;col<8;col++)
{
fdtbl_Y[k]=1.0/(YTable[ZigZag[k]]*aasf[row]*aasf[col]*8.0);
fdtbl_UV[k]=1.0/(UVTable[ZigZag[k]]*aasf[row]*aasf[col]*8.0);
k++;
}
}
}

function computeHuffmanTbl(nrcodes,std_table){
var codevalue=0;
var pos_in_table=0;
var HT=new Array();
for(var k=1;k<=16;k++){
for(var j=1;j<=nrcodes[k];j++){
HT[std_table[pos_in_table]]=[];
HT[std_table[pos_in_table]][0]=codevalue;
HT[std_table[pos_in_table]][1]=k;
pos_in_table++;
codevalue++;
}
codevalue*=2;
}
return HT;
}

function initHuffmanTbl()
{
YDC_HT=computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
UVDC_HT=computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
YAC_HT=computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
UVAC_HT=computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
}

function initCategoryNumber()
{
var nrlower=1;
var nrupper=2;
for(var cat=1;cat<=15;cat++){

for(var nr=nrlower;nr<nrupper;nr++){
category[32767+nr]=cat;
bitcode[32767+nr]=[];
bitcode[32767+nr][1]=cat;
bitcode[32767+nr][0]=nr;
}

for(var nrneg=-(nrupper-1);nrneg<=-nrlower;nrneg++){
category[32767+nrneg]=cat;
bitcode[32767+nrneg]=[];
bitcode[32767+nrneg][1]=cat;
bitcode[32767+nrneg][0]=nrupper-1+nrneg;
}
nrlower<<=1;
nrupper<<=1;
}
}

function initRGBYUVTable(){
for(var i=0;i<256;i++){
RGB_YUV_TABLE[i]=19595*i;
RGB_YUV_TABLE[i+256>>0]=38470*i;
RGB_YUV_TABLE[i+512>>0]=7471*i+0x8000;
RGB_YUV_TABLE[i+768>>0]=-11059*i;
RGB_YUV_TABLE[i+1024>>0]=-21709*i;
RGB_YUV_TABLE[i+1280>>0]=32768*i+0x807FFF;
RGB_YUV_TABLE[i+1536>>0]=-27439*i;
RGB_YUV_TABLE[i+1792>>0]=-5329*i;
}
}


function writeBits(bs)
{
var value=bs[0];
var posval=bs[1]-1;
while(posval>=0){
if(value&1<<posval){
bytenew|=1<<bytepos;
}
posval--;
bytepos--;
if(bytepos<0){
if(bytenew==0xFF){
writeByte(0xFF);
writeByte(0);
}else
{
writeByte(bytenew);
}
bytepos=7;
bytenew=0;
}
}
}

function writeByte(value)
{

byteout.push(value);
}

function writeWord(value)
{
writeByte(value>>8&0xFF);
writeByte(value&0xFF);
}


function fDCTQuant(data,fdtbl)
{
var d0,d1,d2,d3,d4,d5,d6,d7;

var dataOff=0;
var i;
const I8=8;
const I64=64;
for(i=0;i<I8;++i)
{
d0=data[dataOff];
d1=data[dataOff+1];
d2=data[dataOff+2];
d3=data[dataOff+3];
d4=data[dataOff+4];
d5=data[dataOff+5];
d6=data[dataOff+6];
d7=data[dataOff+7];

var tmp0=d0+d7;
var tmp7=d0-d7;
var tmp1=d1+d6;
var tmp6=d1-d6;
var tmp2=d2+d5;
var tmp5=d2-d5;
var tmp3=d3+d4;
var tmp4=d3-d4;


var tmp10=tmp0+tmp3;
var tmp13=tmp0-tmp3;
var tmp11=tmp1+tmp2;
var tmp12=tmp1-tmp2;

data[dataOff]=tmp10+tmp11;
data[dataOff+4]=tmp10-tmp11;

var z1=(tmp12+tmp13)*0.707106781;
data[dataOff+2]=tmp13+z1;
data[dataOff+6]=tmp13-z1;


tmp10=tmp4+tmp5;
tmp11=tmp5+tmp6;
tmp12=tmp6+tmp7;


var z5=(tmp10-tmp12)*0.382683433;
var z2=0.541196100*tmp10+z5;
var z4=1.306562965*tmp12+z5;
var z3=tmp11*0.707106781;

var z11=tmp7+z3;
var z13=tmp7-z3;

data[dataOff+5]=z13+z2;
data[dataOff+3]=z13-z2;
data[dataOff+1]=z11+z4;
data[dataOff+7]=z11-z4;

dataOff+=8;
}


dataOff=0;
for(i=0;i<I8;++i)
{
d0=data[dataOff];
d1=data[dataOff+8];
d2=data[dataOff+16];
d3=data[dataOff+24];
d4=data[dataOff+32];
d5=data[dataOff+40];
d6=data[dataOff+48];
d7=data[dataOff+56];

var tmp0p2=d0+d7;
var tmp7p2=d0-d7;
var tmp1p2=d1+d6;
var tmp6p2=d1-d6;
var tmp2p2=d2+d5;
var tmp5p2=d2-d5;
var tmp3p2=d3+d4;
var tmp4p2=d3-d4;


var tmp10p2=tmp0p2+tmp3p2;
var tmp13p2=tmp0p2-tmp3p2;
var tmp11p2=tmp1p2+tmp2p2;
var tmp12p2=tmp1p2-tmp2p2;

data[dataOff]=tmp10p2+tmp11p2;
data[dataOff+32]=tmp10p2-tmp11p2;

var z1p2=(tmp12p2+tmp13p2)*0.707106781;
data[dataOff+16]=tmp13p2+z1p2;
data[dataOff+48]=tmp13p2-z1p2;


tmp10p2=tmp4p2+tmp5p2;
tmp11p2=tmp5p2+tmp6p2;
tmp12p2=tmp6p2+tmp7p2;


var z5p2=(tmp10p2-tmp12p2)*0.382683433;
var z2p2=0.541196100*tmp10p2+z5p2;
var z4p2=1.306562965*tmp12p2+z5p2;
var z3p2=tmp11p2*0.707106781;

var z11p2=tmp7p2+z3p2;
var z13p2=tmp7p2-z3p2;

data[dataOff+40]=z13p2+z2p2;
data[dataOff+24]=z13p2-z2p2;
data[dataOff+8]=z11p2+z4p2;
data[dataOff+56]=z11p2-z4p2;

dataOff++;
}


var fDCTQuant;
for(i=0;i<I64;++i)
{

fDCTQuant=data[i]*fdtbl[i];
outputfDCTQuant[i]=fDCTQuant>0.0?fDCTQuant+0.5|0:fDCTQuant-0.5|0;


}
return outputfDCTQuant;
}

function writeAPP0()
{
writeWord(0xFFE0);
writeWord(16);
writeByte(0x4A);
writeByte(0x46);
writeByte(0x49);
writeByte(0x46);
writeByte(0);
writeByte(1);
writeByte(1);
writeByte(0);
writeWord(1);
writeWord(1);
writeByte(0);
writeByte(0);
}

function writeSOF0(width,height)
{
writeWord(0xFFC0);
writeWord(17);
writeByte(8);
writeWord(height);
writeWord(width);
writeByte(3);
writeByte(1);
writeByte(0x11);
writeByte(0);
writeByte(2);
writeByte(0x11);
writeByte(1);
writeByte(3);
writeByte(0x11);
writeByte(1);
}

function writeDQT()
{
writeWord(0xFFDB);
writeWord(132);
writeByte(0);
for(var i=0;i<64;i++){
writeByte(YTable[i]);
}
writeByte(1);
for(var j=0;j<64;j++){
writeByte(UVTable[j]);
}
}

function writeDHT()
{
writeWord(0xFFC4);
writeWord(0x01A2);

writeByte(0);
for(var i=0;i<16;i++){
writeByte(std_dc_luminance_nrcodes[i+1]);
}
for(var j=0;j<=11;j++){
writeByte(std_dc_luminance_values[j]);
}

writeByte(0x10);
for(var k=0;k<16;k++){
writeByte(std_ac_luminance_nrcodes[k+1]);
}
for(var l=0;l<=161;l++){
writeByte(std_ac_luminance_values[l]);
}

writeByte(1);
for(var m=0;m<16;m++){
writeByte(std_dc_chrominance_nrcodes[m+1]);
}
for(var n=0;n<=11;n++){
writeByte(std_dc_chrominance_values[n]);
}

writeByte(0x11);
for(var o=0;o<16;o++){
writeByte(std_ac_chrominance_nrcodes[o+1]);
}
for(var p=0;p<=161;p++){
writeByte(std_ac_chrominance_values[p]);
}
}

function writeSOS()
{
writeWord(0xFFDA);
writeWord(12);
writeByte(3);
writeByte(1);
writeByte(0);
writeByte(2);
writeByte(0x11);
writeByte(3);
writeByte(0x11);
writeByte(0);
writeByte(0x3f);
writeByte(0);
}

function processDU(CDU,fdtbl,DC,HTDC,HTAC){
var EOB=HTAC[0x00];
var M16zeroes=HTAC[0xF0];
var pos;
const I16=16;
const I63=63;
const I64=64;
var DU_DCT=fDCTQuant(CDU,fdtbl);

for(var j=0;j<I64;++j){
DU[ZigZag[j]]=DU_DCT[j];
}
var Diff=DU[0]-DC;DC=DU[0];

if(Diff==0){
writeBits(HTDC[0]);
}else{
pos=32767+Diff;
writeBits(HTDC[category[pos]]);
writeBits(bitcode[pos]);
}

var end0pos=63;
for(;end0pos>0&&DU[end0pos]==0;end0pos--){};

if(end0pos==0){
writeBits(EOB);
return DC;
}
var i=1;
var lng;
while(i<=end0pos){
var startpos=i;
for(;DU[i]==0&&i<=end0pos;++i){}
var nrzeroes=i-startpos;
if(nrzeroes>=I16){
lng=nrzeroes>>4;
for(var nrmarker=1;nrmarker<=lng;++nrmarker)
writeBits(M16zeroes);
nrzeroes=nrzeroes&0xF;
}
pos=32767+DU[i];
writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
writeBits(bitcode[pos]);
i++;
}
if(end0pos!=I63){
writeBits(EOB);
}
return DC;
}

function initCharLookupTable(){
var sfcc=String.fromCharCode;
for(var i=0;i<256;i++){
clt[i]=sfcc(i);
}
}

this.encode=function(image,quality)
{
var time_start=new Date().getTime();

if(quality)setQuality(quality);


byteout=new Array();
bytenew=0;
bytepos=7;


writeWord(0xFFD8);
writeAPP0();
writeDQT();
writeSOF0(image.width,image.height);
writeDHT();
writeSOS();



var DCY=0;
var DCU=0;
var DCV=0;

bytenew=0;
bytepos=7;


this.encode.displayName="_encode_";

var imageData=image.data;
var width=image.width;
var height=image.height;

var quadWidth=width*4;
var tripleWidth=width*3;

var x,y=0;
var r,g,b;
var start,p,col,row,pos;
while(y<height){
x=0;
while(x<quadWidth){
start=quadWidth*y+x;
p=start;
col=-1;
row=0;

for(pos=0;pos<64;pos++){
row=pos>>3;
col=(pos&7)*4;
p=start+row*quadWidth+col;

if(y+row>=height){
p-=quadWidth*(y+1+row-height);
}

if(x+col>=quadWidth){
p-=x+col-quadWidth+4;
}

r=imageData[p++];
g=imageData[p++];
b=imageData[p++];









YDU[pos]=(RGB_YUV_TABLE[r]+RGB_YUV_TABLE[g+256>>0]+RGB_YUV_TABLE[b+512>>0]>>16)-128;
UDU[pos]=(RGB_YUV_TABLE[r+768>>0]+RGB_YUV_TABLE[g+1024>>0]+RGB_YUV_TABLE[b+1280>>0]>>16)-128;
VDU[pos]=(RGB_YUV_TABLE[r+1280>>0]+RGB_YUV_TABLE[g+1536>>0]+RGB_YUV_TABLE[b+1792>>0]>>16)-128;

}

DCY=processDU(YDU,fdtbl_Y,DCY,YDC_HT,YAC_HT);
DCU=processDU(UDU,fdtbl_UV,DCU,UVDC_HT,UVAC_HT);
DCV=processDU(VDU,fdtbl_UV,DCV,UVDC_HT,UVAC_HT);
x+=32;
}
y+=8;
}





if(bytepos>=0){
var fillbits=[];
fillbits[1]=bytepos+1;
fillbits[0]=(1<<bytepos+1)-1;
writeBits(fillbits);
}

writeWord(0xFFD9);


return new Buffer(byteout);

var jpegDataUri='data:image/jpeg;base64,'+btoa(byteout.join(''));

byteout=[];


var duration=new Date().getTime()-time_start;



return jpegDataUri;
};

function setQuality(quality){
if(quality<=0){
quality=1;
}
if(quality>100){
quality=100;
}

if(currentQuality==quality)return;

var sf=0;
if(quality<50){
sf=Math.floor(5000/quality);
}else{
sf=Math.floor(200-quality*2);
}

initQuantTables(sf);
currentQuality=quality;

}

function init(){
var time_start=new Date().getTime();
if(!quality)quality=50;

initCharLookupTable();
initHuffmanTbl();
initCategoryNumber();
initRGBYUVTable();

setQuality(quality);
var duration=new Date().getTime()-time_start;

}

init();

};
module.exports=encode;

function encode(imgData,qu){
if(typeof qu==='undefined')qu=50;
var encoder=new JPEGEncoder(qu);
var data=encoder.encode(imgData,qu);
return{
data:data,
width:imgData.width,
height:imgData.height};

}


function getImageDataFromImage(idOrElement){
var theImg=typeof idOrElement=='string'?document.getElementById(idOrElement):idOrElement;
var cvs=document.createElement('canvas');
cvs.width=theImg.width;
cvs.height=theImg.height;
var ctx=cvs.getContext("2d");
ctx.drawImage(theImg,0,0);

return ctx.getImageData(0,0,cvs.width,cvs.height);
}

}).call(this,require("buffer").Buffer);
},{"buffer":102}],125:[function(require,module,exports){
(function(process){





'use strict';

const debug=require('debug');
const marky=require('marky');

const EventEmitter=require('events').EventEmitter;
const isWindows=process.platform==='win32';


const isBrowser=process.browser;

const colors={
red:isBrowser?'crimson':1,
yellow:isBrowser?'gold':3,
cyan:isBrowser?'darkturquoise':6,
green:isBrowser?'forestgreen':2,
blue:isBrowser?'steelblue':4,
magenta:isBrowser?'palevioletred':5};



debug.colors=[colors.cyan,colors.green,colors.blue,colors.magenta];

class Emitter extends EventEmitter{






issueStatus(title,argsArray){
if(title==='status'||title==='statusEnd'){
this.emit(title,[title,...argsArray]);
}
}







issueWarning(title,argsArray){
this.emit('warning',[title,...argsArray]);
}}


const loggersByTitle={};
const loggingBufferColumns=25;
let level_;

class Log{
static _logToStdErr(title,argsArray){
const log=Log.loggerfn(title);
log(...argsArray);
}

static loggerfn(title){
let log=loggersByTitle[title];
if(!log){
log=debug(title);
loggersByTitle[title]=log;

if(title.endsWith('error')){
log.color=colors.red;
}else if(title.endsWith('warn')){
log.color=colors.yellow;
}
}
return log;
}




static setLevel(level){
level_=level;
switch(level){
case'silent':
debug.enable('-*');
break;
case'verbose':
debug.enable('*');
break;
case'error':
debug.enable('-*, *:error');
break;
default:
debug.enable('*, -*:verbose');}

}







static formatProtocol(prefix,data,level){
const columns=!process||process.browser?Infinity:process.stdout.columns;
const method=data.method||'?????';
const maxLength=columns-method.length-prefix.length-loggingBufferColumns;

const snippet=data.params&&method!=='IO.read'?
JSON.stringify(data.params).substr(0,maxLength):'';
Log._logToStdErr(`${prefix}:${level||''}`,[method,snippet]);
}




static isVerbose(){
return level_==='verbose';
}

static time({msg,id,args=[]},level='log'){
marky.mark(id);
Log[level]('status',msg,...args);
}

static timeEnd({msg,id,args=[]},level='verbose'){
Log[level]('statusEnd',msg,...args);
marky.stop(id);
}

static log(title,...args){
Log.events.issueStatus(title,args);
return Log._logToStdErr(title,args);
}

static warn(title,...args){
Log.events.issueWarning(title,args);
return Log._logToStdErr(`${title}:warn`,args);
}

static error(title,...args){
return Log._logToStdErr(`${title}:error`,args);
}

static verbose(title,...args){
Log.events.issueStatus(title,args);
return Log._logToStdErr(`${title}:verbose`,args);
}






static greenify(str){
return`${Log.green}${str}${Log.reset}`;
}






static redify(str){
return`${Log.red}${str}${Log.reset}`;
}

static get green(){
return'\x1B[32m';
}

static get red(){
return'\x1B[31m';
}

static get yellow(){
return'\x1b[33m';
}

static get purple(){
return'\x1b[95m';
}

static get reset(){
return'\x1B[0m';
}

static get bold(){
return'\x1b[1m';
}

static get dim(){
return'\x1b[2m';
}

static get tick(){
return isWindows?'\u221A':'✓';
}

static get cross(){
return isWindows?'\u00D7':'✘';
}

static get whiteSmallSquare(){
return isWindows?'\u0387':'▫';
}

static get heavyHorizontal(){
return isWindows?'\u2500':'━';
}

static get heavyVertical(){
return isWindows?'\u2502 ':'┃ ';
}

static get heavyUpAndRight(){
return isWindows?'\u2514':'┗';
}

static get heavyVerticalAndRight(){
return isWindows?'\u251C':'┣';
}

static get heavyDownAndHorizontal(){
return isWindows?'\u252C':'┳';
}

static get doubleLightHorizontal(){
return'──';
}}


Log.events=new Emitter();
Log.takeTimeEntries=()=>{
const entries=marky.getEntries();
marky.clear();
return entries;
};
Log.getTimeEntries=()=>marky.getEntries();

module.exports=Log;

}).call(this,require('_process'));
},{"_process":158,"debug":106,"events":108,"marky":144}],126:[function(require,module,exports){














const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node.js');

const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');

const LanternMetric=require('lighthouse/lighthouse-core/computed/metrics/lantern-metric');

const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
const{isBidRelatedRequest,isImpressionPing,isGoogleAds,isGptAdRequest}=require('../utils/resource-classification');
const{URL}=require('url');









function getFrame(event){

return event.args.frame||event.args.data&&event.args.data.frame||null;
}






function getCpuNodeUrls(cpuNode){
const results=new Set();
for(const{args}of cpuNode.childEvents){
if(args.data&&args.data.url){
results.add(args.data.url);
}
}
return Array.from(results);
}






function isAdTask(cpuNode){
return!!getCpuNodeUrls(cpuNode).find(
url=>isBidRelatedRequest(url)||isGoogleAds(new URL(url)));
}






function isLongTask(cpuNode){


return cpuNode.event.dur>50*1000;
}





function addEdges(graph){
const adRequestNodes=[];
graph.traverse(node=>{
if(node.type===BaseNode.TYPES.NETWORK&&isGptAdRequest(node.record)){
adRequestNodes.push(node);
}
});
graph.traverse(node=>{
if(node.type!==BaseNode.TYPES.NETWORK){
return;
}
if(isBidRelatedRequest(node.record)){
for(const adNode of adRequestNodes){


if(adNode.record.startTime>=node.record.endTime){
node.addDependent(adNode);
}
}
}
if(isImpressionPing(node.record.url)){
for(const adNode of adRequestNodes){
if(adNode.record.endTime>node.record.startTime){
continue;
}
adNode.addDependent(node);
for(const dependent of adNode.getDependents()){
if(dependent.endTime<=node.startTime){
dependent.addDependency(node);
}
}
}
}
});
}


class AdLanternMetric extends LanternMetric{




static get COEFFICIENTS(){
return{
intercept:0,

optimistic:1,
pessimistic:0};

}







static getPessimisticGraph(graph){

const pessimisticGraph=graph.cloneWithRelationships(_=>true);
addEdges(pessimisticGraph);
return pessimisticGraph;
}







static getOptimisticGraph(graph){

const mainFrame=graph.record.frameId;
const pessimisticGraph=AdLanternMetric.getPessimisticGraph(graph);

const optimisticGraph=pessimisticGraph.cloneWithRelationships(node=>{
if(node.type===BaseNode.TYPES.CPU){
return(
isLongTask(node)||
isAdTask(node)||
!!getFrame(node.event)&&getFrame(node.event)!==mainFrame);
}
if(node.hasRenderBlockingPriority()){
return true;
}
const url=node.record.url;
return isBidRelatedRequest(url)||isGoogleAds(new URL(url));
});
return optimisticGraph;
}







static getEstimateFromSimulation(simulationResult,extras){
throw new Error(
'getEstimateFromSimulation not implemented by '+this.name);
}






static findTiming(nodeTimings,isTargetNode){
let leastTiming={startTime:Infinity,endTime:-Infinity,duration:0};
for(const[node,timing]of nodeTimings.entries()){
if(isTargetNode(node,timing)&&
leastTiming.startTime>timing.startTime){
leastTiming=timing;
}
}
return leastTiming;
}






static findNetworkTiming(nodeTimings,isTargetRequest){
return this.findTiming(
nodeTimings,
node=>
node.type===BaseNode.TYPES.NETWORK&&isTargetRequest(node.record));
}}


module.exports=AdLanternMetric;

},{"../utils/resource-classification":140,"lighthouse/lighthouse-core/computed/metrics/lantern-metric":25,"lighthouse/lighthouse-core/lib/dependency-graph/base-node.js":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59,"url":"url"}],127:[function(require,module,exports){














const AdLanternMetric=require('./ad-lantern-metric');

const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');

const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
const{getPageStartTime,getImpressionStartTime}=require('../utils/network-timing');
const{isImpressionPing}=require('../utils/resource-classification');






class LanternAdRenderTime extends AdLanternMetric{






static getEstimateFromSimulation(simulationResult,extras){
const{nodeTimings}=simulationResult;
const timeInMs=AdLanternMetric.findNetworkTiming(
nodeTimings,
req=>!!req.url&&isImpressionPing(new URL(req.url))).startTime;
return{timeInMs,nodeTimings};
}}





LanternAdRenderTime=makeComputedArtifact(LanternAdRenderTime);


class AdRenderTime extends ComputedMetric{






static async computeSimulatedMetric(data,context){

return LanternAdRenderTime.request(data,context);
}







static async computeObservedMetric(data,context){
const{networkRecords}=data;
const pageStartTime=getPageStartTime(networkRecords);
const impressionStartTime=getImpressionStartTime(networkRecords);
const firstPaintMs=(impressionStartTime-pageStartTime)*1000;
return Promise.resolve({timing:firstPaintMs});
}}





AdRenderTime=makeComputedArtifact(AdRenderTime);

module.exports=AdRenderTime;


},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],128:[function(require,module,exports){














const AdLanternMetric=require('./ad-lantern-metric');

const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');

const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
const{getAdStartTime,getPageStartTime}=require('../utils/network-timing');
const{isAdRequest}=require('../utils/resource-classification');






class LanternAdRequestTime extends AdLanternMetric{






static getEstimateFromSimulation(simulationResult,extras){
const{nodeTimings}=simulationResult;
const timeInMs=AdLanternMetric.findNetworkTiming(
nodeTimings,isAdRequest).startTime;
return{timeInMs,nodeTimings};
}}





LanternAdRequestTime=makeComputedArtifact(LanternAdRequestTime);


class AdRequestTime extends ComputedMetric{






static async computeSimulatedMetric(data,context){

return LanternAdRequestTime.request(data,context);
}






static async computeObservedMetric(data){
const{networkRecords}=data;
const pageStartTime=getPageStartTime(networkRecords);
const adStartTime=getAdStartTime(networkRecords);
const adRequestTimeMs=(adStartTime-pageStartTime)*1000;
return Promise.resolve({timing:adRequestTimeMs});
}}





AdRequestTime=makeComputedArtifact(AdRequestTime);

module.exports=AdRequestTime;

},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],129:[function(require,module,exports){














const AdLanternMetric=require('./ad-lantern-metric');

const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');

const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
const{getBidStartTime,getPageStartTime}=require('../utils/network-timing');
const{isBidRequest}=require('../utils/resource-classification');






class LanternBidRequestTime extends AdLanternMetric{






static getEstimateFromSimulation(simulationResult,extras){
const{nodeTimings}=simulationResult;
const timeInMs=AdLanternMetric.findNetworkTiming(
nodeTimings,isBidRequest).startTime;
return{timeInMs,nodeTimings};
}}





LanternBidRequestTime=makeComputedArtifact(LanternBidRequestTime);


class BidRequestTime extends ComputedMetric{






static async computeSimulatedMetric(data,context){

return LanternBidRequestTime.request(data,context);
}






static async computeObservedMetric(data){
const{networkRecords}=data;
const pageStartTime=getPageStartTime(networkRecords);
const bidStartTime=getBidStartTime(networkRecords);
const bidRequestTimeMs=(bidStartTime-pageStartTime)*1000;
return Promise.resolve({timing:bidRequestTimeMs});
}}





BidRequestTime=makeComputedArtifact(BidRequestTime);

module.exports=BidRequestTime;

},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],130:[function(require,module,exports){














const AdLanternMetric=require('../computed/ad-lantern-metric');
const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node.js');

const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');

const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');
const{getAttributableUrl}=require('../utils/tasks');

const LoadSimulator=require('lighthouse/lighthouse-core/computed/load-simulator');
const MainThreadTasks=require('lighthouse/lighthouse-core/computed/main-thread-tasks');

const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');

const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');

const LONG_TASK_THRESHOLD_MS=50;






function isLong(task,knownScripts){
if(task.duration<LONG_TASK_THRESHOLD_MS){
return false;
}
const script=getAttributableUrl(task,knownScripts);
if(!script){
return false;
}
if(task.parent){


const parentScript=getAttributableUrl(task.parent,knownScripts);
return script!=parentScript;
}
return true;
}


class LongTasks extends ComputedMetric{






static async getSimulationGraph(trace,devtoolsLog,context){

const documentNode=

await PageDependencyGraph.request({trace,devtoolsLog},context);
return AdLanternMetric.getOptimisticGraph(documentNode);
}







static async computeSimulatedResult(trace,devtoolsLog,context){
const graph=await this.getSimulationGraph(trace,devtoolsLog,context);
const simulator=await LoadSimulator.request(
{devtoolsLog,settings:context.settings},context);
const{nodeTimings}=simulator.simulate(graph,{});

const tasks=[];
for(const[node,timing]of nodeTimings.entries()){
if(node.type!==BaseNode.TYPES.CPU||
timing.duration<LONG_TASK_THRESHOLD_MS){
continue;
}
tasks.push({
event:node.event,
startTime:timing.startTime,
endTime:timing.endTime,
duration:timing.duration,
selfTime:timing.duration,
attributableURLs:Array.from(node.getEvaluateScriptURLs()),
children:[]});

}
return tasks;
}







static async computeObservedResult(trace,devtoolsLog,context){
const tasks=await MainThreadTasks.request(trace,context);
const networkRecords=await NetworkRecords.request(devtoolsLog,context);

const knownScripts=new Set(networkRecords.
filter(record=>record.resourceType==='Script').
map(record=>record.url));
return tasks.filter(t=>isLong(t,knownScripts));
}






static async compute_({trace,devtoolsLog},context){
return context.settings.throttlingMethod=='simulate'?
this.computeSimulatedResult(trace,devtoolsLog,context):
this.computeObservedResult(trace,devtoolsLog,context);
}}





LongTasks=makeComputedArtifact(LongTasks);

module.exports=LongTasks;

},{"../computed/ad-lantern-metric":126,"../utils/tasks":141,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/load-simulator":10,"lighthouse/lighthouse-core/computed/main-thread-tasks":12,"lighthouse/lighthouse-core/computed/metrics/metric":30,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/dependency-graph/base-node.js":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59}],131:[function(require,module,exports){














const AdLanternMetric=require('./ad-lantern-metric');

const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');

const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
const{getPageStartTime,getTagEndTime}=require('../utils/network-timing');
const{isImplTag}=require('../utils/resource-classification');
const{URL}=require('url');






class LanternTagLoadTime extends AdLanternMetric{






static getEstimateFromSimulation(simulationResult,extras){
const{nodeTimings}=simulationResult;
const timeInMs=AdLanternMetric.findNetworkTiming(
nodeTimings,req=>!!req.url&&isImplTag(new URL(req.url))).endTime;
return{timeInMs,nodeTimings};
}}





LanternTagLoadTime=makeComputedArtifact(LanternTagLoadTime);


class TagLoadTime extends ComputedMetric{






static async computeSimulatedMetric(data,context){

return LanternTagLoadTime.request(data,context);
}







static async computeObservedMetric(data,context){
const{networkRecords}=data;
const pageStartTime=getPageStartTime(networkRecords);
const tagEndTime=getTagEndTime(networkRecords);
const tagLoadMs=(tagEndTime-pageStartTime)*1000;
return Promise.resolve({timing:tagLoadMs});
}}





TagLoadTime=makeComputedArtifact(TagLoadTime);

module.exports=TagLoadTime;


},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30,"url":"url"}],132:[function(require,module,exports){
(function(__filename){














const UIStrings={
GROUPS__METRICS:'Metrics',
GROUPS__ADS_PERFORMANCE:'Ad Speed',
GROUPS__ADS_BEST_PRACTICES:'Tag Best Practices',

NOT_APPLICABLE__DEFAULT:'Audit not applicable',
NOT_APPLICABLE__INVALID_TIMING:'Invalid timing task data',
NOT_APPLICABLE__NO_AD_RELATED_REQ:'No ad-related requests',
NOT_APPLICABLE__NO_AD_RENDERED:'No ads rendered',
NOT_APPLICABLE__NO_ADS_VIEWPORT:'No ads in viewport',
NOT_APPLICABLE__NO_ADS:'No ads requested',
NOT_APPLICABLE__NO_BIDS:'No bids detected',
NOT_APPLICABLE__NO_EVENT_MATCHING_REQ:'No event matches network records',
NOT_APPLICABLE__NO_GPT:'GPT not requested',
NOT_APPLICABLE__NO_RECORDS:'No successful network records',
NOT_APPLICABLE__NO_VISIBLE_SLOTS:'No visible slots',
NOT_APPLICABLE__NO_TAG:'No tag requested',
NOT_APPLICABLE__NO_TAGS:'No tags requested',
NOT_APPLICABLE__NO_TASKS:'No tasks to compare',
NOT_APPLICABLE__NO_VALID_AD_WIDTHS:'No requested ads contain ads of valid width',

ERRORS__AREA_LARGER_THAN_VIEWPORT:'Calculated ad area is larger than viewport',
ERRORS__VIEWPORT_AREA_ZERO:'Viewport area is zero',

WARNINGS__NO_ADS:'No ads were requested when fetching this page.',
WARNINGS__NO_AD_RENDERED:'No ads were rendered when rendering this page.',
WARNINGS__NO_TAG:'The GPT tag was not requested.'};

const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');

const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);






const notApplicableObj=message=>({
notApplicable:true,
score:1,
displayValue:str_(message)});






const auditNotApplicable={
Default:notApplicableObj(UIStrings.NOT_APPLICABLE__DEFAULT),
InvalidTiming:notApplicableObj(UIStrings.NOT_APPLICABLE__INVALID_TIMING),
NoAdRelatedReq:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_AD_RELATED_REQ),
NoAdRendered:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_AD_RENDERED),
NoAdsViewport:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_ADS_VIEWPORT),
NoAds:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_ADS),
NoBids:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_BIDS),
NoEventMatchingReq:notApplicableObj(
UIStrings.NOT_APPLICABLE__NO_EVENT_MATCHING_REQ),
NoGpt:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_GPT),
NoRecords:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_RECORDS),
NoVisibleSlots:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_VISIBLE_SLOTS),
NoTag:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TAG),
NoTags:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TAGS),
NoTasks:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TASKS),
NoValidAdWidths:notApplicableObj(
UIStrings.NOT_APPLICABLE__NO_VALID_AD_WIDTHS)};


const runWarning={
NoAds:str_(UIStrings.WARNINGS__NO_ADS),
NoAdRendered:str_(UIStrings.WARNINGS__NO_AD_RENDERED),
NoTag:str_(UIStrings.WARNINGS__NO_TAG)};


const auditError={
AreaLargerThanViewport:str_(UIStrings.ERRORS__AREA_LARGER_THAN_VIEWPORT),
ViewportAreaZero:str_(UIStrings.ERRORS__VIEWPORT_AREA_ZERO)};


const group={
Metrics:str_(UIStrings.GROUPS__METRICS),
AdsPerformance:str_(UIStrings.GROUPS__ADS_PERFORMANCE),
AdsBestPractices:str_(UIStrings.GROUPS__ADS_BEST_PRACTICES)};


module.exports={auditNotApplicable,runWarning,auditError,group};
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/messages/common-strings.js");
},{"lighthouse/lighthouse-core/lib/i18n/i18n":66}],133:[function(require,module,exports){





















function count(arr,pred){
let num=0;
for(const el of arr){
if(pred(el)){
num++;
}
}
return num;
}










function bucket(array,splitter){

const buckets=new Map();
for(const element of array){
const result=splitter(element);
if(result!=null){


const bucket=buckets.get(result)||[];
bucket.push(element);
buckets.set(result,bucket);
}
}
return buckets;
}







function flatten(arrs){
const result=[];
for(const arr of arrs){
result.push(...arr);
}
return result;
}

module.exports={
count,bucket,flatten};


},{}],134:[function(require,module,exports){



















function assert(x){
if(x==null)throw new Error('Expected not to be null');
return x;
}

module.exports={
assert};


},{}],135:[function(require,module,exports){














module.exports=[
{
label:'Prebid JS',
patterns:[
`^https?://([^.]*.)?prebid[.]org/.*`,
'^https?://acdn[.]adnxs[.]com/prebid/.*']},


{
label:'33Across',
patterns:[
'^https?://ssc[.]33across.com/api/.*']},


{
label:'AppNexus',
patterns:[
'^https?://ib[.]adnxs[.]com/.*']},


{
label:'Amazon',
patterns:[
'^https?://[a-z-_.]*[.]amazon-adsystem[.]com/.*bid.*']},


{
label:'AdTechus (AOL)',
patterns:[
'^https?://([^.]*.)?adserver[.]adtechus[.]com/.*']},


{
label:'Aardvark',
patterns:[
'^https?://thor[.]rtk[.]io/.*']},


{
label:'AdBlade',
patterns:[
'^https?://rtb[.]adblade[.]com/prebidjs/bid.*']},


{
label:'AdBund',
patterns:[
'^https?://us-east-engine[.]adbund[.]xyz/prebid/ad/get.*',
'^https?://us-west-engine[.]adbund[.]xyz/prebid/ad/get.*']},


{
label:'AdButler',
patterns:[
'^https?://servedbyadbutler[.]com/adserve.*']},


{
label:'Adequant',
patterns:[
'^https?://rex[.]adequant[.]com/rex/c2s_prebid.*']},


{
label:'AdForm',
patterns:[
'^https?://adx[.]adform[.]net/adx.*']},


{
label:'AdMedia',
patterns:[
'^https?://b[.]admedia[.]com/banner/prebid/bidder.*']},


{
label:'AdMixer',
patterns:[
'^https?://inv-nets[.]admixer[.]net/prebid[.]aspx.*',
'^https?://inv-nets[.]admixer[.]net/videoprebid[.]aspx.*']},


{
label:'AOL',
patterns:[
'^https?://adserver-us[.]adtech[.]advertising[.]com.*',
'^https?://adserver-eu[.]adtech[.]advertising[.]com.*',
'^https?://adserver-as[.]adtech[.]advertising[.]com.*',
'^https?://adserver[.]adtech[.]de/pubapi/.*']},


{
label:'Beachfront',
patterns:[
'^https?://reachms[.]bfmio[.]com/bid[.]json?exchange_id=.*']},


{
label:'Bidfluence',
patterns:[
'^https?://cdn[.]bidfluence[.]com/forge[.]js.*']},


{
label:'Brightcom',
patterns:[
'^https?://hb[.]iselephant[.]com/auc/ortb.*']},


{
label:'C1x',
patterns:[
'^https?://ht-integration[.]c1exchange[.]com:9000/ht.*']},


{
label:'CentroBid',
patterns:[
'^https?://t[.]brand-server[.]com/hb.*']},


{
label:'Conversant',
patterns:[
'^https?://media[.]msg[.]dotomi[.]com/s2s/.*']},


{
label:'Criteo',
patterns:[
'^https?://static[.]criteo[.]net/js/ld/publishertag[.]js.*',
'^https?://([^.]*.)?bidder[.]criteo[.]com/cdb.*',
'^https?://([^.]*.)?rtax[.]criteo[.]com/delivery/rta.*',
'^https?://([^.]*.)?rtax[.]eu[.]criteo[.]com/delivery/rta.*']},


{
label:'Districtm',
patterns:[
'^https?://prebid[.]districtm[.]ca/lib[.]js.*']},


{
label:'E-Planning',
patterns:[
'^https?://ads[.]us[.]e-planning[.]net.*']},


{
label:'Essens',
patterns:[
'^https?://bid[.]essrtb[.]com/bid/prebid_call.*']},


{
label:'Facebook',
patterns:[
'^https?://an[.]facebook[.]com/v2/placementbid[.]json.*']},


{
label:'FeatureForward',
patterns:[
'^https?://prmbdr[.]featureforward[.]com/newbidder/.*']},


{
label:'Fidelity',
patterns:[
'^https?://x[.]fidelity-media[.]com.*']},


{
label:'GetIntent',
patterns:[
'^https?://px[.]adhigh[.]net/rtb/direct_banner.*',
'^https?://px[.]adhigh[.]net/rtb/direct_vast.*']},


{
label:'GumGum',
patterns:[
'^https?://g2[.]gumgum[.]com/hbid/imp.*']},


{
label:'Hiromedia',
patterns:[
'^https?://hb-rtb[.]ktdpublishers[.]com/bid/get.*']},


{
label:'Imonomy',
patterns:[
'^https?://b[.]imonomy[.]com/openrtb/hb/.*']},


{
label:'ImproveDigital',
patterns:[
'^https?://ad[.]360yield[.]com/hb.*']},


{
label:'IndexExchange',
patterns:[
'^https?://as(-sec)?[.]casalemedia[.]com/(cygnus|headertag).*',
'^https?://js(-sec)?[.]indexww[.]com/ht/.*']},


{
label:'InnerActive',
patterns:[
'^https?://ad-tag[.]inner-active[.]mobi/simpleM2M/requestJsonAd.*']},


{
label:'Innity',
patterns:[
'^https?://as[.]innity[.]com/synd/.*']},


{
label:'JCM',
patterns:[
'^https?://media[.]adfrontiers[.]com/pq.*']},


{
label:'JustPremium',
patterns:[
'^https?://pre[.]ads[.]justpremium[.]com/v/.*']},


{
label:'Kargo',
patterns:[
'^https?://krk[.]kargo[.]com/api/v1/bid.*']},


{
label:'Komoona',
patterns:[
'^https?://bidder[.]komoona[.]com/v1/GetSBids.*']},


{
label:'KruxLink',
patterns:[
'^https?://link[.]krxd[.]net/hb.*']},


{
label:'Kumma',
patterns:[
'^https?://cdn[.]kumma[.]com/pb_ortb[.]js.*']},


{
label:'Mantis',
patterns:[
'^https?://mantodea[.]mantisadnetwork[.]com/website/prebid.*']},


{
label:'MarsMedia',
patterns:[
'^https?://bid306[.]rtbsrv[.]com:9306/bidder.*']},


{
label:'Media.net',
patterns:[
'^https?://contextual[.]media[.]net/bidexchange.*']},


{
label:'MemeGlobal',
patterns:[
'^https?://stinger[.]memeglobal[.]com/api/v1/services/prebid.*']},


{
label:'MobFox',
patterns:[
'^https?://my[.]mobfox[.]com/request[.]php.*']},


{
label:'NanoInteractive',
patterns:[
'^https?://tmp[.]audiencemanager[.]de/hb.*']},


{
label:'OpenX',
patterns:[
'^https?://([^.]*.)?d[.]openx[.]net/w/1[.]0/arj.*',
'^https?://([^.]*.)?servedbyopenx[.]com/.*']},


{
label:'Piximedia',
patterns:[
'^https?://static[.]adserver[.]pm/prebid.*']},


{
label:'Platformio',
patterns:[
'^https?://piohbdisp[.]hb[.]adx1[.]com.*']},


{
label:'Pollux',
patterns:[
'^https?://adn[.]plxnt[.]com/prebid.*']},


{
label:'PubGears',
patterns:[
'^https?://c[.]pubgears[.]com/tags.*']},


{
label:'Pubmatic',
patterns:[
'^https?://ads[.]pubmatic[.]com/AdServer/js/gshowad[.]js.*',
'^https?://([^.]*.)?gads.pubmatic[.]com/.*',
'^https?://hbopenbid.pubmatic[.]com/.*']},


{
label:'Pulsepoint',
patterns:[
'^https?://bid[.]contextweb[.]com/header/tag.*']},


{
label:'Quantcast',
patterns:[
'^https?://global[.]qc[.]rtb[.]quantserve[.]com:8080/qchb.*']},


{
label:'Rhythmone',
patterns:[
'^https?://tag[.]1rx[.]io/rmp/.*']},


{
label:'Roxot',
patterns:[
'^https?://r[.]rxthdr[.]com.*']},


{
label:'Rubicon',
patterns:[
'^https?://([^.]*.)?(fastlane|optimized-by|anvil)[.]rubiconproject[.]com/a/api.*',
'^https?://fastlane-adv[.]rubiconproject[.]com/v1/auction/video.*']},


{
label:'Sekindo',
patterns:[
'^https?://hb[.]sekindo[.]com/live/liveView[.]php.*']},


{
label:'ShareThrough',
patterns:[
'^https?://btlr[.]sharethrough[.]com/header-bid/.*']},


{
label:'Smart AdServer',
patterns:[
'^https?://prg[.]smartadserver[.]com/prebid.*']},


{
label:'Sonobi',
patterns:[
'^https?://apex[.]go[.]sonobi[.]com/trinity[.]js.*']},


{
label:'Sovrn',
patterns:[
'^https?://ap[.]lijit[.]com/rtb/bid.*']},


{
label:'SpringServe',
patterns:[
'^https?://bidder[.]springserve[.]com/display/hbid.*']},


{
label:'StickyAds',
patterns:[
'^https?://cdn[.]stickyadstv[.]com/mustang/mustang[.]min[.]js.*',
'^https?://cdn[.]stickyadstv[.]com/prime-time/.*']},


{
label:'TapSense3',
patterns:[
'^https?://ads04[.]tapsense[.]com/ads/headerad.*']},


{
label:'ThoughtLeadr',
patterns:[
'^https?://a[.]thoughtleadr[.]com/v4/.*']},


{
label:'TremorBid',
patterns:[
'^https?://([^.]*.)?ads[.]tremorhub[.]com/ad/tag.*']},


{
label:'Trion',
patterns:[
'^https?://in-appadvertising[.]com/api/bidRequest.*']},


{
label:'TripleLift',
patterns:[
'^https?://tlx[.]3lift[.]com/header/auction.*']},


{
label:'TrustX',
patterns:[
'^https?://sofia[.]trustx[.]org/hb.*']},


{
label:'UCFunnel',
patterns:[
'^https?://agent[.]aralego[.]com/header.*']},


{
label:'Underdog Media',
patterns:[
'^https?://udmserve[.]net/udm/img[.]fetch.*']},


{
label:'UnRuly',
patterns:[
'^https?://targeting[.]unrulymedia[.]com/prebid.*']},


{
label:'VertaMedia',
patterns:[
'^https?://rtb[.]vertamedia[.]com/hb/.*']},


{
label:'Vertoz',
patterns:[
'^https?://hb[.]vrtzads[.]com/vzhbidder/bid.*']},


{
label:'WideOrbig',
patterns:[
'^https?://([^.]*.)?atemda[.]com/JSAdservingMP[.]ashx.*']},


{
label:'WideSpace',
patterns:[
'^https?://engine[.]widespace[.]com/map/engine/hb/.*']},


{
label:'YieldBot',
patterns:[
'^https?://cdn[.]yldbt[.]com/js/yieldbot[.]intent[.]js.*']},


{
label:'YieldMo',
patterns:[
'^https?://ads[.]yieldmo[.]com/exchange/prebid.*']}];




},{}],136:[function(require,module,exports){



















function isBoxInViewport(clientRect,viewport){
const{innerWidth,innerHeight}=viewport;
const{left,top,right,bottom}=clientRect;

return left<right&&top<bottom&&
left<innerWidth&&top<innerHeight&&0<right&&0<bottom;
}






function boxViewableArea(clientRect,viewport){
if(!isBoxInViewport(clientRect,viewport))return 0;

const{innerWidth,innerHeight}=viewport;
const{left,top,right,bottom}=clientRect;

return(Math.min(right,innerWidth)-Math.max(left,0))*(
Math.min(bottom,innerHeight)-Math.max(top,0));
}

module.exports={
isBoxInViewport,
boxViewableArea};



},{}],137:[function(require,module,exports){














const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node');

const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');

const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{assert}=require('./asserts');
const{getAbbreviatedUrl,trimUrl}=require('../utils/resource-classification');
const{getNetworkInitiators}=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
const{getTimingsByRecord}=require('../utils/network-timing');
const{isAdRequest,getHeaderBidder}=require('./resource-classification');

















function findTargetRequest(root,isTargetRequest){

let firstTarget=null;
root.traverse(node=>{
if(node.type===BaseNode.TYPES.CPU||!isTargetRequest(node.record)){
return;
}
if(firstTarget&&firstTarget.startTime<node.startTime){
return;
}
firstTarget=node;
});
return firstTarget;
}








function getTransitiveClosure(root,isTargetRequest){

const closure=new Set();

const firstTarget=findTargetRequest(root,isTargetRequest);


const requests=[];

const traceEvents=[];

if(firstTarget==null){
return{requests,traceEvents};
}

const stack=[firstTarget];


while(stack.length){
const node=stack.pop();
if(!node||closure.has(node)){
continue;
}
closure.add(node);
stack.push(...node.getDependencies());
}


const visited=new Set();
stack.push(...root.getDependents());
while(stack.length){
const node=stack.pop();
if(!node||visited.has(node)){
continue;
}
visited.add(node);
if(closure.has(node)){
for(const n of stack){
closure.add(n);
}
}
stack.push(...node.getDependents());
}


for(const node of closure){
if(node.type===BaseNode.TYPES.NETWORK){
if(node.endTime<assert(firstTarget).startTime){
requests.push(node.record);
}
}else if(node.type===BaseNode.TYPES.CPU){
if(node.event.ts<assert(firstTarget).startTime*1e6){
traceEvents.push(node.event,...node.childEvents);
}
}
}
return{requests,traceEvents};
}








function isXhrCritical(xhrReq,networkSummary,criticalRequests){
const edges=networkSummary.xhrEdges.get(xhrReq.url);
if(!edges){
return false;
}
for(const{url}of criticalRequests){
if(edges.has(url)){
return true;
}
}
return false;
}









function addInitiatedRequests(
scriptReq,parentReq,networkSummary,criticalRequests){
const initiatedRequests=networkSummary.allRecords.
filter(r=>r.resourceType!=undefined).
filter(r=>['Script','XHR'].includes(r.resourceType||'')&&
r.endTime<parentReq.startTime).
filter(r=>r.initiatorRequest==scriptReq||
getNetworkInitiators(r).includes(scriptReq.url));

for(const initiatedReq of initiatedRequests){

const blocking=
initiatedReq.resourceType=='XHR'&&
isXhrCritical(initiatedReq,networkSummary,criticalRequests);
if(blocking){
linkGraph(networkSummary,initiatedReq,criticalRequests);
}
}
}








function getCriticalGraph(networkRecords,traceEvents,targetRequest){
const summary=buildNetworkSummary(networkRecords,traceEvents);
const criticalRequests=new Set();
linkGraph(summary,targetRequest,criticalRequests);
return criticalRequests;
}








function linkGraph(
networkSummary,targetRequest,criticalRequests=new Set()){
if(!targetRequest||criticalRequests.has(targetRequest)){
return criticalRequests;
}
criticalRequests.add(targetRequest);
const seen=new Set();
for(let stack=targetRequest.initiator.stack;stack;stack=stack.parent){
for(const{url}of stack.callFrames){
if(seen.has(url))continue;
seen.add(url);

const request=networkSummary.requestsByUrl.get(url);
if(!request)continue;

linkGraph(networkSummary,request,criticalRequests);

if(request.resourceType=='Script'){
const scriptUrl=stack.callFrames[0].url;
const scriptReq=networkSummary.requestsByUrl.get(scriptUrl);
if(scriptReq){
addInitiatedRequests(
scriptReq,
targetRequest,
networkSummary,
criticalRequests);
}
}
}
}

linkGraph(
networkSummary,targetRequest.initiatorRequest||null,criticalRequests);
return criticalRequests;
}






function buildNetworkSummary(networkRecords,traceEvents){
const requestsByUrl=new Map();
for(const req of networkRecords){
requestsByUrl.set(req.url,req);
}

const xhrEvents=traceEvents.
filter(t=>t.name.startsWith('XHR')).
filter(t=>!!(t.args.data||{}).url);
const xhrEdges=new Map();
for(const e of xhrEvents){
const data=e.args.data||{};
const edges=xhrEdges.get(data.url)||new Set();
for(const{url}of data.stackTrace||[]){
edges.add(url);
}
xhrEdges.set(data.url,edges);
}
return{requestsByUrl,xhrEdges,allRecords:networkRecords};
}



















function areSimilarRequests(r1,r2){
if(Math.max(r1.startTime,r2.startTime)>Math.min(r1.endTime,r2.endTime)){
return false;
}
if(r1.type&&r2.type&&r1.type!=r2.type){
return false;
}
return r1.abbreviatedUrl==r2.abbreviatedUrl;
}







function computeSummaries(requests){



requests.sort((a,b)=>{
if(a.abbreviatedUrl!=b.abbreviatedUrl){
return a.abbreviatedUrl<b.abbreviatedUrl?-1:1;
}
if(a.type!=b.type){
return a.type<b.type?-1:1;
}
if(a.startTime!=b.startTime){
return a.startTime<b.startTime?-1:1;
}
return a.endTime-b.endTime;
});
const result=[];
for(let i=0;i<requests.length;i++){
const current=requests[i];
let next;
while(i<requests.length){
next=requests[i+1];
if(!next||!areSimilarRequests(next,current)){
break;
}
current.url=current.abbreviatedUrl;
current.endTime=Math.max(current.endTime,next.endTime);
current.duration=current.endTime-current.startTime;
i++;
}
result.push(current);
}
result.sort((a,b)=>a.startTime-b.startTime);
return result;
}





function computeSelfTimes(requests){
if(!requests.length){
return[];
}

let bottlneckRequest=assert(requests[0]);
bottlneckRequest.selfTime=bottlneckRequest.duration;

let scanEnd=bottlneckRequest.startTime;

for(const current of requests){
if(current.endTime<scanEnd||current==bottlneckRequest){

continue;
}
const left=Math.max(scanEnd,current.startTime);
const right=Math.min(bottlneckRequest.endTime,current.endTime);
if(left<right){

bottlneckRequest.selfTime-=right-left;
}
scanEnd=Math.max(scanEnd,right);
if(current.endTime>bottlneckRequest.endTime){
current.selfTime=current.endTime-left;
bottlneckRequest=current;
}
}
}










async function computeAdRequestWaterfall(trace,devtoolsLog,context){
const networkRecords=await NetworkRecords.request(devtoolsLog,context);

const maybeFirstAdRequest=networkRecords.find(isAdRequest);
const criticalRequests=new Set();
if(maybeFirstAdRequest==null){
return Promise.resolve([]);
}
const firstAdRequest=assert(maybeFirstAdRequest);
const bidRequests=networkRecords.filter(r=>
!!getHeaderBidder(r.url)&&r.endTime<=firstAdRequest.startTime);
const summary=buildNetworkSummary(networkRecords,trace.traceEvents);
for(const req of[firstAdRequest,...bidRequests]){
linkGraph(summary,req,criticalRequests);
}

const REQUEST_TYPES=new Set([
'Script','XHR','Fetch','EventStream','Document',undefined]);
const waterfall=Array.from(criticalRequests).
filter(r=>r.endTime<firstAdRequest.startTime).
filter(r=>REQUEST_TYPES.has(r.resourceType)).
filter(r=>r.mimeType!='text/css');


const timingsByRecord=
await getTimingsByRecord(trace,devtoolsLog,context);
const timedWaterfall=waterfall.map(req=>{
const{startTime,endTime}=timingsByRecord.get(req)||req;
return{
startTime,
endTime,
duration:endTime-startTime,
selfTime:0,
url:trimUrl(req.url),
abbreviatedUrl:getAbbreviatedUrl(req.url),
type:req.resourceType,
record:req};

});
const result=computeSummaries(timedWaterfall);
computeSelfTimes(result);
return result;
}

module.exports={
getTransitiveClosure,
getCriticalGraph,
computeAdRequestWaterfall};


},{"../utils/network-timing":138,"../utils/resource-classification":140,"./asserts":134,"./resource-classification":140,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/dependency-graph/base-node":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59}],138:[function(require,module,exports){














const AdLanternMetric=require('../computed/ad-lantern-metric');

const LoadSimulator=require('lighthouse/lighthouse-core/computed/load-simulator');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
const{isAdRequest,isBidRequest,isImplTag,isImpressionPing}=require('./resource-classification');
const{URL}=require('url');














function getTagEndTime(networkRecords){
const tagRecord=networkRecords.find(
record=>isImplTag(new URL(record.url)));
return tagRecord?tagRecord.endTime:-1;
}






function getAdStartTime(networkRecords){
const firstAdRecord=networkRecords.find(isAdRequest);
return firstAdRecord?firstAdRecord.startTime:-1;
}






function getBidStartTime(networkRecords){
const firstBidRecord=networkRecords.find(isBidRequest);
return firstBidRecord?firstBidRecord.startTime:-1;
}






function getImpressionStartTime(networkRecords){
const firstImpressionRecord=networkRecords.find(
record=>isImpressionPing(record.url));
return firstImpressionRecord?firstImpressionRecord.startTime:-1;
}







function getPageStartTime(networkRecords,defaultValue=-1){
const firstSuccessRecord=networkRecords.find(
record=>record.statusCode==200);
return firstSuccessRecord?firstSuccessRecord.startTime:defaultValue;
}







function getPageResponseTime(networkRecords,defaultValue=-1){
const firstSuccessRecord=networkRecords.find(
record=>record.statusCode==200);
return firstSuccessRecord?
firstSuccessRecord.responseReceivedTime:defaultValue;
}







async function getTimingsByRecord(trace,devtoolsLog,context){

const timingsByRecord=new Map();
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
if(context.settings.throttlingMethod=='simulate'){

const documentNode=

await PageDependencyGraph.request({trace,devtoolsLog},context);
const releventGraph=AdLanternMetric.getOptimisticGraph(documentNode);
const simulator=await LoadSimulator.request(
{devtoolsLog,settings:context.settings},context);
const{nodeTimings}=simulator.simulate(releventGraph,{});
for(const[{record},timing]of nodeTimings.entries()){
if(!record)continue;
timingsByRecord.set(record,timing);
}
}else{
const pageStartTime=getPageStartTime(networkRecords);
for(const record of networkRecords){
timingsByRecord.set(record,{
startTime:(record.startTime-pageStartTime)*1000,
endTime:(record.endTime-pageStartTime)*1000,
duration:(record.endTime-record.startTime)*1000});

}
}
return timingsByRecord;
}





function getScriptUrl(e){
if(!e.args.data){
return undefined;
}
if(!['EvaluateScript','FunctionCall'].includes(e.name)){
return undefined;
}
if(e.args.data.url){
return e.args.data.url;
}
if(e.args.data.stackTrace){
return e.args.data.stackTrace[0].url;
}
return undefined;
}











async function getScriptEvaluationTimes(trace,devtoolsLog,context){
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const pageStartTime=getPageStartTime(networkRecords)*1000;

const results=new Map();
for(const e of trace.traceEvents){
const script=getScriptUrl(e);
if(script&&!results.has(script)){
results.set(script,e.ts/1000-pageStartTime);
}
}
if(context.settings.throttlingMethod!=='simulate'){
return results;
}

const timingsByRecord=await getTimingsByRecord(trace,devtoolsLog,context);
for(const[req,timing]of timingsByRecord.entries()){
const scriptEvalTime=results.get(req.url);
if(!scriptEvalTime){
continue;
}
const unsimulatedNetworkTime=req.startTime*1000-pageStartTime;
const simulatedNetworkTime=timing.endTime;

const cpuFactor=context.settings.throttling.cpuSlowdownMultiplier;

const unsimulatedCpuTime=scriptEvalTime-unsimulatedNetworkTime;
const simulatedCpuTime=cpuFactor*unsimulatedCpuTime;

results.set(req.url,simulatedNetworkTime+simulatedCpuTime);
}
return results;
}

module.exports={
getTagEndTime,
getImpressionStartTime,
getAdStartTime,
getBidStartTime,
getPageStartTime,
getPageResponseTime,
getTimingsByRecord,
getScriptEvaluationTimes};


},{"../computed/ad-lantern-metric":126,"./resource-classification":140,"lighthouse/lighthouse-core/computed/load-simulator":10,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"url":"url"}],139:[function(require,module,exports){















const CacheHeaders=require('lighthouse/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl');

const{parse:parseCacheControl}=require('@tusbar/cache-control');






function getHeader(req,header){
const lowerHeader=header.toLowerCase();
return(req.responseHeaders||[]).find(
h=>h.name.toLowerCase()===lowerHeader);
}






function isCacheable(req){

if(!CacheHeaders.isCacheableAsset(req)){
return false;
}
const cacheControlHeader=getHeader(req,'cache-control');
if(cacheControlHeader){
try{
const cacheControl=parseCacheControl(cacheControlHeader.value);
if(cacheControl.noStore||cacheControl.noCache||
cacheControl.maxAge===0){
return false;
}
}catch(e){}
return true;
}

return!!getHeader(req,'expires')||!!getHeader(req,'last-modified');
}

module.exports={
isCacheable};


},{"@tusbar/cache-control":91,"lighthouse/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl":"../audits/byte-efficiency/uses-long-cache-ttl"}],140:[function(require,module,exports){














const bidderPatterns=require('./bidder-patterns');
const{isCacheable}=require('../utils/network');
const{URL}=require('url');







function toURL(urlOrStr){
return typeof urlOrStr==='string'?new URL(urlOrStr):urlOrStr;
}






function isGoogleAds(url){
return /(^|\.)(doubleclick.net|google(syndication|tagservices).com)$/.
test(url.hostname);
}






function isAdSenseTag(url){
url=toURL(url);
const matchesHost=url.host==='pagead2.googlesyndication.com';
const matchesPath=
[
'/pagead/js/adsbygoogle.js',
'/pagead/show_ads.js'].
includes(url.pathname);
return matchesHost&&matchesPath;
}






function isAdSenseImplTag(url){
url=toURL(url);
const matchesHost=url.host==='pagead2.googlesyndication.com';
const matchesPath=
/(^\/pagead\/js\/.*\/show_ads_impl\.js)/.test(url.pathname);
return matchesHost&&matchesPath;
}






function isAdSense(url){
return isAdSenseTag(url)||isAdSenseImplTag(url);
}






function isAdSenseAdRequest(request){
if(!request)return false;
const url=new URL(request.url);
return(
url.pathname==='/pagead/ads'&&
url.host==='googleads.g.doubleclick.net');

}





function isAdSenseIframe(iframe){
return /(^aswift_\d+)/.test(iframe.id);
}






function isImpressionPing(url){
const{host,pathname}=toURL(url);
return(
[
'securepubads.g.doubleclick.net',
'googleads4.g.doubleclick.net'].
includes(host)&&
['/pcs/view','/pagead/adview'].includes(pathname));

}






function isGptTag(url){
const{host,pathname}=toURL(url);
const matchesHost=[
'www.googletagservices.com',
'securepubads.g.doubleclick.net'].includes(host);
const matchesPath=
['/tag/js/gpt.js','/tag/js/gpt_mobile.js'].includes(pathname);
return matchesHost&&matchesPath;
}






function isGptImplTag(url){
return(
/(^\/gpt\/pubads_impl([a-z_]*)((?<!rendering)_)\d+\.js)/.
test(toURL(url).pathname));

}






function isGpt(url){
return isGptTag(url)||isGptImplTag(url);
}






function isGptAdRequest(request){
if(!request)return false;
const url=new URL(request.url);
return(
url.pathname==='/gampad/ads'&&
url.host==='securepubads.g.doubleclick.net'&&
request.resourceType==='XHR');

}





function isGptIframe(iframe){
return /(^google_ads_iframe_)/.test(iframe.id);
}






function isAdTag(url){
return isAdSenseTag(url)||isGptTag(url);
}






function isAdScript(url){
return isAdSense(url)||isGpt(url);
}






function isAdRequest(request){
return isAdSenseAdRequest(request)||isGptAdRequest(request);
}






function isAdIframe(iframe){
return isAdSenseIframe(iframe)||isGptIframe(iframe);
}






function isImplTag(url){
return isAdSenseTag(url)||isGptImplTag(url);
}







function containsAnySubstring(str,substrings){
return substrings.some(substring=>str.includes(substring));
}






function hasImpressionPath(url){
return url.pathname==='/pcs/view'||
url.pathname==='/pagead/adview';
}






function getHeaderBidder(url){
for(const def of bidderPatterns){
for(const pattern of def.patterns){
if(new RegExp(pattern).test(url)){
return def.label;
}
}
}
return undefined;
}







function isBidRelatedRequest(requestOrUrl){
return!!getHeaderBidder(
typeof requestOrUrl=='string'?requestOrUrl:requestOrUrl.url);
}






function isPossibleBidRequest(req){
return(req.resourceSize==null||req.resourceSize>0)&&
req.resourceType!='Image'&&
!isCacheable(req);
}






function isBidRequest(req){
return isBidRelatedRequest(req)&&isPossibleBidRequest(req);
}





function isStaticRequest(request){

return['parser','preload','other'].includes(request.initiator.type);
}






function trimUrl(url){
const u=new URL(url);
const PATH_MAX=60;
const path=u.pathname.length>PATH_MAX?
u.pathname.substr(0,PATH_MAX)+'...':u.pathname;
return u.origin+path;
}







function getAbbreviatedUrl(url){
const u=new URL(trimUrl(url));
const parts=u.pathname.split('/');
if(parts.length>4){
u.pathname=[...parts.splice(0,4),'...'].join('/');
}
return u.toString();
}

module.exports={
isGoogleAds,
isGptAdRequest,
isImpressionPing,
isGpt,
isAdSense,
isAdSenseTag,
isAdSenseImplTag,
isAdSenseAdRequest,
isAdSenseIframe,
isGptTag,
isGptImplTag,
isGptIframe,
isAdTag,
isAdScript,
isAdRequest,
isAdIframe,
isImplTag,
containsAnySubstring,
hasImpressionPath,
getHeaderBidder,
isBidRelatedRequest,
isBidRequest,
isStaticRequest,
trimUrl,
getAbbreviatedUrl};


},{"../utils/network":139,"./bidder-patterns":135,"url":"url"}],141:[function(require,module,exports){





















function getAttributableUrl(longTask,knownScripts=new Set()){
const scriptUrl=longTask.attributableURLs.find(
url=>knownScripts.has(url));
const fallbackUrl=longTask.attributableURLs[0]||
(longTask.event.args.data||{}).url;
const attributableUrl=scriptUrl||fallbackUrl;

if(attributableUrl){
return attributableUrl;
}
let maxChildDuration=50;
let childUrl='';
for(const child of longTask.children){
const url=getAttributableUrl(child,knownScripts);
if(url&&child.duration>maxChildDuration){
childUrl=url;
maxChildDuration=child.duration;
}
}
return childUrl;
}

module.exports={getAttributableUrl};

},{}],142:[function(require,module,exports){
(function(global){










var LARGE_ARRAY_SIZE=200;


var HASH_UNDEFINED='__lodash_hash_undefined__';


var COMPARE_PARTIAL_FLAG=1,
COMPARE_UNORDERED_FLAG=2;


var MAX_SAFE_INTEGER=9007199254740991;


var argsTag='[object Arguments]',
arrayTag='[object Array]',
asyncTag='[object AsyncFunction]',
boolTag='[object Boolean]',
dateTag='[object Date]',
errorTag='[object Error]',
funcTag='[object Function]',
genTag='[object GeneratorFunction]',
mapTag='[object Map]',
numberTag='[object Number]',
nullTag='[object Null]',
objectTag='[object Object]',
promiseTag='[object Promise]',
proxyTag='[object Proxy]',
regexpTag='[object RegExp]',
setTag='[object Set]',
stringTag='[object String]',
symbolTag='[object Symbol]',
undefinedTag='[object Undefined]',
weakMapTag='[object WeakMap]';

var arrayBufferTag='[object ArrayBuffer]',
dataViewTag='[object DataView]',
float32Tag='[object Float32Array]',
float64Tag='[object Float64Array]',
int8Tag='[object Int8Array]',
int16Tag='[object Int16Array]',
int32Tag='[object Int32Array]',
uint8Tag='[object Uint8Array]',
uint8ClampedTag='[object Uint8ClampedArray]',
uint16Tag='[object Uint16Array]',
uint32Tag='[object Uint32Array]';





var reRegExpChar=/[\\^$.*+?()[\]{}|]/g;


var reIsHostCtor=/^\[object .+?Constructor\]$/;


var reIsUint=/^(?:0|[1-9]\d*)$/;


var typedArrayTags={};
typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=
typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=
typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=
typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=
typedArrayTags[uint32Tag]=true;
typedArrayTags[argsTag]=typedArrayTags[arrayTag]=
typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=
typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=
typedArrayTags[errorTag]=typedArrayTags[funcTag]=
typedArrayTags[mapTag]=typedArrayTags[numberTag]=
typedArrayTags[objectTag]=typedArrayTags[regexpTag]=
typedArrayTags[setTag]=typedArrayTags[stringTag]=
typedArrayTags[weakMapTag]=false;


var freeGlobal=typeof global=='object'&&global&&global.Object===Object&&global;


var freeSelf=typeof self=='object'&&self&&self.Object===Object&&self;


var root=freeGlobal||freeSelf||Function('return this')();


var freeExports=typeof exports=='object'&&exports&&!exports.nodeType&&exports;


var freeModule=freeExports&&typeof module=='object'&&module&&!module.nodeType&&module;


var moduleExports=freeModule&&freeModule.exports===freeExports;


var freeProcess=moduleExports&&freeGlobal.process;


var nodeUtil=function(){
try{
return freeProcess&&freeProcess.binding&&freeProcess.binding('util');
}catch(e){}
}();


var nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;










function arrayFilter(array,predicate){
var index=-1,
length=array==null?0:array.length,
resIndex=0,
result=[];

while(++index<length){
var value=array[index];
if(predicate(value,index,array)){
result[resIndex++]=value;
}
}
return result;
}









function arrayPush(array,values){
var index=-1,
length=values.length,
offset=array.length;

while(++index<length){
array[offset+index]=values[index];
}
return array;
}











function arraySome(array,predicate){
var index=-1,
length=array==null?0:array.length;

while(++index<length){
if(predicate(array[index],index,array)){
return true;
}
}
return false;
}










function baseTimes(n,iteratee){
var index=-1,
result=Array(n);

while(++index<n){
result[index]=iteratee(index);
}
return result;
}








function baseUnary(func){
return function(value){
return func(value);
};
}









function cacheHas(cache,key){
return cache.has(key);
}









function getValue(object,key){
return object==null?undefined:object[key];
}








function mapToArray(map){
var index=-1,
result=Array(map.size);

map.forEach(function(value,key){
result[++index]=[key,value];
});
return result;
}









function overArg(func,transform){
return function(arg){
return func(transform(arg));
};
}








function setToArray(set){
var index=-1,
result=Array(set.size);

set.forEach(function(value){
result[++index]=value;
});
return result;
}


var arrayProto=Array.prototype,
funcProto=Function.prototype,
objectProto=Object.prototype;


var coreJsData=root['__core-js_shared__'];


var funcToString=funcProto.toString;


var hasOwnProperty=objectProto.hasOwnProperty;


var maskSrcKey=function(){
var uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||'');
return uid?'Symbol(src)_1.'+uid:'';
}();






var nativeObjectToString=objectProto.toString;


var reIsNative=RegExp('^'+
funcToString.call(hasOwnProperty).replace(reRegExpChar,'\\$&').
replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,'$1.*?')+'$');



var Buffer=moduleExports?root.Buffer:undefined,
Symbol=root.Symbol,
Uint8Array=root.Uint8Array,
propertyIsEnumerable=objectProto.propertyIsEnumerable,
splice=arrayProto.splice,
symToStringTag=Symbol?Symbol.toStringTag:undefined;


var nativeGetSymbols=Object.getOwnPropertySymbols,
nativeIsBuffer=Buffer?Buffer.isBuffer:undefined,
nativeKeys=overArg(Object.keys,Object);


var DataView=getNative(root,'DataView'),
Map=getNative(root,'Map'),
Promise=getNative(root,'Promise'),
Set=getNative(root,'Set'),
WeakMap=getNative(root,'WeakMap'),
nativeCreate=getNative(Object,'create');


var dataViewCtorString=toSource(DataView),
mapCtorString=toSource(Map),
promiseCtorString=toSource(Promise),
setCtorString=toSource(Set),
weakMapCtorString=toSource(WeakMap);


var symbolProto=Symbol?Symbol.prototype:undefined,
symbolValueOf=symbolProto?symbolProto.valueOf:undefined;








function Hash(entries){
var index=-1,
length=entries==null?0:entries.length;

this.clear();
while(++index<length){
var entry=entries[index];
this.set(entry[0],entry[1]);
}
}








function hashClear(){
this.__data__=nativeCreate?nativeCreate(null):{};
this.size=0;
}











function hashDelete(key){
var result=this.has(key)&&delete this.__data__[key];
this.size-=result?1:0;
return result;
}










function hashGet(key){
var data=this.__data__;
if(nativeCreate){
var result=data[key];
return result===HASH_UNDEFINED?undefined:result;
}
return hasOwnProperty.call(data,key)?data[key]:undefined;
}










function hashHas(key){
var data=this.__data__;
return nativeCreate?data[key]!==undefined:hasOwnProperty.call(data,key);
}











function hashSet(key,value){
var data=this.__data__;
this.size+=this.has(key)?0:1;
data[key]=nativeCreate&&value===undefined?HASH_UNDEFINED:value;
return this;
}


Hash.prototype.clear=hashClear;
Hash.prototype['delete']=hashDelete;
Hash.prototype.get=hashGet;
Hash.prototype.has=hashHas;
Hash.prototype.set=hashSet;








function ListCache(entries){
var index=-1,
length=entries==null?0:entries.length;

this.clear();
while(++index<length){
var entry=entries[index];
this.set(entry[0],entry[1]);
}
}








function listCacheClear(){
this.__data__=[];
this.size=0;
}










function listCacheDelete(key){
var data=this.__data__,
index=assocIndexOf(data,key);

if(index<0){
return false;
}
var lastIndex=data.length-1;
if(index==lastIndex){
data.pop();
}else{
splice.call(data,index,1);
}
--this.size;
return true;
}










function listCacheGet(key){
var data=this.__data__,
index=assocIndexOf(data,key);

return index<0?undefined:data[index][1];
}










function listCacheHas(key){
return assocIndexOf(this.__data__,key)>-1;
}











function listCacheSet(key,value){
var data=this.__data__,
index=assocIndexOf(data,key);

if(index<0){
++this.size;
data.push([key,value]);
}else{
data[index][1]=value;
}
return this;
}


ListCache.prototype.clear=listCacheClear;
ListCache.prototype['delete']=listCacheDelete;
ListCache.prototype.get=listCacheGet;
ListCache.prototype.has=listCacheHas;
ListCache.prototype.set=listCacheSet;








function MapCache(entries){
var index=-1,
length=entries==null?0:entries.length;

this.clear();
while(++index<length){
var entry=entries[index];
this.set(entry[0],entry[1]);
}
}








function mapCacheClear(){
this.size=0;
this.__data__={
'hash':new Hash(),
'map':new(Map||ListCache)(),
'string':new Hash()};

}










function mapCacheDelete(key){
var result=getMapData(this,key)['delete'](key);
this.size-=result?1:0;
return result;
}










function mapCacheGet(key){
return getMapData(this,key).get(key);
}










function mapCacheHas(key){
return getMapData(this,key).has(key);
}











function mapCacheSet(key,value){
var data=getMapData(this,key),
size=data.size;

data.set(key,value);
this.size+=data.size==size?0:1;
return this;
}


MapCache.prototype.clear=mapCacheClear;
MapCache.prototype['delete']=mapCacheDelete;
MapCache.prototype.get=mapCacheGet;
MapCache.prototype.has=mapCacheHas;
MapCache.prototype.set=mapCacheSet;









function SetCache(values){
var index=-1,
length=values==null?0:values.length;

this.__data__=new MapCache();
while(++index<length){
this.add(values[index]);
}
}











function setCacheAdd(value){
this.__data__.set(value,HASH_UNDEFINED);
return this;
}










function setCacheHas(value){
return this.__data__.has(value);
}


SetCache.prototype.add=SetCache.prototype.push=setCacheAdd;
SetCache.prototype.has=setCacheHas;








function Stack(entries){
var data=this.__data__=new ListCache(entries);
this.size=data.size;
}








function stackClear(){
this.__data__=new ListCache();
this.size=0;
}










function stackDelete(key){
var data=this.__data__,
result=data['delete'](key);

this.size=data.size;
return result;
}










function stackGet(key){
return this.__data__.get(key);
}










function stackHas(key){
return this.__data__.has(key);
}











function stackSet(key,value){
var data=this.__data__;
if(data instanceof ListCache){
var pairs=data.__data__;
if(!Map||pairs.length<LARGE_ARRAY_SIZE-1){
pairs.push([key,value]);
this.size=++data.size;
return this;
}
data=this.__data__=new MapCache(pairs);
}
data.set(key,value);
this.size=data.size;
return this;
}


Stack.prototype.clear=stackClear;
Stack.prototype['delete']=stackDelete;
Stack.prototype.get=stackGet;
Stack.prototype.has=stackHas;
Stack.prototype.set=stackSet;









function arrayLikeKeys(value,inherited){
var isArr=isArray(value),
isArg=!isArr&&isArguments(value),
isBuff=!isArr&&!isArg&&isBuffer(value),
isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),
skipIndexes=isArr||isArg||isBuff||isType,
result=skipIndexes?baseTimes(value.length,String):[],
length=result.length;

for(var key in value){
if((inherited||hasOwnProperty.call(value,key))&&
!(skipIndexes&&(

key=='length'||

isBuff&&(key=='offset'||key=='parent')||

isType&&(key=='buffer'||key=='byteLength'||key=='byteOffset')||

isIndex(key,length))))
{
result.push(key);
}
}
return result;
}









function assocIndexOf(array,key){
var length=array.length;
while(length--){
if(eq(array[length][0],key)){
return length;
}
}
return-1;
}












function baseGetAllKeys(object,keysFunc,symbolsFunc){
var result=keysFunc(object);
return isArray(object)?result:arrayPush(result,symbolsFunc(object));
}








function baseGetTag(value){
if(value==null){
return value===undefined?undefinedTag:nullTag;
}
return symToStringTag&&symToStringTag in Object(value)?
getRawTag(value):
objectToString(value);
}








function baseIsArguments(value){
return isObjectLike(value)&&baseGetTag(value)==argsTag;
}















function baseIsEqual(value,other,bitmask,customizer,stack){
if(value===other){
return true;
}
if(value==null||other==null||!isObjectLike(value)&&!isObjectLike(other)){
return value!==value&&other!==other;
}
return baseIsEqualDeep(value,other,bitmask,customizer,baseIsEqual,stack);
}















function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){
var objIsArr=isArray(object),
othIsArr=isArray(other),
objTag=objIsArr?arrayTag:getTag(object),
othTag=othIsArr?arrayTag:getTag(other);

objTag=objTag==argsTag?objectTag:objTag;
othTag=othTag==argsTag?objectTag:othTag;

var objIsObj=objTag==objectTag,
othIsObj=othTag==objectTag,
isSameTag=objTag==othTag;

if(isSameTag&&isBuffer(object)){
if(!isBuffer(other)){
return false;
}
objIsArr=true;
objIsObj=false;
}
if(isSameTag&&!objIsObj){
stack||(stack=new Stack());
return objIsArr||isTypedArray(object)?
equalArrays(object,other,bitmask,customizer,equalFunc,stack):
equalByTag(object,other,objTag,bitmask,customizer,equalFunc,stack);
}
if(!(bitmask&COMPARE_PARTIAL_FLAG)){
var objIsWrapped=objIsObj&&hasOwnProperty.call(object,'__wrapped__'),
othIsWrapped=othIsObj&&hasOwnProperty.call(other,'__wrapped__');

if(objIsWrapped||othIsWrapped){
var objUnwrapped=objIsWrapped?object.value():object,
othUnwrapped=othIsWrapped?other.value():other;

stack||(stack=new Stack());
return equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack);
}
}
if(!isSameTag){
return false;
}
stack||(stack=new Stack());
return equalObjects(object,other,bitmask,customizer,equalFunc,stack);
}









function baseIsNative(value){
if(!isObject(value)||isMasked(value)){
return false;
}
var pattern=isFunction(value)?reIsNative:reIsHostCtor;
return pattern.test(toSource(value));
}








function baseIsTypedArray(value){
return isObjectLike(value)&&
isLength(value.length)&&!!typedArrayTags[baseGetTag(value)];
}








function baseKeys(object){
if(!isPrototype(object)){
return nativeKeys(object);
}
var result=[];
for(var key in Object(object)){
if(hasOwnProperty.call(object,key)&&key!='constructor'){
result.push(key);
}
}
return result;
}














function equalArrays(array,other,bitmask,customizer,equalFunc,stack){
var isPartial=bitmask&COMPARE_PARTIAL_FLAG,
arrLength=array.length,
othLength=other.length;

if(arrLength!=othLength&&!(isPartial&&othLength>arrLength)){
return false;
}

var stacked=stack.get(array);
if(stacked&&stack.get(other)){
return stacked==other;
}
var index=-1,
result=true,
seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache():undefined;

stack.set(array,other);
stack.set(other,array);


while(++index<arrLength){
var arrValue=array[index],
othValue=other[index];

if(customizer){
var compared=isPartial?
customizer(othValue,arrValue,index,other,array,stack):
customizer(arrValue,othValue,index,array,other,stack);
}
if(compared!==undefined){
if(compared){
continue;
}
result=false;
break;
}

if(seen){
if(!arraySome(other,function(othValue,othIndex){
if(!cacheHas(seen,othIndex)&&(
arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){
return seen.push(othIndex);
}
})){
result=false;
break;
}
}else if(!(
arrValue===othValue||
equalFunc(arrValue,othValue,bitmask,customizer,stack)))
{
result=false;
break;
}
}
stack['delete'](array);
stack['delete'](other);
return result;
}


















function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){
switch(tag){
case dataViewTag:
if(object.byteLength!=other.byteLength||
object.byteOffset!=other.byteOffset){
return false;
}
object=object.buffer;
other=other.buffer;

case arrayBufferTag:
if(object.byteLength!=other.byteLength||
!equalFunc(new Uint8Array(object),new Uint8Array(other))){
return false;
}
return true;

case boolTag:
case dateTag:
case numberTag:


return eq(+object,+other);

case errorTag:
return object.name==other.name&&object.message==other.message;

case regexpTag:
case stringTag:



return object==other+'';

case mapTag:
var convert=mapToArray;

case setTag:
var isPartial=bitmask&COMPARE_PARTIAL_FLAG;
convert||(convert=setToArray);

if(object.size!=other.size&&!isPartial){
return false;
}

var stacked=stack.get(object);
if(stacked){
return stacked==other;
}
bitmask|=COMPARE_UNORDERED_FLAG;


stack.set(object,other);
var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);
stack['delete'](object);
return result;

case symbolTag:
if(symbolValueOf){
return symbolValueOf.call(object)==symbolValueOf.call(other);
}}

return false;
}














function equalObjects(object,other,bitmask,customizer,equalFunc,stack){
var isPartial=bitmask&COMPARE_PARTIAL_FLAG,
objProps=getAllKeys(object),
objLength=objProps.length,
othProps=getAllKeys(other),
othLength=othProps.length;

if(objLength!=othLength&&!isPartial){
return false;
}
var index=objLength;
while(index--){
var key=objProps[index];
if(!(isPartial?key in other:hasOwnProperty.call(other,key))){
return false;
}
}

var stacked=stack.get(object);
if(stacked&&stack.get(other)){
return stacked==other;
}
var result=true;
stack.set(object,other);
stack.set(other,object);

var skipCtor=isPartial;
while(++index<objLength){
key=objProps[index];
var objValue=object[key],
othValue=other[key];

if(customizer){
var compared=isPartial?
customizer(othValue,objValue,key,other,object,stack):
customizer(objValue,othValue,key,object,other,stack);
}

if(!(compared===undefined?
objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):
compared))
{
result=false;
break;
}
skipCtor||(skipCtor=key=='constructor');
}
if(result&&!skipCtor){
var objCtor=object.constructor,
othCtor=other.constructor;


if(objCtor!=othCtor&&
'constructor'in object&&'constructor'in other&&
!(typeof objCtor=='function'&&objCtor instanceof objCtor&&
typeof othCtor=='function'&&othCtor instanceof othCtor)){
result=false;
}
}
stack['delete'](object);
stack['delete'](other);
return result;
}








function getAllKeys(object){
return baseGetAllKeys(object,keys,getSymbols);
}









function getMapData(map,key){
var data=map.__data__;
return isKeyable(key)?
data[typeof key=='string'?'string':'hash']:
data.map;
}









function getNative(object,key){
var value=getValue(object,key);
return baseIsNative(value)?value:undefined;
}








function getRawTag(value){
var isOwn=hasOwnProperty.call(value,symToStringTag),
tag=value[symToStringTag];

try{
value[symToStringTag]=undefined;
var unmasked=true;
}catch(e){}

var result=nativeObjectToString.call(value);
if(unmasked){
if(isOwn){
value[symToStringTag]=tag;
}else{
delete value[symToStringTag];
}
}
return result;
}








var getSymbols=!nativeGetSymbols?stubArray:function(object){
if(object==null){
return[];
}
object=Object(object);
return arrayFilter(nativeGetSymbols(object),function(symbol){
return propertyIsEnumerable.call(object,symbol);
});
};








var getTag=baseGetTag;


if(DataView&&getTag(new DataView(new ArrayBuffer(1)))!=dataViewTag||
Map&&getTag(new Map())!=mapTag||
Promise&&getTag(Promise.resolve())!=promiseTag||
Set&&getTag(new Set())!=setTag||
WeakMap&&getTag(new WeakMap())!=weakMapTag){
getTag=function(value){
var result=baseGetTag(value),
Ctor=result==objectTag?value.constructor:undefined,
ctorString=Ctor?toSource(Ctor):'';

if(ctorString){
switch(ctorString){
case dataViewCtorString:return dataViewTag;
case mapCtorString:return mapTag;
case promiseCtorString:return promiseTag;
case setCtorString:return setTag;
case weakMapCtorString:return weakMapTag;}

}
return result;
};
}









function isIndex(value,length){
length=length==null?MAX_SAFE_INTEGER:length;
return!!length&&(
typeof value=='number'||reIsUint.test(value))&&
value>-1&&value%1==0&&value<length;
}








function isKeyable(value){
var type=typeof value;
return type=='string'||type=='number'||type=='symbol'||type=='boolean'?
value!=='__proto__':
value===null;
}








function isMasked(func){
return!!maskSrcKey&&maskSrcKey in func;
}








function isPrototype(value){
var Ctor=value&&value.constructor,
proto=typeof Ctor=='function'&&Ctor.prototype||objectProto;

return value===proto;
}








function objectToString(value){
return nativeObjectToString.call(value);
}








function toSource(func){
if(func!=null){
try{
return funcToString.call(func);
}catch(e){}
try{
return func+'';
}catch(e){}
}
return'';
}

































function eq(value,other){
return value===other||value!==value&&other!==other;
}



















var isArguments=baseIsArguments(function(){return arguments;}())?baseIsArguments:function(value){
return isObjectLike(value)&&hasOwnProperty.call(value,'callee')&&
!propertyIsEnumerable.call(value,'callee');
};
























var isArray=Array.isArray;


























function isArrayLike(value){
return value!=null&&isLength(value.length)&&!isFunction(value);
}


















var isBuffer=nativeIsBuffer||stubFalse;





























function isEqual(value,other){
return baseIsEqual(value,other);
}


















function isFunction(value){
if(!isObject(value)){
return false;
}


var tag=baseGetTag(value);
return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag;
}



























function isLength(value){
return typeof value=='number'&&
value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER;
}


























function isObject(value){
var type=typeof value;
return value!=null&&(type=='object'||type=='function');
}

























function isObjectLike(value){
return value!=null&&typeof value=='object';
}


















var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;





























function keys(object){
return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object);
}



















function stubArray(){
return[];
}














function stubFalse(){
return false;
}

module.exports=isEqual;

}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
},{}],143:[function(require,module,exports){



module.exports=function lookupClosestLocale(locale,available){
if(typeof locale==='string'&&available[locale])return locale;
var locales=[].concat(locale||[]);
for(var l=0,ll=locales.length;l<ll;++l){
var current=locales[l].split('-');
while(current.length){
var candidate=current.join('-');
if(available[candidate])return candidate;
current.pop();
}
}
};

},{}],144:[function(require,module,exports){
'use strict';

Object.defineProperty(exports,'__esModule',{value:true});


var perf=typeof performance!=='undefined'&&performance;

var now=perf&&perf.now?function(){return perf.now();}:function(){return Date.now();};

function throwIfEmpty(name){
if(!name){
throw new Error('name must be non-empty');
}
}


function insertSorted(arr,item){
var low=0;
var high=arr.length;
var mid;
while(low<high){
mid=low+high>>>1;
if(arr[mid].startTime<item.startTime){
low=mid+1;
}else{
high=mid;
}
}
arr.splice(low,0,item);
}

if(perf&&perf.mark){
exports.mark=function(name){
throwIfEmpty(name);
perf.mark("start "+name);
};
exports.stop=function(name){
throwIfEmpty(name);
perf.mark("end "+name);
perf.measure(name,"start "+name,"end "+name);
var entries=perf.getEntriesByName(name);
return entries[entries.length-1];
};
exports.getEntries=function(){return perf.getEntriesByType('measure');};
exports.clear=function(){
perf.clearMarks();
perf.clearMeasures();
};
}else{
var marks={};
var entries=[];
exports.mark=function(name){
throwIfEmpty(name);
var startTime=now();
marks['$'+name]=startTime;
};
exports.stop=function(name){
throwIfEmpty(name);
var endTime=now();
var startTime=marks['$'+name];
if(!startTime){
throw new Error("no known mark: "+name);
}
var entry={
startTime:startTime,
name:name,
duration:endTime-startTime,
entryType:'measure'};




insertSorted(entries,entry);
return entry;
};
exports.getEntries=function(){return entries;};
exports.clear=function(){entries=[];};
}

},{}],145:[function(require,module,exports){
exports.getRenderingDataFromViewport=function(viewportProperties,uaDeviceWidth,uaDeviceHeight,uaMaxZoom,uaMinZoom){

var vw=uaDeviceWidth/100;
var vh=uaDeviceHeight/100;



var maxZoom=null;
var minZoom=null;
var zoom=null;
var minWidth=null;
var minHeight=null;
var maxWidth=null;
var maxHeight=null;
var width=null,height=null;
var initialWidth=uaDeviceWidth;
var initialHeight=uaDeviceHeight;
var userZoom="zoom";

if(viewportProperties["maximum-scale"]!==undefined){
maxZoom=translateZoomProperty(viewportProperties["maximum-scale"]);
}
if(viewportProperties["minimum-scale"]!==undefined){
minZoom=translateZoomProperty(viewportProperties["minimum-scale"]);
}
if(viewportProperties["initial-scale"]!==undefined){
zoom=translateZoomProperty(viewportProperties["initial-scale"]);
}







if(minZoom!==null&&maxZoom===null){
minZoom=min(uaMaxZoom,translateZoomProperty(viewportProperties["minimum-scale"]));
}

if(viewportProperties["width"]!==undefined){
minWidth="extend-to-zoom";
maxWidth=translateLengthProperty(viewportProperties["width"],vw,vh);
}

if(viewportProperties["height"]!==undefined){
minHeight="extend-to-zoom";
maxHeight=translateLengthProperty(viewportProperties["height"],vw,vh);
}


if(viewportProperties["user-scalable"]!==undefined){
userZoom=viewportProperties["user-scalable"];
if(typeof userZoom==="number"){
if(userZoom>=1||userZoom<=-1){
userZoom="zoom";
}else{
userZoom="fixed";
}
}else{
switch(userZoom){
case"yes":
case"device-width":
case"device-height":
userZoom="zoom";
break;
case"no":
default:
userZoom="fixed";
break;}

}
}



if(zoom!==null&&(
viewportProperties["width"]===undefined||width===undefined)){
if(viewportProperties["height"]!==undefined){

minWidth=null;
maxWidth=null;
}else{

minWidth="extend-to-zoom";
maxWidth="extend-to-zoom";
}
}






if(minZoom!==null&&maxZoom!==null){
maxZoom=max(minZoom,maxZoom);
}


if(zoom!==null){
zoom=clamp(zoom,minZoom,maxZoom);
}


var extendZoom=zoom===null&&maxZoom===null?null:min(zoom,maxZoom);
var extendWidth,extendHeight;
if(extendZoom===null){
if(maxWidth==="extend-to-zoom"){
maxWidth=null;
}
if(maxHeight==="extend-to-zoom"){
maxHeight=null;
}
if(minWidth==="extend-to-zoom"){
minWidth=maxWidth;
}
if(minHeight==="extend-to-zoom"){
minHeight=maxHeight;
}
}else{
extendWidth=initialWidth/extendZoom;
extendHeight=initialHeight/extendZoom;

if(maxWidth==="extend-to-zoom"){
maxWidth=extendWidth;
}
if(maxHeight==="extend-to-zoom"){
maxHeight=extendHeight;
}
if(minWidth==="extend-to-zoom"){
minWidth=max(extendWidth,maxWidth);
}
if(minHeight==="extend-to-zoom"){
minHeight=max(extendHeight,maxHeight);
}
}


if(minWidth!==null||maxWidth!==null){
width=max(minWidth,min(maxWidth,initialWidth));
}
if(minHeight!==null||maxHeight!==null){
height=max(minHeight,min(maxHeight,initialHeight));
}


if(width===null){
if(height===null){
width=initialWidth;
}else{
if(initialHeight!==0){
width=Math.round(height*(initialWidth/initialHeight));
}else{
width=initialWidth;
}
}
}
if(height===null){
if(initialWidth!==0){
height=Math.round(width*(initialHeight/initialWidth));
}else{
height=initialHeight;
}
}

return{zoom:zoom,width:width,height:height,userZoom:userZoom};
};

function min(a,b){
if(a===null)return b;
if(b===null)return a;
return Math.min(a,b);
}

function max(a,b){
if(a===null)return b;
if(b===null)return a;
return Math.max(a,b);
}


function translateLengthProperty(prop,vw,vh){

if(typeof prop==="number"){
if(prop>=0){

return clamp(prop,1,10000);
}else{
return undefined;
}
}
if(prop==="device-width"){
return 100*vw;
}
if(prop==="device-height"){
return 100*vh;
}
return 1;
}

function translateZoomProperty(prop){

if(typeof prop==="number"){
if(prop>=0){

return clamp(prop,0.1,10);
}else{
return undefined;
}
}
if(prop==="yes"){
return 1;
}
if(prop==="device-width"||prop==="device-height"){
return 10;
}
if(prop==="no"||prop===null){
return 0.1;
}
}


function clamp(value,minv,maxv){
return max(min(value,maxv),minv);
}
































exports.parseMetaViewPortContent=function(S){
var parsedContent={
validProperties:{},
unknownProperties:{},
invalidValues:{}};

var i=1;
while(i<=S.length){
while(i<=S.length&&RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
i++;
}
if(i<=S.length){
i=parseProperty(parsedContent,S,i);
}
}
return parsedContent;
};

var propertyNames=["width","height","initial-scale","minimum-scale","maximum-scale","user-scalable","shrink-to-fit","viewport-fit"];

function parseProperty(parsedContent,S,i){
var start=i;
while(i<=S.length&&!RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
i++;
}
if(i>S.length||RegExp(',|;').test(S[i-1])){
return i;
}
var propertyName=S.slice(start-1,i-1);
while(i<=S.length&&!RegExp(',|;|=').test(S[i-1])){
i++;
}
if(i>S.length||RegExp(',|;').test(S[i-1])){
return i;
}
while(i<=S.length&&RegExp(' |\x0A|\x09|\0d|=').test(S[i-1])){
i++;
}
if(i>S.length||RegExp(',|;').test(S[i-1])){
return i;
}
start=i;
while(i<=S.length&&!RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
i++;
}
var propertyValue=S.slice(start-1,i-1);
setProperty(parsedContent,propertyName,propertyValue);
return i;
}

function setProperty(parsedContent,name,value){
if(propertyNames.indexOf(name)>=0){
var number=parseFloat(value);
if(!isNaN(number)){
parsedContent.validProperties[name]=number;
return;
}
var string=value.toLowerCase();

if(string==="yes"||string==="no"||string==="device-width"||string==="device-height"||


name.toLowerCase()==='viewport-fit'&&(string==='auto'||string==='cover')){

parsedContent.validProperties[name]=string;
return;
}

parsedContent.validProperties[name]=null;
parsedContent.invalidValues[name]=value;
}else{
parsedContent.unknownProperties[name]=value;
}
}

exports.expectedValues={
"width":["device-width","device-height","a positive number"],
"height":["device-width","device-height","a positive number"],
"initial-scale":["a positive number"],
"minimum-scale":["a positive number"],
"maximum-scale":["a positive number"],
"user-scalable":["yes","no","0","1"],
"shrink-to-fit":["yes","no"],
"viewport-fit":["auto","cover"]};


},{}],146:[function(require,module,exports){




var s=1000;
var m=s*60;
var h=m*60;
var d=h*24;
var y=d*365.25;















module.exports=function(val,options){
options=options||{};
var type=typeof val;
if(type==='string'&&val.length>0){
return parse(val);
}else if(type==='number'&&isNaN(val)===false){
return options.long?fmtLong(val):fmtShort(val);
}
throw new Error(
'val is not a non-empty string or a valid number. val='+
JSON.stringify(val));

};









function parse(str){
str=String(str);
if(str.length>100){
return;
}
var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
str);

if(!match){
return;
}
var n=parseFloat(match[1]);
var type=(match[2]||'ms').toLowerCase();
switch(type){
case'years':
case'year':
case'yrs':
case'yr':
case'y':
return n*y;
case'days':
case'day':
case'd':
return n*d;
case'hours':
case'hour':
case'hrs':
case'hr':
case'h':
return n*h;
case'minutes':
case'minute':
case'mins':
case'min':
case'm':
return n*m;
case'seconds':
case'second':
case'secs':
case'sec':
case's':
return n*s;
case'milliseconds':
case'millisecond':
case'msecs':
case'msec':
case'ms':
return n;
default:
return undefined;}

}









function fmtShort(ms){
if(ms>=d){
return Math.round(ms/d)+'d';
}
if(ms>=h){
return Math.round(ms/h)+'h';
}
if(ms>=m){
return Math.round(ms/m)+'m';
}
if(ms>=s){
return Math.round(ms/s)+'s';
}
return ms+'ms';
}









function fmtLong(ms){
return plural(ms,d,'day')||
plural(ms,h,'hour')||
plural(ms,m,'minute')||
plural(ms,s,'second')||
ms+' ms';
}





function plural(ms,n,name){
if(ms<n){
return;
}
if(ms<n*1.5){
return Math.floor(ms/n)+' '+name;
}
return Math.ceil(ms/n)+' '+name+'s';
}

},{}],147:[function(require,module,exports){
'use strict';


var TYPED_OK=typeof Uint8Array!=='undefined'&&
typeof Uint16Array!=='undefined'&&
typeof Int32Array!=='undefined';

function _has(obj,key){
return Object.prototype.hasOwnProperty.call(obj,key);
}

exports.assign=function(obj){
var sources=Array.prototype.slice.call(arguments,1);
while(sources.length){
var source=sources.shift();
if(!source){continue;}

if(typeof source!=='object'){
throw new TypeError(source+'must be non-object');
}

for(var p in source){
if(_has(source,p)){
obj[p]=source[p];
}
}
}

return obj;
};



exports.shrinkBuf=function(buf,size){
if(buf.length===size){return buf;}
if(buf.subarray){return buf.subarray(0,size);}
buf.length=size;
return buf;
};


var fnTyped={
arraySet:function(dest,src,src_offs,len,dest_offs){
if(src.subarray&&dest.subarray){
dest.set(src.subarray(src_offs,src_offs+len),dest_offs);
return;
}

for(var i=0;i<len;i++){
dest[dest_offs+i]=src[src_offs+i];
}
},

flattenChunks:function(chunks){
var i,l,len,pos,chunk,result;


len=0;
for(i=0,l=chunks.length;i<l;i++){
len+=chunks[i].length;
}


result=new Uint8Array(len);
pos=0;
for(i=0,l=chunks.length;i<l;i++){
chunk=chunks[i];
result.set(chunk,pos);
pos+=chunk.length;
}

return result;
}};


var fnUntyped={
arraySet:function(dest,src,src_offs,len,dest_offs){
for(var i=0;i<len;i++){
dest[dest_offs+i]=src[src_offs+i];
}
},

flattenChunks:function(chunks){
return[].concat.apply([],chunks);
}};





exports.setTyped=function(on){
if(on){
exports.Buf8=Uint8Array;
exports.Buf16=Uint16Array;
exports.Buf32=Int32Array;
exports.assign(exports,fnTyped);
}else{
exports.Buf8=Array;
exports.Buf16=Array;
exports.Buf32=Array;
exports.assign(exports,fnUntyped);
}
};

exports.setTyped(TYPED_OK);

},{}],148:[function(require,module,exports){
'use strict';
























function adler32(adler,buf,len,pos){
var s1=adler&0xffff|0,
s2=adler>>>16&0xffff|0,
n=0;

while(len!==0){



n=len>2000?2000:len;
len-=n;

do{
s1=s1+buf[pos++]|0;
s2=s2+s1|0;
}while(--n);

s1%=65521;
s2%=65521;
}

return s1|s2<<16|0;
}


module.exports=adler32;

},{}],149:[function(require,module,exports){
'use strict';




















module.exports={


Z_NO_FLUSH:0,
Z_PARTIAL_FLUSH:1,
Z_SYNC_FLUSH:2,
Z_FULL_FLUSH:3,
Z_FINISH:4,
Z_BLOCK:5,
Z_TREES:6,




Z_OK:0,
Z_STREAM_END:1,
Z_NEED_DICT:2,
Z_ERRNO:-1,
Z_STREAM_ERROR:-2,
Z_DATA_ERROR:-3,

Z_BUF_ERROR:-5,



Z_NO_COMPRESSION:0,
Z_BEST_SPEED:1,
Z_BEST_COMPRESSION:9,
Z_DEFAULT_COMPRESSION:-1,


Z_FILTERED:1,
Z_HUFFMAN_ONLY:2,
Z_RLE:3,
Z_FIXED:4,
Z_DEFAULT_STRATEGY:0,


Z_BINARY:0,
Z_TEXT:1,

Z_UNKNOWN:2,


Z_DEFLATED:8};



},{}],150:[function(require,module,exports){
'use strict';

























function makeTable(){
var c,table=[];

for(var n=0;n<256;n++){
c=n;
for(var k=0;k<8;k++){
c=c&1?0xEDB88320^c>>>1:c>>>1;
}
table[n]=c;
}

return table;
}


var crcTable=makeTable();


function crc32(crc,buf,len,pos){
var t=crcTable,
end=pos+len;

crc^=-1;

for(var i=pos;i<end;i++){
crc=crc>>>8^t[(crc^buf[i])&0xFF];
}

return crc^-1;
}


module.exports=crc32;

},{}],151:[function(require,module,exports){
'use strict';




















var utils=require('../utils/common');
var trees=require('./trees');
var adler32=require('./adler32');
var crc32=require('./crc32');
var msg=require('./messages');






var Z_NO_FLUSH=0;
var Z_PARTIAL_FLUSH=1;

var Z_FULL_FLUSH=3;
var Z_FINISH=4;
var Z_BLOCK=5;






var Z_OK=0;
var Z_STREAM_END=1;


var Z_STREAM_ERROR=-2;
var Z_DATA_ERROR=-3;

var Z_BUF_ERROR=-5;







var Z_DEFAULT_COMPRESSION=-1;


var Z_FILTERED=1;
var Z_HUFFMAN_ONLY=2;
var Z_RLE=3;
var Z_FIXED=4;
var Z_DEFAULT_STRATEGY=0;





var Z_UNKNOWN=2;



var Z_DEFLATED=8;




var MAX_MEM_LEVEL=9;

var MAX_WBITS=15;

var DEF_MEM_LEVEL=8;


var LENGTH_CODES=29;

var LITERALS=256;

var L_CODES=LITERALS+1+LENGTH_CODES;

var D_CODES=30;

var BL_CODES=19;

var HEAP_SIZE=2*L_CODES+1;

var MAX_BITS=15;


var MIN_MATCH=3;
var MAX_MATCH=258;
var MIN_LOOKAHEAD=MAX_MATCH+MIN_MATCH+1;

var PRESET_DICT=0x20;

var INIT_STATE=42;
var EXTRA_STATE=69;
var NAME_STATE=73;
var COMMENT_STATE=91;
var HCRC_STATE=103;
var BUSY_STATE=113;
var FINISH_STATE=666;

var BS_NEED_MORE=1;
var BS_BLOCK_DONE=2;
var BS_FINISH_STARTED=3;
var BS_FINISH_DONE=4;

var OS_CODE=0x03;

function err(strm,errorCode){
strm.msg=msg[errorCode];
return errorCode;
}

function rank(f){
return(f<<1)-(f>4?9:0);
}

function zero(buf){var len=buf.length;while(--len>=0){buf[len]=0;}}








function flush_pending(strm){
var s=strm.state;


var len=s.pending;
if(len>strm.avail_out){
len=strm.avail_out;
}
if(len===0){return;}

utils.arraySet(strm.output,s.pending_buf,s.pending_out,len,strm.next_out);
strm.next_out+=len;
s.pending_out+=len;
strm.total_out+=len;
strm.avail_out-=len;
s.pending-=len;
if(s.pending===0){
s.pending_out=0;
}
}


function flush_block_only(s,last){
trees._tr_flush_block(s,s.block_start>=0?s.block_start:-1,s.strstart-s.block_start,last);
s.block_start=s.strstart;
flush_pending(s.strm);
}


function put_byte(s,b){
s.pending_buf[s.pending++]=b;
}







function putShortMSB(s,b){


s.pending_buf[s.pending++]=b>>>8&0xff;
s.pending_buf[s.pending++]=b&0xff;
}









function read_buf(strm,buf,start,size){
var len=strm.avail_in;

if(len>size){len=size;}
if(len===0){return 0;}

strm.avail_in-=len;


utils.arraySet(buf,strm.input,strm.next_in,len,start);
if(strm.state.wrap===1){
strm.adler=adler32(strm.adler,buf,len,start);
}else

if(strm.state.wrap===2){
strm.adler=crc32(strm.adler,buf,len,start);
}

strm.next_in+=len;
strm.total_in+=len;

return len;
}











function longest_match(s,cur_match){
var chain_length=s.max_chain_length;
var scan=s.strstart;
var match;
var len;
var best_len=s.prev_length;
var nice_match=s.nice_match;
var limit=s.strstart>s.w_size-MIN_LOOKAHEAD?
s.strstart-(s.w_size-MIN_LOOKAHEAD):0;

var _win=s.window;

var wmask=s.w_mask;
var prev=s.prev;





var strend=s.strstart+MAX_MATCH;
var scan_end1=_win[scan+best_len-1];
var scan_end=_win[scan+best_len];







if(s.prev_length>=s.good_match){
chain_length>>=2;
}



if(nice_match>s.lookahead){nice_match=s.lookahead;}



do{

match=cur_match;










if(_win[match+best_len]!==scan_end||
_win[match+best_len-1]!==scan_end1||
_win[match]!==_win[scan]||
_win[++match]!==_win[scan+1]){
continue;
}







scan+=2;
match++;





do{

}while(_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
scan<strend);



len=MAX_MATCH-(strend-scan);
scan=strend-MAX_MATCH;

if(len>best_len){
s.match_start=cur_match;
best_len=len;
if(len>=nice_match){
break;
}
scan_end1=_win[scan+best_len-1];
scan_end=_win[scan+best_len];
}
}while((cur_match=prev[cur_match&wmask])>limit&&--chain_length!==0);

if(best_len<=s.lookahead){
return best_len;
}
return s.lookahead;
}












function fill_window(s){
var _w_size=s.w_size;
var p,n,m,more,str;



do{
more=s.window_size-s.lookahead-s.strstart;



















if(s.strstart>=_w_size+(_w_size-MIN_LOOKAHEAD)){

utils.arraySet(s.window,s.window,_w_size,_w_size,0);
s.match_start-=_w_size;
s.strstart-=_w_size;

s.block_start-=_w_size;








n=s.hash_size;
p=n;
do{
m=s.head[--p];
s.head[p]=m>=_w_size?m-_w_size:0;
}while(--n);

n=_w_size;
p=n;
do{
m=s.prev[--p];
s.prev[p]=m>=_w_size?m-_w_size:0;



}while(--n);

more+=_w_size;
}
if(s.strm.avail_in===0){
break;
}













n=read_buf(s.strm,s.window,s.strstart+s.lookahead,more);
s.lookahead+=n;


if(s.lookahead+s.insert>=MIN_MATCH){
str=s.strstart-s.insert;
s.ins_h=s.window[str];


s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+1])&s.hash_mask;



while(s.insert){

s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+MIN_MATCH-1])&s.hash_mask;

s.prev[str&s.w_mask]=s.head[s.ins_h];
s.head[s.ins_h]=str;
str++;
s.insert--;
if(s.lookahead+s.insert<MIN_MATCH){
break;
}
}
}




}while(s.lookahead<MIN_LOOKAHEAD&&s.strm.avail_in!==0);





































}










function deflate_stored(s,flush){



var max_block_size=0xffff;

if(max_block_size>s.pending_buf_size-5){
max_block_size=s.pending_buf_size-5;
}


for(;;){

if(s.lookahead<=1){








fill_window(s);
if(s.lookahead===0&&flush===Z_NO_FLUSH){
return BS_NEED_MORE;
}

if(s.lookahead===0){
break;
}

}



s.strstart+=s.lookahead;
s.lookahead=0;


var max_start=s.block_start+max_block_size;

if(s.strstart===0||s.strstart>=max_start){

s.lookahead=s.strstart-max_start;
s.strstart=max_start;

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}



}



if(s.strstart-s.block_start>=s.w_size-MIN_LOOKAHEAD){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}
}

s.insert=0;

if(flush===Z_FINISH){

flush_block_only(s,true);
if(s.strm.avail_out===0){
return BS_FINISH_STARTED;
}

return BS_FINISH_DONE;
}

if(s.strstart>s.block_start){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}

return BS_NEED_MORE;
}








function deflate_fast(s,flush){
var hash_head;
var bflush;

for(;;){





if(s.lookahead<MIN_LOOKAHEAD){
fill_window(s);
if(s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH){
return BS_NEED_MORE;
}
if(s.lookahead===0){
break;
}
}




hash_head=0;
if(s.lookahead>=MIN_MATCH){

s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
s.head[s.ins_h]=s.strstart;

}




if(hash_head!==0&&s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD){




s.match_length=longest_match(s,hash_head);

}
if(s.match_length>=MIN_MATCH){




bflush=trees._tr_tally(s,s.strstart-s.match_start,s.match_length-MIN_MATCH);

s.lookahead-=s.match_length;




if(s.match_length<=s.max_lazy_match&&s.lookahead>=MIN_MATCH){
s.match_length--;
do{
s.strstart++;

s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
s.head[s.ins_h]=s.strstart;




}while(--s.match_length!==0);
s.strstart++;
}else
{
s.strstart+=s.match_length;
s.match_length=0;
s.ins_h=s.window[s.strstart];

s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+1])&s.hash_mask;







}
}else{



bflush=trees._tr_tally(s,0,s.window[s.strstart]);

s.lookahead--;
s.strstart++;
}
if(bflush){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}
}
s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1;
if(flush===Z_FINISH){

flush_block_only(s,true);
if(s.strm.avail_out===0){
return BS_FINISH_STARTED;
}

return BS_FINISH_DONE;
}
if(s.last_lit){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}
return BS_BLOCK_DONE;
}






function deflate_slow(s,flush){
var hash_head;
var bflush;

var max_insert;


for(;;){





if(s.lookahead<MIN_LOOKAHEAD){
fill_window(s);
if(s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH){
return BS_NEED_MORE;
}
if(s.lookahead===0){break;}
}




hash_head=0;
if(s.lookahead>=MIN_MATCH){

s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
s.head[s.ins_h]=s.strstart;

}



s.prev_length=s.match_length;
s.prev_match=s.match_start;
s.match_length=MIN_MATCH-1;

if(hash_head!==0&&s.prev_length<s.max_lazy_match&&
s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD){




s.match_length=longest_match(s,hash_head);


if(s.match_length<=5&&(
s.strategy===Z_FILTERED||s.match_length===MIN_MATCH&&s.strstart-s.match_start>4096)){




s.match_length=MIN_MATCH-1;
}
}



if(s.prev_length>=MIN_MATCH&&s.match_length<=s.prev_length){
max_insert=s.strstart+s.lookahead-MIN_MATCH;






bflush=trees._tr_tally(s,s.strstart-1-s.prev_match,s.prev_length-MIN_MATCH);





s.lookahead-=s.prev_length-1;
s.prev_length-=2;
do{
if(++s.strstart<=max_insert){

s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
s.head[s.ins_h]=s.strstart;

}
}while(--s.prev_length!==0);
s.match_available=0;
s.match_length=MIN_MATCH-1;
s.strstart++;

if(bflush){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}

}else if(s.match_available){






bflush=trees._tr_tally(s,0,s.window[s.strstart-1]);

if(bflush){

flush_block_only(s,false);

}
s.strstart++;
s.lookahead--;
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}
}else{



s.match_available=1;
s.strstart++;
s.lookahead--;
}
}

if(s.match_available){


bflush=trees._tr_tally(s,0,s.window[s.strstart-1]);

s.match_available=0;
}
s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1;
if(flush===Z_FINISH){

flush_block_only(s,true);
if(s.strm.avail_out===0){
return BS_FINISH_STARTED;
}

return BS_FINISH_DONE;
}
if(s.last_lit){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}

return BS_BLOCK_DONE;
}







function deflate_rle(s,flush){
var bflush;
var prev;
var scan,strend;

var _win=s.window;

for(;;){




if(s.lookahead<=MAX_MATCH){
fill_window(s);
if(s.lookahead<=MAX_MATCH&&flush===Z_NO_FLUSH){
return BS_NEED_MORE;
}
if(s.lookahead===0){break;}
}


s.match_length=0;
if(s.lookahead>=MIN_MATCH&&s.strstart>0){
scan=s.strstart-1;
prev=_win[scan];
if(prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]){
strend=s.strstart+MAX_MATCH;
do{

}while(prev===_win[++scan]&&prev===_win[++scan]&&
prev===_win[++scan]&&prev===_win[++scan]&&
prev===_win[++scan]&&prev===_win[++scan]&&
prev===_win[++scan]&&prev===_win[++scan]&&
scan<strend);
s.match_length=MAX_MATCH-(strend-scan);
if(s.match_length>s.lookahead){
s.match_length=s.lookahead;
}
}

}


if(s.match_length>=MIN_MATCH){



bflush=trees._tr_tally(s,1,s.match_length-MIN_MATCH);

s.lookahead-=s.match_length;
s.strstart+=s.match_length;
s.match_length=0;
}else{



bflush=trees._tr_tally(s,0,s.window[s.strstart]);

s.lookahead--;
s.strstart++;
}
if(bflush){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}
}
s.insert=0;
if(flush===Z_FINISH){

flush_block_only(s,true);
if(s.strm.avail_out===0){
return BS_FINISH_STARTED;
}

return BS_FINISH_DONE;
}
if(s.last_lit){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}
return BS_BLOCK_DONE;
}





function deflate_huff(s,flush){
var bflush;

for(;;){

if(s.lookahead===0){
fill_window(s);
if(s.lookahead===0){
if(flush===Z_NO_FLUSH){
return BS_NEED_MORE;
}
break;
}
}


s.match_length=0;


bflush=trees._tr_tally(s,0,s.window[s.strstart]);
s.lookahead--;
s.strstart++;
if(bflush){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}
}
s.insert=0;
if(flush===Z_FINISH){

flush_block_only(s,true);
if(s.strm.avail_out===0){
return BS_FINISH_STARTED;
}

return BS_FINISH_DONE;
}
if(s.last_lit){

flush_block_only(s,false);
if(s.strm.avail_out===0){
return BS_NEED_MORE;
}

}
return BS_BLOCK_DONE;
}






function Config(good_length,max_lazy,nice_length,max_chain,func){
this.good_length=good_length;
this.max_lazy=max_lazy;
this.nice_length=nice_length;
this.max_chain=max_chain;
this.func=func;
}

var configuration_table;

configuration_table=[

new Config(0,0,0,0,deflate_stored),
new Config(4,4,8,4,deflate_fast),
new Config(4,5,16,8,deflate_fast),
new Config(4,6,32,32,deflate_fast),

new Config(4,4,16,16,deflate_slow),
new Config(8,16,32,32,deflate_slow),
new Config(8,16,128,128,deflate_slow),
new Config(8,32,128,256,deflate_slow),
new Config(32,128,258,1024,deflate_slow),
new Config(32,258,258,4096,deflate_slow)];






function lm_init(s){
s.window_size=2*s.w_size;


zero(s.head);



s.max_lazy_match=configuration_table[s.level].max_lazy;
s.good_match=configuration_table[s.level].good_length;
s.nice_match=configuration_table[s.level].nice_length;
s.max_chain_length=configuration_table[s.level].max_chain;

s.strstart=0;
s.block_start=0;
s.lookahead=0;
s.insert=0;
s.match_length=s.prev_length=MIN_MATCH-1;
s.match_available=0;
s.ins_h=0;
}


function DeflateState(){
this.strm=null;
this.status=0;
this.pending_buf=null;
this.pending_buf_size=0;
this.pending_out=0;
this.pending=0;
this.wrap=0;
this.gzhead=null;
this.gzindex=0;
this.method=Z_DEFLATED;
this.last_flush=-1;

this.w_size=0;
this.w_bits=0;
this.w_mask=0;

this.window=null;







this.window_size=0;




this.prev=null;





this.head=null;

this.ins_h=0;
this.hash_size=0;
this.hash_bits=0;
this.hash_mask=0;

this.hash_shift=0;






this.block_start=0;




this.match_length=0;
this.prev_match=0;
this.match_available=0;
this.strstart=0;
this.match_start=0;
this.lookahead=0;

this.prev_length=0;




this.max_chain_length=0;





this.max_lazy_match=0;











this.level=0;
this.strategy=0;

this.good_match=0;


this.nice_match=0;











this.dyn_ltree=new utils.Buf16(HEAP_SIZE*2);
this.dyn_dtree=new utils.Buf16((2*D_CODES+1)*2);
this.bl_tree=new utils.Buf16((2*BL_CODES+1)*2);
zero(this.dyn_ltree);
zero(this.dyn_dtree);
zero(this.bl_tree);

this.l_desc=null;
this.d_desc=null;
this.bl_desc=null;


this.bl_count=new utils.Buf16(MAX_BITS+1);



this.heap=new utils.Buf16(2*L_CODES+1);
zero(this.heap);

this.heap_len=0;
this.heap_max=0;




this.depth=new utils.Buf16(2*L_CODES+1);
zero(this.depth);



this.l_buf=0;

this.lit_bufsize=0;



















this.last_lit=0;

this.d_buf=0;





this.opt_len=0;
this.static_len=0;
this.matches=0;
this.insert=0;


this.bi_buf=0;



this.bi_valid=0;












}


function deflateResetKeep(strm){
var s;

if(!strm||!strm.state){
return err(strm,Z_STREAM_ERROR);
}

strm.total_in=strm.total_out=0;
strm.data_type=Z_UNKNOWN;

s=strm.state;
s.pending=0;
s.pending_out=0;

if(s.wrap<0){
s.wrap=-s.wrap;

}
s.status=s.wrap?INIT_STATE:BUSY_STATE;
strm.adler=s.wrap===2?
0:

1;
s.last_flush=Z_NO_FLUSH;
trees._tr_init(s);
return Z_OK;
}


function deflateReset(strm){
var ret=deflateResetKeep(strm);
if(ret===Z_OK){
lm_init(strm.state);
}
return ret;
}


function deflateSetHeader(strm,head){
if(!strm||!strm.state){return Z_STREAM_ERROR;}
if(strm.state.wrap!==2){return Z_STREAM_ERROR;}
strm.state.gzhead=head;
return Z_OK;
}


function deflateInit2(strm,level,method,windowBits,memLevel,strategy){
if(!strm){
return Z_STREAM_ERROR;
}
var wrap=1;

if(level===Z_DEFAULT_COMPRESSION){
level=6;
}

if(windowBits<0){
wrap=0;
windowBits=-windowBits;
}else

if(windowBits>15){
wrap=2;
windowBits-=16;
}


if(memLevel<1||memLevel>MAX_MEM_LEVEL||method!==Z_DEFLATED||
windowBits<8||windowBits>15||level<0||level>9||
strategy<0||strategy>Z_FIXED){
return err(strm,Z_STREAM_ERROR);
}


if(windowBits===8){
windowBits=9;
}


var s=new DeflateState();

strm.state=s;
s.strm=strm;

s.wrap=wrap;
s.gzhead=null;
s.w_bits=windowBits;
s.w_size=1<<s.w_bits;
s.w_mask=s.w_size-1;

s.hash_bits=memLevel+7;
s.hash_size=1<<s.hash_bits;
s.hash_mask=s.hash_size-1;
s.hash_shift=~~((s.hash_bits+MIN_MATCH-1)/MIN_MATCH);

s.window=new utils.Buf8(s.w_size*2);
s.head=new utils.Buf16(s.hash_size);
s.prev=new utils.Buf16(s.w_size);




s.lit_bufsize=1<<memLevel+6;

s.pending_buf_size=s.lit_bufsize*4;



s.pending_buf=new utils.Buf8(s.pending_buf_size);



s.d_buf=1*s.lit_bufsize;


s.l_buf=(1+2)*s.lit_bufsize;

s.level=level;
s.strategy=strategy;
s.method=method;

return deflateReset(strm);
}

function deflateInit(strm,level){
return deflateInit2(strm,level,Z_DEFLATED,MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY);
}


function deflate(strm,flush){
var old_flush,s;
var beg,val;

if(!strm||!strm.state||
flush>Z_BLOCK||flush<0){
return strm?err(strm,Z_STREAM_ERROR):Z_STREAM_ERROR;
}

s=strm.state;

if(!strm.output||
!strm.input&&strm.avail_in!==0||
s.status===FINISH_STATE&&flush!==Z_FINISH){
return err(strm,strm.avail_out===0?Z_BUF_ERROR:Z_STREAM_ERROR);
}

s.strm=strm;
old_flush=s.last_flush;
s.last_flush=flush;


if(s.status===INIT_STATE){

if(s.wrap===2){
strm.adler=0;
put_byte(s,31);
put_byte(s,139);
put_byte(s,8);
if(!s.gzhead){
put_byte(s,0);
put_byte(s,0);
put_byte(s,0);
put_byte(s,0);
put_byte(s,0);
put_byte(s,s.level===9?2:
s.strategy>=Z_HUFFMAN_ONLY||s.level<2?
4:0);
put_byte(s,OS_CODE);
s.status=BUSY_STATE;
}else
{
put_byte(s,(s.gzhead.text?1:0)+(
s.gzhead.hcrc?2:0)+(
!s.gzhead.extra?0:4)+(
!s.gzhead.name?0:8)+(
!s.gzhead.comment?0:16));

put_byte(s,s.gzhead.time&0xff);
put_byte(s,s.gzhead.time>>8&0xff);
put_byte(s,s.gzhead.time>>16&0xff);
put_byte(s,s.gzhead.time>>24&0xff);
put_byte(s,s.level===9?2:
s.strategy>=Z_HUFFMAN_ONLY||s.level<2?
4:0);
put_byte(s,s.gzhead.os&0xff);
if(s.gzhead.extra&&s.gzhead.extra.length){
put_byte(s,s.gzhead.extra.length&0xff);
put_byte(s,s.gzhead.extra.length>>8&0xff);
}
if(s.gzhead.hcrc){
strm.adler=crc32(strm.adler,s.pending_buf,s.pending,0);
}
s.gzindex=0;
s.status=EXTRA_STATE;
}
}else

{
var header=Z_DEFLATED+(s.w_bits-8<<4)<<8;
var level_flags=-1;

if(s.strategy>=Z_HUFFMAN_ONLY||s.level<2){
level_flags=0;
}else if(s.level<6){
level_flags=1;
}else if(s.level===6){
level_flags=2;
}else{
level_flags=3;
}
header|=level_flags<<6;
if(s.strstart!==0){header|=PRESET_DICT;}
header+=31-header%31;

s.status=BUSY_STATE;
putShortMSB(s,header);


if(s.strstart!==0){
putShortMSB(s,strm.adler>>>16);
putShortMSB(s,strm.adler&0xffff);
}
strm.adler=1;
}
}


if(s.status===EXTRA_STATE){
if(s.gzhead.extra){
beg=s.pending;

while(s.gzindex<(s.gzhead.extra.length&0xffff)){
if(s.pending===s.pending_buf_size){
if(s.gzhead.hcrc&&s.pending>beg){
strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
}
flush_pending(strm);
beg=s.pending;
if(s.pending===s.pending_buf_size){
break;
}
}
put_byte(s,s.gzhead.extra[s.gzindex]&0xff);
s.gzindex++;
}
if(s.gzhead.hcrc&&s.pending>beg){
strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
}
if(s.gzindex===s.gzhead.extra.length){
s.gzindex=0;
s.status=NAME_STATE;
}
}else
{
s.status=NAME_STATE;
}
}
if(s.status===NAME_STATE){
if(s.gzhead.name){
beg=s.pending;


do{
if(s.pending===s.pending_buf_size){
if(s.gzhead.hcrc&&s.pending>beg){
strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
}
flush_pending(strm);
beg=s.pending;
if(s.pending===s.pending_buf_size){
val=1;
break;
}
}

if(s.gzindex<s.gzhead.name.length){
val=s.gzhead.name.charCodeAt(s.gzindex++)&0xff;
}else{
val=0;
}
put_byte(s,val);
}while(val!==0);

if(s.gzhead.hcrc&&s.pending>beg){
strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
}
if(val===0){
s.gzindex=0;
s.status=COMMENT_STATE;
}
}else
{
s.status=COMMENT_STATE;
}
}
if(s.status===COMMENT_STATE){
if(s.gzhead.comment){
beg=s.pending;


do{
if(s.pending===s.pending_buf_size){
if(s.gzhead.hcrc&&s.pending>beg){
strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
}
flush_pending(strm);
beg=s.pending;
if(s.pending===s.pending_buf_size){
val=1;
break;
}
}

if(s.gzindex<s.gzhead.comment.length){
val=s.gzhead.comment.charCodeAt(s.gzindex++)&0xff;
}else{
val=0;
}
put_byte(s,val);
}while(val!==0);

if(s.gzhead.hcrc&&s.pending>beg){
strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
}
if(val===0){
s.status=HCRC_STATE;
}
}else
{
s.status=HCRC_STATE;
}
}
if(s.status===HCRC_STATE){
if(s.gzhead.hcrc){
if(s.pending+2>s.pending_buf_size){
flush_pending(strm);
}
if(s.pending+2<=s.pending_buf_size){
put_byte(s,strm.adler&0xff);
put_byte(s,strm.adler>>8&0xff);
strm.adler=0;
s.status=BUSY_STATE;
}
}else
{
s.status=BUSY_STATE;
}
}



if(s.pending!==0){
flush_pending(strm);
if(strm.avail_out===0){






s.last_flush=-1;
return Z_OK;
}





}else if(strm.avail_in===0&&rank(flush)<=rank(old_flush)&&
flush!==Z_FINISH){
return err(strm,Z_BUF_ERROR);
}


if(s.status===FINISH_STATE&&strm.avail_in!==0){
return err(strm,Z_BUF_ERROR);
}



if(strm.avail_in!==0||s.lookahead!==0||
flush!==Z_NO_FLUSH&&s.status!==FINISH_STATE){
var bstate=s.strategy===Z_HUFFMAN_ONLY?deflate_huff(s,flush):
s.strategy===Z_RLE?deflate_rle(s,flush):
configuration_table[s.level].func(s,flush);

if(bstate===BS_FINISH_STARTED||bstate===BS_FINISH_DONE){
s.status=FINISH_STATE;
}
if(bstate===BS_NEED_MORE||bstate===BS_FINISH_STARTED){
if(strm.avail_out===0){
s.last_flush=-1;

}
return Z_OK;







}
if(bstate===BS_BLOCK_DONE){
if(flush===Z_PARTIAL_FLUSH){
trees._tr_align(s);
}else
if(flush!==Z_BLOCK){

trees._tr_stored_block(s,0,0,false);



if(flush===Z_FULL_FLUSH){

zero(s.head);

if(s.lookahead===0){
s.strstart=0;
s.block_start=0;
s.insert=0;
}
}
}
flush_pending(strm);
if(strm.avail_out===0){
s.last_flush=-1;
return Z_OK;
}
}
}



if(flush!==Z_FINISH){return Z_OK;}
if(s.wrap<=0){return Z_STREAM_END;}


if(s.wrap===2){
put_byte(s,strm.adler&0xff);
put_byte(s,strm.adler>>8&0xff);
put_byte(s,strm.adler>>16&0xff);
put_byte(s,strm.adler>>24&0xff);
put_byte(s,strm.total_in&0xff);
put_byte(s,strm.total_in>>8&0xff);
put_byte(s,strm.total_in>>16&0xff);
put_byte(s,strm.total_in>>24&0xff);
}else

{
putShortMSB(s,strm.adler>>>16);
putShortMSB(s,strm.adler&0xffff);
}

flush_pending(strm);



if(s.wrap>0){s.wrap=-s.wrap;}

return s.pending!==0?Z_OK:Z_STREAM_END;
}

function deflateEnd(strm){
var status;

if(!strm||!strm.state){
return Z_STREAM_ERROR;
}

status=strm.state.status;
if(status!==INIT_STATE&&
status!==EXTRA_STATE&&
status!==NAME_STATE&&
status!==COMMENT_STATE&&
status!==HCRC_STATE&&
status!==BUSY_STATE&&
status!==FINISH_STATE)
{
return err(strm,Z_STREAM_ERROR);
}

strm.state=null;

return status===BUSY_STATE?err(strm,Z_DATA_ERROR):Z_OK;
}






function deflateSetDictionary(strm,dictionary){
var dictLength=dictionary.length;

var s;
var str,n;
var wrap;
var avail;
var next;
var input;
var tmpDict;

if(!strm||!strm.state){
return Z_STREAM_ERROR;
}

s=strm.state;
wrap=s.wrap;

if(wrap===2||wrap===1&&s.status!==INIT_STATE||s.lookahead){
return Z_STREAM_ERROR;
}


if(wrap===1){

strm.adler=adler32(strm.adler,dictionary,dictLength,0);
}

s.wrap=0;


if(dictLength>=s.w_size){
if(wrap===0){

zero(s.head);
s.strstart=0;
s.block_start=0;
s.insert=0;
}


tmpDict=new utils.Buf8(s.w_size);
utils.arraySet(tmpDict,dictionary,dictLength-s.w_size,s.w_size,0);
dictionary=tmpDict;
dictLength=s.w_size;
}

avail=strm.avail_in;
next=strm.next_in;
input=strm.input;
strm.avail_in=dictLength;
strm.next_in=0;
strm.input=dictionary;
fill_window(s);
while(s.lookahead>=MIN_MATCH){
str=s.strstart;
n=s.lookahead-(MIN_MATCH-1);
do{

s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+MIN_MATCH-1])&s.hash_mask;

s.prev[str&s.w_mask]=s.head[s.ins_h];

s.head[s.ins_h]=str;
str++;
}while(--n);
s.strstart=str;
s.lookahead=MIN_MATCH-1;
fill_window(s);
}
s.strstart+=s.lookahead;
s.block_start=s.strstart;
s.insert=s.lookahead;
s.lookahead=0;
s.match_length=s.prev_length=MIN_MATCH-1;
s.match_available=0;
strm.next_in=next;
strm.input=input;
strm.avail_in=avail;
s.wrap=wrap;
return Z_OK;
}


exports.deflateInit=deflateInit;
exports.deflateInit2=deflateInit2;
exports.deflateReset=deflateReset;
exports.deflateResetKeep=deflateResetKeep;
exports.deflateSetHeader=deflateSetHeader;
exports.deflate=deflate;
exports.deflateEnd=deflateEnd;
exports.deflateSetDictionary=deflateSetDictionary;
exports.deflateInfo='pako deflate (from Nodeca project)';










},{"../utils/common":147,"./adler32":148,"./crc32":150,"./messages":152,"./trees":153}],152:[function(require,module,exports){
'use strict';




















module.exports={
2:'need dictionary',
1:'stream end',
0:'',
'-1':'file error',
'-2':'stream error',
'-3':'data error',
'-4':'insufficient memory',
'-5':'buffer error',
'-6':'incompatible version'};


},{}],153:[function(require,module,exports){
'use strict';






















var utils=require('../utils/common');








var Z_FIXED=4;



var Z_BINARY=0;
var Z_TEXT=1;

var Z_UNKNOWN=2;




function zero(buf){var len=buf.length;while(--len>=0){buf[len]=0;}}



var STORED_BLOCK=0;
var STATIC_TREES=1;
var DYN_TREES=2;


var MIN_MATCH=3;
var MAX_MATCH=258;







var LENGTH_CODES=29;


var LITERALS=256;


var L_CODES=LITERALS+1+LENGTH_CODES;


var D_CODES=30;


var BL_CODES=19;


var HEAP_SIZE=2*L_CODES+1;


var MAX_BITS=15;


var Buf_size=16;







var MAX_BL_BITS=7;


var END_BLOCK=256;


var REP_3_6=16;


var REPZ_3_10=17;


var REPZ_11_138=18;



var extra_lbits=
[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];

var extra_dbits=
[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];

var extra_blbits=
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];

var bl_order=
[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];












var DIST_CODE_LEN=512;


var static_ltree=new Array((L_CODES+2)*2);
zero(static_ltree);






var static_dtree=new Array(D_CODES*2);
zero(static_dtree);




var _dist_code=new Array(DIST_CODE_LEN);
zero(_dist_code);





var _length_code=new Array(MAX_MATCH-MIN_MATCH+1);
zero(_length_code);


var base_length=new Array(LENGTH_CODES);
zero(base_length);


var base_dist=new Array(D_CODES);
zero(base_dist);



function StaticTreeDesc(static_tree,extra_bits,extra_base,elems,max_length){

this.static_tree=static_tree;
this.extra_bits=extra_bits;
this.extra_base=extra_base;
this.elems=elems;
this.max_length=max_length;


this.has_stree=static_tree&&static_tree.length;
}


var static_l_desc;
var static_d_desc;
var static_bl_desc;


function TreeDesc(dyn_tree,stat_desc){
this.dyn_tree=dyn_tree;
this.max_code=0;
this.stat_desc=stat_desc;
}



function d_code(dist){
return dist<256?_dist_code[dist]:_dist_code[256+(dist>>>7)];
}






function put_short(s,w){


s.pending_buf[s.pending++]=w&0xff;
s.pending_buf[s.pending++]=w>>>8&0xff;
}






function send_bits(s,value,length){
if(s.bi_valid>Buf_size-length){
s.bi_buf|=value<<s.bi_valid&0xffff;
put_short(s,s.bi_buf);
s.bi_buf=value>>Buf_size-s.bi_valid;
s.bi_valid+=length-Buf_size;
}else{
s.bi_buf|=value<<s.bi_valid&0xffff;
s.bi_valid+=length;
}
}


function send_code(s,c,tree){
send_bits(s,tree[c*2],tree[c*2+1]);
}







function bi_reverse(code,len){
var res=0;
do{
res|=code&1;
code>>>=1;
res<<=1;
}while(--len>0);
return res>>>1;
}





function bi_flush(s){
if(s.bi_valid===16){
put_short(s,s.bi_buf);
s.bi_buf=0;
s.bi_valid=0;

}else if(s.bi_valid>=8){
s.pending_buf[s.pending++]=s.bi_buf&0xff;
s.bi_buf>>=8;
s.bi_valid-=8;
}
}












function gen_bitlen(s,desc)


{
var tree=desc.dyn_tree;
var max_code=desc.max_code;
var stree=desc.stat_desc.static_tree;
var has_stree=desc.stat_desc.has_stree;
var extra=desc.stat_desc.extra_bits;
var base=desc.stat_desc.extra_base;
var max_length=desc.stat_desc.max_length;
var h;
var n,m;
var bits;
var xbits;
var f;
var overflow=0;

for(bits=0;bits<=MAX_BITS;bits++){
s.bl_count[bits]=0;
}




tree[s.heap[s.heap_max]*2+1]=0;

for(h=s.heap_max+1;h<HEAP_SIZE;h++){
n=s.heap[h];
bits=tree[tree[n*2+1]*2+1]+1;
if(bits>max_length){
bits=max_length;
overflow++;
}
tree[n*2+1]=bits;


if(n>max_code){continue;}

s.bl_count[bits]++;
xbits=0;
if(n>=base){
xbits=extra[n-base];
}
f=tree[n*2];
s.opt_len+=f*(bits+xbits);
if(has_stree){
s.static_len+=f*(stree[n*2+1]+xbits);
}
}
if(overflow===0){return;}





do{
bits=max_length-1;
while(s.bl_count[bits]===0){bits--;}
s.bl_count[bits]--;
s.bl_count[bits+1]+=2;
s.bl_count[max_length]--;



overflow-=2;
}while(overflow>0);






for(bits=max_length;bits!==0;bits--){
n=s.bl_count[bits];
while(n!==0){
m=s.heap[--h];
if(m>max_code){continue;}
if(tree[m*2+1]!==bits){

s.opt_len+=(bits-tree[m*2+1])*tree[m*2];
tree[m*2+1]=bits;
}
n--;
}
}
}










function gen_codes(tree,max_code,bl_count)



{
var next_code=new Array(MAX_BITS+1);
var code=0;
var bits;
var n;




for(bits=1;bits<=MAX_BITS;bits++){
next_code[bits]=code=code+bl_count[bits-1]<<1;
}







for(n=0;n<=max_code;n++){
var len=tree[n*2+1];
if(len===0){continue;}

tree[n*2]=bi_reverse(next_code[len]++,len);



}
}





function tr_static_init(){
var n;
var bits;
var length;
var code;
var dist;
var bl_count=new Array(MAX_BITS+1);















length=0;
for(code=0;code<LENGTH_CODES-1;code++){
base_length[code]=length;
for(n=0;n<1<<extra_lbits[code];n++){
_length_code[length++]=code;
}
}





_length_code[length-1]=code;


dist=0;
for(code=0;code<16;code++){
base_dist[code]=dist;
for(n=0;n<1<<extra_dbits[code];n++){
_dist_code[dist++]=code;
}
}

dist>>=7;
for(;code<D_CODES;code++){
base_dist[code]=dist<<7;
for(n=0;n<1<<extra_dbits[code]-7;n++){
_dist_code[256+dist++]=code;
}
}



for(bits=0;bits<=MAX_BITS;bits++){
bl_count[bits]=0;
}

n=0;
while(n<=143){
static_ltree[n*2+1]=8;
n++;
bl_count[8]++;
}
while(n<=255){
static_ltree[n*2+1]=9;
n++;
bl_count[9]++;
}
while(n<=279){
static_ltree[n*2+1]=7;
n++;
bl_count[7]++;
}
while(n<=287){
static_ltree[n*2+1]=8;
n++;
bl_count[8]++;
}




gen_codes(static_ltree,L_CODES+1,bl_count);


for(n=0;n<D_CODES;n++){
static_dtree[n*2+1]=5;
static_dtree[n*2]=bi_reverse(n,5);
}


static_l_desc=new StaticTreeDesc(static_ltree,extra_lbits,LITERALS+1,L_CODES,MAX_BITS);
static_d_desc=new StaticTreeDesc(static_dtree,extra_dbits,0,D_CODES,MAX_BITS);
static_bl_desc=new StaticTreeDesc(new Array(0),extra_blbits,0,BL_CODES,MAX_BL_BITS);


}





function init_block(s){
var n;


for(n=0;n<L_CODES;n++){s.dyn_ltree[n*2]=0;}
for(n=0;n<D_CODES;n++){s.dyn_dtree[n*2]=0;}
for(n=0;n<BL_CODES;n++){s.bl_tree[n*2]=0;}

s.dyn_ltree[END_BLOCK*2]=1;
s.opt_len=s.static_len=0;
s.last_lit=s.matches=0;
}





function bi_windup(s)
{
if(s.bi_valid>8){
put_short(s,s.bi_buf);
}else if(s.bi_valid>0){

s.pending_buf[s.pending++]=s.bi_buf;
}
s.bi_buf=0;
s.bi_valid=0;
}





function copy_block(s,buf,len,header)




{
bi_windup(s);

if(header){
put_short(s,len);
put_short(s,~len);
}



utils.arraySet(s.pending_buf,s.window,buf,len,s.pending);
s.pending+=len;
}





function smaller(tree,n,m,depth){
var _n2=n*2;
var _m2=m*2;
return tree[_n2]<tree[_m2]||
tree[_n2]===tree[_m2]&&depth[n]<=depth[m];
}







function pqdownheap(s,tree,k)



{
var v=s.heap[k];
var j=k<<1;
while(j<=s.heap_len){

if(j<s.heap_len&&
smaller(tree,s.heap[j+1],s.heap[j],s.depth)){
j++;
}

if(smaller(tree,v,s.heap[j],s.depth)){break;}


s.heap[k]=s.heap[j];
k=j;


j<<=1;
}
s.heap[k]=v;
}








function compress_block(s,ltree,dtree)



{
var dist;
var lc;
var lx=0;
var code;
var extra;

if(s.last_lit!==0){
do{
dist=s.pending_buf[s.d_buf+lx*2]<<8|s.pending_buf[s.d_buf+lx*2+1];
lc=s.pending_buf[s.l_buf+lx];
lx++;

if(dist===0){
send_code(s,lc,ltree);

}else{

code=_length_code[lc];
send_code(s,code+LITERALS+1,ltree);
extra=extra_lbits[code];
if(extra!==0){
lc-=base_length[code];
send_bits(s,lc,extra);
}
dist--;
code=d_code(dist);


send_code(s,code,dtree);
extra=extra_dbits[code];
if(extra!==0){
dist-=base_dist[code];
send_bits(s,dist,extra);
}
}





}while(lx<s.last_lit);
}

send_code(s,END_BLOCK,ltree);
}










function build_tree(s,desc)


{
var tree=desc.dyn_tree;
var stree=desc.stat_desc.static_tree;
var has_stree=desc.stat_desc.has_stree;
var elems=desc.stat_desc.elems;
var n,m;
var max_code=-1;
var node;





s.heap_len=0;
s.heap_max=HEAP_SIZE;

for(n=0;n<elems;n++){
if(tree[n*2]!==0){
s.heap[++s.heap_len]=max_code=n;
s.depth[n]=0;

}else{
tree[n*2+1]=0;
}
}






while(s.heap_len<2){
node=s.heap[++s.heap_len]=max_code<2?++max_code:0;
tree[node*2]=1;
s.depth[node]=0;
s.opt_len--;

if(has_stree){
s.static_len-=stree[node*2+1];
}

}
desc.max_code=max_code;




for(n=s.heap_len>>1;n>=1;n--){pqdownheap(s,tree,n);}




node=elems;
do{


n=s.heap[1];
s.heap[1]=s.heap[s.heap_len--];
pqdownheap(s,tree,1);


m=s.heap[1];

s.heap[--s.heap_max]=n;
s.heap[--s.heap_max]=m;


tree[node*2]=tree[n*2]+tree[m*2];
s.depth[node]=(s.depth[n]>=s.depth[m]?s.depth[n]:s.depth[m])+1;
tree[n*2+1]=tree[m*2+1]=node;


s.heap[1]=node++;
pqdownheap(s,tree,1);

}while(s.heap_len>=2);

s.heap[--s.heap_max]=s.heap[1];




gen_bitlen(s,desc);


gen_codes(tree,max_code,s.bl_count);
}






function scan_tree(s,tree,max_code)



{
var n;
var prevlen=-1;
var curlen;

var nextlen=tree[0*2+1];

var count=0;
var max_count=7;
var min_count=4;

if(nextlen===0){
max_count=138;
min_count=3;
}
tree[(max_code+1)*2+1]=0xffff;

for(n=0;n<=max_code;n++){
curlen=nextlen;
nextlen=tree[(n+1)*2+1];

if(++count<max_count&&curlen===nextlen){
continue;

}else if(count<min_count){
s.bl_tree[curlen*2]+=count;

}else if(curlen!==0){

if(curlen!==prevlen){s.bl_tree[curlen*2]++;}
s.bl_tree[REP_3_6*2]++;

}else if(count<=10){
s.bl_tree[REPZ_3_10*2]++;

}else{
s.bl_tree[REPZ_11_138*2]++;
}

count=0;
prevlen=curlen;

if(nextlen===0){
max_count=138;
min_count=3;

}else if(curlen===nextlen){
max_count=6;
min_count=3;

}else{
max_count=7;
min_count=4;
}
}
}






function send_tree(s,tree,max_code)



{
var n;
var prevlen=-1;
var curlen;

var nextlen=tree[0*2+1];

var count=0;
var max_count=7;
var min_count=4;


if(nextlen===0){
max_count=138;
min_count=3;
}

for(n=0;n<=max_code;n++){
curlen=nextlen;
nextlen=tree[(n+1)*2+1];

if(++count<max_count&&curlen===nextlen){
continue;

}else if(count<min_count){
do{send_code(s,curlen,s.bl_tree);}while(--count!==0);

}else if(curlen!==0){
if(curlen!==prevlen){
send_code(s,curlen,s.bl_tree);
count--;
}

send_code(s,REP_3_6,s.bl_tree);
send_bits(s,count-3,2);

}else if(count<=10){
send_code(s,REPZ_3_10,s.bl_tree);
send_bits(s,count-3,3);

}else{
send_code(s,REPZ_11_138,s.bl_tree);
send_bits(s,count-11,7);
}

count=0;
prevlen=curlen;
if(nextlen===0){
max_count=138;
min_count=3;

}else if(curlen===nextlen){
max_count=6;
min_count=3;

}else{
max_count=7;
min_count=4;
}
}
}






function build_bl_tree(s){
var max_blindex;


scan_tree(s,s.dyn_ltree,s.l_desc.max_code);
scan_tree(s,s.dyn_dtree,s.d_desc.max_code);


build_tree(s,s.bl_desc);








for(max_blindex=BL_CODES-1;max_blindex>=3;max_blindex--){
if(s.bl_tree[bl_order[max_blindex]*2+1]!==0){
break;
}
}

s.opt_len+=3*(max_blindex+1)+5+5+4;



return max_blindex;
}







function send_all_trees(s,lcodes,dcodes,blcodes)


{
var rank;





send_bits(s,lcodes-257,5);
send_bits(s,dcodes-1,5);
send_bits(s,blcodes-4,4);
for(rank=0;rank<blcodes;rank++){

send_bits(s,s.bl_tree[bl_order[rank]*2+1],3);
}


send_tree(s,s.dyn_ltree,lcodes-1);


send_tree(s,s.dyn_dtree,dcodes-1);

}















function detect_data_type(s){




var black_mask=0xf3ffc07f;
var n;


for(n=0;n<=31;n++,black_mask>>>=1){
if(black_mask&1&&s.dyn_ltree[n*2]!==0){
return Z_BINARY;
}
}


if(s.dyn_ltree[9*2]!==0||s.dyn_ltree[10*2]!==0||
s.dyn_ltree[13*2]!==0){
return Z_TEXT;
}
for(n=32;n<LITERALS;n++){
if(s.dyn_ltree[n*2]!==0){
return Z_TEXT;
}
}




return Z_BINARY;
}


var static_init_done=false;




function _tr_init(s)
{

if(!static_init_done){
tr_static_init();
static_init_done=true;
}

s.l_desc=new TreeDesc(s.dyn_ltree,static_l_desc);
s.d_desc=new TreeDesc(s.dyn_dtree,static_d_desc);
s.bl_desc=new TreeDesc(s.bl_tree,static_bl_desc);

s.bi_buf=0;
s.bi_valid=0;


init_block(s);
}





function _tr_stored_block(s,buf,stored_len,last)




{
send_bits(s,(STORED_BLOCK<<1)+(last?1:0),3);
copy_block(s,buf,stored_len,true);
}






function _tr_align(s){
send_bits(s,STATIC_TREES<<1,3);
send_code(s,END_BLOCK,static_ltree);
bi_flush(s);
}






function _tr_flush_block(s,buf,stored_len,last)




{
var opt_lenb,static_lenb;
var max_blindex=0;


if(s.level>0){


if(s.strm.data_type===Z_UNKNOWN){
s.strm.data_type=detect_data_type(s);
}


build_tree(s,s.l_desc);



build_tree(s,s.d_desc);









max_blindex=build_bl_tree(s);


opt_lenb=s.opt_len+3+7>>>3;
static_lenb=s.static_len+3+7>>>3;





if(static_lenb<=opt_lenb){opt_lenb=static_lenb;}

}else{

opt_lenb=static_lenb=stored_len+5;
}

if(stored_len+4<=opt_lenb&&buf!==-1){








_tr_stored_block(s,buf,stored_len,last);

}else if(s.strategy===Z_FIXED||static_lenb===opt_lenb){

send_bits(s,(STATIC_TREES<<1)+(last?1:0),3);
compress_block(s,static_ltree,static_dtree);

}else{
send_bits(s,(DYN_TREES<<1)+(last?1:0),3);
send_all_trees(s,s.l_desc.max_code+1,s.d_desc.max_code+1,max_blindex+1);
compress_block(s,s.dyn_ltree,s.dyn_dtree);
}




init_block(s);

if(last){
bi_windup(s);
}


}





function _tr_tally(s,dist,lc)



{


s.pending_buf[s.d_buf+s.last_lit*2]=dist>>>8&0xff;
s.pending_buf[s.d_buf+s.last_lit*2+1]=dist&0xff;

s.pending_buf[s.l_buf+s.last_lit]=lc&0xff;
s.last_lit++;

if(dist===0){

s.dyn_ltree[lc*2]++;
}else{
s.matches++;

dist--;




s.dyn_ltree[(_length_code[lc]+LITERALS+1)*2]++;
s.dyn_dtree[d_code(dist)*2]++;
}
























return s.last_lit===s.lit_bufsize-1;




}

exports._tr_init=_tr_init;
exports._tr_stored_block=_tr_stored_block;
exports._tr_flush_block=_tr_flush_block;
exports._tr_tally=_tr_tally;
exports._tr_align=_tr_align;

},{"../utils/common":147}],154:[function(require,module,exports){
'use strict';




















function ZStream(){

this.input=null;
this.next_in=0;

this.avail_in=0;

this.total_in=0;

this.output=null;
this.next_out=0;

this.avail_out=0;

this.total_out=0;

this.msg='';

this.state=null;

this.data_type=2;

this.adler=0;
}

module.exports=ZStream;

},{}],155:[function(require,module,exports){
module.exports=function parseCacheControl(field){

if(typeof field!=='string'){
return null;
}









var regex=/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g;

var header={};
var err=field.replace(regex,function($0,$1,$2,$3){
var value=$2||$3;
header[$1]=value?value.toLowerCase():true;
return'';
});

if(header['max-age']){
try{
var maxAge=parseInt(header['max-age'],10);
if(isNaN(maxAge)){
return null;
}

header['max-age']=maxAge;
}
catch(err){}
}

return err?null:header;
};

},{}],156:[function(require,module,exports){
(function(process){




























function normalizeArray(parts,allowAboveRoot){

var up=0;
for(var i=parts.length-1;i>=0;i--){
var last=parts[i];
if(last==='.'){
parts.splice(i,1);
}else if(last==='..'){
parts.splice(i,1);
up++;
}else if(up){
parts.splice(i,1);
up--;
}
}


if(allowAboveRoot){
for(;up--;up){
parts.unshift('..');
}
}

return parts;
}



exports.resolve=function(){
var resolvedPath='',
resolvedAbsolute=false;

for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){
var path=i>=0?arguments[i]:process.cwd();


if(typeof path!=='string'){
throw new TypeError('Arguments to path.resolve must be strings');
}else if(!path){
continue;
}

resolvedPath=path+'/'+resolvedPath;
resolvedAbsolute=path.charAt(0)==='/';
}





resolvedPath=normalizeArray(filter(resolvedPath.split('/'),function(p){
return!!p;
}),!resolvedAbsolute).join('/');

return(resolvedAbsolute?'/':'')+resolvedPath||'.';
};



exports.normalize=function(path){
var isAbsolute=exports.isAbsolute(path),
trailingSlash=substr(path,-1)==='/';


path=normalizeArray(filter(path.split('/'),function(p){
return!!p;
}),!isAbsolute).join('/');

if(!path&&!isAbsolute){
path='.';
}
if(path&&trailingSlash){
path+='/';
}

return(isAbsolute?'/':'')+path;
};


exports.isAbsolute=function(path){
return path.charAt(0)==='/';
};


exports.join=function(){
var paths=Array.prototype.slice.call(arguments,0);
return exports.normalize(filter(paths,function(p,index){
if(typeof p!=='string'){
throw new TypeError('Arguments to path.join must be strings');
}
return p;
}).join('/'));
};




exports.relative=function(from,to){
from=exports.resolve(from).substr(1);
to=exports.resolve(to).substr(1);

function trim(arr){
var start=0;
for(;start<arr.length;start++){
if(arr[start]!=='')break;
}

var end=arr.length-1;
for(;end>=0;end--){
if(arr[end]!=='')break;
}

if(start>end)return[];
return arr.slice(start,end-start+1);
}

var fromParts=trim(from.split('/'));
var toParts=trim(to.split('/'));

var length=Math.min(fromParts.length,toParts.length);
var samePartsLength=length;
for(var i=0;i<length;i++){
if(fromParts[i]!==toParts[i]){
samePartsLength=i;
break;
}
}

var outputParts=[];
for(var i=samePartsLength;i<fromParts.length;i++){
outputParts.push('..');
}

outputParts=outputParts.concat(toParts.slice(samePartsLength));

return outputParts.join('/');
};

exports.sep='/';
exports.delimiter=':';

exports.dirname=function(path){
if(typeof path!=='string')path=path+'';
if(path.length===0)return'.';
var code=path.charCodeAt(0);
var hasRoot=code===47;
var end=-1;
var matchedSlash=true;
for(var i=path.length-1;i>=1;--i){
code=path.charCodeAt(i);
if(code===47){
if(!matchedSlash){
end=i;
break;
}
}else{

matchedSlash=false;
}
}

if(end===-1)return hasRoot?'/':'.';
if(hasRoot&&end===1){


return'/';
}
return path.slice(0,end);
};

function basename(path){
if(typeof path!=='string')path=path+'';

var start=0;
var end=-1;
var matchedSlash=true;
var i;

for(i=path.length-1;i>=0;--i){
if(path.charCodeAt(i)===47){


if(!matchedSlash){
start=i+1;
break;
}
}else if(end===-1){


matchedSlash=false;
end=i+1;
}
}

if(end===-1)return'';
return path.slice(start,end);
}



exports.basename=function(path,ext){
var f=basename(path);
if(ext&&f.substr(-1*ext.length)===ext){
f=f.substr(0,f.length-ext.length);
}
return f;
};

exports.extname=function(path){
if(typeof path!=='string')path=path+'';
var startDot=-1;
var startPart=0;
var end=-1;
var matchedSlash=true;


var preDotState=0;
for(var i=path.length-1;i>=0;--i){
var code=path.charCodeAt(i);
if(code===47){


if(!matchedSlash){
startPart=i+1;
break;
}
continue;
}
if(end===-1){


matchedSlash=false;
end=i+1;
}
if(code===46){

if(startDot===-1)
startDot=i;else
if(preDotState!==1)
preDotState=1;
}else if(startDot!==-1){


preDotState=-1;
}
}

if(startDot===-1||end===-1||

preDotState===0||

preDotState===1&&startDot===end-1&&startDot===startPart+1){
return'';
}
return path.slice(startDot,end);
};

function filter(xs,f){
if(xs.filter)return xs.filter(f);
var res=[];
for(var i=0;i<xs.length;i++){
if(f(xs[i],i,xs))res.push(xs[i]);
}
return res;
}


var substr='ab'.substr(-1)==='b'?
function(str,start,len){return str.substr(start,len);}:
function(str,start,len){
if(start<0)start=str.length+start;
return str.substr(start,len);
};


}).call(this,require('_process'));
},{"_process":158}],157:[function(require,module,exports){
(function(process){
'use strict';

if(!process.version||
process.version.indexOf('v0.')===0||
process.version.indexOf('v1.')===0&&process.version.indexOf('v1.8.')!==0){
module.exports={nextTick:nextTick};
}else{
module.exports=process;
}

function nextTick(fn,arg1,arg2,arg3){
if(typeof fn!=='function'){
throw new TypeError('"callback" argument must be a function');
}
var len=arguments.length;
var args,i;
switch(len){
case 0:
case 1:
return process.nextTick(fn);
case 2:
return process.nextTick(function afterTickOne(){
fn.call(null,arg1);
});
case 3:
return process.nextTick(function afterTickTwo(){
fn.call(null,arg1,arg2);
});
case 4:
return process.nextTick(function afterTickThree(){
fn.call(null,arg1,arg2,arg3);
});
default:
args=new Array(len-1);
i=0;
while(i<args.length){
args[i++]=arguments[i];
}
return process.nextTick(function afterTick(){
fn.apply(null,args);
});}

}


}).call(this,require('_process'));
},{"_process":158}],158:[function(require,module,exports){

var process=module.exports={};






var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout(){
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout(){
throw new Error('clearTimeout has not been defined');
}
(function(){
try{
if(typeof setTimeout==='function'){
cachedSetTimeout=setTimeout;
}else{
cachedSetTimeout=defaultSetTimout;
}
}catch(e){
cachedSetTimeout=defaultSetTimout;
}
try{
if(typeof clearTimeout==='function'){
cachedClearTimeout=clearTimeout;
}else{
cachedClearTimeout=defaultClearTimeout;
}
}catch(e){
cachedClearTimeout=defaultClearTimeout;
}
})();
function runTimeout(fun){
if(cachedSetTimeout===setTimeout){

return setTimeout(fun,0);
}

if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){
cachedSetTimeout=setTimeout;
return setTimeout(fun,0);
}
try{

return cachedSetTimeout(fun,0);
}catch(e){
try{

return cachedSetTimeout.call(null,fun,0);
}catch(e){

return cachedSetTimeout.call(this,fun,0);
}
}


}
function runClearTimeout(marker){
if(cachedClearTimeout===clearTimeout){

return clearTimeout(marker);
}

if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){
cachedClearTimeout=clearTimeout;
return clearTimeout(marker);
}
try{

return cachedClearTimeout(marker);
}catch(e){
try{

return cachedClearTimeout.call(null,marker);
}catch(e){


return cachedClearTimeout.call(this,marker);
}
}



}
var queue=[];
var draining=false;
var currentQueue;
var queueIndex=-1;

function cleanUpNextTick(){
if(!draining||!currentQueue){
return;
}
draining=false;
if(currentQueue.length){
queue=currentQueue.concat(queue);
}else{
queueIndex=-1;
}
if(queue.length){
drainQueue();
}
}

function drainQueue(){
if(draining){
return;
}
var timeout=runTimeout(cleanUpNextTick);
draining=true;

var len=queue.length;
while(len){
currentQueue=queue;
queue=[];
while(++queueIndex<len){
if(currentQueue){
currentQueue[queueIndex].run();
}
}
queueIndex=-1;
len=queue.length;
}
currentQueue=null;
draining=false;
runClearTimeout(timeout);
}

process.nextTick=function(fun){
var args=new Array(arguments.length-1);
if(arguments.length>1){
for(var i=1;i<arguments.length;i++){
args[i-1]=arguments[i];
}
}
queue.push(new Item(fun,args));
if(queue.length===1&&!draining){
runTimeout(drainQueue);
}
};


function Item(fun,array){
this.fun=fun;
this.array=array;
}
Item.prototype.run=function(){
this.fun.apply(null,this.array);
};
process.title='browser';
process.browser=true;
process.env={};
process.argv=[];
process.version='';
process.versions={};

function noop(){}

process.on=noop;
process.addListener=noop;
process.once=noop;
process.off=noop;
process.removeListener=noop;
process.removeAllListeners=noop;
process.emit=noop;
process.prependListener=noop;
process.prependOnceListener=noop;

process.listeners=function(name){return[];};

process.binding=function(name){
throw new Error('process.binding is not supported');
};

process.cwd=function(){return'/';};
process.chdir=function(dir){
throw new Error('process.chdir is not supported');
};
process.umask=function(){return 0;};

},{}],159:[function(require,module,exports){





















'use strict';




function hasOwnProperty(obj,prop){
return Object.prototype.hasOwnProperty.call(obj,prop);
}

module.exports=function(qs,sep,eq,options){
sep=sep||'&';
eq=eq||'=';
var obj={};

if(typeof qs!=='string'||qs.length===0){
return obj;
}

var regexp=/\+/g;
qs=qs.split(sep);

var maxKeys=1000;
if(options&&typeof options.maxKeys==='number'){
maxKeys=options.maxKeys;
}

var len=qs.length;

if(maxKeys>0&&len>maxKeys){
len=maxKeys;
}

for(var i=0;i<len;++i){
var x=qs[i].replace(regexp,'%20'),
idx=x.indexOf(eq),
kstr,vstr,k,v;

if(idx>=0){
kstr=x.substr(0,idx);
vstr=x.substr(idx+1);
}else{
kstr=x;
vstr='';
}

k=decodeURIComponent(kstr);
v=decodeURIComponent(vstr);

if(!hasOwnProperty(obj,k)){
obj[k]=v;
}else if(isArray(obj[k])){
obj[k].push(v);
}else{
obj[k]=[obj[k],v];
}
}

return obj;
};

var isArray=Array.isArray||function(xs){
return Object.prototype.toString.call(xs)==='[object Array]';
};

},{}],160:[function(require,module,exports){





















'use strict';

var stringifyPrimitive=function(v){
switch(typeof v){
case'string':
return v;

case'boolean':
return v?'true':'false';

case'number':
return isFinite(v)?v:'';

default:
return'';}

};

module.exports=function(obj,sep,eq,name){
sep=sep||'&';
eq=eq||'=';
if(obj===null){
obj=undefined;
}

if(typeof obj==='object'){
return map(objectKeys(obj),function(k){
var ks=encodeURIComponent(stringifyPrimitive(k))+eq;
if(isArray(obj[k])){
return map(obj[k],function(v){
return ks+encodeURIComponent(stringifyPrimitive(v));
}).join(sep);
}else{
return ks+encodeURIComponent(stringifyPrimitive(obj[k]));
}
}).join(sep);

}

if(!name)return'';
return encodeURIComponent(stringifyPrimitive(name))+eq+
encodeURIComponent(stringifyPrimitive(obj));
};

var isArray=Array.isArray||function(xs){
return Object.prototype.toString.call(xs)==='[object Array]';
};

function map(xs,f){
if(xs.map)return xs.map(f);
var res=[];
for(var i=0;i<xs.length;i++){
res.push(f(xs[i],i));
}
return res;
}

var objectKeys=Object.keys||function(obj){
var res=[];
for(var key in obj){
if(Object.prototype.hasOwnProperty.call(obj,key))res.push(key);
}
return res;
};

},{}],161:[function(require,module,exports){
'use strict';

exports.decode=exports.parse=require('./decode');
exports.encode=exports.stringify=require('./encode');

},{"./decode":159,"./encode":160}],162:[function(require,module,exports){
module.exports=require('./lib/_stream_duplex.js');

},{"./lib/_stream_duplex.js":163}],163:[function(require,module,exports){


























'use strict';



var pna=require('process-nextick-args');



var objectKeys=Object.keys||function(obj){
var keys=[];
for(var key in obj){
keys.push(key);
}return keys;
};


module.exports=Duplex;


var util=require('core-util-is');
util.inherits=require('inherits');


var Readable=require('./_stream_readable');
var Writable=require('./_stream_writable');

util.inherits(Duplex,Readable);

{

var keys=objectKeys(Writable.prototype);
for(var v=0;v<keys.length;v++){
var method=keys[v];
if(!Duplex.prototype[method])Duplex.prototype[method]=Writable.prototype[method];
}
}

function Duplex(options){
if(!(this instanceof Duplex))return new Duplex(options);

Readable.call(this,options);
Writable.call(this,options);

if(options&&options.readable===false)this.readable=false;

if(options&&options.writable===false)this.writable=false;

this.allowHalfOpen=true;
if(options&&options.allowHalfOpen===false)this.allowHalfOpen=false;

this.once('end',onend);
}

Object.defineProperty(Duplex.prototype,'writableHighWaterMark',{



enumerable:false,
get:function(){
return this._writableState.highWaterMark;
}});



function onend(){


if(this.allowHalfOpen||this._writableState.ended)return;



pna.nextTick(onEndNT,this);
}

function onEndNT(self){
self.end();
}

Object.defineProperty(Duplex.prototype,'destroyed',{
get:function(){
if(this._readableState===undefined||this._writableState===undefined){
return false;
}
return this._readableState.destroyed&&this._writableState.destroyed;
},
set:function(value){


if(this._readableState===undefined||this._writableState===undefined){
return;
}



this._readableState.destroyed=value;
this._writableState.destroyed=value;
}});


Duplex.prototype._destroy=function(err,cb){
this.push(null);
this.end();

pna.nextTick(cb,err);
};
},{"./_stream_readable":165,"./_stream_writable":167,"core-util-is":103,"inherits":113,"process-nextick-args":157}],164:[function(require,module,exports){

























'use strict';

module.exports=PassThrough;

var Transform=require('./_stream_transform');


var util=require('core-util-is');
util.inherits=require('inherits');


util.inherits(PassThrough,Transform);

function PassThrough(options){
if(!(this instanceof PassThrough))return new PassThrough(options);

Transform.call(this,options);
}

PassThrough.prototype._transform=function(chunk,encoding,cb){
cb(null,chunk);
};
},{"./_stream_transform":166,"core-util-is":103,"inherits":113}],165:[function(require,module,exports){
(function(process,global){





















'use strict';



var pna=require('process-nextick-args');


module.exports=Readable;


var isArray=require('isarray');



var Duplex;


Readable.ReadableState=ReadableState;


var EE=require('events').EventEmitter;

var EElistenerCount=function(emitter,type){
return emitter.listeners(type).length;
};



var Stream=require('./internal/streams/stream');




var Buffer=require('safe-buffer').Buffer;
var OurUint8Array=global.Uint8Array||function(){};
function _uint8ArrayToBuffer(chunk){
return Buffer.from(chunk);
}
function _isUint8Array(obj){
return Buffer.isBuffer(obj)||obj instanceof OurUint8Array;
}




var util=require('core-util-is');
util.inherits=require('inherits');



var debugUtil=require('util');
var debug=void 0;
if(debugUtil&&debugUtil.debuglog){
debug=debugUtil.debuglog('stream');
}else{
debug=function(){};
}


var BufferList=require('./internal/streams/BufferList');
var destroyImpl=require('./internal/streams/destroy');
var StringDecoder;

util.inherits(Readable,Stream);

var kProxyEvents=['error','close','destroy','pause','resume'];

function prependListener(emitter,event,fn){


if(typeof emitter.prependListener==='function')return emitter.prependListener(event,fn);





if(!emitter._events||!emitter._events[event])emitter.on(event,fn);else if(isArray(emitter._events[event]))emitter._events[event].unshift(fn);else emitter._events[event]=[fn,emitter._events[event]];
}

function ReadableState(options,stream){
Duplex=Duplex||require('./_stream_duplex');

options=options||{};






var isDuplex=stream instanceof Duplex;



this.objectMode=!!options.objectMode;

if(isDuplex)this.objectMode=this.objectMode||!!options.readableObjectMode;



var hwm=options.highWaterMark;
var readableHwm=options.readableHighWaterMark;
var defaultHwm=this.objectMode?16:16*1024;

if(hwm||hwm===0)this.highWaterMark=hwm;else if(isDuplex&&(readableHwm||readableHwm===0))this.highWaterMark=readableHwm;else this.highWaterMark=defaultHwm;


this.highWaterMark=Math.floor(this.highWaterMark);




this.buffer=new BufferList();
this.length=0;
this.pipes=null;
this.pipesCount=0;
this.flowing=null;
this.ended=false;
this.endEmitted=false;
this.reading=false;





this.sync=true;



this.needReadable=false;
this.emittedReadable=false;
this.readableListening=false;
this.resumeScheduled=false;


this.destroyed=false;




this.defaultEncoding=options.defaultEncoding||'utf8';


this.awaitDrain=0;


this.readingMore=false;

this.decoder=null;
this.encoding=null;
if(options.encoding){
if(!StringDecoder)StringDecoder=require('string_decoder/').StringDecoder;
this.decoder=new StringDecoder(options.encoding);
this.encoding=options.encoding;
}
}

function Readable(options){
Duplex=Duplex||require('./_stream_duplex');

if(!(this instanceof Readable))return new Readable(options);

this._readableState=new ReadableState(options,this);


this.readable=true;

if(options){
if(typeof options.read==='function')this._read=options.read;

if(typeof options.destroy==='function')this._destroy=options.destroy;
}

Stream.call(this);
}

Object.defineProperty(Readable.prototype,'destroyed',{
get:function(){
if(this._readableState===undefined){
return false;
}
return this._readableState.destroyed;
},
set:function(value){


if(!this._readableState){
return;
}



this._readableState.destroyed=value;
}});


Readable.prototype.destroy=destroyImpl.destroy;
Readable.prototype._undestroy=destroyImpl.undestroy;
Readable.prototype._destroy=function(err,cb){
this.push(null);
cb(err);
};





Readable.prototype.push=function(chunk,encoding){
var state=this._readableState;
var skipChunkCheck;

if(!state.objectMode){
if(typeof chunk==='string'){
encoding=encoding||state.defaultEncoding;
if(encoding!==state.encoding){
chunk=Buffer.from(chunk,encoding);
encoding='';
}
skipChunkCheck=true;
}
}else{
skipChunkCheck=true;
}

return readableAddChunk(this,chunk,encoding,false,skipChunkCheck);
};


Readable.prototype.unshift=function(chunk){
return readableAddChunk(this,chunk,null,true,false);
};

function readableAddChunk(stream,chunk,encoding,addToFront,skipChunkCheck){
var state=stream._readableState;
if(chunk===null){
state.reading=false;
onEofChunk(stream,state);
}else{
var er;
if(!skipChunkCheck)er=chunkInvalid(state,chunk);
if(er){
stream.emit('error',er);
}else if(state.objectMode||chunk&&chunk.length>0){
if(typeof chunk!=='string'&&!state.objectMode&&Object.getPrototypeOf(chunk)!==Buffer.prototype){
chunk=_uint8ArrayToBuffer(chunk);
}

if(addToFront){
if(state.endEmitted)stream.emit('error',new Error('stream.unshift() after end event'));else addChunk(stream,state,chunk,true);
}else if(state.ended){
stream.emit('error',new Error('stream.push() after EOF'));
}else{
state.reading=false;
if(state.decoder&&!encoding){
chunk=state.decoder.write(chunk);
if(state.objectMode||chunk.length!==0)addChunk(stream,state,chunk,false);else maybeReadMore(stream,state);
}else{
addChunk(stream,state,chunk,false);
}
}
}else if(!addToFront){
state.reading=false;
}
}

return needMoreData(state);
}

function addChunk(stream,state,chunk,addToFront){
if(state.flowing&&state.length===0&&!state.sync){
stream.emit('data',chunk);
stream.read(0);
}else{

state.length+=state.objectMode?1:chunk.length;
if(addToFront)state.buffer.unshift(chunk);else state.buffer.push(chunk);

if(state.needReadable)emitReadable(stream);
}
maybeReadMore(stream,state);
}

function chunkInvalid(state,chunk){
var er;
if(!_isUint8Array(chunk)&&typeof chunk!=='string'&&chunk!==undefined&&!state.objectMode){
er=new TypeError('Invalid non-string/buffer chunk');
}
return er;
}








function needMoreData(state){
return!state.ended&&(state.needReadable||state.length<state.highWaterMark||state.length===0);
}

Readable.prototype.isPaused=function(){
return this._readableState.flowing===false;
};


Readable.prototype.setEncoding=function(enc){
if(!StringDecoder)StringDecoder=require('string_decoder/').StringDecoder;
this._readableState.decoder=new StringDecoder(enc);
this._readableState.encoding=enc;
return this;
};


var MAX_HWM=0x800000;
function computeNewHighWaterMark(n){
if(n>=MAX_HWM){
n=MAX_HWM;
}else{


n--;
n|=n>>>1;
n|=n>>>2;
n|=n>>>4;
n|=n>>>8;
n|=n>>>16;
n++;
}
return n;
}



function howMuchToRead(n,state){
if(n<=0||state.length===0&&state.ended)return 0;
if(state.objectMode)return 1;
if(n!==n){

if(state.flowing&&state.length)return state.buffer.head.data.length;else return state.length;
}

if(n>state.highWaterMark)state.highWaterMark=computeNewHighWaterMark(n);
if(n<=state.length)return n;

if(!state.ended){
state.needReadable=true;
return 0;
}
return state.length;
}


Readable.prototype.read=function(n){
debug('read',n);
n=parseInt(n,10);
var state=this._readableState;
var nOrig=n;

if(n!==0)state.emittedReadable=false;




if(n===0&&state.needReadable&&(state.length>=state.highWaterMark||state.ended)){
debug('read: emitReadable',state.length,state.ended);
if(state.length===0&&state.ended)endReadable(this);else emitReadable(this);
return null;
}

n=howMuchToRead(n,state);


if(n===0&&state.ended){
if(state.length===0)endReadable(this);
return null;
}
























var doRead=state.needReadable;
debug('need readable',doRead);


if(state.length===0||state.length-n<state.highWaterMark){
doRead=true;
debug('length less than watermark',doRead);
}



if(state.ended||state.reading){
doRead=false;
debug('reading or ended',doRead);
}else if(doRead){
debug('do read');
state.reading=true;
state.sync=true;

if(state.length===0)state.needReadable=true;

this._read(state.highWaterMark);
state.sync=false;


if(!state.reading)n=howMuchToRead(nOrig,state);
}

var ret;
if(n>0)ret=fromList(n,state);else ret=null;

if(ret===null){
state.needReadable=true;
n=0;
}else{
state.length-=n;
}

if(state.length===0){


if(!state.ended)state.needReadable=true;


if(nOrig!==n&&state.ended)endReadable(this);
}

if(ret!==null)this.emit('data',ret);

return ret;
};

function onEofChunk(stream,state){
if(state.ended)return;
if(state.decoder){
var chunk=state.decoder.end();
if(chunk&&chunk.length){
state.buffer.push(chunk);
state.length+=state.objectMode?1:chunk.length;
}
}
state.ended=true;


emitReadable(stream);
}




function emitReadable(stream){
var state=stream._readableState;
state.needReadable=false;
if(!state.emittedReadable){
debug('emitReadable',state.flowing);
state.emittedReadable=true;
if(state.sync)pna.nextTick(emitReadable_,stream);else emitReadable_(stream);
}
}

function emitReadable_(stream){
debug('emit readable');
stream.emit('readable');
flow(stream);
}







function maybeReadMore(stream,state){
if(!state.readingMore){
state.readingMore=true;
pna.nextTick(maybeReadMore_,stream,state);
}
}

function maybeReadMore_(stream,state){
var len=state.length;
while(!state.reading&&!state.flowing&&!state.ended&&state.length<state.highWaterMark){
debug('maybeReadMore read 0');
stream.read(0);
if(len===state.length)

break;else len=state.length;
}
state.readingMore=false;
}





Readable.prototype._read=function(n){
this.emit('error',new Error('_read() is not implemented'));
};

Readable.prototype.pipe=function(dest,pipeOpts){
var src=this;
var state=this._readableState;

switch(state.pipesCount){
case 0:
state.pipes=dest;
break;
case 1:
state.pipes=[state.pipes,dest];
break;
default:
state.pipes.push(dest);
break;}

state.pipesCount+=1;
debug('pipe count=%d opts=%j',state.pipesCount,pipeOpts);

var doEnd=(!pipeOpts||pipeOpts.end!==false)&&dest!==process.stdout&&dest!==process.stderr;

var endFn=doEnd?onend:unpipe;
if(state.endEmitted)pna.nextTick(endFn);else src.once('end',endFn);

dest.on('unpipe',onunpipe);
function onunpipe(readable,unpipeInfo){
debug('onunpipe');
if(readable===src){
if(unpipeInfo&&unpipeInfo.hasUnpiped===false){
unpipeInfo.hasUnpiped=true;
cleanup();
}
}
}

function onend(){
debug('onend');
dest.end();
}





var ondrain=pipeOnDrain(src);
dest.on('drain',ondrain);

var cleanedUp=false;
function cleanup(){
debug('cleanup');

dest.removeListener('close',onclose);
dest.removeListener('finish',onfinish);
dest.removeListener('drain',ondrain);
dest.removeListener('error',onerror);
dest.removeListener('unpipe',onunpipe);
src.removeListener('end',onend);
src.removeListener('end',unpipe);
src.removeListener('data',ondata);

cleanedUp=true;






if(state.awaitDrain&&(!dest._writableState||dest._writableState.needDrain))ondrain();
}





var increasedAwaitDrain=false;
src.on('data',ondata);
function ondata(chunk){
debug('ondata');
increasedAwaitDrain=false;
var ret=dest.write(chunk);
if(false===ret&&!increasedAwaitDrain){




if((state.pipesCount===1&&state.pipes===dest||state.pipesCount>1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp){
debug('false write response, pause',src._readableState.awaitDrain);
src._readableState.awaitDrain++;
increasedAwaitDrain=true;
}
src.pause();
}
}



function onerror(er){
debug('onerror',er);
unpipe();
dest.removeListener('error',onerror);
if(EElistenerCount(dest,'error')===0)dest.emit('error',er);
}


prependListener(dest,'error',onerror);


function onclose(){
dest.removeListener('finish',onfinish);
unpipe();
}
dest.once('close',onclose);
function onfinish(){
debug('onfinish');
dest.removeListener('close',onclose);
unpipe();
}
dest.once('finish',onfinish);

function unpipe(){
debug('unpipe');
src.unpipe(dest);
}


dest.emit('pipe',src);


if(!state.flowing){
debug('pipe resume');
src.resume();
}

return dest;
};

function pipeOnDrain(src){
return function(){
var state=src._readableState;
debug('pipeOnDrain',state.awaitDrain);
if(state.awaitDrain)state.awaitDrain--;
if(state.awaitDrain===0&&EElistenerCount(src,'data')){
state.flowing=true;
flow(src);
}
};
}

Readable.prototype.unpipe=function(dest){
var state=this._readableState;
var unpipeInfo={hasUnpiped:false};


if(state.pipesCount===0)return this;


if(state.pipesCount===1){

if(dest&&dest!==state.pipes)return this;

if(!dest)dest=state.pipes;


state.pipes=null;
state.pipesCount=0;
state.flowing=false;
if(dest)dest.emit('unpipe',this,unpipeInfo);
return this;
}



if(!dest){

var dests=state.pipes;
var len=state.pipesCount;
state.pipes=null;
state.pipesCount=0;
state.flowing=false;

for(var i=0;i<len;i++){
dests[i].emit('unpipe',this,unpipeInfo);
}return this;
}


var index=indexOf(state.pipes,dest);
if(index===-1)return this;

state.pipes.splice(index,1);
state.pipesCount-=1;
if(state.pipesCount===1)state.pipes=state.pipes[0];

dest.emit('unpipe',this,unpipeInfo);

return this;
};



Readable.prototype.on=function(ev,fn){
var res=Stream.prototype.on.call(this,ev,fn);

if(ev==='data'){

if(this._readableState.flowing!==false)this.resume();
}else if(ev==='readable'){
var state=this._readableState;
if(!state.endEmitted&&!state.readableListening){
state.readableListening=state.needReadable=true;
state.emittedReadable=false;
if(!state.reading){
pna.nextTick(nReadingNextTick,this);
}else if(state.length){
emitReadable(this);
}
}
}

return res;
};
Readable.prototype.addListener=Readable.prototype.on;

function nReadingNextTick(self){
debug('readable nexttick read 0');
self.read(0);
}



Readable.prototype.resume=function(){
var state=this._readableState;
if(!state.flowing){
debug('resume');
state.flowing=true;
resume(this,state);
}
return this;
};

function resume(stream,state){
if(!state.resumeScheduled){
state.resumeScheduled=true;
pna.nextTick(resume_,stream,state);
}
}

function resume_(stream,state){
if(!state.reading){
debug('resume read 0');
stream.read(0);
}

state.resumeScheduled=false;
state.awaitDrain=0;
stream.emit('resume');
flow(stream);
if(state.flowing&&!state.reading)stream.read(0);
}

Readable.prototype.pause=function(){
debug('call pause flowing=%j',this._readableState.flowing);
if(false!==this._readableState.flowing){
debug('pause');
this._readableState.flowing=false;
this.emit('pause');
}
return this;
};

function flow(stream){
var state=stream._readableState;
debug('flow',state.flowing);
while(state.flowing&&stream.read()!==null){}
}




Readable.prototype.wrap=function(stream){
var _this=this;

var state=this._readableState;
var paused=false;

stream.on('end',function(){
debug('wrapped end');
if(state.decoder&&!state.ended){
var chunk=state.decoder.end();
if(chunk&&chunk.length)_this.push(chunk);
}

_this.push(null);
});

stream.on('data',function(chunk){
debug('wrapped data');
if(state.decoder)chunk=state.decoder.write(chunk);


if(state.objectMode&&(chunk===null||chunk===undefined))return;else if(!state.objectMode&&(!chunk||!chunk.length))return;

var ret=_this.push(chunk);
if(!ret){
paused=true;
stream.pause();
}
});



for(var i in stream){
if(this[i]===undefined&&typeof stream[i]==='function'){
this[i]=function(method){
return function(){
return stream[method].apply(stream,arguments);
};
}(i);
}
}


for(var n=0;n<kProxyEvents.length;n++){
stream.on(kProxyEvents[n],this.emit.bind(this,kProxyEvents[n]));
}



this._read=function(n){
debug('wrapped _read',n);
if(paused){
paused=false;
stream.resume();
}
};

return this;
};

Object.defineProperty(Readable.prototype,'readableHighWaterMark',{



enumerable:false,
get:function(){
return this._readableState.highWaterMark;
}});



Readable._fromList=fromList;





function fromList(n,state){

if(state.length===0)return null;

var ret;
if(state.objectMode)ret=state.buffer.shift();else if(!n||n>=state.length){

if(state.decoder)ret=state.buffer.join('');else if(state.buffer.length===1)ret=state.buffer.head.data;else ret=state.buffer.concat(state.length);
state.buffer.clear();
}else{

ret=fromListPartial(n,state.buffer,state.decoder);
}

return ret;
}




function fromListPartial(n,list,hasStrings){
var ret;
if(n<list.head.data.length){

ret=list.head.data.slice(0,n);
list.head.data=list.head.data.slice(n);
}else if(n===list.head.data.length){

ret=list.shift();
}else{

ret=hasStrings?copyFromBufferString(n,list):copyFromBuffer(n,list);
}
return ret;
}





function copyFromBufferString(n,list){
var p=list.head;
var c=1;
var ret=p.data;
n-=ret.length;
while(p=p.next){
var str=p.data;
var nb=n>str.length?str.length:n;
if(nb===str.length)ret+=str;else ret+=str.slice(0,n);
n-=nb;
if(n===0){
if(nb===str.length){
++c;
if(p.next)list.head=p.next;else list.head=list.tail=null;
}else{
list.head=p;
p.data=str.slice(nb);
}
break;
}
++c;
}
list.length-=c;
return ret;
}




function copyFromBuffer(n,list){
var ret=Buffer.allocUnsafe(n);
var p=list.head;
var c=1;
p.data.copy(ret);
n-=p.data.length;
while(p=p.next){
var buf=p.data;
var nb=n>buf.length?buf.length:n;
buf.copy(ret,ret.length-n,0,nb);
n-=nb;
if(n===0){
if(nb===buf.length){
++c;
if(p.next)list.head=p.next;else list.head=list.tail=null;
}else{
list.head=p;
p.data=buf.slice(nb);
}
break;
}
++c;
}
list.length-=c;
return ret;
}

function endReadable(stream){
var state=stream._readableState;



if(state.length>0)throw new Error('"endReadable()" called on non-empty stream');

if(!state.endEmitted){
state.ended=true;
pna.nextTick(endReadableNT,state,stream);
}
}

function endReadableNT(state,stream){

if(!state.endEmitted&&state.length===0){
state.endEmitted=true;
stream.readable=false;
stream.emit('end');
}
}

function indexOf(xs,x){
for(var i=0,l=xs.length;i<l;i++){
if(xs[i]===x)return i;
}
return-1;
}
}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
},{"./_stream_duplex":163,"./internal/streams/BufferList":168,"./internal/streams/destroy":169,"./internal/streams/stream":170,"_process":158,"core-util-is":103,"events":108,"inherits":113,"isarray":121,"process-nextick-args":157,"safe-buffer":178,"string_decoder/":171,"util":98}],166:[function(require,module,exports){































































'use strict';

module.exports=Transform;

var Duplex=require('./_stream_duplex');


var util=require('core-util-is');
util.inherits=require('inherits');


util.inherits(Transform,Duplex);

function afterTransform(er,data){
var ts=this._transformState;
ts.transforming=false;

var cb=ts.writecb;

if(!cb){
return this.emit('error',new Error('write callback called multiple times'));
}

ts.writechunk=null;
ts.writecb=null;

if(data!=null)
this.push(data);

cb(er);

var rs=this._readableState;
rs.reading=false;
if(rs.needReadable||rs.length<rs.highWaterMark){
this._read(rs.highWaterMark);
}
}

function Transform(options){
if(!(this instanceof Transform))return new Transform(options);

Duplex.call(this,options);

this._transformState={
afterTransform:afterTransform.bind(this),
needTransform:false,
transforming:false,
writecb:null,
writechunk:null,
writeencoding:null};



this._readableState.needReadable=true;




this._readableState.sync=false;

if(options){
if(typeof options.transform==='function')this._transform=options.transform;

if(typeof options.flush==='function')this._flush=options.flush;
}


this.on('prefinish',prefinish);
}

function prefinish(){
var _this=this;

if(typeof this._flush==='function'){
this._flush(function(er,data){
done(_this,er,data);
});
}else{
done(this,null,null);
}
}

Transform.prototype.push=function(chunk,encoding){
this._transformState.needTransform=false;
return Duplex.prototype.push.call(this,chunk,encoding);
};











Transform.prototype._transform=function(chunk,encoding,cb){
throw new Error('_transform() is not implemented');
};

Transform.prototype._write=function(chunk,encoding,cb){
var ts=this._transformState;
ts.writecb=cb;
ts.writechunk=chunk;
ts.writeencoding=encoding;
if(!ts.transforming){
var rs=this._readableState;
if(ts.needTransform||rs.needReadable||rs.length<rs.highWaterMark)this._read(rs.highWaterMark);
}
};




Transform.prototype._read=function(n){
var ts=this._transformState;

if(ts.writechunk!==null&&ts.writecb&&!ts.transforming){
ts.transforming=true;
this._transform(ts.writechunk,ts.writeencoding,ts.afterTransform);
}else{


ts.needTransform=true;
}
};

Transform.prototype._destroy=function(err,cb){
var _this2=this;

Duplex.prototype._destroy.call(this,err,function(err2){
cb(err2);
_this2.emit('close');
});
};

function done(stream,er,data){
if(er)return stream.emit('error',er);

if(data!=null)
stream.push(data);



if(stream._writableState.length)throw new Error('Calling transform done when ws.length != 0');

if(stream._transformState.transforming)throw new Error('Calling transform done when still transforming');

return stream.push(null);
}
},{"./_stream_duplex":163,"core-util-is":103,"inherits":113}],167:[function(require,module,exports){
(function(process,global,setImmediate){

























'use strict';



var pna=require('process-nextick-args');


module.exports=Writable;


function WriteReq(chunk,encoding,cb){
this.chunk=chunk;
this.encoding=encoding;
this.callback=cb;
this.next=null;
}



function CorkedRequest(state){
var _this=this;

this.next=null;
this.entry=null;
this.finish=function(){
onCorkedFinish(_this,state);
};
}



var asyncWrite=!process.browser&&['v0.10','v0.9.'].indexOf(process.version.slice(0,5))>-1?setImmediate:pna.nextTick;



var Duplex;


Writable.WritableState=WritableState;


var util=require('core-util-is');
util.inherits=require('inherits');



var internalUtil={
deprecate:require('util-deprecate')};




var Stream=require('./internal/streams/stream');




var Buffer=require('safe-buffer').Buffer;
var OurUint8Array=global.Uint8Array||function(){};
function _uint8ArrayToBuffer(chunk){
return Buffer.from(chunk);
}
function _isUint8Array(obj){
return Buffer.isBuffer(obj)||obj instanceof OurUint8Array;
}



var destroyImpl=require('./internal/streams/destroy');

util.inherits(Writable,Stream);

function nop(){}

function WritableState(options,stream){
Duplex=Duplex||require('./_stream_duplex');

options=options||{};






var isDuplex=stream instanceof Duplex;



this.objectMode=!!options.objectMode;

if(isDuplex)this.objectMode=this.objectMode||!!options.writableObjectMode;




var hwm=options.highWaterMark;
var writableHwm=options.writableHighWaterMark;
var defaultHwm=this.objectMode?16:16*1024;

if(hwm||hwm===0)this.highWaterMark=hwm;else if(isDuplex&&(writableHwm||writableHwm===0))this.highWaterMark=writableHwm;else this.highWaterMark=defaultHwm;


this.highWaterMark=Math.floor(this.highWaterMark);


this.finalCalled=false;


this.needDrain=false;

this.ending=false;

this.ended=false;

this.finished=false;


this.destroyed=false;




var noDecode=options.decodeStrings===false;
this.decodeStrings=!noDecode;




this.defaultEncoding=options.defaultEncoding||'utf8';




this.length=0;


this.writing=false;


this.corked=0;





this.sync=true;




this.bufferProcessing=false;


this.onwrite=function(er){
onwrite(stream,er);
};


this.writecb=null;


this.writelen=0;

this.bufferedRequest=null;
this.lastBufferedRequest=null;



this.pendingcb=0;



this.prefinished=false;


this.errorEmitted=false;


this.bufferedRequestCount=0;



this.corkedRequestsFree=new CorkedRequest(this);
}

WritableState.prototype.getBuffer=function getBuffer(){
var current=this.bufferedRequest;
var out=[];
while(current){
out.push(current);
current=current.next;
}
return out;
};

(function(){
try{
Object.defineProperty(WritableState.prototype,'buffer',{
get:internalUtil.deprecate(function(){
return this.getBuffer();
},'_writableState.buffer is deprecated. Use _writableState.getBuffer '+'instead.','DEP0003')});

}catch(_){}
})();



var realHasInstance;
if(typeof Symbol==='function'&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==='function'){
realHasInstance=Function.prototype[Symbol.hasInstance];
Object.defineProperty(Writable,Symbol.hasInstance,{
value:function(object){
if(realHasInstance.call(this,object))return true;
if(this!==Writable)return false;

return object&&object._writableState instanceof WritableState;
}});

}else{
realHasInstance=function(object){
return object instanceof this;
};
}

function Writable(options){
Duplex=Duplex||require('./_stream_duplex');








if(!realHasInstance.call(Writable,this)&&!(this instanceof Duplex)){
return new Writable(options);
}

this._writableState=new WritableState(options,this);


this.writable=true;

if(options){
if(typeof options.write==='function')this._write=options.write;

if(typeof options.writev==='function')this._writev=options.writev;

if(typeof options.destroy==='function')this._destroy=options.destroy;

if(typeof options.final==='function')this._final=options.final;
}

Stream.call(this);
}


Writable.prototype.pipe=function(){
this.emit('error',new Error('Cannot pipe, not readable'));
};

function writeAfterEnd(stream,cb){
var er=new Error('write after end');

stream.emit('error',er);
pna.nextTick(cb,er);
}




function validChunk(stream,state,chunk,cb){
var valid=true;
var er=false;

if(chunk===null){
er=new TypeError('May not write null values to stream');
}else if(typeof chunk!=='string'&&chunk!==undefined&&!state.objectMode){
er=new TypeError('Invalid non-string/buffer chunk');
}
if(er){
stream.emit('error',er);
pna.nextTick(cb,er);
valid=false;
}
return valid;
}

Writable.prototype.write=function(chunk,encoding,cb){
var state=this._writableState;
var ret=false;
var isBuf=!state.objectMode&&_isUint8Array(chunk);

if(isBuf&&!Buffer.isBuffer(chunk)){
chunk=_uint8ArrayToBuffer(chunk);
}

if(typeof encoding==='function'){
cb=encoding;
encoding=null;
}

if(isBuf)encoding='buffer';else if(!encoding)encoding=state.defaultEncoding;

if(typeof cb!=='function')cb=nop;

if(state.ended)writeAfterEnd(this,cb);else if(isBuf||validChunk(this,state,chunk,cb)){
state.pendingcb++;
ret=writeOrBuffer(this,state,isBuf,chunk,encoding,cb);
}

return ret;
};

Writable.prototype.cork=function(){
var state=this._writableState;

state.corked++;
};

Writable.prototype.uncork=function(){
var state=this._writableState;

if(state.corked){
state.corked--;

if(!state.writing&&!state.corked&&!state.finished&&!state.bufferProcessing&&state.bufferedRequest)clearBuffer(this,state);
}
};

Writable.prototype.setDefaultEncoding=function setDefaultEncoding(encoding){

if(typeof encoding==='string')encoding=encoding.toLowerCase();
if(!(['hex','utf8','utf-8','ascii','binary','base64','ucs2','ucs-2','utf16le','utf-16le','raw'].indexOf((encoding+'').toLowerCase())>-1))throw new TypeError('Unknown encoding: '+encoding);
this._writableState.defaultEncoding=encoding;
return this;
};

function decodeChunk(state,chunk,encoding){
if(!state.objectMode&&state.decodeStrings!==false&&typeof chunk==='string'){
chunk=Buffer.from(chunk,encoding);
}
return chunk;
}

Object.defineProperty(Writable.prototype,'writableHighWaterMark',{



enumerable:false,
get:function(){
return this._writableState.highWaterMark;
}});





function writeOrBuffer(stream,state,isBuf,chunk,encoding,cb){
if(!isBuf){
var newChunk=decodeChunk(state,chunk,encoding);
if(chunk!==newChunk){
isBuf=true;
encoding='buffer';
chunk=newChunk;
}
}
var len=state.objectMode?1:chunk.length;

state.length+=len;

var ret=state.length<state.highWaterMark;

if(!ret)state.needDrain=true;

if(state.writing||state.corked){
var last=state.lastBufferedRequest;
state.lastBufferedRequest={
chunk:chunk,
encoding:encoding,
isBuf:isBuf,
callback:cb,
next:null};

if(last){
last.next=state.lastBufferedRequest;
}else{
state.bufferedRequest=state.lastBufferedRequest;
}
state.bufferedRequestCount+=1;
}else{
doWrite(stream,state,false,len,chunk,encoding,cb);
}

return ret;
}

function doWrite(stream,state,writev,len,chunk,encoding,cb){
state.writelen=len;
state.writecb=cb;
state.writing=true;
state.sync=true;
if(writev)stream._writev(chunk,state.onwrite);else stream._write(chunk,encoding,state.onwrite);
state.sync=false;
}

function onwriteError(stream,state,sync,er,cb){
--state.pendingcb;

if(sync){


pna.nextTick(cb,er);


pna.nextTick(finishMaybe,stream,state);
stream._writableState.errorEmitted=true;
stream.emit('error',er);
}else{


cb(er);
stream._writableState.errorEmitted=true;
stream.emit('error',er);


finishMaybe(stream,state);
}
}

function onwriteStateUpdate(state){
state.writing=false;
state.writecb=null;
state.length-=state.writelen;
state.writelen=0;
}

function onwrite(stream,er){
var state=stream._writableState;
var sync=state.sync;
var cb=state.writecb;

onwriteStateUpdate(state);

if(er)onwriteError(stream,state,sync,er,cb);else{

var finished=needFinish(state);

if(!finished&&!state.corked&&!state.bufferProcessing&&state.bufferedRequest){
clearBuffer(stream,state);
}

if(sync){

asyncWrite(afterWrite,stream,state,finished,cb);

}else{
afterWrite(stream,state,finished,cb);
}
}
}

function afterWrite(stream,state,finished,cb){
if(!finished)onwriteDrain(stream,state);
state.pendingcb--;
cb();
finishMaybe(stream,state);
}




function onwriteDrain(stream,state){
if(state.length===0&&state.needDrain){
state.needDrain=false;
stream.emit('drain');
}
}


function clearBuffer(stream,state){
state.bufferProcessing=true;
var entry=state.bufferedRequest;

if(stream._writev&&entry&&entry.next){

var l=state.bufferedRequestCount;
var buffer=new Array(l);
var holder=state.corkedRequestsFree;
holder.entry=entry;

var count=0;
var allBuffers=true;
while(entry){
buffer[count]=entry;
if(!entry.isBuf)allBuffers=false;
entry=entry.next;
count+=1;
}
buffer.allBuffers=allBuffers;

doWrite(stream,state,true,state.length,buffer,'',holder.finish);



state.pendingcb++;
state.lastBufferedRequest=null;
if(holder.next){
state.corkedRequestsFree=holder.next;
holder.next=null;
}else{
state.corkedRequestsFree=new CorkedRequest(state);
}
state.bufferedRequestCount=0;
}else{

while(entry){
var chunk=entry.chunk;
var encoding=entry.encoding;
var cb=entry.callback;
var len=state.objectMode?1:chunk.length;

doWrite(stream,state,false,len,chunk,encoding,cb);
entry=entry.next;
state.bufferedRequestCount--;




if(state.writing){
break;
}
}

if(entry===null)state.lastBufferedRequest=null;
}

state.bufferedRequest=entry;
state.bufferProcessing=false;
}

Writable.prototype._write=function(chunk,encoding,cb){
cb(new Error('_write() is not implemented'));
};

Writable.prototype._writev=null;

Writable.prototype.end=function(chunk,encoding,cb){
var state=this._writableState;

if(typeof chunk==='function'){
cb=chunk;
chunk=null;
encoding=null;
}else if(typeof encoding==='function'){
cb=encoding;
encoding=null;
}

if(chunk!==null&&chunk!==undefined)this.write(chunk,encoding);


if(state.corked){
state.corked=1;
this.uncork();
}


if(!state.ending&&!state.finished)endWritable(this,state,cb);
};

function needFinish(state){
return state.ending&&state.length===0&&state.bufferedRequest===null&&!state.finished&&!state.writing;
}
function callFinal(stream,state){
stream._final(function(err){
state.pendingcb--;
if(err){
stream.emit('error',err);
}
state.prefinished=true;
stream.emit('prefinish');
finishMaybe(stream,state);
});
}
function prefinish(stream,state){
if(!state.prefinished&&!state.finalCalled){
if(typeof stream._final==='function'){
state.pendingcb++;
state.finalCalled=true;
pna.nextTick(callFinal,stream,state);
}else{
state.prefinished=true;
stream.emit('prefinish');
}
}
}

function finishMaybe(stream,state){
var need=needFinish(state);
if(need){
prefinish(stream,state);
if(state.pendingcb===0){
state.finished=true;
stream.emit('finish');
}
}
return need;
}

function endWritable(stream,state,cb){
state.ending=true;
finishMaybe(stream,state);
if(cb){
if(state.finished)pna.nextTick(cb);else stream.once('finish',cb);
}
state.ended=true;
stream.writable=false;
}

function onCorkedFinish(corkReq,state,err){
var entry=corkReq.entry;
corkReq.entry=null;
while(entry){
var cb=entry.callback;
state.pendingcb--;
cb(err);
entry=entry.next;
}
if(state.corkedRequestsFree){
state.corkedRequestsFree.next=corkReq;
}else{
state.corkedRequestsFree=corkReq;
}
}

Object.defineProperty(Writable.prototype,'destroyed',{
get:function(){
if(this._writableState===undefined){
return false;
}
return this._writableState.destroyed;
},
set:function(value){


if(!this._writableState){
return;
}



this._writableState.destroyed=value;
}});


Writable.prototype.destroy=destroyImpl.destroy;
Writable.prototype._undestroy=destroyImpl.undestroy;
Writable.prototype._destroy=function(err,cb){
this.end();
cb(err);
};
}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},require("timers").setImmediate);
},{"./_stream_duplex":163,"./internal/streams/destroy":169,"./internal/streams/stream":170,"_process":158,"core-util-is":103,"inherits":113,"process-nextick-args":157,"safe-buffer":178,"timers":188,"util-deprecate":189}],168:[function(require,module,exports){
'use strict';

function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}

var Buffer=require('safe-buffer').Buffer;
var util=require('util');

function copyBuffer(src,target,offset){
src.copy(target,offset);
}

module.exports=function(){
function BufferList(){
_classCallCheck(this,BufferList);

this.head=null;
this.tail=null;
this.length=0;
}

BufferList.prototype.push=function push(v){
var entry={data:v,next:null};
if(this.length>0)this.tail.next=entry;else this.head=entry;
this.tail=entry;
++this.length;
};

BufferList.prototype.unshift=function unshift(v){
var entry={data:v,next:this.head};
if(this.length===0)this.tail=entry;
this.head=entry;
++this.length;
};

BufferList.prototype.shift=function shift(){
if(this.length===0)return;
var ret=this.head.data;
if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;
--this.length;
return ret;
};

BufferList.prototype.clear=function clear(){
this.head=this.tail=null;
this.length=0;
};

BufferList.prototype.join=function join(s){
if(this.length===0)return'';
var p=this.head;
var ret=''+p.data;
while(p=p.next){
ret+=s+p.data;
}return ret;
};

BufferList.prototype.concat=function concat(n){
if(this.length===0)return Buffer.alloc(0);
if(this.length===1)return this.head.data;
var ret=Buffer.allocUnsafe(n>>>0);
var p=this.head;
var i=0;
while(p){
copyBuffer(p.data,ret,i);
i+=p.data.length;
p=p.next;
}
return ret;
};

return BufferList;
}();

if(util&&util.inspect&&util.inspect.custom){
module.exports.prototype[util.inspect.custom]=function(){
var obj=util.inspect({length:this.length});
return this.constructor.name+' '+obj;
};
}
},{"safe-buffer":178,"util":98}],169:[function(require,module,exports){
'use strict';



var pna=require('process-nextick-args');



function destroy(err,cb){
var _this=this;

var readableDestroyed=this._readableState&&this._readableState.destroyed;
var writableDestroyed=this._writableState&&this._writableState.destroyed;

if(readableDestroyed||writableDestroyed){
if(cb){
cb(err);
}else if(err&&(!this._writableState||!this._writableState.errorEmitted)){
pna.nextTick(emitErrorNT,this,err);
}
return this;
}




if(this._readableState){
this._readableState.destroyed=true;
}


if(this._writableState){
this._writableState.destroyed=true;
}

this._destroy(err||null,function(err){
if(!cb&&err){
pna.nextTick(emitErrorNT,_this,err);
if(_this._writableState){
_this._writableState.errorEmitted=true;
}
}else if(cb){
cb(err);
}
});

return this;
}

function undestroy(){
if(this._readableState){
this._readableState.destroyed=false;
this._readableState.reading=false;
this._readableState.ended=false;
this._readableState.endEmitted=false;
}

if(this._writableState){
this._writableState.destroyed=false;
this._writableState.ended=false;
this._writableState.ending=false;
this._writableState.finished=false;
this._writableState.errorEmitted=false;
}
}

function emitErrorNT(self,err){
self.emit('error',err);
}

module.exports={
destroy:destroy,
undestroy:undestroy};

},{"process-nextick-args":157}],170:[function(require,module,exports){
module.exports=require('events').EventEmitter;

},{"events":108}],171:[function(require,module,exports){





















'use strict';



var Buffer=require('safe-buffer').Buffer;


var isEncoding=Buffer.isEncoding||function(encoding){
encoding=''+encoding;
switch(encoding&&encoding.toLowerCase()){
case'hex':case'utf8':case'utf-8':case'ascii':case'binary':case'base64':case'ucs2':case'ucs-2':case'utf16le':case'utf-16le':case'raw':
return true;
default:
return false;}

};

function _normalizeEncoding(enc){
if(!enc)return'utf8';
var retried;
while(true){
switch(enc){
case'utf8':
case'utf-8':
return'utf8';
case'ucs2':
case'ucs-2':
case'utf16le':
case'utf-16le':
return'utf16le';
case'latin1':
case'binary':
return'latin1';
case'base64':
case'ascii':
case'hex':
return enc;
default:
if(retried)return;
enc=(''+enc).toLowerCase();
retried=true;}

}
};



function normalizeEncoding(enc){
var nenc=_normalizeEncoding(enc);
if(typeof nenc!=='string'&&(Buffer.isEncoding===isEncoding||!isEncoding(enc)))throw new Error('Unknown encoding: '+enc);
return nenc||enc;
}




exports.StringDecoder=StringDecoder;
function StringDecoder(encoding){
this.encoding=normalizeEncoding(encoding);
var nb;
switch(this.encoding){
case'utf16le':
this.text=utf16Text;
this.end=utf16End;
nb=4;
break;
case'utf8':
this.fillLast=utf8FillLast;
nb=4;
break;
case'base64':
this.text=base64Text;
this.end=base64End;
nb=3;
break;
default:
this.write=simpleWrite;
this.end=simpleEnd;
return;}

this.lastNeed=0;
this.lastTotal=0;
this.lastChar=Buffer.allocUnsafe(nb);
}

StringDecoder.prototype.write=function(buf){
if(buf.length===0)return'';
var r;
var i;
if(this.lastNeed){
r=this.fillLast(buf);
if(r===undefined)return'';
i=this.lastNeed;
this.lastNeed=0;
}else{
i=0;
}
if(i<buf.length)return r?r+this.text(buf,i):this.text(buf,i);
return r||'';
};

StringDecoder.prototype.end=utf8End;


StringDecoder.prototype.text=utf8Text;


StringDecoder.prototype.fillLast=function(buf){
if(this.lastNeed<=buf.length){
buf.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed);
return this.lastChar.toString(this.encoding,0,this.lastTotal);
}
buf.copy(this.lastChar,this.lastTotal-this.lastNeed,0,buf.length);
this.lastNeed-=buf.length;
};



function utf8CheckByte(byte){
if(byte<=0x7F)return 0;else if(byte>>5===0x06)return 2;else if(byte>>4===0x0E)return 3;else if(byte>>3===0x1E)return 4;
return byte>>6===0x02?-1:-2;
}




function utf8CheckIncomplete(self,buf,i){
var j=buf.length-1;
if(j<i)return 0;
var nb=utf8CheckByte(buf[j]);
if(nb>=0){
if(nb>0)self.lastNeed=nb-1;
return nb;
}
if(--j<i||nb===-2)return 0;
nb=utf8CheckByte(buf[j]);
if(nb>=0){
if(nb>0)self.lastNeed=nb-2;
return nb;
}
if(--j<i||nb===-2)return 0;
nb=utf8CheckByte(buf[j]);
if(nb>=0){
if(nb>0){
if(nb===2)nb=0;else self.lastNeed=nb-3;
}
return nb;
}
return 0;
}









function utf8CheckExtraBytes(self,buf,p){
if((buf[0]&0xC0)!==0x80){
self.lastNeed=0;
return'\ufffd';
}
if(self.lastNeed>1&&buf.length>1){
if((buf[1]&0xC0)!==0x80){
self.lastNeed=1;
return'\ufffd';
}
if(self.lastNeed>2&&buf.length>2){
if((buf[2]&0xC0)!==0x80){
self.lastNeed=2;
return'\ufffd';
}
}
}
}


function utf8FillLast(buf){
var p=this.lastTotal-this.lastNeed;
var r=utf8CheckExtraBytes(this,buf,p);
if(r!==undefined)return r;
if(this.lastNeed<=buf.length){
buf.copy(this.lastChar,p,0,this.lastNeed);
return this.lastChar.toString(this.encoding,0,this.lastTotal);
}
buf.copy(this.lastChar,p,0,buf.length);
this.lastNeed-=buf.length;
}




function utf8Text(buf,i){
var total=utf8CheckIncomplete(this,buf,i);
if(!this.lastNeed)return buf.toString('utf8',i);
this.lastTotal=total;
var end=buf.length-(total-this.lastNeed);
buf.copy(this.lastChar,0,end);
return buf.toString('utf8',i,end);
}



function utf8End(buf){
var r=buf&&buf.length?this.write(buf):'';
if(this.lastNeed)return r+'\ufffd';
return r;
}





function utf16Text(buf,i){
if((buf.length-i)%2===0){
var r=buf.toString('utf16le',i);
if(r){
var c=r.charCodeAt(r.length-1);
if(c>=0xD800&&c<=0xDBFF){
this.lastNeed=2;
this.lastTotal=4;
this.lastChar[0]=buf[buf.length-2];
this.lastChar[1]=buf[buf.length-1];
return r.slice(0,-1);
}
}
return r;
}
this.lastNeed=1;
this.lastTotal=2;
this.lastChar[0]=buf[buf.length-1];
return buf.toString('utf16le',i,buf.length-1);
}



function utf16End(buf){
var r=buf&&buf.length?this.write(buf):'';
if(this.lastNeed){
var end=this.lastTotal-this.lastNeed;
return r+this.lastChar.toString('utf16le',0,end);
}
return r;
}

function base64Text(buf,i){
var n=(buf.length-i)%3;
if(n===0)return buf.toString('base64',i);
this.lastNeed=3-n;
this.lastTotal=3;
if(n===1){
this.lastChar[0]=buf[buf.length-1];
}else{
this.lastChar[0]=buf[buf.length-2];
this.lastChar[1]=buf[buf.length-1];
}
return buf.toString('base64',i,buf.length-n);
}

function base64End(buf){
var r=buf&&buf.length?this.write(buf):'';
if(this.lastNeed)return r+this.lastChar.toString('base64',0,3-this.lastNeed);
return r;
}


function simpleWrite(buf){
return buf.toString(this.encoding);
}

function simpleEnd(buf){
return buf&&buf.length?this.write(buf):'';
}
},{"safe-buffer":178}],172:[function(require,module,exports){
module.exports=require('./readable').PassThrough;

},{"./readable":173}],173:[function(require,module,exports){
exports=module.exports=require('./lib/_stream_readable.js');
exports.Stream=exports;
exports.Readable=exports;
exports.Writable=require('./lib/_stream_writable.js');
exports.Duplex=require('./lib/_stream_duplex.js');
exports.Transform=require('./lib/_stream_transform.js');
exports.PassThrough=require('./lib/_stream_passthrough.js');

},{"./lib/_stream_duplex.js":163,"./lib/_stream_passthrough.js":164,"./lib/_stream_readable.js":165,"./lib/_stream_transform.js":166,"./lib/_stream_writable.js":167}],174:[function(require,module,exports){
module.exports=require('./readable').Transform;

},{"./readable":173}],175:[function(require,module,exports){
module.exports=require('./lib/_stream_writable.js');

},{"./lib/_stream_writable.js":167}],176:[function(require,module,exports){
var URL=require('url').URL;











function trimLine(line){
if(!line){
return null;
}

if(Array.isArray(line)){
return line.map(trimLine);
}

return String(line).trim();
}








function removeComments(line){
var commentStartIndex=line.indexOf('#');
if(commentStartIndex>-1){
return line.substr(0,commentStartIndex);
}

return line;
}








function splitLine(line){
var idx=String(line).indexOf(':');

if(!line||idx<0){
return null;
}

return[line.slice(0,idx),line.slice(idx+1)];
}









function formatUserAgent(userAgent){
var formattedUserAgent=userAgent.toLowerCase();


var idx=formattedUserAgent.indexOf('/');
if(idx>-1){
formattedUserAgent=formattedUserAgent.substr(0,idx);
}

return formattedUserAgent.trim();
}









function normaliseEncoding(path){
try{
return urlEncodeToUpper(encodeURI(path).replace(/%25/g,'%'));
}catch(e){
return path;
}
}










function urlEncodeToUpper(path){
return path.replace(/%[0-9a-fA-F]{2}/g,function(match){
return match.toUpperCase();
});
}











function parsePattern(pattern){
var regexSpecialChars=/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g;
var wildCardPattern=/\*/g;
var endOfLinePattern=/\\\$$/;

pattern=normaliseEncoding(pattern);

if(pattern.indexOf('*')<0&&pattern.indexOf('$')<0){
return pattern;
}

pattern=pattern.
replace(regexSpecialChars,'\\$&').
replace(wildCardPattern,'(?:.*)').
replace(endOfLinePattern,'$');

return new RegExp(pattern);
}

function parseRobots(contents,robots){
var newlineRegex=/\r\n|\r|\n/;
var lines=contents.
split(newlineRegex).
map(removeComments).
map(splitLine).
map(trimLine);

var currentUserAgents=[];
var isNoneUserAgentState=true;
for(var i=0;i<lines.length;i++){
var line=lines[i];

if(!line||!line[0]){
continue;
}

switch(line[0].toLowerCase()){
case'user-agent':
if(isNoneUserAgentState){
currentUserAgents.length=0;
}

if(line[1]){
currentUserAgents.push(formatUserAgent(line[1]));
}
break;
case'disallow':
robots.addRule(currentUserAgents,line[1],false,i+1);
break;
case'allow':
robots.addRule(currentUserAgents,line[1],true,i+1);
break;
case'crawl-delay':
robots.setCrawlDelay(currentUserAgents,line[1]);
break;
case'sitemap':
if(line[1]){
robots.addSitemap(line[1]);
}
break;
case'host':
if(line[1]){
robots.setPreferredHost(line[1].toLowerCase());
}
break;}


isNoneUserAgentState=line[0].toLowerCase()!=='user-agent';
}
}









function findRule(path,rules){
var matchingRule=null;

for(var i=0;i<rules.length;i++){
var rule=rules[i];

if(typeof rule.pattern==='string'){
if(path.indexOf(rule.pattern)!==0){
continue;
}


if(!matchingRule||rule.pattern.length>matchingRule.pattern.length){
matchingRule=rule;
}


}else if(rule.pattern.test(path)){
return rule;
}
}

return matchingRule;
}










function parseUrl(url){
try{
return new URL(url);
}catch(e){
return null;
}
}


function Robots(url,contents){
this._url=parseUrl(url)||{};
this._url.port=this._url.port||80;

this._rules={};
this._sitemaps=[];
this._preferedHost=null;

parseRobots(contents||'',this);
}










Robots.prototype.addRule=function(userAgents,pattern,allow,lineNumber){
var rules=this._rules;

userAgents.forEach(function(userAgent){
rules[userAgent]=rules[userAgent]||[];

if(!pattern){
return;
}

rules[userAgent].push({
pattern:parsePattern(pattern),
allow:allow,
lineNumber:lineNumber});

});
};







Robots.prototype.setCrawlDelay=function(userAgents,delayStr){
var rules=this._rules;
var delay=Number(delayStr);

userAgents.forEach(function(userAgent){
rules[userAgent]=rules[userAgent]||[];

if(isNaN(delay)){
return;
}

rules[userAgent].crawlDelay=delay;
});
};






Robots.prototype.addSitemap=function(url){
this._sitemaps.push(url);
};






Robots.prototype.setPreferredHost=function(url){
this._preferedHost=url;
};

Robots.prototype._getRule=function(url,ua){
var parsedUrl=parseUrl(url)||{};
var userAgent=formatUserAgent(ua||'*');

parsedUrl.port=parsedUrl.port||'80';


if(parsedUrl.protocol!==this._url.protocol||
parsedUrl.hostname!==this._url.hostname||
parsedUrl.port!==this._url.port){
return;
}

var rules=this._rules[userAgent]||this._rules['*']||[];
var path=urlEncodeToUpper(parsedUrl.pathname+parsedUrl.search);
var rule=findRule(path,rules);

return rule;
};











Robots.prototype.isAllowed=function(url,ua){
var rule=this._getRule(url,ua);

if(typeof rule==='undefined'){
return;
}

return!rule||rule.allow;
};















Robots.prototype.getMatchingLineNumber=function(url,ua){
var rule=this._getRule(url,ua);

return rule?rule.lineNumber:-1;
};








Robots.prototype.isDisallowed=function(url,ua){
return!this.isAllowed(url,ua);
};









Robots.prototype.getCrawlDelay=function(ua){
var userAgent=formatUserAgent(ua||'*');

return(this._rules[userAgent]||this._rules['*']||{}).crawlDelay;
};






Robots.prototype.getPreferredHost=function(){
return this._preferedHost;
};






Robots.prototype.getSitemaps=function(){
return this._sitemaps.slice(0);
};

module.exports=Robots;

},{"url":"url"}],177:[function(require,module,exports){
var Robots=require('./Robots');

module.exports=function(url,contents){
return new Robots(url,contents);
};
},{"./Robots":176}],178:[function(require,module,exports){

var buffer=require('buffer');
var Buffer=buffer.Buffer;


function copyProps(src,dst){
for(var key in src){
dst[key]=src[key];
}
}
if(Buffer.from&&Buffer.alloc&&Buffer.allocUnsafe&&Buffer.allocUnsafeSlow){
module.exports=buffer;
}else{

copyProps(buffer,exports);
exports.Buffer=SafeBuffer;
}

function SafeBuffer(arg,encodingOrOffset,length){
return Buffer(arg,encodingOrOffset,length);
}


copyProps(Buffer,SafeBuffer);

SafeBuffer.from=function(arg,encodingOrOffset,length){
if(typeof arg==='number'){
throw new TypeError('Argument must not be a number');
}
return Buffer(arg,encodingOrOffset,length);
};

SafeBuffer.alloc=function(size,fill,encoding){
if(typeof size!=='number'){
throw new TypeError('Argument must be a number');
}
var buf=Buffer(size);
if(fill!==undefined){
if(typeof encoding==='string'){
buf.fill(fill,encoding);
}else{
buf.fill(fill);
}
}else{
buf.fill(0);
}
return buf;
};

SafeBuffer.allocUnsafe=function(size){
if(typeof size!=='number'){
throw new TypeError('Argument must be a number');
}
return Buffer(size);
};

SafeBuffer.allocUnsafeSlow=function(size){
if(typeof size!=='number'){
throw new TypeError('Argument must be a number');
}
return buffer.SlowBuffer(size);
};

},{"buffer":102}],179:[function(require,module,exports){
(function(process){
exports=module.exports=SemVer;

var debug;

if(typeof process==='object'&&
process.env&&
process.env.NODE_DEBUG&&
/\bsemver\b/i.test(process.env.NODE_DEBUG)){
debug=function(){
var args=Array.prototype.slice.call(arguments,0);
args.unshift('SEMVER');
console.log.apply(console,args);
};
}else{
debug=function(){};
}



exports.SEMVER_SPEC_VERSION='2.0.0';

var MAX_LENGTH=256;
var MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||
9007199254740991;


var MAX_SAFE_COMPONENT_LENGTH=16;


var re=exports.re=[];
var src=exports.src=[];
var R=0;







var NUMERICIDENTIFIER=R++;
src[NUMERICIDENTIFIER]='0|[1-9]\\d*';
var NUMERICIDENTIFIERLOOSE=R++;
src[NUMERICIDENTIFIERLOOSE]='[0-9]+';





var NONNUMERICIDENTIFIER=R++;
src[NONNUMERICIDENTIFIER]='\\d*[a-zA-Z-][a-zA-Z0-9-]*';




var MAINVERSION=R++;
src[MAINVERSION]='('+src[NUMERICIDENTIFIER]+')\\.'+
'('+src[NUMERICIDENTIFIER]+')\\.'+
'('+src[NUMERICIDENTIFIER]+')';

var MAINVERSIONLOOSE=R++;
src[MAINVERSIONLOOSE]='('+src[NUMERICIDENTIFIERLOOSE]+')\\.'+
'('+src[NUMERICIDENTIFIERLOOSE]+')\\.'+
'('+src[NUMERICIDENTIFIERLOOSE]+')';




var PRERELEASEIDENTIFIER=R++;
src[PRERELEASEIDENTIFIER]='(?:'+src[NUMERICIDENTIFIER]+
'|'+src[NONNUMERICIDENTIFIER]+')';

var PRERELEASEIDENTIFIERLOOSE=R++;
src[PRERELEASEIDENTIFIERLOOSE]='(?:'+src[NUMERICIDENTIFIERLOOSE]+
'|'+src[NONNUMERICIDENTIFIER]+')';





var PRERELEASE=R++;
src[PRERELEASE]='(?:-('+src[PRERELEASEIDENTIFIER]+
'(?:\\.'+src[PRERELEASEIDENTIFIER]+')*))';

var PRERELEASELOOSE=R++;
src[PRERELEASELOOSE]='(?:-?('+src[PRERELEASEIDENTIFIERLOOSE]+
'(?:\\.'+src[PRERELEASEIDENTIFIERLOOSE]+')*))';




var BUILDIDENTIFIER=R++;
src[BUILDIDENTIFIER]='[0-9A-Za-z-]+';





var BUILD=R++;
src[BUILD]='(?:\\+('+src[BUILDIDENTIFIER]+
'(?:\\.'+src[BUILDIDENTIFIER]+')*))';










var FULL=R++;
var FULLPLAIN='v?'+src[MAINVERSION]+
src[PRERELEASE]+'?'+
src[BUILD]+'?';

src[FULL]='^'+FULLPLAIN+'$';




var LOOSEPLAIN='[v=\\s]*'+src[MAINVERSIONLOOSE]+
src[PRERELEASELOOSE]+'?'+
src[BUILD]+'?';

var LOOSE=R++;
src[LOOSE]='^'+LOOSEPLAIN+'$';

var GTLT=R++;
src[GTLT]='((?:<|>)?=?)';




var XRANGEIDENTIFIERLOOSE=R++;
src[XRANGEIDENTIFIERLOOSE]=src[NUMERICIDENTIFIERLOOSE]+'|x|X|\\*';
var XRANGEIDENTIFIER=R++;
src[XRANGEIDENTIFIER]=src[NUMERICIDENTIFIER]+'|x|X|\\*';

var XRANGEPLAIN=R++;
src[XRANGEPLAIN]='[v=\\s]*('+src[XRANGEIDENTIFIER]+')'+
'(?:\\.('+src[XRANGEIDENTIFIER]+')'+
'(?:\\.('+src[XRANGEIDENTIFIER]+')'+
'(?:'+src[PRERELEASE]+')?'+
src[BUILD]+'?'+
')?)?';

var XRANGEPLAINLOOSE=R++;
src[XRANGEPLAINLOOSE]='[v=\\s]*('+src[XRANGEIDENTIFIERLOOSE]+')'+
'(?:\\.('+src[XRANGEIDENTIFIERLOOSE]+')'+
'(?:\\.('+src[XRANGEIDENTIFIERLOOSE]+')'+
'(?:'+src[PRERELEASELOOSE]+')?'+
src[BUILD]+'?'+
')?)?';

var XRANGE=R++;
src[XRANGE]='^'+src[GTLT]+'\\s*'+src[XRANGEPLAIN]+'$';
var XRANGELOOSE=R++;
src[XRANGELOOSE]='^'+src[GTLT]+'\\s*'+src[XRANGEPLAINLOOSE]+'$';



var COERCE=R++;
src[COERCE]='(?:^|[^\\d])'+
'(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'})'+
'(?:\\.(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'}))?'+
'(?:\\.(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'}))?'+
'(?:$|[^\\d])';



var LONETILDE=R++;
src[LONETILDE]='(?:~>?)';

var TILDETRIM=R++;
src[TILDETRIM]='(\\s*)'+src[LONETILDE]+'\\s+';
re[TILDETRIM]=new RegExp(src[TILDETRIM],'g');
var tildeTrimReplace='$1~';

var TILDE=R++;
src[TILDE]='^'+src[LONETILDE]+src[XRANGEPLAIN]+'$';
var TILDELOOSE=R++;
src[TILDELOOSE]='^'+src[LONETILDE]+src[XRANGEPLAINLOOSE]+'$';



var LONECARET=R++;
src[LONECARET]='(?:\\^)';

var CARETTRIM=R++;
src[CARETTRIM]='(\\s*)'+src[LONECARET]+'\\s+';
re[CARETTRIM]=new RegExp(src[CARETTRIM],'g');
var caretTrimReplace='$1^';

var CARET=R++;
src[CARET]='^'+src[LONECARET]+src[XRANGEPLAIN]+'$';
var CARETLOOSE=R++;
src[CARETLOOSE]='^'+src[LONECARET]+src[XRANGEPLAINLOOSE]+'$';


var COMPARATORLOOSE=R++;
src[COMPARATORLOOSE]='^'+src[GTLT]+'\\s*('+LOOSEPLAIN+')$|^$';
var COMPARATOR=R++;
src[COMPARATOR]='^'+src[GTLT]+'\\s*('+FULLPLAIN+')$|^$';



var COMPARATORTRIM=R++;
src[COMPARATORTRIM]='(\\s*)'+src[GTLT]+
'\\s*('+LOOSEPLAIN+'|'+src[XRANGEPLAIN]+')';


re[COMPARATORTRIM]=new RegExp(src[COMPARATORTRIM],'g');
var comparatorTrimReplace='$1$2$3';





var HYPHENRANGE=R++;
src[HYPHENRANGE]='^\\s*('+src[XRANGEPLAIN]+')'+
'\\s+-\\s+'+
'('+src[XRANGEPLAIN]+')'+
'\\s*$';

var HYPHENRANGELOOSE=R++;
src[HYPHENRANGELOOSE]='^\\s*('+src[XRANGEPLAINLOOSE]+')'+
'\\s+-\\s+'+
'('+src[XRANGEPLAINLOOSE]+')'+
'\\s*$';


var STAR=R++;
src[STAR]='(<|>)?=?\\s*\\*';



for(var i=0;i<R;i++){
debug(i,src[i]);
if(!re[i]){
re[i]=new RegExp(src[i]);
}
}

exports.parse=parse;
function parse(version,options){
if(!options||typeof options!=='object'){
options={
loose:!!options,
includePrerelease:false};

}

if(version instanceof SemVer){
return version;
}

if(typeof version!=='string'){
return null;
}

if(version.length>MAX_LENGTH){
return null;
}

var r=options.loose?re[LOOSE]:re[FULL];
if(!r.test(version)){
return null;
}

try{
return new SemVer(version,options);
}catch(er){
return null;
}
}

exports.valid=valid;
function valid(version,options){
var v=parse(version,options);
return v?v.version:null;
}

exports.clean=clean;
function clean(version,options){
var s=parse(version.trim().replace(/^[=v]+/,''),options);
return s?s.version:null;
}

exports.SemVer=SemVer;

function SemVer(version,options){
if(!options||typeof options!=='object'){
options={
loose:!!options,
includePrerelease:false};

}
if(version instanceof SemVer){
if(version.loose===options.loose){
return version;
}else{
version=version.version;
}
}else if(typeof version!=='string'){
throw new TypeError('Invalid Version: '+version);
}

if(version.length>MAX_LENGTH){
throw new TypeError('version is longer than '+MAX_LENGTH+' characters');
}

if(!(this instanceof SemVer)){
return new SemVer(version,options);
}

debug('SemVer',version,options);
this.options=options;
this.loose=!!options.loose;

var m=version.trim().match(options.loose?re[LOOSE]:re[FULL]);

if(!m){
throw new TypeError('Invalid Version: '+version);
}

this.raw=version;


this.major=+m[1];
this.minor=+m[2];
this.patch=+m[3];

if(this.major>MAX_SAFE_INTEGER||this.major<0){
throw new TypeError('Invalid major version');
}

if(this.minor>MAX_SAFE_INTEGER||this.minor<0){
throw new TypeError('Invalid minor version');
}

if(this.patch>MAX_SAFE_INTEGER||this.patch<0){
throw new TypeError('Invalid patch version');
}


if(!m[4]){
this.prerelease=[];
}else{
this.prerelease=m[4].split('.').map(function(id){
if(/^[0-9]+$/.test(id)){
var num=+id;
if(num>=0&&num<MAX_SAFE_INTEGER){
return num;
}
}
return id;
});
}

this.build=m[5]?m[5].split('.'):[];
this.format();
}

SemVer.prototype.format=function(){
this.version=this.major+'.'+this.minor+'.'+this.patch;
if(this.prerelease.length){
this.version+='-'+this.prerelease.join('.');
}
return this.version;
};

SemVer.prototype.toString=function(){
return this.version;
};

SemVer.prototype.compare=function(other){
debug('SemVer.compare',this.version,this.options,other);
if(!(other instanceof SemVer)){
other=new SemVer(other,this.options);
}

return this.compareMain(other)||this.comparePre(other);
};

SemVer.prototype.compareMain=function(other){
if(!(other instanceof SemVer)){
other=new SemVer(other,this.options);
}

return compareIdentifiers(this.major,other.major)||
compareIdentifiers(this.minor,other.minor)||
compareIdentifiers(this.patch,other.patch);
};

SemVer.prototype.comparePre=function(other){
if(!(other instanceof SemVer)){
other=new SemVer(other,this.options);
}


if(this.prerelease.length&&!other.prerelease.length){
return-1;
}else if(!this.prerelease.length&&other.prerelease.length){
return 1;
}else if(!this.prerelease.length&&!other.prerelease.length){
return 0;
}

var i=0;
do{
var a=this.prerelease[i];
var b=other.prerelease[i];
debug('prerelease compare',i,a,b);
if(a===undefined&&b===undefined){
return 0;
}else if(b===undefined){
return 1;
}else if(a===undefined){
return-1;
}else if(a===b){
continue;
}else{
return compareIdentifiers(a,b);
}
}while(++i);
};



SemVer.prototype.inc=function(release,identifier){
switch(release){
case'premajor':
this.prerelease.length=0;
this.patch=0;
this.minor=0;
this.major++;
this.inc('pre',identifier);
break;
case'preminor':
this.prerelease.length=0;
this.patch=0;
this.minor++;
this.inc('pre',identifier);
break;
case'prepatch':



this.prerelease.length=0;
this.inc('patch',identifier);
this.inc('pre',identifier);
break;


case'prerelease':
if(this.prerelease.length===0){
this.inc('patch',identifier);
}
this.inc('pre',identifier);
break;

case'major':




if(this.minor!==0||
this.patch!==0||
this.prerelease.length===0){
this.major++;
}
this.minor=0;
this.patch=0;
this.prerelease=[];
break;
case'minor':




if(this.patch!==0||this.prerelease.length===0){
this.minor++;
}
this.patch=0;
this.prerelease=[];
break;
case'patch':




if(this.prerelease.length===0){
this.patch++;
}
this.prerelease=[];
break;


case'pre':
if(this.prerelease.length===0){
this.prerelease=[0];
}else{
var i=this.prerelease.length;
while(--i>=0){
if(typeof this.prerelease[i]==='number'){
this.prerelease[i]++;
i=-2;
}
}
if(i===-1){

this.prerelease.push(0);
}
}
if(identifier){


if(this.prerelease[0]===identifier){
if(isNaN(this.prerelease[1])){
this.prerelease=[identifier,0];
}
}else{
this.prerelease=[identifier,0];
}
}
break;

default:
throw new Error('invalid increment argument: '+release);}

this.format();
this.raw=this.version;
return this;
};

exports.inc=inc;
function inc(version,release,loose,identifier){
if(typeof loose==='string'){
identifier=loose;
loose=undefined;
}

try{
return new SemVer(version,loose).inc(release,identifier).version;
}catch(er){
return null;
}
}

exports.diff=diff;
function diff(version1,version2){
if(eq(version1,version2)){
return null;
}else{
var v1=parse(version1);
var v2=parse(version2);
var prefix='';
if(v1.prerelease.length||v2.prerelease.length){
prefix='pre';
var defaultResult='prerelease';
}
for(var key in v1){
if(key==='major'||key==='minor'||key==='patch'){
if(v1[key]!==v2[key]){
return prefix+key;
}
}
}
return defaultResult;
}
}

exports.compareIdentifiers=compareIdentifiers;

var numeric=/^[0-9]+$/;
function compareIdentifiers(a,b){
var anum=numeric.test(a);
var bnum=numeric.test(b);

if(anum&&bnum){
a=+a;
b=+b;
}

return a===b?0:
anum&&!bnum?-1:
bnum&&!anum?1:
a<b?-1:
1;
}

exports.rcompareIdentifiers=rcompareIdentifiers;
function rcompareIdentifiers(a,b){
return compareIdentifiers(b,a);
}

exports.major=major;
function major(a,loose){
return new SemVer(a,loose).major;
}

exports.minor=minor;
function minor(a,loose){
return new SemVer(a,loose).minor;
}

exports.patch=patch;
function patch(a,loose){
return new SemVer(a,loose).patch;
}

exports.compare=compare;
function compare(a,b,loose){
return new SemVer(a,loose).compare(new SemVer(b,loose));
}

exports.compareLoose=compareLoose;
function compareLoose(a,b){
return compare(a,b,true);
}

exports.rcompare=rcompare;
function rcompare(a,b,loose){
return compare(b,a,loose);
}

exports.sort=sort;
function sort(list,loose){
return list.sort(function(a,b){
return exports.compare(a,b,loose);
});
}

exports.rsort=rsort;
function rsort(list,loose){
return list.sort(function(a,b){
return exports.rcompare(a,b,loose);
});
}

exports.gt=gt;
function gt(a,b,loose){
return compare(a,b,loose)>0;
}

exports.lt=lt;
function lt(a,b,loose){
return compare(a,b,loose)<0;
}

exports.eq=eq;
function eq(a,b,loose){
return compare(a,b,loose)===0;
}

exports.neq=neq;
function neq(a,b,loose){
return compare(a,b,loose)!==0;
}

exports.gte=gte;
function gte(a,b,loose){
return compare(a,b,loose)>=0;
}

exports.lte=lte;
function lte(a,b,loose){
return compare(a,b,loose)<=0;
}

exports.cmp=cmp;
function cmp(a,op,b,loose){
switch(op){
case'===':
if(typeof a==='object')
a=a.version;
if(typeof b==='object')
b=b.version;
return a===b;

case'!==':
if(typeof a==='object')
a=a.version;
if(typeof b==='object')
b=b.version;
return a!==b;

case'':
case'=':
case'==':
return eq(a,b,loose);

case'!=':
return neq(a,b,loose);

case'>':
return gt(a,b,loose);

case'>=':
return gte(a,b,loose);

case'<':
return lt(a,b,loose);

case'<=':
return lte(a,b,loose);

default:
throw new TypeError('Invalid operator: '+op);}

}

exports.Comparator=Comparator;
function Comparator(comp,options){
if(!options||typeof options!=='object'){
options={
loose:!!options,
includePrerelease:false};

}

if(comp instanceof Comparator){
if(comp.loose===!!options.loose){
return comp;
}else{
comp=comp.value;
}
}

if(!(this instanceof Comparator)){
return new Comparator(comp,options);
}

debug('comparator',comp,options);
this.options=options;
this.loose=!!options.loose;
this.parse(comp);

if(this.semver===ANY){
this.value='';
}else{
this.value=this.operator+this.semver.version;
}

debug('comp',this);
}

var ANY={};
Comparator.prototype.parse=function(comp){
var r=this.options.loose?re[COMPARATORLOOSE]:re[COMPARATOR];
var m=comp.match(r);

if(!m){
throw new TypeError('Invalid comparator: '+comp);
}

this.operator=m[1];
if(this.operator==='='){
this.operator='';
}


if(!m[2]){
this.semver=ANY;
}else{
this.semver=new SemVer(m[2],this.options.loose);
}
};

Comparator.prototype.toString=function(){
return this.value;
};

Comparator.prototype.test=function(version){
debug('Comparator.test',version,this.options.loose);

if(this.semver===ANY){
return true;
}

if(typeof version==='string'){
version=new SemVer(version,this.options);
}

return cmp(version,this.operator,this.semver,this.options);
};

Comparator.prototype.intersects=function(comp,options){
if(!(comp instanceof Comparator)){
throw new TypeError('a Comparator is required');
}

if(!options||typeof options!=='object'){
options={
loose:!!options,
includePrerelease:false};

}

var rangeTmp;

if(this.operator===''){
rangeTmp=new Range(comp.value,options);
return satisfies(this.value,rangeTmp,options);
}else if(comp.operator===''){
rangeTmp=new Range(this.value,options);
return satisfies(comp.semver,rangeTmp,options);
}

var sameDirectionIncreasing=
(this.operator==='>='||this.operator==='>')&&(
comp.operator==='>='||comp.operator==='>');
var sameDirectionDecreasing=
(this.operator==='<='||this.operator==='<')&&(
comp.operator==='<='||comp.operator==='<');
var sameSemVer=this.semver.version===comp.semver.version;
var differentDirectionsInclusive=
(this.operator==='>='||this.operator==='<=')&&(
comp.operator==='>='||comp.operator==='<=');
var oppositeDirectionsLessThan=
cmp(this.semver,'<',comp.semver,options)&&
(this.operator==='>='||this.operator==='>')&&(
comp.operator==='<='||comp.operator==='<');
var oppositeDirectionsGreaterThan=
cmp(this.semver,'>',comp.semver,options)&&
(this.operator==='<='||this.operator==='<')&&(
comp.operator==='>='||comp.operator==='>');

return sameDirectionIncreasing||sameDirectionDecreasing||
sameSemVer&&differentDirectionsInclusive||
oppositeDirectionsLessThan||oppositeDirectionsGreaterThan;
};

exports.Range=Range;
function Range(range,options){
if(!options||typeof options!=='object'){
options={
loose:!!options,
includePrerelease:false};

}

if(range instanceof Range){
if(range.loose===!!options.loose&&
range.includePrerelease===!!options.includePrerelease){
return range;
}else{
return new Range(range.raw,options);
}
}

if(range instanceof Comparator){
return new Range(range.value,options);
}

if(!(this instanceof Range)){
return new Range(range,options);
}

this.options=options;
this.loose=!!options.loose;
this.includePrerelease=!!options.includePrerelease;


this.raw=range;
this.set=range.split(/\s*\|\|\s*/).map(function(range){
return this.parseRange(range.trim());
},this).filter(function(c){

return c.length;
});

if(!this.set.length){
throw new TypeError('Invalid SemVer Range: '+range);
}

this.format();
}

Range.prototype.format=function(){
this.range=this.set.map(function(comps){
return comps.join(' ').trim();
}).join('||').trim();
return this.range;
};

Range.prototype.toString=function(){
return this.range;
};

Range.prototype.parseRange=function(range){
var loose=this.options.loose;
range=range.trim();

var hr=loose?re[HYPHENRANGELOOSE]:re[HYPHENRANGE];
range=range.replace(hr,hyphenReplace);
debug('hyphen replace',range);

range=range.replace(re[COMPARATORTRIM],comparatorTrimReplace);
debug('comparator trim',range,re[COMPARATORTRIM]);


range=range.replace(re[TILDETRIM],tildeTrimReplace);


range=range.replace(re[CARETTRIM],caretTrimReplace);


range=range.split(/\s+/).join(' ');




var compRe=loose?re[COMPARATORLOOSE]:re[COMPARATOR];
var set=range.split(' ').map(function(comp){
return parseComparator(comp,this.options);
},this).join(' ').split(/\s+/);
if(this.options.loose){

set=set.filter(function(comp){
return!!comp.match(compRe);
});
}
set=set.map(function(comp){
return new Comparator(comp,this.options);
},this);

return set;
};

Range.prototype.intersects=function(range,options){
if(!(range instanceof Range)){
throw new TypeError('a Range is required');
}

return this.set.some(function(thisComparators){
return thisComparators.every(function(thisComparator){
return range.set.some(function(rangeComparators){
return rangeComparators.every(function(rangeComparator){
return thisComparator.intersects(rangeComparator,options);
});
});
});
});
};


exports.toComparators=toComparators;
function toComparators(range,options){
return new Range(range,options).set.map(function(comp){
return comp.map(function(c){
return c.value;
}).join(' ').trim().split(' ');
});
}




function parseComparator(comp,options){
debug('comp',comp,options);
comp=replaceCarets(comp,options);
debug('caret',comp);
comp=replaceTildes(comp,options);
debug('tildes',comp);
comp=replaceXRanges(comp,options);
debug('xrange',comp);
comp=replaceStars(comp,options);
debug('stars',comp);
return comp;
}

function isX(id){
return!id||id.toLowerCase()==='x'||id==='*';
}







function replaceTildes(comp,options){
return comp.trim().split(/\s+/).map(function(comp){
return replaceTilde(comp,options);
}).join(' ');
}

function replaceTilde(comp,options){
var r=options.loose?re[TILDELOOSE]:re[TILDE];
return comp.replace(r,function(_,M,m,p,pr){
debug('tilde',comp,_,M,m,p,pr);
var ret;

if(isX(M)){
ret='';
}else if(isX(m)){
ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
}else if(isX(p)){

ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
}else if(pr){
debug('replaceTilde pr',pr);
ret='>='+M+'.'+m+'.'+p+'-'+pr+
' <'+M+'.'+(+m+1)+'.0';
}else{

ret='>='+M+'.'+m+'.'+p+
' <'+M+'.'+(+m+1)+'.0';
}

debug('tilde return',ret);
return ret;
});
}







function replaceCarets(comp,options){
return comp.trim().split(/\s+/).map(function(comp){
return replaceCaret(comp,options);
}).join(' ');
}

function replaceCaret(comp,options){
debug('caret',comp,options);
var r=options.loose?re[CARETLOOSE]:re[CARET];
return comp.replace(r,function(_,M,m,p,pr){
debug('caret',comp,_,M,m,p,pr);
var ret;

if(isX(M)){
ret='';
}else if(isX(m)){
ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
}else if(isX(p)){
if(M==='0'){
ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
}else{
ret='>='+M+'.'+m+'.0 <'+(+M+1)+'.0.0';
}
}else if(pr){
debug('replaceCaret pr',pr);
if(M==='0'){
if(m==='0'){
ret='>='+M+'.'+m+'.'+p+'-'+pr+
' <'+M+'.'+m+'.'+(+p+1);
}else{
ret='>='+M+'.'+m+'.'+p+'-'+pr+
' <'+M+'.'+(+m+1)+'.0';
}
}else{
ret='>='+M+'.'+m+'.'+p+'-'+pr+
' <'+(+M+1)+'.0.0';
}
}else{
debug('no pr');
if(M==='0'){
if(m==='0'){
ret='>='+M+'.'+m+'.'+p+
' <'+M+'.'+m+'.'+(+p+1);
}else{
ret='>='+M+'.'+m+'.'+p+
' <'+M+'.'+(+m+1)+'.0';
}
}else{
ret='>='+M+'.'+m+'.'+p+
' <'+(+M+1)+'.0.0';
}
}

debug('caret return',ret);
return ret;
});
}

function replaceXRanges(comp,options){
debug('replaceXRanges',comp,options);
return comp.split(/\s+/).map(function(comp){
return replaceXRange(comp,options);
}).join(' ');
}

function replaceXRange(comp,options){
comp=comp.trim();
var r=options.loose?re[XRANGELOOSE]:re[XRANGE];
return comp.replace(r,function(ret,gtlt,M,m,p,pr){
debug('xRange',comp,ret,gtlt,M,m,p,pr);
var xM=isX(M);
var xm=xM||isX(m);
var xp=xm||isX(p);
var anyX=xp;

if(gtlt==='='&&anyX){
gtlt='';
}

if(xM){
if(gtlt==='>'||gtlt==='<'){

ret='<0.0.0';
}else{

ret='*';
}
}else if(gtlt&&anyX){


if(xm){
m=0;
}
p=0;

if(gtlt==='>'){



gtlt='>=';
if(xm){
M=+M+1;
m=0;
p=0;
}else{
m=+m+1;
p=0;
}
}else if(gtlt==='<='){


gtlt='<';
if(xm){
M=+M+1;
}else{
m=+m+1;
}
}

ret=gtlt+M+'.'+m+'.'+p;
}else if(xm){
ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
}else if(xp){
ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
}

debug('xRange return',ret);

return ret;
});
}



function replaceStars(comp,options){
debug('replaceStars',comp,options);

return comp.trim().replace(re[STAR],'');
}






function hyphenReplace($0,
from,fM,fm,fp,fpr,fb,
to,tM,tm,tp,tpr,tb){
if(isX(fM)){
from='';
}else if(isX(fm)){
from='>='+fM+'.0.0';
}else if(isX(fp)){
from='>='+fM+'.'+fm+'.0';
}else{
from='>='+from;
}

if(isX(tM)){
to='';
}else if(isX(tm)){
to='<'+(+tM+1)+'.0.0';
}else if(isX(tp)){
to='<'+tM+'.'+(+tm+1)+'.0';
}else if(tpr){
to='<='+tM+'.'+tm+'.'+tp+'-'+tpr;
}else{
to='<='+to;
}

return(from+' '+to).trim();
}


Range.prototype.test=function(version){
if(!version){
return false;
}

if(typeof version==='string'){
version=new SemVer(version,this.options);
}

for(var i=0;i<this.set.length;i++){
if(testSet(this.set[i],version,this.options)){
return true;
}
}
return false;
};

function testSet(set,version,options){
for(var i=0;i<set.length;i++){
if(!set[i].test(version)){
return false;
}
}

if(version.prerelease.length&&!options.includePrerelease){





for(i=0;i<set.length;i++){
debug(set[i].semver);
if(set[i].semver===ANY){
continue;
}

if(set[i].semver.prerelease.length>0){
var allowed=set[i].semver;
if(allowed.major===version.major&&
allowed.minor===version.minor&&
allowed.patch===version.patch){
return true;
}
}
}


return false;
}

return true;
}

exports.satisfies=satisfies;
function satisfies(version,range,options){
try{
range=new Range(range,options);
}catch(er){
return false;
}
return range.test(version);
}

exports.maxSatisfying=maxSatisfying;
function maxSatisfying(versions,range,options){
var max=null;
var maxSV=null;
try{
var rangeObj=new Range(range,options);
}catch(er){
return null;
}
versions.forEach(function(v){
if(rangeObj.test(v)){

if(!max||maxSV.compare(v)===-1){

max=v;
maxSV=new SemVer(max,options);
}
}
});
return max;
}

exports.minSatisfying=minSatisfying;
function minSatisfying(versions,range,options){
var min=null;
var minSV=null;
try{
var rangeObj=new Range(range,options);
}catch(er){
return null;
}
versions.forEach(function(v){
if(rangeObj.test(v)){

if(!min||minSV.compare(v)===1){

min=v;
minSV=new SemVer(min,options);
}
}
});
return min;
}

exports.minVersion=minVersion;
function minVersion(range,loose){
range=new Range(range,loose);

var minver=new SemVer('0.0.0');
if(range.test(minver)){
return minver;
}

minver=new SemVer('0.0.0-0');
if(range.test(minver)){
return minver;
}

minver=null;
for(var i=0;i<range.set.length;++i){
var comparators=range.set[i];

comparators.forEach(function(comparator){

var compver=new SemVer(comparator.semver.version);
switch(comparator.operator){
case'>':
if(compver.prerelease.length===0){
compver.patch++;
}else{
compver.prerelease.push(0);
}
compver.raw=compver.format();

case'':
case'>=':
if(!minver||gt(minver,compver)){
minver=compver;
}
break;
case'<':
case'<=':

break;

default:
throw new Error('Unexpected operation: '+comparator.operator);}

});
}

if(minver&&range.test(minver)){
return minver;
}

return null;
}

exports.validRange=validRange;
function validRange(range,options){
try{


return new Range(range,options).range||'*';
}catch(er){
return null;
}
}


exports.ltr=ltr;
function ltr(version,range,options){
return outside(version,range,'<',options);
}


exports.gtr=gtr;
function gtr(version,range,options){
return outside(version,range,'>',options);
}

exports.outside=outside;
function outside(version,range,hilo,options){
version=new SemVer(version,options);
range=new Range(range,options);

var gtfn,ltefn,ltfn,comp,ecomp;
switch(hilo){
case'>':
gtfn=gt;
ltefn=lte;
ltfn=lt;
comp='>';
ecomp='>=';
break;
case'<':
gtfn=lt;
ltefn=gte;
ltfn=gt;
comp='<';
ecomp='<=';
break;
default:
throw new TypeError('Must provide a hilo val of "<" or ">"');}



if(satisfies(version,range,options)){
return false;
}




for(var i=0;i<range.set.length;++i){
var comparators=range.set[i];

var high=null;
var low=null;

comparators.forEach(function(comparator){
if(comparator.semver===ANY){
comparator=new Comparator('>=0.0.0');
}
high=high||comparator;
low=low||comparator;
if(gtfn(comparator.semver,high.semver,options)){
high=comparator;
}else if(ltfn(comparator.semver,low.semver,options)){
low=comparator;
}
});



if(high.operator===comp||high.operator===ecomp){
return false;
}



if((!low.operator||low.operator===comp)&&
ltefn(version,low.semver)){
return false;
}else if(low.operator===ecomp&&ltfn(version,low.semver)){
return false;
}
}
return true;
}

exports.prerelease=prerelease;
function prerelease(version,options){
var parsed=parse(version,options);
return parsed&&parsed.prerelease.length?parsed.prerelease:null;
}

exports.intersects=intersects;
function intersects(r1,r2,options){
r1=new Range(r1,options);
r2=new Range(r2,options);
return r1.intersects(r2);
}

exports.coerce=coerce;
function coerce(version){
if(version instanceof SemVer){
return version;
}

if(typeof version!=='string'){
return null;
}

var match=version.match(re[COERCE]);

if(match==null){
return null;
}

return parse(match[1]+
'.'+(match[2]||'0')+
'.'+(match[3]||'0'));
}

}).call(this,require('_process'));
},{"_process":158}],180:[function(require,module,exports){
(function(Buffer){
'use strict';

const fs=require('fs');
const jpeg=require('jpeg-js');
















function getPixel(x,y,channel,width,buff){
return buff[(x+y*width)*4+channel];
}






function isWhitePixel(i,j,img){
return getPixel(i,j,0,img.width,img.data)>=249&&
getPixel(i,j,1,img.width,img.data)>=249&&
getPixel(i,j,2,img.width,img.data)>=249;
}


function convertPixelsToHistogram(img){
const createHistogramArray=function(){
const ret=[];
for(let i=0;i<256;i++){
ret[i]=0;
}
return ret;
};

const width=img.width;
const height=img.height;

const histograms=[
createHistogramArray(),
createHistogramArray(),
createHistogramArray()];


for(let j=0;j<height;j++){
for(let i=0;i<width;i++){

if(isWhitePixel(i,j,img)){
continue;
}

for(let channel=0;channel<histograms.length;channel++){
const pixelValue=getPixel(i,j,channel,width,img.data);
histograms[channel][pixelValue]++;
}
}
}

return histograms;
}


function synthesizeWhiteFrame(frames){
const firstImageData=jpeg.decode(frames[0].getImage());
const width=firstImageData.width;
const height=firstImageData.height;

const frameData=Buffer.alloc(width*height*4);
let i=0;
while(i<frameData.length){
frameData[i++]=0xFF;
frameData[i++]=0xFF;
frameData[i++]=0xFF;
frameData[i++]=0xFF;
}

var jpegImageData=jpeg.encode({
data:frameData,
width:width,
height:height});

return jpegImageData.data;
}

const screenshotTraceCategory='disabled-by-default-devtools.screenshot';





function extractFramesFromTimeline(timeline,opts){
opts=opts||{};

let trace;
timeline=typeof timeline==='string'?fs.readFileSync(timeline,'utf-8'):timeline;
try{
trace=typeof timeline==='string'?JSON.parse(timeline):timeline;
}catch(e){
throw new Error('Speedline: Invalid JSON'+e.message);
}

let events=trace.traceEvents||trace;

let startTs=Number.MAX_VALUE;
let endTs=-Number.MAX_VALUE;
events.forEach(e=>{
if(e.ts===0){
return;
}

startTs=Math.min(startTs,e.ts);
endTs=Math.max(endTs,e.ts);
});

startTs=(opts.timeOrigin||startTs)/1000;
endTs/=1000;


let lastFrame=null;
const rawScreenshots=events.filter(e=>e.cat.includes(screenshotTraceCategory)&&e.ts>=startTs*1000);
rawScreenshots.sort((a,b)=>a.ts-b.ts);


const uniqueFrames=rawScreenshots.map(function(evt){
const base64img=evt.args&&evt.args.snapshot;
const timestamp=evt.ts/1000;

if(base64img===lastFrame){
return null;
}

lastFrame=base64img;
const imgBuff=Buffer.from(base64img,'base64');
return frame(imgBuff,timestamp);
}).filter(Boolean);

if(uniqueFrames.length===0){
return Promise.reject(new Error('No screenshots found in trace'));
}

const fakeWhiteFrame=frame(synthesizeWhiteFrame(uniqueFrames),startTs);
uniqueFrames.unshift(fakeWhiteFrame);

const data={
startTs,
endTs,
frames:uniqueFrames};

return Promise.resolve(data);
}






function frame(imgBuff,ts){

let _histogram=null;

let _progress=null;

let _isProgressInterpolated=null;

let _perceptualProgress=null;

let _isPerceptualProgressInterpolated=null;

let _parsedImage=null;

return{
getHistogram:function(){
if(_histogram){
return _histogram;
}

const pixels=this.getParsedImage();
_histogram=convertPixelsToHistogram(pixels);
return _histogram;
},

getTimeStamp:function(){
return ts;
},

setProgress:function(progress,isInterpolated){
_progress=progress;
_isProgressInterpolated=Boolean(isInterpolated);
},

setPerceptualProgress:function(progress,isInterpolated){
_perceptualProgress=progress;
_isPerceptualProgressInterpolated=Boolean(isInterpolated);
},

getImage:function(){
return imgBuff;
},

getParsedImage:function(){
if(!_parsedImage){
_parsedImage=jpeg.decode(imgBuff);
}
return _parsedImage;
},

getProgress:function(){
return _progress;
},

isProgressInterpolated:function(){
return _isProgressInterpolated;
},

getPerceptualProgress:function(){
return _perceptualProgress;
},

isPerceptualProgressInterpolated:function(){
return _isPerceptualProgressInterpolated;
}};

}

module.exports={
extractFramesFromTimeline,
create:frame};


}).call(this,require("buffer").Buffer);
},{"buffer":102,"fs":101,"jpeg-js":122}],181:[function(require,module,exports){
'use strict';

const frame=require('./frame');
const speedIndex=require('./speed-index');











function calculateValues(frames,data){
const indexes=speedIndex.calculateSpeedIndexes(frames,data);
const duration=Math.floor(data.endTs-data.startTs);
const first=Math.floor(indexes.firstPaintTs-data.startTs);
const complete=Math.floor(indexes.visuallyCompleteTs-data.startTs);

return{
beginning:data.startTs,
end:data.endTs,
frames,
first,
complete,
duration,
speedIndex:indexes.speedIndex,
perceptualSpeedIndex:indexes.perceptualSpeedIndex};

}


const Include={
All:'all',
pSI:'perceptualSpeedIndex',
SI:'speedIndex'};









module.exports=function(timeline,opts){
const include=opts&&opts.include||Include.All;

if(!Object.keys(Include).some(key=>Include[key]===include)){
throw new Error(`Unrecognized include option: ${include}`);
}

return frame.extractFramesFromTimeline(timeline,opts).then(function(data){
const frames=data.frames;

if(include===Include.All||include===Include.SI){
speedIndex.calculateVisualProgress(frames,opts);
}

if(include===Include.All||include===Include.pSI){
speedIndex.calculatePerceptualProgress(frames,opts);
}

return calculateValues(frames,data);
});
};

},{"./frame":180,"./speed-index":182}],182:[function(require,module,exports){
'use strict';

const imageSSIM=require('image-ssim');


const fastModeAllowableChangeMax=5;
const fastModeAllowableChangeMedian=3;
const fastModeAllowableChangeMin=-1;

const fastModeConstant=fastModeAllowableChangeMin;
const fastModeMultiplier=fastModeAllowableChangeMax-fastModeConstant;
const fastModeExponentiationCoefficient=Math.log((fastModeAllowableChangeMedian-fastModeConstant)/fastModeMultiplier);














function calculateFastModeAllowableChange(elapsedTime){
const elapsedTimeInSeconds=elapsedTime/1000;
const allowableChange=fastModeMultiplier*Math.exp(fastModeExponentiationCoefficient*elapsedTimeInSeconds)+fastModeConstant;
return allowableChange;
}






function calculateFrameProgress(current,initial,target){
let total=0;
let match=0;

const currentHist=current.getHistogram();
const initialHist=initial.getHistogram();
const targetHist=target.getHistogram();

for(let channel=0;channel<3;channel++){
for(let pixelVal=0;pixelVal<256;pixelVal++){
const currentCount=currentHist[channel][pixelVal];
const initialCount=initialHist[channel][pixelVal];
const targetCount=targetHist[channel][pixelVal];

const currentDiff=Math.abs(currentCount-initialCount);
const targetDiff=Math.abs(targetCount-initialCount);

match+=Math.min(currentDiff,targetDiff);
total+=targetDiff;
}
}

let progress;
if(match===0&&total===0){
progress=100;
}else{
progress=Math.floor(match/total*100);
}
return progress;
}









function calculateProgressBetweenFrames(frames,lowerBound,upperBound,isFastMode,getProgress,setProgress){
if(!isFastMode){
frames.forEach(frame=>setProgress(frame,getProgress(frame),false));
return;
}

const lowerFrame=frames[lowerBound];
const upperFrame=frames[upperBound];
const elapsedTime=upperFrame.getTimeStamp()-lowerFrame.getTimeStamp();

const lowerProgress=getProgress(lowerFrame);
const upperProgress=getProgress(upperFrame);

setProgress(lowerFrame,lowerProgress,false);
setProgress(upperFrame,upperProgress,false);

if(Math.abs(lowerProgress-upperProgress)<calculateFastModeAllowableChange(elapsedTime)){
for(let i=lowerBound+1;i<upperBound;i++){
setProgress(frames[i],lowerProgress,true);
}
}else if(upperBound-lowerBound>1){
const midpoint=Math.floor((lowerBound+upperBound)/2);
calculateProgressBetweenFrames(frames,lowerBound,midpoint,isFastMode,getProgress,setProgress);
calculateProgressBetweenFrames(frames,midpoint,upperBound,isFastMode,getProgress,setProgress);
}
}





function calculateVisualProgress(frames,opts){
const initial=frames[0];
const target=frames[frames.length-1];


function getProgress(frame){
if(typeof frame.getProgress()==='number'){
return frame.getProgress();
}

return calculateFrameProgress(frame,initial,target);
}






function setProgress(frame,progress,isInterpolated){
return frame.setProgress(progress,isInterpolated);
}

calculateProgressBetweenFrames(
frames,
0,
frames.length-1,
opts&&opts.fastMode,
getProgress,
setProgress);


return frames;
}






function calculateFrameSimilarity(frame,target){
const defaultImageConfig={


channels:4};


const frameData=Object.assign(frame.getParsedImage(),defaultImageConfig);
const targetData=Object.assign(target.getParsedImage(),defaultImageConfig);

const diff=imageSSIM.compare(frameData,targetData);
return diff.ssim;
}





function calculatePerceptualProgress(frames,opts){
const initial=frames[0];
const target=frames[frames.length-1];
const initialSimilarity=calculateFrameSimilarity(initial,target);


function getProgress(frame){
if(typeof frame.getPerceptualProgress()==='number'){
return frame.getPerceptualProgress();
}

const ssim=calculateFrameSimilarity(frame,target);
return Math.max(100*(ssim-initialSimilarity)/(1-initialSimilarity),0);
}






function setProgress(frame,progress,isInterpolated){
return frame.setPerceptualProgress(progress,isInterpolated);
}

calculateProgressBetweenFrames(
frames,
0,
frames.length-1,
opts&&opts.fastMode,
getProgress,
setProgress);


return frames;
}






function calculateSpeedIndexes(frames,data){
const hasVisualProgress=typeof frames[0].getProgress()==='number';
const hasPerceptualProgress=typeof frames[0].getPerceptualProgress()==='number';
const progressToUse=hasVisualProgress?'getProgress':'getPerceptualProgress';
const startTs=data.startTs;
let visuallyCompleteTs;

let firstPaintTs;


for(let i=0;i<frames.length&&!firstPaintTs;i++){
if(frames[i][progressToUse]()>0){
firstPaintTs=frames[i].getTimeStamp();
}
}


for(let i=0;i<frames.length&&!visuallyCompleteTs;i++){
if(frames[i][progressToUse]()>=100){
visuallyCompleteTs=frames[i].getTimeStamp();
}
}

let prevFrameTs=frames[0].getTimeStamp();
let prevProgress=frames[0].getProgress();
let prevPerceptualProgress=frames[0].getPerceptualProgress();




let speedIndex=firstPaintTs-startTs;

let perceptualSpeedIndex=firstPaintTs-startTs;

frames.forEach(function(frame){

if(frame.getTimeStamp()>firstPaintTs){
const elapsed=frame.getTimeStamp()-prevFrameTs;
speedIndex+=elapsed*(1-prevProgress);
perceptualSpeedIndex+=elapsed*(1-prevPerceptualProgress);
}

prevFrameTs=frame.getTimeStamp();
prevProgress=frame.getProgress()/100;
prevPerceptualProgress=frame.getPerceptualProgress()/100;
});

speedIndex=hasVisualProgress?speedIndex:undefined;
perceptualSpeedIndex=hasPerceptualProgress?perceptualSpeedIndex:undefined;

return{
firstPaintTs,
visuallyCompleteTs,
speedIndex,
perceptualSpeedIndex};

}

module.exports={
calculateFastModeAllowableChange,
calculateFrameSimilarity,
calculateVisualProgress,
calculatePerceptualProgress,
calculateSpeedIndexes};


},{"image-ssim":112}],183:[function(require,module,exports){





















module.exports=Stream;

var EE=require('events').EventEmitter;
var inherits=require('inherits');

inherits(Stream,EE);
Stream.Readable=require('readable-stream/readable.js');
Stream.Writable=require('readable-stream/writable.js');
Stream.Duplex=require('readable-stream/duplex.js');
Stream.Transform=require('readable-stream/transform.js');
Stream.PassThrough=require('readable-stream/passthrough.js');


Stream.Stream=Stream;






function Stream(){
EE.call(this);
}

Stream.prototype.pipe=function(dest,options){
var source=this;

function ondata(chunk){
if(dest.writable){
if(false===dest.write(chunk)&&source.pause){
source.pause();
}
}
}

source.on('data',ondata);

function ondrain(){
if(source.readable&&source.resume){
source.resume();
}
}

dest.on('drain',ondrain);



if(!dest._isStdio&&(!options||options.end!==false)){
source.on('end',onend);
source.on('close',onclose);
}

var didOnEnd=false;
function onend(){
if(didOnEnd)return;
didOnEnd=true;

dest.end();
}


function onclose(){
if(didOnEnd)return;
didOnEnd=true;

if(typeof dest.destroy==='function')dest.destroy();
}


function onerror(er){
cleanup();
if(EE.listenerCount(this,'error')===0){
throw er;
}
}

source.on('error',onerror);
dest.on('error',onerror);


function cleanup(){
source.removeListener('data',ondata);
dest.removeListener('drain',ondrain);

source.removeListener('end',onend);
source.removeListener('close',onclose);

source.removeListener('error',onerror);
dest.removeListener('error',onerror);

source.removeListener('end',cleanup);
source.removeListener('close',cleanup);

dest.removeListener('close',cleanup);
}

source.on('end',cleanup);
source.on('close',cleanup);

dest.on('close',cleanup);

dest.emit('pipe',source);


return dest;
};

},{"events":108,"inherits":113,"readable-stream/duplex.js":162,"readable-stream/passthrough.js":172,"readable-stream/readable.js":173,"readable-stream/transform.js":174,"readable-stream/writable.js":175}],184:[function(require,module,exports){
module.exports=[{"name":"Google Analytics","company":"Google","homepage":"https://www.google.com/analytics/analytics/","categories":["analytics"],"domains":["*.google-analytics.com","*.urchin.com"],"examples":["www.google-analytics.com","ssl.google-analytics.com"]},{"name":"Facebook","homepage":"https://www.facebook.com","categories":["social"],"domains":["*.atlassbx.com","*.facebook.com","*.fbsbx.com","fbcdn-photos-e-a.akamaihd.net","*.facebook.net","*.fbcdn.net"],"examples":["www.facebook.com","connect.facebook.net","staticxx.facebook.com","static.xx.fbcdn.net","m.facebook.com","an.facebook.com","platform-lookaside.fbsbx.com"]},{"name":"Google CDN","company":"Google","homepage":"https://developers.google.com/speed/libraries/","categories":["cdn"],"domains":["ajax.googleapis.com","commondatastorage.googleapis.com","www.gstatic.com"]},{"name":"Google/Doubleclick Ads","company":"Google","homepage":"https://www.doubleclickbygoogle.com/","categories":["ad"],"domains":["adservice.google.com","adservice.google.com.au","adservice.google.com.sg","adservice.google.com.br","adservice.google.com.ua","adservice.google.co.uk","adservice.google.co.jp","adservice.google.co.in","adservice.google.co.kr","adservice.google.co.id","adservice.google.co.nz","adservice.google.ie","adservice.google.se","adservice.google.de","adservice.google.ca","adservice.google.be","adservice.google.es","adservice.google.ch","adservice.google.fr","adservice.google.nl","*.googleadservices.com","*.googlesyndication.com","*.googletagservices.com","*.2mdn.net","*.doubleclick.net"],"examples":["pagead2.googlesyndication.com","tpc.googlesyndication.com","ade.googlesyndication.com","googleads.g.doubleclick.net","googleads4.g.doubleclick.net","securepubads.g.doubleclick.net","pubads.g.doubleclick.net","static.doubleclick.net","cm.g.doubleclick.net","bid.g.doubleclick.net","s0.2mdn.net","stats.g.doubleclick.net","survey.g.doubleclick.net","fls.doubleclick.net","ad.doubleclick.net","www.googleadservices.com","https://www.googletagservices.com/tag/js/gpt.js"]},{"name":"Google Tag Manager","company":"Google","homepage":"https://marketingplatform.google.com/about/tag-manager/","categories":["tag-manager"],"domains":["*.googletagmanager.com"],"examples":["www.googletagmanager.com"]},{"name":"Other Google APIs/SDKs","company":"Google","homepage":"https://developers.google.com/apis-explorer/#p/","categories":["utility"],"domains":["accounts.google.com","apis.google.com","calendar.google.com","clients2.google.com","cse.google.com","news.google.com","pay.google.com","payments.google.com","play.google.com","smartlock.google.com","www.google.com","www.google.de","www.google.co.jp","www.google.com.au","www.google.co.uk","www.google.ie","www.google.com.sg","www.google.co.in","www.google.com.br","www.google.ca","www.google.co.kr","www.google.co.nz","www.google.co.id","www.google.fr","www.google.be","www.google.com.ua","www.google.nl","www.google.ru","www.google.se","imasdk.googleapis.com","storage.googleapis.com","translate.googleapis.com","lh3.googleusercontent.com","csi.gstatic.com"]},{"name":"YouTube","homepage":"https://youtube.com","categories":["video"],"domains":["*.ggpht.com","*.youtube-nocookie.com","*.youtube.com","*.ytimg.com"],"examples":["www.youtube.com","s.ytimg.com","yt3.ggpht.com","img.youtube.com","fcmatch.youtube.com"]},{"name":"Google Maps","company":"Google","homepage":"https://www.google.com/maps","categories":["utility"],"domains":["maps.google.com","maps-api-ssl.google.com","maps.googleapis.com","mts.googleapis.com","maps.gstatic.com"]},{"name":"Twitter","homepage":"https://twitter.com","categories":["social"],"domains":["*.vine.co","*.twimg.com","*.twitpic.com","platform.twitter.com","syndication.twitter.com"],"examples":["cdn.syndication.twimg.com","abs.twimg.com","pbs.twimg.com"]},{"name":"Yandex Metrica","company":"Yandex","homepage":"https://metrica.yandex.com/about?","categories":["analytics"],"domains":["d31j93rd8oukbv.cloudfront.net","mc.yandex.ru"]},{"name":"jQuery CDN","homepage":"https://code.jquery.com/","categories":["cdn"],"domains":["*.jquery.com"],"examples":["code.jquery.com"]},{"name":"Hotjar","homepage":"https://www.hotjar.com/","categories":["analytics"],"domains":["*.hotjar.com","*.hotjar.io"],"examples":["script.hotjar.com","static.hotjar.com","in.hotjar.com","vc.hotjar.io","vars.hotjar.com"]},{"name":"AddThis","homepage":"http://www.addthis.com/","categories":["social"],"domains":["*.addthis.com","*.addthiscdn.com","*.addthisedge.com"],"examples":["s7.addthis.com","r.dlx.addthis.com","su.addthis.com","x.dlx.addthis.com"]},{"name":"WordPress","company":"Automattic","homepage":"https://wp.com/","categories":["hosting"],"domains":["*.wordpress.com","s0.wp.com","s2.wp.com","*.w.org","c0.wp.com","s1.wp.com","widgets.wp.com"],"examples":["s.w.org"]},{"name":"Cloudflare CDN","homepage":"https://cdnjs.com/","categories":["cdn"],"domains":["amp.cloudflare.com","cdnjs.cloudflare.com"]},{"name":"Shopify","homepage":"https://www.shopify.com/","categories":["hosting"],"domains":["*.shopify.com","*.shopifyapps.com","*.shopifycdn.com"],"examples":["cdn.shopify.com","productreviews.shopifycdn.com"]},{"name":"ZenDesk","homepage":"https://zendesk.com/","categories":["customer-success"],"domains":["*.zdassets.com","*.zendesk.com","*.zopim.com"],"examples":["assets.zendesk.com","static.zdassets.com","v2.zopim.com"]},{"name":"Criteo","homepage":"https://www.criteo.com/","categories":["ad"],"domains":["*.criteo.com","*.emailretargeting.com","*.criteo.net"],"examples":["static.criteo.net","bidder.criteo.com","dis.criteo.com","gum.criteo.com","sslwidget.criteo.com","dis.us.criteo.com"]},{"name":"Pubmatic","homepage":"https://pubmatic.com/","categories":["ad"],"domains":["*.pubmatic.com"],"examples":["image6.pubmatic.com","ads.pubmatic.com","image2.pubmatic.com","simage2.pubmatic.com","image4.pubmatic.com","simage4.pubmatic.com","image5.pubmatic.com","hbopenbid.pubmatic.com"]},{"name":"Tawk.to","homepage":"https://www.tawk.to/","categories":["customer-success"],"domains":["*.tawk.to"],"examples":["embed.tawk.to"]},{"name":"AMP","homepage":"https://amp.dev/","categories":["content"],"domains":["*.ampproject.org"],"examples":["cdn.ampproject.org"]},{"name":"Wix","homepage":"https://www.wix.com/","categories":["hosting"],"domains":["*.parastorage.com","*.wix.com","*.wixstatic.com","*.wixapps.net"],"examples":["static.parastorage.com","static.wixstatic.com","www.wix.com","instagram.codev.wixapps.net"]},{"name":"Squarespace","homepage":"https://www.squarespace.com/","categories":["hosting"],"domains":["*.squarespace.com"],"examples":["static.squarespace.com","static1.squarespace.com"]},{"name":"Amazon Web Services","homepage":"https://aws.amazon.com/s3/","categories":["other"],"domains":["*.amazon.com","*.amazonaws.com","*.amazonwebapps.com","*.amazonwebservices.com","*.elasticbeanstalk.com","*.images-amazon.com","*.amazon.co.uk"],"examples":["s3.amazonaws.com","us-east-1.amazonaws.com","api-cdn.amazon.com","ecx.images-amazon.com","ws.amazon.co.uk"]},{"name":"ShareThis","homepage":"https://www.sharethis.com/","categories":["social"],"domains":["*.sharethis.com"],"examples":["w.sharethis.com","ws.sharethis.com","t.sharethis.com"]},{"name":"Vimeo","homepage":"http://vimeo.com/","categories":["video"],"domains":["*.vimeo.com","*.vimeocdn.com"],"examples":["f.vimeocdn.com","player.vimeo.com","i.vimeocdn.com"]},{"name":"JSDelivr CDN","homepage":"https://www.jsdelivr.com/","categories":["cdn"],"domains":["*.jsdelivr.net"],"examples":["cdn.jsdelivr.net"]},{"name":"Adobe Tag Manager","company":"Adobe","homepage":"https://www.adobe.com/experience-platform/","categories":["tag-manager"],"domains":["*.adobedtm.com","*.demdex.net","*.everesttech.net"],"examples":["assets.adobedtm.com","sync-tm.everesttech.net","cm.everesttech.net"]},{"name":"Jivochat","homepage":"https://www.jivochat.com/","categories":["customer-success"],"domains":["*.jivosite.com"],"examples":["cdn-ca.jivosite.com","code.jivosite.com"]},{"name":"PIXNET","homepage":"https://www.pixnet.net/","categories":["social"],"domains":["*.pixfs.net"],"examples":["front.pixfs.net","falcon-asset.pixfs.net","pixgame-asset.pixfs.net"]},{"name":"Yandex Share","company":"Yandex","homepage":"https://yastatic.net/share2/share.js","categories":["social"],"domains":["*.yastatic.net"]},{"name":"Scorecard Research","homepage":"https://www.scorecardresearch.com/","categories":["ad"],"domains":["*.scorecardresearch.com"],"examples":["sb.scorecardresearch.com","sa.scorecardresearch.com","b.scorecardresearch.com"]},{"name":"Rubicon Project","homepage":"https://rubiconproject.com/","categories":["ad"],"domains":["*.chango.com","*.fimserve.com","*.rubiconproject.com"],"examples":["pixel.rubiconproject.com","fastlane.rubiconproject.com","secure-assets.rubiconproject.com","eus.rubiconproject.com","pixel-us-east.rubiconproject.com","token.rubiconproject.com","ads.rubiconproject.com"]},{"name":"FontAwesome CDN","homepage":"https://fontawesome.com/","categories":["cdn"],"domains":["*.fontawesome.com"],"examples":["use.fontawesome.com"]},{"name":"Cloudflare","homepage":"https://www.cloudflare.com/website-optimization/","categories":["utility"],"domains":["ajax.cloudflare.com"]},{"name":"Blogger","homepage":"http://www.blogger.com/","categories":["hosting"],"domains":["*.blogblog.com","*.blogger.com","*.blogspot.com","images-blogger-opensocial.googleusercontent.com"],"examples":["1.bp.blogspot.com","www.blogger.com"]},{"name":"Salesforce","homepage":"https://www.salesforce.com/products/marketing-cloud/","categories":["analytics"],"domains":["*.krxd.net"],"examples":["cdn.krxd.net","beacon.krxd.net","consumer.krxd.net","usermatch.krxd.net"]},{"name":"Yandex Ads","company":"Yandex","homepage":"https://yandex.com/adv/","categories":["ad"],"domains":["an.yandex.ru"]},{"name":"Tynt","company":"33 Across","categories":["ad"],"domains":["*.tynt.com"]},{"name":"Yandex APIs","company":"Yandex","homepage":"https://yandex.ru/","categories":["utility"],"domains":["api-maps.yandex.ru","money.yandex.ru"]},{"name":"Micropat","categories":["social"],"domains":["*.addtoany.com"]},{"name":"Hubspot","homepage":"https://hubspot.com/","categories":["marketing"],"domains":["*.hs-scripts.com","*.hubspot.com","*.leadin.com","*.hs-analytics.net","*.hscollectedforms.net","*.hscta.net","*.hsforms.net","*.hsleadflows.net","*.hsstatic.net","*.hubspot.net"],"examples":["forms.hubspot.com","js.hsforms.net","js.hs-analytics.net","js.leadin.com"]},{"name":"Sumo","homepage":"https://sumo.com/","categories":["marketing"],"domains":["*.sumo.com","*.sumome.com","sumo.b-cdn.net"],"examples":["sumo.b-cdn.net","load.sumo.com","load.sumome.com"]},{"name":"Beeketing","homepage":"https://beeketing.com/","categories":["marketing"],"domains":["*.beeketing.com"],"examples":["sdk-cdn.beeketing.com","sdk.beeketing.com"]},{"name":"Mailchimp","homepage":"https://mailchimp.com/","categories":["marketing"],"domains":["*.chimpstatic.com","*.list-manage.com","*.mailchimp.com"],"examples":["downloads.mailchimp.com"]},{"name":"Media.net","homepage":"https://www.media.net/","categories":["ad"],"domains":["*.media.net","*.mnet-ad.net"],"examples":["contextual.media.net","cdnwest-xch.media.net","hbx.media.net","cs.media.net","hblg.media.net"]},{"name":"Skimbit","categories":["ad"],"domains":["*.redirectingat.com","*.skimresources.com","*.skimresources.net"]},{"name":"Moat","homepage":"https://moat.com/","categories":["ad"],"domains":["*.moatads.com","*.moatpixel.com"],"examples":["z.moatads.com","px.moatads.com","geo.moatads.com","sejs.moatads.com","mb.moatads.com","v4.moatads.com"]},{"name":"AppNexus","homepage":"https://www.appnexus.com/","categories":["ad"],"domains":["*.adnxs.com","*.ctasnet.com"],"examples":["acdn.adnxs.com","secure.adnxs.com","ib.adnxs.com","sharethrough.adnxs.com","cdn.adnxs.com","vcdn.adnxs.com"]},{"name":"VK","homepage":"https://vk.com/","categories":["social"],"domains":["*.vk.com"]},{"name":"LiveChat","homepage":"https://www.livechatinc.com/","categories":["customer-success"],"domains":["*.livechatinc.com"],"examples":["cdn.livechatinc.com","secure.livechatinc.com"]},{"name":"OneSignal","homepage":"https://onesignal.com/","categories":["utility"],"domains":["*.onesignal.com"],"examples":["cdn.onesignal.com","https://onesignal.com/api/v1/sync/"]},{"name":"WordAds","company":"Automattic","homepage":"https://wordads.co/","categories":["ad"],"domains":["*.pubmine.com"],"examples":["s.pubmine.com"]},{"name":"Integral Ad Science","homepage":"https://integralads.com/uk/","categories":["ad"],"domains":["*.adsafeprotected.com","*.iasds01.com"],"examples":["pixel.adsafeprotected.com","static.adsafeprotected.com","fw.adsafeprotected.com","cdn.adsafeprotected.com","dt.adsafeprotected.com"]},{"name":"Amazon Ads","homepage":"https://ad.amazon.com/","categories":["ad"],"domains":["*.amazon-adsystem.com"],"examples":["s.amazon-adsystem.com","c.amazon-adsystem.com","aax.amazon-adsystem.com","z-na.amazon-adsystem.com","fls-na.amazon-adsystem.com","aax-us-east.amazon-adsystem.com","ir-na.amazon-adsystem.com"]},{"name":"Yahoo!","homepage":"https://www.yahoo.com/","categories":["ad"],"domains":["*.bluelithium.com","*.hostingprod.com","*.lexity.com","*.yahoo.com","*.yahooapis.com","*.yimg.com","*.yimg.jp","*.zenfs.com","*.yahoo.net"],"examples":["ads.yahoo.com","analytics.yahoo.com","geo.yahoo.com","udc.yahoo.com","ganon.yahoo.com","ads.yap.yahoo.com"]},{"name":"Hatena Blog","homepage":"https://hatenablog.com/","categories":["hosting"],"domains":["*.st-hatena.com","*.hatena.ne.jp"],"examples":["cdn.blog.st-hatena.com","cdn.pool.st-hatena.com","cdn7.www.st-hatena.com","s.hatena.ne.jp","b.st-hatena.com"]},{"name":"Pinterest","homepage":"https://pinterest.com/","categories":["social"],"domains":["*.pinimg.com","*.pinterest.com"],"examples":["assets.pinterest.com","ct.pinterest.com","log.pinterest.com"]},{"name":"LinkedIn","homepage":"https://www.linkedin.com/","categories":["social"],"domains":["*.bizographics.com","platform.linkedin.com","*.slideshare.com","*.slidesharecdn.com"]},{"name":"Stripe","homepage":"https://stripe.com","categories":["utility"],"domains":["*.stripe.com","*.stripecdn.com","*.stripe.network"],"examples":["m.stripe.network","js.stripe.com"]},{"name":"Taboola","homepage":"https://www.taboola.com/","categories":["ad"],"domains":["*.taboola.com","*.taboolasyndication.com"],"examples":["cdn.taboola.com","trc.taboola.com","vidstat.taboola.com","images.taboola.com"]},{"name":"Weebly","homepage":"https://www.weebly.com/","categories":["hosting"],"domains":["*.editmysite.com"]},{"name":"Bing Ads","homepage":"https://bingads.microsoft.com","categories":["ad"],"domains":["*.bing.com","*.microsoft.com","*.msn.com","*.s-msft.com","*.s-msn.com","*.msads.net","*.msecnd.net","*.windows.net"],"examples":["bat.bing.com","c.bing.com","bat.r.msn.com","ajax.microsoft.com"]},{"name":"Intercom","homepage":"https://www.intercom.com","categories":["customer-success"],"domains":["*.intercomcdn.com","*.intercom.io"],"examples":["js.intercomcdn.com","api-iam.intercom.io","widget.intercom.io","nexus-websocket-a.intercom.io"]},{"name":"Crazy Egg","homepage":"https://www.crazyegg.com/","categories":["analytics"],"domains":["*.cetrk.com","*.crazyegg.com","*.hellobar.com","dnn506yrbagrg.cloudfront.net"]},{"name":"Amazon Pay","homepage":"https://pay.amazon.com","categories":["utility"],"domains":["payments.amazon.com","*.payments-amazon.com"]},{"name":"Histats","homepage":"http://histats.com/","categories":["analytics"],"domains":["*.histats.com"],"examples":["s10.histats.com"]},{"name":"Adform","categories":["ad"],"domains":["*.adform.net","*.adformdsp.net"]},{"name":"Datacamp","categories":["utility"],"domains":["*.cdn77.org"]},{"name":"Tealium","homepage":"https://tealium.com/","categories":["tag-manager"],"domains":["*.aniview.com","*.delvenetworks.com","*.limelight.com","*.tiqcdn.com","*.llnwd.net","*.tealiumiq.com"],"examples":["tags.tiqcdn.com","tealium.hs.llnwd.net","link.videoplatform.limelight.com","datacloud.tealiumiq.com"]},{"name":"Optimizely","homepage":"https://www.optimizely.com/","categories":["analytics"],"domains":["*.optimizely.com"],"examples":["cdn.optimizely.com","cdn-pci.optimizely.com","logx.optimizely.com","cdn3.optimizely.com"]},{"name":"Yotpo","homepage":"https://www.yotpo.com/","categories":["marketing"],"domains":["*.yotpo.com"]},{"name":"Trust Pilot","categories":["analytics"],"domains":["*.trustpilot.com"]},{"name":"Privy","categories":["ad"],"domains":["*.privy.com","*.privymktg.com"]},{"name":"Baidu Analytics","homepage":"https://tongji.baidu.com/web/welcome/login","categories":["analytics"],"domains":["*.baidu.com"],"examples":["hm.baidu.com"]},{"name":"Wistia","homepage":"https://wistia.com/","categories":["video"],"domains":["*.wistia.com","embedwistia-a.akamaihd.net","*.wistia.net"],"examples":["fast.wistia.com","fast.wistia.net","distillery.wistia.com","pipedream.wistia.com"]},{"name":"iubenda","categories":["utility"],"domains":["*.iubenda.com"],"examples":["www.iubenda.com"]},{"name":"Nielsen NetRatings SiteCensus","company":"The Nielsen Company","homepage":"http://www.nielsen-online.com/intlpage.html","categories":["analytics"],"domains":["*.imrworldwide.com"]},{"name":"BrightTag / Signal","company":"Signal","homepage":"https://www.signal.co","categories":["tag-manager"],"domains":["*.btstatic.com","*.thebrighttag.com"]},{"name":"mPulse","homepage":"https://developer.akamai.com/akamai-mpulse","categories":["analytics"],"domains":["*.akstat.io","*.go-mpulse.net","*.mpulse.net","*.mpstat.us"],"examples":["c.go-mpulse.net","0211c83c.akstat.io"]},{"name":"PayPal","homepage":"https://paypal.com","categories":["utility"],"domains":["*.paypal.com","*.paypalobjects.com"],"examples":["www.paypalobjects.com"]},{"name":"Sentry","homepage":"https://sentry.io/","categories":["utility"],"domains":["*.getsentry.com","*.ravenjs.com","*.sentry-cdn.com"],"examples":["cdn.ravenjs.com","browser.sentry-cdn.com"]},{"name":"Cookiebot","homepage":"https://www.cookiebot.com/","categories":["utility"],"domains":["*.cookiebot.com"],"examples":["consent.cookiebot.com"]},{"name":"Distil Networks","homepage":"https://www.distilnetworks.com/","categories":["utility"],"domains":["*.areyouahuman.com"],"examples":["n-cdn.areyouahuman.com"]},{"name":"Adobe TypeKit","company":"Adobe","homepage":"https://fonts.adobe.com/","categories":["cdn"],"domains":["*.typekit.com","*.typekit.net"],"examples":["use.typekit.net","p.typekit.net"]},{"name":"Kakao","categories":["social"],"domains":["*.daum.net","*.daumcdn.net"]},{"name":"Bold Commerce","categories":["utility"],"domains":["*.shappify-cdn.com","*.shappify.com","*.boldapps.net"]},{"name":"Akamai","homepage":"https://www.akamai.com/","categories":["cdn"],"domains":["23.62.3.183","*.akamaitechnologies.com","*.akamaitechnologies.fr","*.akamai.net","*.akamaiedge.net","*.akamaihd.net","*.akamaized.net","*.edgefcs.net","*.edgekey.net","edgesuite.net","*.srip.net"]},{"name":"Segment","homepage":"https://segment.com/","categories":["analytics"],"domains":["*.segment.com","*.segment.io"],"examples":["cdn.segment.com","api.segment.io"]},{"name":"District M","categories":["ad"],"domains":["*.districtm.io"]},{"name":"Bigcommerce","categories":["marketing"],"domains":["*.bigcommerce.com"]},{"name":"Dealer","homepage":"https://www.dealer.com/","categories":["hosting"],"domains":["*.dealer.com"],"examples":["static.dealer.com"]},{"name":"Klaviyo","categories":["ad"],"domains":["*.klaviyo.com"]},{"name":"Rambler","company":"Rambler & Co","categories":["utility"],"domains":["*.rambler.ru"]},{"name":"Tumblr","homepage":"https://tumblr.com/","categories":["social"],"domains":["*.tumblr.com"],"examples":["assets.tumblr.com","static.tumblr.com"]},{"name":"Snapchat","homepage":"https://www.snapchat.com","categories":["analytics"],"domains":["*.snapchat.com","*.sc-static.net"],"examples":["tr.snapchat.com"]},{"name":"VigLink","categories":["ad"],"domains":["*.viglink.com"]},{"name":"StatCounter","categories":["analytics"],"domains":["*.statcounter.com"]},{"name":"TrustArc","homepage":"https://www.trustarc.com/","categories":["utility"],"domains":["*.trustarc.com"],"examples":["choices.trustarc.com","consent.trustarc.com"]},{"name":"Tidio Live Chat","company":"Tidio","homepage":"https://www.tidiochat.com/en/","categories":["customer-success"],"domains":["*.tidiochat.com"]},{"name":"DoubleVerify","homepage":"https://www.doubleverify.com/","categories":["ad"],"domains":["*.doubleverify.com","*.dvtps.com","*.iqfp1.com"],"examples":["cdn.doubleverify.com","cdn3.doubleverify.com","tps.doubleverify.com","tps712.doubleverify.com","tps714.doubleverify.com","tps706.doubleverify.com","tps700.doubleverify.com","tps707.doubleverify.com","rtb2.doubleverify.com","rtb0.doubleverify.com","rtbcdn.doubleverify.com","tps11020.doubleverify.com","tm.iqfp1.com"]},{"name":"Instagram","homepage":"https://www.instagram.com","categories":["social"],"domains":["*.cdninstagram.com","*.instagram.com"],"examples":["scontent.cdninstagram.com"]},{"name":"OptinMonster","homepage":"https://optinmonster.com/","categories":["marketing"],"domains":["*.opmnstr.com","*.optmnstr.com","*.optmstr.com"],"examples":["a.optmstr.com","api.opmnstr.com","a.optmnstr.com"]},{"name":"Evidon","categories":["analytics"],"domains":["*.evidon.com"]},{"name":"Lucky Orange","homepage":"https://www.luckyorange.com/","categories":["analytics"],"domains":["*.luckyorange.com","d10lpsik1i8c69.cloudfront.net","*.luckyorange.net"]},{"name":"Gemius","categories":["ad"],"domains":["*.gemius.pl"]},{"name":"Olark","homepage":"https://www.olark.com/","categories":["customer-success"],"domains":["*.olark.com"],"examples":["static.olark.com"]},{"name":"CallRail","categories":["analytics"],"domains":["*.callrail.com"]},{"name":"Mixpanel","homepage":"https://mixpanel.com/","categories":["analytics"],"domains":["*.mixpanel.com","*.mxpnl.com"],"examples":["cdn.mxpnl.com"]},{"name":"OpenX","homepage":"https://www.openx.com/","categories":["ad"],"domains":["*.deliverimp.com","*.openxadexchange.com","*.servedbyopenx.com","*.jump-time.net","*.openx.net"],"examples":["uk-ads.openx.net","us-ads.openx.net","33across-d.openx.net","rtb.openx.net","us-u.openx.net","eu-u.openx.net","u.openx.net"]},{"name":"CreateJS CDN","homepage":"http://code.createjs.com/","categories":["cdn"],"domains":["*.createjs.com"],"examples":["code.createjs.com"]},{"name":"Chartbeat","categories":["analytics"],"domains":["*.chartbeat.com","*.chartbeat.net"]},{"name":"Sizmek","homepage":"https://www.sizmek.com/","categories":["ad"],"domains":["*.serving-sys.com","*.peer39.net"],"examples":["secure-ds.serving-sys.com","ds.serving-sys.com","bs.serving-sys.com"]},{"name":"FullStory","categories":["analytics"],"domains":["*.fullstory.com"],"examples":["rs.fullstory.com"]},{"name":"Snowplow","homepage":"https://snowplowanalytics.com/","categories":["analytics"],"domains":["d32hwlnfiv2gyn.cloudfront.net"]},{"name":"Brightcove","homepage":"https://www.brightcove.com/en/","categories":["video"],"domains":["*.brightcove.com","*.brightcove.net","*.zencdn.net"],"examples":["vjs.zencdn.net","players.brightcove.net"]},{"name":"GoDaddy","homepage":"https://www.godaddy.com/","categories":["utility"],"domains":["*.godaddy.com","*.wsimg.com"],"examples":["ocsp.godaddy.com","seal.godaddy.com"]},{"name":"Inspectlet","categories":["analytics"],"domains":["*.inspectlet.com"]},{"name":"Teads","categories":["ad"],"domains":["*.teads.tv"]},{"name":"New Relic","homepage":"https://newrelic.com/","categories":["utility"],"domains":["*.newrelic.com","*.nr-data.net"],"examples":["js-agent.newrelic.com","bam.nr-data.net"]},{"name":"Ensighten","homepage":"https://www.ensighten.com/","categories":["tag-manager"],"domains":["*.ensighten.com"],"examples":["nexus.ensighten.com"]},{"name":"Parking Crew","homepage":"http://parkingcrew.net/","categories":["other"],"domains":["d1lxhc4jvstzrp.cloudfront.net","*.parkingcrew.net"]},{"name":"Azure Web Services","company":"Microsoft","categories":["cdn"],"domains":["*.azurewebsites.net","*.azureedge.net","*.msedge.net"]},{"name":"BlueKai","company":"Oracle","categories":["ad"],"domains":["*.bkrtx.com","*.bluekai.com"]},{"name":"Treasure Data","categories":["analytics"],"domains":["*.treasuredata.com"]},{"name":"Drift","homepage":"https://www.drift.com/","categories":["marketing"],"domains":["*.drift.com","*.driftt.com"],"examples":["js.driftt.com","api.drift.com"]},{"name":"MGID","homepage":"https://www.mgid.com/","categories":["ad"],"domains":["*.mgid.com","*.dt07.net"],"examples":["servicer.mgid.com"]},{"name":"Microsoft Hosted Libs","company":"Microsoft","categories":["cdn"],"domains":["*.aspnetcdn.com"],"examples":["ajax.aspnetcdn.com"]},{"name":"33 Across","homepage":"https://33across.com/","categories":["ad"],"domains":["*.33across.com"],"examples":["sic.33across.com","cdn-sic.33across.com"]},{"name":"Monotype","categories":["cdn"],"domains":["*.fonts.com","*.fonts.net"]},{"name":"DTSCOUT","categories":["ad"],"domains":["*.dtscout.com"]},{"name":"WordPress Site Stats","company":"Automattic","homepage":"https://wp.com/","categories":["analytics"],"domains":["pixel.wp.com","stats.wp.com"]},{"name":"Mapbox","categories":["utility"],"domains":["*.mapbox.com"]},{"name":"MediaVine","homepage":"https://www.mediavine.com/","categories":["ad"],"domains":["*.mediavine.com"],"examples":["scripts.mediavine.com","video.mediavine.com"]},{"name":"Shareaholic","homepage":"https://www.shareaholic.com/","categories":["social"],"domains":["*.shareaholic.com","dsms0mj1bbhn4.cloudfront.net"]},{"name":"Dataxu","categories":["marketing"],"domains":["*.w55c.net"]},{"name":"MailMunch","categories":["ad"],"domains":["*.mailmunch.co"]},{"name":"Cxense","categories":["ad"],"domains":["*.cxense.com","*.cxpublic.com","*.emediate.dk","*.emediate.eu"]},{"name":"Marchex","categories":["analytics"],"domains":["*.voicestar.com","*.marchex.io"]},{"name":"Fastly","categories":["utility"],"domains":["*.fastly.net"]},{"name":"Unpkg","homepage":"https://unpkg.com","categories":["cdn"],"domains":["*.unpkg.com"]},{"name":"LivePerson","categories":["customer-success"],"homepage":"https://www.liveperson.com/","domains":["*.liveperson.com","*.look.io","*.liveperson.net","*.lpsnmedia.net"]},{"name":"SoundCloud","homepage":"https://www.soundcloud.com/","categories":["content"],"domains":["*.sndcdn.com","*.soundcloud.com","*.stratus.sc"],"examples":["widget.sndcdn.com"]},{"name":"VWO","homepage":"https://vwo.com","categories":["analytics"],"domains":["*.visualwebsiteoptimizer.com"],"examples":["dev.visualwebsiteoptimizer.com"]},{"name":"StickyADS.tv","categories":["ad"],"domains":["*.stickyadstv.com"]},{"name":"PushCrew","categories":["ad"],"domains":["*.pushcrew.com"]},{"name":"Embedly","categories":["content"],"domains":["*.embedly.com","*.embed.ly"]},{"name":"CDK Dealer Management","company":"CDK Global","homepage":"https://www.cdkglobal.com/us","categories":["hosting"],"domains":["*.assets-cdk.com"],"examples":["media-cf.assets-cdk.com"]},{"name":"Popads","homepage":"https://www.popads.net/","categories":["ad"],"domains":["*.popads.net"],"examples":["serve.popads.net","c1.popads.net"]},{"name":"FreakOut","categories":["ad"],"domains":["*.fout.jp"]},{"name":"SnapWidget","categories":["content"],"domains":["*.snapwidget.com"]},{"name":"Pure Chat","categories":["customer-success"],"domains":["*.purechat.com"]},{"name":"Outbrain","homepage":"https://www.outbrain.com/","categories":["ad"],"domains":["*.outbrain.com","*.outbrainimg.com","*.visualrevenue.com"]},{"name":"RD Station","homepage":"https://www.rdstation.com/en/","categories":["marketing"],"domains":["d335luupugsy2.cloudfront.net"]},{"name":"LiveJournal","categories":["social"],"domains":["*.livejournal.com","*.livejournal.net"]},{"name":"ContactAtOnce","homepage":"https://www.contactatonce.com/","categories":["customer-success"],"domains":["*.contactatonce.com"],"examples":["tag.contactatonce.com","agentpresence.contactatonce.com"]},{"name":"Ezoic","categories":["analytics"],"domains":["*.ezoic.net"]},{"name":"AB Tasty","categories":["analytics"],"domains":["*.abtasty.com","d1447tq2m68ekg.cloudfront.net"]},{"name":"Quantcast","homepage":"https://www.quantcast.com","categories":["analytics"],"domains":["*.brtstats.com","*.quantcount.com","*.quantserve.com","*.semantictec.com","*.ntv.io"],"examples":["pixel.quantserve.com","secure.quantserve.com","cms.quantserve.com","rules.quantcount.com"]},{"name":"DigiTrust","homepage":"http://www.digitru.st/","categories":["analytics"],"domains":["*.digitru.st"],"examples":["cdn.digitru.st"]},{"name":"LongTail Ad Solutions","categories":["ad"],"domains":["*.jwpcdn.com","*.jwplatform.com","*.jwplayer.com","*.jwpltx.com","*.jwpsrv.com","*.longtailvideo.com"]},{"name":"Parse.ly","categories":["analytics"],"domains":["*.parsely.com","d1z2jf7jlzjs58.cloudfront.net"]},{"name":"Index Exchange","company":"WPP","categories":["ad"],"domains":["*.casalemedia.com","*.indexww.com"]},{"name":"Clicktripz","categories":["content"],"domains":["*.clicktripz.com"],"examples":["static.clicktripz.com","www.clicktripz.com"]},{"name":"Ve","company":"Ve Interactive","categories":["marketing"],"domains":["*.veinteractive.com"]},{"name":"Adloox","categories":["ad"],"domains":["*.adlooxtracking.com"]},{"name":"GumGum","categories":["ad"],"domains":["*.gumgum.com"]},{"name":"Digital ad Consortium","categories":["ad"],"domains":["*.impact-ad.jp"]},{"name":"Amplitude Mobile Analytics","company":"Amplitude","categories":["analytics"],"domains":["*.amplitude.com","d24n15hnbwhuhn.cloudfront.net"]},{"name":"Adobe Business Catalyst","homepage":"https://www.businesscatalyst.com/","categories":["hosting"],"domains":["*.businesscatalyst.com"]},{"name":"LightWidget","categories":["utility"],"domains":["*.lightwidget.com"]},{"name":"Spotify","homepage":"https://www.spotify.com/","categories":["content"],"domains":["*.scdn.co","*.spotify.com"],"examples":["open.spotify.com","open.scdn.co","i.scdn.co"]},{"name":"SmartAdServer","categories":["ad"],"domains":["*.01net.com","*.sascdn.com"],"examples":["securite.01net.com"]},{"name":"Adroll","homepage":"https://www.adroll.com/","categories":["ad"],"domains":["*.adroll.com"],"examples":["d.adroll.com","s.adroll.com"]},{"name":"PureCars","homepage":"https://www.purecars.com/","categories":["marketing"],"domains":["*.purecars.com"],"examples":["cdn.purecars.com"]},{"name":"Keen","company":"Keen","homepage":"https://keen.io/","categories":["analytics"],"domains":["*.keen.io","d26b395fwzu5fz.cloudfront.net"]},{"name":"Infolinks","categories":["ad"],"domains":["*.infolinks.com"]},{"name":"Unbounce","categories":["ad"],"domains":["*.ubembed.com","*.unbounce.com","d2xxq4ijfwetlm.cloudfront.net","d9hhrg4mnvzow.cloudfront.net"]},{"name":"Roxr Software","categories":["analytics"],"domains":["*.getclicky.com"]},{"name":"OpenTable","company":"Priceline Group","categories":["content"],"domains":["*.opentable.com","*.opentable.co.uk","*.toptable.co.uk"],"examples":["www.toptable.co.uk"]},{"name":"uLogin","categories":["other"],"domains":["*.ulogin.ru"]},{"name":"Searchanise","categories":["analytics"],"domains":["*.searchanise.com"],"examples":["www.searchanise.com"]},{"name":"Gigya","categories":["analytics"],"domains":["*.gigya.com"]},{"name":"Net Reviews","categories":["analytics"],"domains":["*.avis-verifies.com"],"examples":["www.avis-verifies.com"]},{"name":"Booking.com","categories":["content"],"domains":["*.bstatic.com"]},{"name":"Disqus","homepage":"http://disqus.com/","categories":["social"],"domains":["*.disqus.com","*.disquscdn.com"],"examples":["c.disquscdn.com"]},{"name":"Tray Commerce","homepage":"https://www.tray.com.br/","categories":["marketing"],"domains":["*.tcdn.com.br"],"examples":["images.tcdn.com.br"]},{"name":"Crowd Control","company":"Lotame","categories":["ad"],"domains":["*.crwdcntrl.net"]},{"name":"Intent Media","homepage":"https://intent.com/","categories":["ad"],"domains":["*.intentmedia.net"]},{"name":"issuu","categories":["content"],"domains":["*.issuu.com","*.isu.pub"]},{"name":"Salesforce Commerce Cloud","homepage":"https://www.salesforce.com/products/commerce-cloud/overview/","categories":["hosting"],"domains":["*.cquotient.com","*.demandware.net","demandware.edgesuite.net"]},{"name":"sovrn","categories":["ad"],"domains":["*.lijit.com"]},{"name":"JuicyAds","categories":["ad"],"domains":["*.juicyads.com"]},{"name":"Sharethrough","categories":["ad"],"domains":["*.sharethrough.com"]},{"name":"Heap","categories":["analytics"],"domains":["*.heapanalytics.com"]},{"name":"LiveTex","categories":["customer-success"],"domains":["*.livetex.ru"]},{"name":"Nosto","categories":["analytics"],"domains":["*.nosto.com"]},{"name":"fluct","categories":["ad"],"domains":["*.adingo.jp"]},{"name":"Smart AdServer","categories":["ad"],"domains":["*.sasqos.com","*.smartadserver.com"]},{"name":"fam","company":"Fing Co Ltd.","homepage":"http://admin.fam-ad.com/report/","categories":["ad"],"domains":["*.fam-ad.com"],"examples":["img.fam-ad.com"]},{"name":"ExoClick","categories":["ad"],"domains":["*.exoclick.com"]},{"name":"BannerFlow","company":"Nordic Factory Solutions","categories":["ad"],"domains":["*.bannerflow.com"]},{"name":"iPerceptions","categories":["customer-success"],"domains":["*.iperceptions.com"]},{"name":"Albacross","homepage":"https://albacross.com/","categories":["marketing"],"domains":["*.albacross.com"],"examples":["serve.albacross.com"]},{"name":"RevJet","homepage":"https://www.revjet.com/","categories":["ad"],"domains":["*.revjet.com"],"examples":["pix.revjet.com","ads.revjet.com"]},{"name":"Trusted Shops","categories":["utility"],"domains":["*.trustedshops.com"]},{"name":"MaxCDN Enterprise","company":"MaxCDN","categories":["utility"],"domains":["*.netdna-cdn.com","*.netdna-ssl.com"]},{"name":"etracker","categories":["analytics"],"domains":["*.etracker.com","*.etracker.de"],"examples":["www.etracker.com"]},{"name":"Yandex CDN","company":"Yandex","homepage":"https://yandex.ru/","categories":["cdn"],"domains":["*.yandex.st"]},{"name":"LKQD","categories":["ad"],"domains":["*.lkqd.net"]},{"name":"Sift Science","categories":["utility"],"domains":["*.siftscience.com"]},{"name":"Help Scout","homepage":"https://www.helpscout.net/","categories":["customer-success"],"domains":["djtflbt20bdde.cloudfront.net","*.helpscout.net"],"examples":["beacon-v2.helpscout.net"]},{"name":"Seznam","categories":["utility"],"domains":["*.imedia.cz"]},{"name":"Vidible","categories":["ad"],"domains":["*.vidible.tv"]},{"name":"Media Math","homepage":"http://www.mediamath.com/","categories":["ad"],"domains":["*.mathads.com","*.mathtag.com"],"examples":["mathid.mathtag.com","sync.mathtag.com","pixel.mathtag.com"]},{"name":"Simplicity Marketing","categories":["ad"],"domains":["*.flashtalking.com"]},{"name":"Mouseflow","categories":["analytics"],"domains":["*.mouseflow.com"]},{"name":"Siteimprove","categories":["utility"],"domains":["*.siteimprove.com","*.siteimproveanalytics.com"]},{"name":"GetSiteControl","company":"GetWebCraft","categories":["utility"],"domains":["*.getsitecontrol.com"]},{"name":"AOL / Oath / Verizon Media","homepage":"https://www.oath.com/","categories":["ad"],"domains":["*.advertising.com","*.aol.com","*.aolcdn.com","*.blogsmithmedia.com","*.oath.com","*.aol.net","*.tacoda.net","*.aol.co.uk"],"examples":["pixel.advertising.com","dtm.advertising.com","tag.sp.advertising.com","service.sp.advertising.com","adtech.advertising.com","adaptv.advertising.com","mighty.aol.net","consent.cmp.oath.com"]},{"name":"Accuweather","categories":["content"],"domains":["*.accuweather.com"]},{"name":"Feefo.com","company":"Feefo","categories":["analytics"],"domains":["*.feefo.com"]},{"name":"Constant Contact","categories":["ad"],"domains":["*.ctctcdn.com"]},{"name":"Rakuten Marketing","company":"Rakuten","categories":["ad"],"domains":["*.rakuten-static.com","*.rmtag.com"]},{"name":"TrafficStars","categories":["ad"],"domains":["*.trafficstars.com","*.tsyndicate.com"]},{"name":"ForeSee","company":"Answers","categories":["analytics"],"domains":["*.4seeresults.com","*.answerscloud.com","*.foresee.com","*.foreseeresults.com"]},{"name":"Swiftype","categories":["utility"],"domains":["*.swiftype.com","*.swiftypecdn.com"]},{"name":"Bazaarvoice","categories":["analytics"],"domains":["*.bazaarvoice.com","*.feedmagnet.com"]},{"name":"SocialShopWave","categories":["social"],"domains":["*.socialshopwave.com"]},{"name":"Bootstrap CDN","homepage":"https://www.bootstrapcdn.com/","categories":["cdn"],"domains":["*.bootstrapcdn.com"],"examples":["maxcdn.bootstrapcdn.com","stackpath.bootstrapcdn.com"]},{"name":"SessionCam","company":"ServiceTick","categories":["analytics"],"domains":["*.sessioncam.com","d2oh4tlt9mrke9.cloudfront.net"]},{"name":"AppDynamics","homepage":"https://www.appdynamics.com/","categories":["utility"],"domains":["*.appdynamics.com","*.eum-appdynamics.com","d3tjaysgumg9lf.cloudfront.net"],"examples":["cdn.appdynamics.com"]},{"name":"Adyoulike","categories":["ad"],"domains":["*.adyoulike.com","*.omnitagjs.com","*.adyoulike.net"]},{"name":"Affirm","categories":["utility"],"domains":["*.affirm.com"]},{"name":"Sortable","categories":["ad"],"domains":["*.deployads.com"]},{"name":"Neodata","categories":["ad"],"domains":["*.neodatagroup.com"]},{"name":"Adnium","categories":["ad"],"domains":["*.adnium.com"]},{"name":"AdScore","homepage":"https://www.adscore.com/","categories":["ad"],"domains":["*.adsco.re"],"examples":["c.adsco.re"]},{"name":"Comm100","categories":["customer-success"],"domains":["*.comm100.com"]},{"name":"Medium","categories":["content"],"domains":["*.medium.com"]},{"name":"Esri ArcGIS","company":"Esri","categories":["utility"],"domains":["*.arcgis.com","*.arcgisonline.com"]},{"name":"iBillboard","categories":["ad"],"domains":["*.ibillboard.com"]},{"name":"Hotmart","homepage":"https://www.hotmart.com/","categories":["content"],"domains":["*.hotmart.com"],"examples":["launchermodule.hotmart.com"]},{"name":"Secomapp","categories":["utility"],"domains":["*.secomapp.com"]},{"name":"AdMatic","categories":["ad"],"domains":["*.admatic.com.tr"]},{"name":"Dailymotion","categories":["content"],"domains":["*.dailymotion.com","*.dmxleo.com","*.dm.gg","*.pxlad.io","*.dmcdn.net","*.sublimevideo.net"],"examples":["ad.pxlad.io","www.dailymotion.com"]},{"name":"Foursixty","categories":["customer-success"],"domains":["*.foursixty.com"]},{"name":"OptiMonk","categories":["ad"],"domains":["*.optimonk.com"]},{"name":"Refersion","categories":["ad"],"domains":["*.refersion.com"]},{"name":"Pardot","categories":["marketing"],"domains":["*.pardot.com"]},{"name":"GitHub","categories":["utility"],"domains":["*.rawgit.com"],"examples":["cdn.rawgit.com"]},{"name":"Alexa","homepage":"https://www.alexa.com/","categories":["analytics"],"domains":["*.alexametrics.com","d31qbv1cthcecs.cloudfront.net"],"examples":["certify.alexametrics.com"]},{"name":"Bugsnag","categories":["utility"],"domains":["*.bugsnag.com","d2wy8f7a9ursnm.cloudfront.net"],"examples":["notify.bugsnag.com"]},{"name":"ResponsiveVoice","categories":["other"],"domains":["*.responsivevoice.org"]},{"name":"ContentSquare","categories":["analytics"],"domains":["d1m6l9dfulcyw7.cloudfront.net","*.content-square.net","*.contentsquare.net"]},{"name":"BounceX","categories":["analytics"],"homepage":"https://www.bouncex.com/","domains":["*.bounceexchange.com","*.bouncex.net"],"examples":["events.bouncex.net"]},{"name":"Tencent","categories":["content"],"domains":["*.qq.com","*.ywxi.net"]},{"name":"TagCommander","categories":["tag-manager"],"domains":["*.commander1.com","*.tagcommander.com"]},{"name":"Between Digital","categories":["ad"],"domains":["*.betweendigital.com"]},{"name":"Tribal Fusion","company":"Exponential Interactive","categories":["ad"],"domains":["*.tribalfusion.com"]},{"name":"iovation","categories":["utility"],"domains":["*.iesnare.com"]},{"name":"Auto Link Maker","company":"Apple","categories":["ad"],"domains":["*.apple.com"],"examples":["autolinkmaker.itunes.apple.com"]},{"name":"SnapEngage","categories":["customer-success"],"domains":["*.snapengage.com"]},{"name":"iAdvize SAS","categories":["customer-success"],"domains":["*.iadvize.com"]},{"name":"Listrak","homepage":"https://www.listrak.com/","categories":["marketing"],"domains":["*.listrak.com","*.listrakbi.com"],"examples":["cdn.listrakbi.com","s1.listrakbi.com"]},{"name":"Branch Metrics","categories":["ad"],"domains":["*.branch.io","*.app.link"]},{"name":"Admixer for Publishers","company":"Admixer","categories":["ad"],"domains":["*.admixer.net"]},{"name":"Tail Target","company":"Tail","categories":["ad"],"domains":["*.tailtarget.com"]},{"name":"Clicktale","categories":["analytics"],"domains":["*.cdngc.net","*.clicktale.net"],"examples":["clicktalecdn.sslcs.cdngc.net"]},{"name":"Maxymiser","categories":["analytics"],"domains":["*.maxymiser.net"]},{"name":"Marketo","homepage":"https://www.marketo.com","categories":["analytics"],"domains":["*.marketo.com","*.mktoresp.com","*.marketo.net"],"examples":["munchkin.marketo.net"]},{"name":"Bizible","categories":["ad"],"domains":["*.bizible.com","*.bizibly.com"]},{"name":"LoyaltyLion","categories":["ad"],"domains":["*.loyaltylion.com","*.loyaltylion.net","dg1f2pfrgjxdq.cloudfront.net"]},{"name":"Convert Insights","categories":["analytics"],"domains":["*.convertexperiments.com"]},{"name":"Opentag","company":"Qubit","categories":["tag-manager"],"domains":["*.qutics.com","d3c3cq33003psk.cloudfront.net"],"examples":["opentag-stats.qutics.com"]},{"name":"Adverline Board","company":"Adverline","categories":["ad"],"domains":["*.adverline.com","*.adnext.fr"]},{"name":"Optanon","homepage":"https://www.cookielaw.org/","categories":["utility"],"domains":["*.onetrust.com","*.cookielaw.org"],"examples":["cdn.cookielaw.org","geolocation.onetrust.com"]},{"name":"Adocean","company":"Gemius","categories":["ad"],"domains":["*.adocean.pl"]},{"name":"Po.st","company":"RadiumOne","categories":["utility"],"domains":["*.po.st"]},{"name":"Yieldmo","categories":["ad"],"domains":["*.yieldmo.com"]},{"name":"Market GID","homepage":"https://www.marketgid.com/","categories":["ad"],"domains":["*.marketgid.com"],"examples":["jsc.marketgid.com"]},{"name":"TRUSTe","categories":["utility"],"domains":["*.truste.com"]},{"name":"One by AOL","company":"AOL","categories":["ad"],"domains":["*.adtechjp.com","*.adtech.de"]},{"name":"Affiliate Window","company":"Digital Window","categories":["ad"],"domains":["*.dwin1.com"]},{"name":"Pagely","categories":["other"],"domains":["*.optnmstr.com"]},{"name":"Perfect Market","categories":["ad"],"domains":["*.perfectmarket.com"]},{"name":"Symantec","categories":["utility"],"domains":["*.norton.com","*.symantec.com","*.symcb.com","*.symcd.com"],"examples":["extended-validation-ssl.websecurity.symantec.com"]},{"name":"piano","categories":["ad"],"domains":["*.npttech.com","*.tinypass.com"],"examples":["www.npttech.com"]},{"name":"Elastic Ad","categories":["ad"],"domains":["*.elasticad.net"]},{"name":"Freshdesk","homepage":"https://freshdesk.com/","categories":["customer-success"],"domains":["d36mpcpuzc4ztk.cloudfront.net"]},{"name":"IPONWEB","categories":["ad"],"domains":["*.company-target.com","*.liadm.com","*.iponweb.net","*.p161.net"],"examples":["pool.udsp.iponweb.net"]},{"name":"Ecwid","categories":["hosting"],"domains":["*.ecwid.com","*.shopsettings.com","d3fi9i0jj23cau.cloudfront.net","d3j0zfs7paavns.cloudfront.net"]},{"name":"Digioh","categories":["ad"],"domains":["*.lightboxcdn.com"]},{"name":"Fort Awesome","categories":["cdn"],"domains":["*.fortawesome.com"]},{"name":"Nend","categories":["ad"],"domains":["*.nend.net"]},{"name":"Bronto Software","categories":["marketing"],"domains":["*.bm23.com","*.bronto.com","*.brontops.com"]},{"name":"TrackJS","categories":["analytics"],"domains":["*.trackjs.com","d2zah9y47r7bi2.cloudfront.net"],"examples":["usage.trackjs.com"]},{"name":"Dynamic Yield","categories":["customer-success"],"domains":["*.dynamicyield.com"]},{"name":"Clerk.io ApS","categories":["analytics"],"domains":["*.clerk.io"]},{"name":"IBM Digital Analytics","company":"IBM","categories":["analytics"],"domains":["*.cmcore.com","coremetrics.com","data.coremetrics.com","data.de.coremetrics.com","libs.de.coremetrics.com","tmscdn.de.coremetrics.com","iocdn.coremetrics.com","libs.coremetrics.com","tmscdn.coremetrics.com","*.s81c.com","*.unica.com","*.coremetrics.eu"],"examples":["data.coremetrics.eu"]},{"name":"Usabilla","homepage":"https://usabilla.com","categories":["analytics"],"domains":["*.usabilla.com","d6tizftlrpuof.cloudfront.net"],"examples":["w.usabilla.com"]},{"name":"Meetrics","categories":["ad"],"domains":["*.de.com","*.meetrics.net","*.mxcdn.net"],"examples":["research.de.com"]},{"name":"Forensiq","categories":["utility"],"domains":["*.fqtag.com"]},{"name":"Revolver Maps","categories":["analytics"],"domains":["*.revolvermaps.com"]},{"name":"Monetate","categories":["analytics"],"domains":["*.monetate.net"]},{"name":"Fraudlogix","categories":["utility"],"domains":["*.yabidos.com"]},{"name":"Mather Economics","categories":["analytics"],"domains":["*.matheranalytics.com"]},{"name":"Blindado","categories":["utility"],"domains":["*.siteblindado.com"]},{"name":"UserReport","categories":["analytics"],"domains":["*.userreport.com"]},{"name":"OwnerIQ","categories":["ad"],"domains":["*.owneriq.net"]},{"name":"CPEx","categories":["content"],"domains":["*.cpex.cz"]},{"name":"eBay","categories":["ad"],"domains":["*.ebay.com","*.ebayimg.com","*.fetchback.com"]},{"name":"Skype","categories":["other"],"domains":["*.skype.com"]},{"name":"DialogTech","categories":["ad"],"domains":["*.dialogtech.com"]},{"name":"WebsiteBuilder.com","homepage":"https://www.websitebuilder.com","categories":["hosting"],"domains":["*.mywebsitebuilder.com"]},{"name":"iZooto","homepage":"https://www.izooto.com","categories":["marketing"],"domains":["*.izooto.com"],"examples":["cdn.izooto.com"]},{"name":"AddEvent","categories":["utility"],"domains":["*.addevent.com"],"examples":["www.addevent.com"]},{"name":"GetResponse","categories":["ad"],"domains":["*.getresponse.com"]},{"name":"Twitch","homepage":"https://twitch.tv/","categories":["video"],"domains":["*.twitch.tv"],"examples":["player.twitch.tv"]},{"name":"Radar","company":"Cedexis","homepage":"https://www.cedexis.com/radar/","categories":["analytics"],"domains":["*.cedexis-test.com","*.cedexis.com","*.cmdolb.com","cedexis.leasewebcdn.com","*.cedexis-radar.net","*.cedexis.net","cedexis-test01.insnw.net","cedexisakamaitest.azureedge.net","cedexispub.cdnetworks.net","cs600.wac.alphacdn.net","cs600.wpc.edgecastdns.net","global2.cmdolb.com","img-cedexis.mncdn.com","a-cedexis.msedge.net","zn3vgszfh.fastestcdn.net"],"examples":["radar.cedexis.com","rpt.cedexis.com","2-01-49cd-0002.cdx.cedexis.net","bench.cedexis-test.com"]},{"name":"Smart Insight Tracking","company":"Emarsys","categories":["analytics"],"domains":["*.scarabresearch.com"]},{"name":"Polar","homepage":"https://polar.me/","categories":["ad"],"domains":["*.polarmobile.ca","*.mediaeverywhere.com","*.mediavoice.com","*.plrsrvcs.com","*.polarcdn-engine.com","*.polarcdn-meraxes.com","*.polarcdn-pentos.com","*.polarcdn-static.com","*.polarcdn-terrax.com","*.polarcdn.com","*.polarmobile.com","*.poweredbypolar.com","*.mediaconductor.me","*.polaracademy.me"]},{"name":"AudienceSearch","company":"Intimate Merger","categories":["ad"],"domains":["*.im-apps.net"]},{"name":"Autopilot","categories":["ad"],"domains":["*.autopilothq.com"]},{"name":"Rackspace","categories":["hosting"],"domains":["*.rackcdn.com","*.rackspacecloud.com","*.raxcdn.com","*.websitetestlink.com"]},{"name":"PowerReviews","categories":["analytics"],"domains":["*.powerreviews.com"]},{"name":"Rocket Fuel","categories":["ad"],"domains":["*.rfihub.com","*.ru4.com","*.rfihub.net","*.ad1x.com"]},{"name":"Okas Concepts","categories":["utility"],"domains":["*.okasconcepts.com"]},{"name":"Madison Logic","categories":["marketing"],"domains":["*.ml314.com"]},{"name":"Celtra","categories":["ad"],"domains":["*.celtra.com"]},{"name":"Snacktools","categories":["ad"],"domains":["*.bannersnack.com"]},{"name":"ClickDesk","categories":["customer-success"],"domains":["*.clickdesk.com","d1gwclp1pmzk26.cloudfront.net"]},{"name":"F@N Communications","homepage":"https://www.fancs.com/","categories":["ad"],"domains":["*.ladsp.com"],"examples":["px.ladsp.com"]},{"name":"Tradelab","categories":["ad"],"domains":["*.tradelab.fr"]},{"name":"CleverDATA","categories":["ad"],"domains":["*.1dmp.io"]},{"name":"Media Management Technologies","categories":["ad"],"domains":["*.speedshiftmedia.com"]},{"name":"Wishpond Technologies","categories":["marketing"],"domains":["*.wishpond.com","*.wishpond.net"]},{"name":"Reviews.co.uk","categories":["analytics"],"domains":["*.reviews.co.uk"]},{"name":"Adobe Scene7","company":"Adobe Systems","categories":["content"],"domains":["wwwimages.adobe.com","*.scene7.com","*.everestads.net","*.everestjs.net"]},{"name":"Permutive","categories":["ad"],"domains":["*.permutive.com","d3alqb8vzo7fun.cloudfront.net"]},{"name":"plista","categories":["ad"],"domains":["*.plista.com"]},{"name":"Kampyle","categories":["analytics"],"domains":["*.kampyle.com"]},{"name":"LinkedIn Ads","categories":["ad"],"domains":["*.licdn.com","ads.linkedin.com","www.linkedin.com"],"examples":["snap.licdn.com"]},{"name":"Survicate","categories":["analytics"],"domains":["*.survicate.com"]},{"name":"Nativo","categories":["ad"],"domains":["*.postrelease.com"]},{"name":"Decibel Insight","categories":["analytics"],"domains":["*.decibelinsight.net"]},{"name":"Github","categories":["utility"],"domains":["*.github.com","*.githubusercontent.com","*.github.io"],"examples":["raw.githubusercontent.com"]},{"name":"WebEngage","categories":["customer-success"],"domains":["*.webengage.co","*.webengage.com","d23nd6ymopvz52.cloudfront.net","d3701cc9l7v9a6.cloudfront.net"]},{"name":"Geniee","categories":["ad"],"domains":["*.href.asia","*.genieessp.jp","*.genieesspv.jp","*.gssprt.jp"],"examples":["cs.gssprt.jp"]},{"name":"The Trade Desk","homepage":"https://www.thetradedesk.com/","categories":["ad"],"domains":["d1eoo1tco6rr5e.cloudfront.net","*.adsrvr.org"],"examples":["js.adsrvr.org","match.adsrvr.org","insight.adsrvr.org","usw-lax.adsrvr.org","data.adsrvr.org","snap.adsrvr.org"]},{"name":"Lytics","categories":["ad"],"domains":["*.lytics.io"]},{"name":"rewardStyle.com","categories":["ad"],"domains":["*.rewardstyle.com"]},{"name":"Kaltura Video Platform","company":"Kaltura","categories":["content"],"domains":["*.kaltura.com"],"examples":["cdnsecakmi.kaltura.com"]},{"name":"WisePops","categories":["utility"],"domains":["*.wisepops.com"]},{"name":"Picreel","categories":["analytics"],"domains":["*.pcrl.co","*.picreel.com"]},{"name":"Riskified","categories":["utility"],"domains":["*.riskified.com"]},{"name":"Supership","homepage":"https://supership.jp/","categories":["ad"],"domains":["*.socdm.com"]},{"name":"Google Plus","company":"Google","categories":["social"],"domains":["plus.google.com"]},{"name":"Yieldify","categories":["ad"],"domains":["*.yieldify.com","*.yieldifylabs.com","d33wq5gej88ld6.cloudfront.net","dwmvwp56lzq5t.cloudfront.net"],"examples":["geo.yieldifylabs.com"]},{"name":"Smarter Click","categories":["ad"],"domains":["*.smct.co","*.smarterclick.co.uk"]},{"name":"Evergage","categories":["analytics"],"domains":["*.evergage.com","*.evgnet.com"],"examples":["cdn.evgnet.com"]},{"name":"SaleCycle","categories":["ad"],"domains":["*.salecycle.com","d16fk4ms6rqz1v.cloudfront.net","d22j4fzzszoii2.cloudfront.net","d30ke5tqu2tkyx.cloudfront.net"]},{"name":"Zanox","categories":["ad"],"domains":["*.zanox.com","*.zanox.ws"]},{"name":"AddShoppers","categories":["social"],"domains":["*.addshoppers.com","d3rr3d0n31t48m.cloudfront.net","*.shop.pe"]},{"name":"Interpublic Group","categories":["ad"],"domains":["*.mbww.com"]},{"name":"Qualaroo","categories":["analytics"],"domains":["*.qualaroo.com"]},{"name":"BoldChat","company":"LogMeIn","categories":["customer-success"],"domains":["*.boldchat.com"]},{"name":"Effective Measure","categories":["ad"],"domains":["*.effectivemeasure.net"]},{"name":"LoopMe","categories":["ad"],"domains":["*.loopme.biz","*.loopme.com","*.vntsm.com","*.loopme.me"]},{"name":"Sooqr Search","company":"Sooqr","categories":["utility"],"domains":["*.sooqr.com"]},{"name":"smartclip","categories":["ad"],"domains":["*.smartclip.net"]},{"name":"Cloudinary","categories":["content"],"domains":["*.cloudinary.com"]},{"name":"Gleam","categories":["marketing"],"domains":["*.gleam.io"]},{"name":"Revcontent","categories":["content"],"domains":["*.revcontent.com"]},{"name":"Browsealoud","homepage":"https://www.texthelp.com/en-gb/products/browsealoud/","categories":["other"],"domains":["*.browsealoud.com","*.texthelp.com"],"examples":["www.browsealoud.com"]},{"name":"Ooyala","categories":["ad"],"domains":["*.ooyala.com"]},{"name":"Intercept Interactive","categories":["ad"],"domains":["*.undertone.com"]},{"name":"Appier","categories":["ad"],"domains":["*.appier.net"]},{"name":"SublimeSkinz","categories":["ad"],"domains":["*.ayads.co"]},{"name":"KISSmetrics","categories":["analytics"],"domains":["*.kissmetrics.com","doug1izaerwt3.cloudfront.net","dsyszv14g9ymi.cloudfront.net"]},{"name":"Pixlee","categories":["social"],"domains":["*.pixlee.com"]},{"name":"NetFlix","categories":["content"],"domains":["*.nflxext.com","*.nflximg.net"]},{"name":"Shopgate","categories":["utility"],"domains":["*.shopgate.com"]},{"name":"Highcharts","categories":["utility"],"domains":["*.highcharts.com"]},{"name":"Audience 360","company":"Datapoint Media","categories":["ad"],"domains":["*.dpmsrv.com"]},{"name":"Bootstrap Chinese network","categories":["cdn"],"domains":["*.bootcss.com"]},{"name":"Sparkflow","company":"Intercept Interactive","categories":["ad"],"domains":["*.sparkflow.net"]},{"name":"Flowplayer","categories":["content"],"domains":["*.flowplayer.org"]},{"name":"Fresh Relevance","categories":["analytics"],"domains":["*.freshrelevance.com","*.cloudfront.ne","d1y9qtn9cuc3xw.cloudfront.net","d81mfvml8p5ml.cloudfront.net","dkpklk99llpj0.cloudfront.net"],"examples":["d1y9qtn9cuc3xw.cloudfront.ne"]},{"name":"WebpageFX","categories":["ad"],"domains":["*.leadmanagerfx.com"]},{"name":"Simpli.fi","categories":["ad"],"domains":["*.simpli.fi"]},{"name":"Omniconvert","categories":["analytics"],"domains":["*.omniconvert.com","d2tgfbvjf3q6hn.cloudfront.net","d3vbj265bmdenw.cloudfront.net"]},{"name":"Adscale","categories":["ad"],"domains":["*.adscale.de"]},{"name":"Covert Pics","categories":["content"],"domains":["*.covet.pics"]},{"name":"Curalate","categories":["marketing"],"domains":["*.curalate.com","d116tqlcqfmz3v.cloudfront.net"]},{"name":"ReadSpeaker","homepage":"https://www.readspeaker.com","categories":["other"],"domains":["*.readspeaker.com"],"examples":["sf1-eu.readspeaker.com"]},{"name":"Stackla PTY","categories":["social"],"domains":["*.stackla.com"]},{"name":"SpotXchange","categories":["ad"],"domains":["*.spotxcdn.com","*.spotxchange.com","*.spotx.tv"]},{"name":"Qubit Deliver","company":"Qubit","categories":["analytics"],"domains":["d1m54pdnjzjnhe.cloudfront.net","d22rutvoghj3db.cloudfront.net","dd6zx4ibq538k.cloudfront.net"]},{"name":"Opta","company":"Perform Group","categories":["content"],"domains":["*.opta.net"]},{"name":"Unruly Media","categories":["ad"],"domains":["*.unrulymedia.com"]},{"name":"Quantum Metric","homepage":"https://www.quantummetric.com/","categories":["analytics"],"domains":["*.quantummetric.com"]},{"name":"Weborama","categories":["ad"],"domains":["*.weborama.com","*.weborama.fr"]},{"name":"Republer","categories":["ad"],"domains":["*.republer.com"],"examples":["sync.republer.com"]},{"name":"Vox Media","homepage":"https://www.voxmedia.com/","categories":["content"],"domains":["*.vox-cdn.com","*.voxmedia.com"],"examples":["cdn.vox-cdn.com"]},{"name":"FoxyCart","categories":["utility"],"domains":["*.foxycart.com"]},{"name":"Adition","homepage":"https://www.adition.com","categories":["ad"],"domains":["*.adition.com"],"examples":["dsp.adfarm1.adition.com"]},{"name":"LiveHelpNow","categories":["customer-success"],"domains":["*.livehelpnow.net"]},{"name":"DemandBase","categories":["marketing"],"domains":["*.demandbase.com"]},{"name":"Concert","homepage":"https://concert.io/","categories":["ad"],"domains":["*.concert.io"],"examples":["cdn.concert.io"]},{"name":"TINT","categories":["content"],"domains":["*.71n7.com","d33w9bm0n1egwm.cloudfront.net","d36hc0p18k1aoc.cloudfront.net","d3l7tj34e9fc43.cloudfront.net"],"examples":["www.71n7.com"]},{"name":"Arbor","company":"LiveRamp","categories":["other"],"domains":["*.pippio.com"]},{"name":"Vidyard","homepage":"https://www.vidyard.com/","categories":["utility"],"domains":["*.vidyard.com"]},{"name":"linkpulse","categories":["analytics"],"domains":["*.lp4.io"]},{"name":"Edge Web Fonts","company":"Adobe Systems","categories":["cdn"],"domains":["*.edgefonts.net"],"examples":["use.edgefonts.net"]},{"name":"ShopiMind","company":"ShopIMind","categories":["ad"],"domains":["*.shopimind.com"]},{"name":"Feedbackify","company":"InsideMetrics","categories":["analytics"],"domains":["*.feedbackify.com"]},{"name":"Sidecar","categories":["other"],"domains":["*.getsidecar.com","d3v27wwd40f0xu.cloudfront.net"]},{"name":"SearchSpring","categories":["utility"],"domains":["*.searchspring.net"]},{"name":"DMD Marketing","homepage":"https://www.dmdconnects.com/","categories":["ad"],"domains":["*.medtargetsystem.com"]},{"name":"C3 Metrics","categories":["analytics"],"domains":["*.c3tag.com"]},{"name":"FirstImpression","categories":["ad"],"domains":["*.firstimpression.io"]},{"name":"GetIntent RTBSuite","company":"GetIntent","categories":["ad"],"domains":["*.adhigh.net"]},{"name":"unpkg","categories":["utility"],"domains":["*.npmcdn.com"]},{"name":"PerimeterX Bot Defender","company":"PerimeterX","categories":["utility"],"domains":["*.perimeterx.net","*.pxi.pub"]},{"name":"JustPremium Ads","company":"JustPremium","categories":["ad"],"domains":["*.justpremium.com"]},{"name":"Talkable","categories":["ad"],"domains":["*.talkable.com","d2jjzw81hqbuqv.cloudfront.net"],"examples":["www.talkable.com"]},{"name":"Steelhouse","categories":["ad"],"domains":["*.steelhousemedia.com"]},{"name":"Adtech (AOL)","categories":["ad"],"domains":["*.adtechus.com"]},{"name":"Technorati","company":"Synacor","categories":["ad"],"domains":["*.technoratimedia.com"]},{"name":"Drip","company":"The Numa Group","categories":["ad"],"domains":["*.getdrip.com"]},{"name":"VoiceFive","categories":["analytics"],"domains":["*.voicefive.com"]},{"name":"Adkontekst","categories":["ad"],"domains":["*.adkontekst.pl"]},{"name":"Cedato","categories":["ad"],"domains":["*.algovid.com","*.vdoserv.com"]},{"name":"TripAdvisor","categories":["content"],"domains":["*.jscache.com","*.tacdn.com","*.tamgrt.com","*.tripadvisor.com","*.viator.com","*.tripadvisor.co.uk"],"examples":["www.jscache.com","www.tamgrt.com"]},{"name":"Typepad","categories":["hosting"],"domains":["*.typepad.com"]},{"name":"Silverpop","company":"IBM","categories":["ad"],"domains":["*.mkt912.com","*.mkt922.com","*.mkt932.com","*.mkt941.com","*.mkt51.net","*.mkt61.net","*.pages01.net","*.pages02.net","*.pages03.net","*.pages04.net","*.pages05.net"]},{"name":"Attentive","homepage":"https://attentivemobile.com/","categories":["ad"],"domains":["*.attn.tv","*.attentivemobile.com"]},{"name":"Salesforce.com","categories":["ad"],"domains":["*.force.com","*.salesforce.com"],"examples":["secure.force.com"]},{"name":"WebSpectator","categories":["ad"],"domains":["*.webspectator.com"]},{"name":"Kaizen Platform","categories":["analytics"],"domains":["*.kaizenplatform.net"],"examples":["cdn.kaizenplatform.net","log-v4.kaizenplatform.net"]},{"name":"Global-e","categories":["hosting"],"domains":["*.global-e.com"]},{"name":"TruConversion","categories":["analytics"],"domains":["*.truconversion.com"]},{"name":"White Ops","categories":["utility"],"domains":["*.acexedge.com","*.tagsrvcs.com"]},{"name":"Accordant Media","categories":["ad"],"domains":["*.a3cloud.net"],"examples":["segment.a3cloud.net"]},{"name":"Keywee","categories":["ad"],"domains":["*.keywee.co"]},{"name":"Hupso Website Analyzer","company":"Hupso","categories":["analytics"],"domains":["*.hupso.com"]},{"name":"ThreatMetrix","categories":["utility"],"domains":["*.online-metrix.net"]},{"name":"eXelate","categories":["ad"],"domains":["*.exelator.com"]},{"name":"Delta Projects AB","categories":["ad"],"domains":["*.de17a.com"]},{"name":"Profitshare","categories":["ad"],"domains":["*.profitshare.ro"]},{"name":"TubeMogul","categories":["ad"],"domains":["*.tubemogul.com"]},{"name":"Ipify","homepage":"https://www.ipify.org","categories":["utility"],"domains":["*.ipify.org"],"examples":["api.ipify.org","geo.ipify.org"]},{"name":"Marketplace Web Service","company":"Amazon","categories":["other"],"domains":["*.ssl-images-amazon.com"]},{"name":"Key CDN","categories":["utility"],"domains":["*.kxcdn.com"]},{"name":"The ADEX","categories":["ad"],"domains":["*.theadex.com"]},{"name":"ZEDO","categories":["ad"],"domains":["*.zedo.com"]},{"name":"Sajari Pty","categories":["utility"],"domains":["*.sajari.com"]},{"name":"The Hut Group","categories":["content"],"domains":["*.thcdn.com"]},{"name":"Signyfyd","categories":["utility"],"domains":["*.signifyd.com"]},{"name":"Apester","categories":["analytics"],"domains":["*.apester.com","*.qmerce.com"]},{"name":"mParticle","homepage":"https://www.mparticle.com/","categories":["utility"],"domains":["*.mparticle.com"],"examples":["jssdks.mparticle.com","identity.mparticle.com"]},{"name":"AdSniper","categories":["ad"],"domains":["*.adsniper.ru","*.sniperlog.ru"]},{"name":"Time","categories":["content"],"domains":["*.timeinc.net"]},{"name":"SurveyMonkey","categories":["analytics"],"domains":["*.surveymonkey.com"]},{"name":"GIPHY","categories":["content"],"domains":["*.giphy.com"]},{"name":"Socialphotos","categories":["social"],"domains":["*.slpht.com"]},{"name":"Livefyre","categories":["content"],"domains":["*.fyre.co","*.livefyre.com"]},{"name":"Civic","categories":["hosting"],"domains":["*.civiccomputing.com"]},{"name":"Auth0","homepage":"https://auth0.com/","categories":["utility"],"domains":["*.auth0.com"],"examples":["cdn.auth0.com"]},{"name":"Flickr","categories":["content"],"domains":["*.flickr.com","*.staticflickr.com"]},{"name":"Reevoo","categories":["analytics"],"domains":["*.reevoo.com"]},{"name":"Sirv","categories":["other"],"domains":["*.sirv.com"]},{"name":"Underdog Media","categories":["ad"],"domains":["*.underdog.media","*.udmserve.net"]},{"name":"Petametrics","categories":["analytics"],"domains":["*.petametrics.com"]},{"name":"Sweet Tooth","categories":["ad"],"domains":["*.sweettooth.io"]},{"name":"Hola Networks","categories":["other"],"domains":["*.h-cdn.com"]},{"name":"Verizon Digital Media CDN","homepage":"https://www.verizondigitalmedia.com/","categories":["cdn"],"domains":["*.edgecastcdn.net","*.edgecastdns.net"]},{"name":"Zarget","categories":["analytics"],"domains":["*.zarget.com"]},{"name":"ResponseTap","categories":["analytics"],"domains":["*.adinsight.com","*.responsetap.com"]},{"name":"ReTargeter","categories":["ad"],"domains":["*.retargeter.com"]},{"name":"Yottaa","categories":["hosting"],"domains":["*.yottaa.com","*.yottaa.net"]},{"name":"Connatix","categories":["ad"],"domains":["*.connatix.com"]},{"name":"Klevu Search","company":"Klevu","categories":["utility"],"domains":["*.klevu.com"]},{"name":"Best Of Media S.A.","categories":["content"],"domains":["*.servebom.com"]},{"name":"AdTrue","company":"FPT AdTrue","categories":["ad"],"domains":["*.adtrue.com"]},{"name":"Customer.io","categories":["ad"],"domains":["*.customer.io"]},{"name":"Advance Magazine Group","categories":["content"],"domains":["*.condenastdigital.com","*.condenet.com","*.condenast.co.uk"]},{"name":"StreamRail","categories":["ad"],"domains":["*.streamrail.com","*.streamrail.net"]},{"name":"Opinion Stage","categories":["analytics"],"domains":["*.opinionstage.com"],"examples":["www.opinionstage.com"]},{"name":"CleverTap","categories":["analytics"],"domains":["d2r1yp2w7bby2u.cloudfront.net"]},{"name":"Fanplayr","categories":["analytics"],"domains":["*.fanplayr.com","d38nbbai6u794i.cloudfront.net"]},{"name":"Calendly","categories":["other"],"domains":["*.calendly.com"]},{"name":"Adobe Test & Target","company":"Adobe Systems","categories":["analytics"],"domains":["*.omtrdc.net"],"examples":["tt.omtrdc.net"]},{"name":"Navegg","categories":["ad"],"domains":["*.navdmp.com"]},{"name":"Sekindo","categories":["content"],"domains":["*.sekindo.com"]},{"name":"Conversio","categories":["ad"],"domains":["*.conversio.com"]},{"name":"CyberSource (Visa)","categories":["utility"],"domains":["*.authorize.net"]},{"name":"Pixalate","categories":["utility"],"domains":["*.adrta.com"]},{"name":"Reviews.io","categories":["analytics"],"domains":["*.reviews.io"]},{"name":"NetAffiliation","company":"Kwanco","categories":["ad"],"domains":["*.metaffiliation.com"]},{"name":"FuelX","categories":["ad"],"domains":["*.fuelx.com"]},{"name":"Touch Commerce","categories":["customer-success"],"domains":["*.inq.com","*.touchcommerce.com"]},{"name":"TripleLift","categories":["ad"],"domains":["*.3lift.com"]},{"name":"Ambassador","categories":["ad"],"domains":["*.getambassador.com"]},{"name":"epoq internet services","categories":["analytics"],"domains":["*.epoq.de"]},{"name":"Woopra","categories":["analytics"],"domains":["*.woopra.com"]},{"name":"Playbuzz","categories":["hosting"],"domains":["*.playbuzz.com"]},{"name":"Exponential Interactive","categories":["ad"],"domains":["*.exponential.com"]},{"name":"JustUno","categories":["ad"],"domains":["*.justuno.com"]},{"name":"Widespace","homepage":"https://www.widespace.com","categories":["ad"],"domains":["*.widespace.com"],"examples":["sync.widespace.com"]},{"name":"VisScore","categories":["analytics"],"domains":["*.visscore.com","d2hkbi3gan6yg6.cloudfront.net"]},{"name":"AWeber","categories":["ad"],"domains":["*.aweber.com"]},{"name":"AvantLink","categories":["ad"],"domains":["*.avmws.com"]},{"name":"Conversant Tag Manager","company":"Conversant","categories":["tag-manager"],"domains":["*.mplxtms.com"]},{"name":"Postcode Anywhere (Holdings)","categories":["utility"],"domains":["*.postcodeanywhere.co.uk"]},{"name":"Conversant","categories":["analytics"],"domains":["*.dotomi.com","*.dtmpub.com","*.emjcd.com","mediaplex.com","*.tqlkg.com","*.fastclick.net"],"examples":["www.tqlkg.com"]},{"name":"FLXone","company":"Teradata","categories":["ad"],"domains":["*.pangolin.blue","*.flx1.com","d2hlpp31teaww3.cloudfront.net"]},{"name":"Infinity Tracking","categories":["analytics"],"domains":["*.infinity-tracking.net"]},{"name":"reEmbed","categories":["other"],"domains":["*.reembed.com"]},{"name":"Kameleoon","categories":["analytics"],"domains":["*.kameleoon.com"]},{"name":"Impact Radius","categories":["ad"],"domains":["*.impactradius-event.com","*.impactradius-go.com","*.7eer.net","d3cxv97fi8q177.cloudfront.net","*.evyy.net","*.ojrq.net"],"examples":["a.impactradius-go.com","microsoft-uk.evyy.net"]},{"name":"Heroku","categories":["other"],"domains":["*.herokuapp.com"]},{"name":"AdsWizz","categories":["ad"],"domains":["*.adswizz.com"]},{"name":"MaxMind","categories":["utility"],"domains":["*.maxmind.com"]},{"name":"Pusher","homepage":"https://pusher.com/","categories":["utility"],"domains":["*.pusher.com","*.pusherapp.com"],"examples":["stats.pusher.com"]},{"name":"Admitad","categories":["ad"],"domains":["*.lenmit.com"]},{"name":"AdsNative","categories":["ad"],"domains":["*.adsnative.com"]},{"name":"Viacom","categories":["content"],"domains":["*.mtvnservices.com"]},{"name":"Cookie-Script.com","categories":["utility"],"domains":["*.cookie-script.com"]},{"name":"MonetizeMore","categories":["ad"],"domains":["*.m2.ai"]},{"name":"Mediahawk","categories":["analytics"],"domains":["*.mediahawk.co.uk"]},{"name":"GoSquared","homepage":"https://www.gosquared.com","categories":["analytics"],"domains":["*.gosquared.com","d1l6p2sc9645hc.cloudfront.net"],"examples":["data.gosquared.com","data2.gosquared.com"]},{"name":"Datonics","categories":["ad"],"domains":["*.pro-market.net"],"examples":["pbid.pro-market.net"]},{"name":"Adobe Marketing Cloud","company":"Adobe Systems","categories":["ad"],"domains":["*.adobetag.com"]},{"name":"News","categories":["social"],"domains":["*.news.com.au","*.newsanalytics.com.au","*.newsapi.com.au","*.newscdn.com.au","*.newsdata.com.au","*.newsdiscover.com.au","*.news-static.com"]},{"name":"Experian Cross-Channel Marketing Platform","company":"Experian","categories":["marketing"],"domains":["*.eccmp.com","*.ccmp.eu"]},{"name":"SkyScanner","categories":["content"],"domains":["*.skyscanner.net"],"examples":["api.skyscanner.net"]},{"name":"Vibrant Media","categories":["ad"],"domains":["*.intellitxt.com","*.picadmedia.com"]},{"name":"Mobify","categories":["utility"],"domains":["*.mobify.com","*.mobify.net"]},{"name":"Bookatable","categories":["content"],"domains":["*.bookatable.com","*.livebookings.com"]},{"name":"SecuredVisit","company":"4Cite Marketing","categories":["ad"],"domains":["*.securedvisit.com"]},{"name":"[24]7","categories":["customer-success"],"domains":["*.247-inc.net","*.247inc.net","d1af033869koo7.cloudfront.net"]},{"name":"Transifex","categories":["utility"],"domains":["*.transifex.com"]},{"name":"Tagboard","categories":["social"],"domains":["*.tagboard.com"]},{"name":"Council ad Network","categories":["ad"],"domains":["*.counciladvertising.net"]},{"name":"WalkMe","categories":["customer-success"],"domains":["*.walkme.com"]},{"name":"Betgenius","company":"Genius Sports","categories":["content"],"domains":["*.connextra.com"]},{"name":"Exactag","categories":["ad"],"domains":["*.exactag.com"]},{"name":"Knight Lab","company":"Northwestern University","categories":["utility"],"domains":["*.knightlab.com"]},{"name":"Reflektion","categories":["analytics"],"domains":["*.reflektion.com","d26opx5dl8t69i.cloudfront.net"]},{"name":"Expedia","categories":["content"],"domains":["*.travel-assets.com","*.trvl-media.com","*.trvl-px.com","*.uciservice.com"],"examples":["www.trvl-px.com","www.uciservice.com"]},{"name":"Performio","categories":["ad"],"domains":["*.performax.cz"],"examples":["ut.performax.cz"]},{"name":"Janrain","categories":["analytics"],"domains":["*.janrain.com","*.janrainbackplane.com","*.rpxnow.com","d3hmp0045zy3cs.cloudfront.net"]},{"name":"Resonance Insights","categories":["analytics"],"domains":["*.res-x.com"]},{"name":"cloudIQ","categories":["analytics"],"domains":["*.cloud-iq.com"]},{"name":"Snack Media","categories":["content"],"domains":["*.snack-media.com"]},{"name":"Ekm Systems","categories":["analytics"],"domains":["*.ekmsecure.com","*.ekmpinpoint.co.uk"],"examples":["globalstats.ekmsecure.com"]},{"name":"Wow Analytics","categories":["analytics"],"domains":["*.wowanalytics.co.uk"]},{"name":"AdvertServe","categories":["ad"],"domains":["*.advertserve.com"]},{"name":"Pingdom RUM","homepage":"https://www.pingdom.com/product/performance-monitoring/","categories":["analytics"],"domains":["*.pingdom.net"],"examples":["rum-static.pingdom.net","rum-collector-2.pingdom.net"]},{"name":"DialogTech SourceTrak","company":"DialogTech","categories":["ad"],"domains":["d31y97ze264gaa.cloudfront.net"]},{"name":"bRealTime","categories":["ad"],"domains":["*.brealtime.com"]},{"name":"Tag Inspector","company":"InfoTrust","categories":["analytics"],"domains":["d22xmn10vbouk4.cloudfront.net"]},{"name":"Zmags","categories":["marketing"],"domains":["*.zmags.com"]},{"name":"LeasdBoxer","company":"LeadBoxer","categories":["ad"],"domains":["*.leadboxer.com"]},{"name":"Friendbuy","categories":["ad"],"domains":["*.friendbuy.com","djnf6e5yyirys.cloudfront.net"]},{"name":"Acceptable Ads","homepage":"https://acceptableads.com/","categories":["ad"],"domains":["*.aaxads.com","*.aaxdetect.com"]},{"name":"Onet","categories":["ad"],"domains":["*.onet.pl"]},{"name":"Netlify","homepage":"https://www.netlify.com/","categories":["utility"],"domains":["*.netlify.com","*.netlifyusercontent.com"],"examples":["cloud.netlifyusercontent.com"]},{"name":"Twitter Online Conversion Tracking","company":"Twitter","categories":["ad"],"domains":["*.ads-twitter.com","analytics.twitter.com"],"examples":["static.ads-twitter.com"]},{"name":"AdRiver","categories":["ad"],"domains":["*.adriver.ru"]},{"name":"Proper Media","categories":["content"],"domains":["*.proper.io"]},{"name":"Storygize","categories":["ad"],"domains":["*.storygize.net"],"examples":["www.storygize.net"]},{"name":"Oracle Recommendations On Demand","company":"Oracle","categories":["analytics"],"domains":["*.atgsvcs.com"]},{"name":"Raygun","categories":["utility"],"domains":["*.raygun.io"]},{"name":"Rakuten LinkShare","company":"Rakuten","categories":["ad"],"domains":["*.linksynergy.com"]},{"name":"BlueCava","categories":["ad"],"domains":["*.bluecava.com"]},{"name":"Hull.js","categories":["utility"],"domains":["*.hull.io","*.hullapp.io"]},{"name":"PERFORM","categories":["content"],"domains":["*.performgroup.com"]},{"name":"Moxie","homepage":"https://www.gomoxie.com/","categories":["utility"],"domains":["*.gomoxie.solutions"]},{"name":"Vee24","categories":["customer-success"],"domains":["*.vee24.com"]},{"name":"Aggregate Knowledge","company":"Neustar","categories":["ad"],"domains":["*.agkn.com"]},{"name":"Cookie Reports","categories":["utility"],"domains":["*.cookiereports.com"]},{"name":"PlayAd Media Group","categories":["ad"],"domains":["*.youplay.se"]},{"name":"Exponea","categories":["analytics"],"domains":["*.exponea.com"]},{"name":"AIR.TV","categories":["ad"],"domains":["*.air.tv"]},{"name":"SlimCut Media Outstream","company":"SlimCut Media","categories":["ad"],"domains":["*.freeskreen.com"]},{"name":"Mopinion","categories":["analytics"],"domains":["*.mopinion.com"]},{"name":"Dynamic Converter","categories":["utility"],"domains":["*.dynamicconverter.com"]},{"name":"Remintrex","company":"SmartUp Venture","categories":["ad"],"domains":["*.remintrex.com"]},{"name":"Attribution","categories":["ad"],"domains":["*.attributionapp.com"]},{"name":"Browser-Update.org","categories":["other"],"domains":["*.browser-update.org"]},{"name":"Sailthru","categories":["analytics"],"domains":["*.sail-horizon.com","*.sail-personalize.com","*.sail-track.com"]},{"name":"AnswerDash","categories":["customer-success"],"domains":["*.answerdash.com"],"examples":["p1.answerdash.com"]},{"name":"Ziff Davis Tech","categories":["ad"],"domains":["*.adziff.com","*.zdbb.net"]},{"name":"Adthink","company":"Adthink Media","categories":["ad"],"domains":["*.adxcore.com","*.dcoengine.com"],"examples":["d.adxcore.com"]},{"name":"Site24x7 Real User Monitoring","company":"Site24x7","categories":["analytics"],"domains":["*.site24x7rum.com"]},{"name":"SpringServer","categories":["ad"],"domains":["*.springserve.com"]},{"name":"Freespee","categories":["customer-success"],"domains":["*.freespee.com"],"examples":["analytics.freespee.com"]},{"name":"VidPulse","categories":["analytics"],"domains":["*.vidpulse.com"]},{"name":"InAuth","categories":["utility"],"homepage":"https://www.inauth.com/","domains":["*.cdn-net.com"],"examples":["uk.cdn-net.com"]},{"name":"MLveda","categories":["utility"],"domains":["*.mlveda.com"],"examples":["www.mlveda.com"]},{"name":"Microad","categories":["ad"],"domains":["*.microad.jp"]},{"name":"ShopRunner","categories":["content"],"domains":["*.shoprunner.com","*.s-9.us"]},{"name":"Reactful","categories":["analytics"],"domains":["*.reactful.com"]},{"name":"Vergic AB","categories":["customer-success"],"domains":["*.psplugin.com"]},{"name":"Alliance for Audited Media","categories":["ad"],"domains":["*.aamsitecertifier.com"]},{"name":"Forter","categories":["utility"],"domains":["*.forter.com"]},{"name":"Swoop","categories":["ad"],"domains":["*.swoop.com"]},{"name":"Gfycat","company":"Gycat","categories":["utility"],"domains":["*.gfycat.com"]},{"name":"Optimove","company":"Mobius Solutions","categories":["analytics"],"domains":["*.optimove.net"]},{"name":"LoginRadius","categories":["social"],"domains":["*.loginradius.com"]},{"name":"Flockler","categories":["ad"],"domains":["*.flockler.com"]},{"name":"Moovweb","categories":["utility"],"domains":["*.moovweb.net"]},{"name":"Cachefly","categories":["utility"],"domains":["*.cachefly.net"]},{"name":"emetriq","homepage":"https://www.emetriq.com/","categories":["ad"],"domains":["*.emetriq.de","*.xplosion.de"]},{"name":"CANDDi","company":"Campaign and Digital Intelligence","categories":["ad"],"domains":["*.canddi.com"]},{"name":"Braintree Payments","company":"Paypal","categories":["utility"],"domains":["*.braintreegateway.com"]},{"name":"Meltwater Group","categories":["customer-success"],"domains":["*.meltwaternews.com"]},{"name":"Video Media Groep","categories":["ad"],"domains":["*.vmg.host","*.inpagevideo.nl"]},{"name":"Polldaddy","company":"Automattic","categories":["analytics"],"domains":["polldaddy.com"]},{"name":"Triblio","categories":["marketing"],"domains":["*.tribl.io"]},{"name":"Wufoo","categories":["utility"],"domains":["*.wufoo.com"]},{"name":"User Replay","categories":["analytics"],"domains":["*.userreplay.net"]},{"name":"Barilliance","categories":["analytics"],"domains":["*.barilliance.net","dn3y71tq7jf07.cloudfront.net"]},{"name":"Boomtrain","categories":["ad"],"domains":["*.boomtrain.com","*.boomtrain.net"]},{"name":"Extole","categories":["ad"],"domains":["*.extole.com","*.extole.io"],"examples":["origin.extole.io"]},{"name":"infogr.am","categories":["utility"],"domains":["*.infogr.am","*.jifo.co"]},{"name":"Catchpoint","homepage":"https://www.catchpoint.com/","categories":["analytics"],"domains":["*.3gl.net"]},{"name":"InSkin Media","categories":["ad"],"domains":["*.inskinad.com","*.inskinmedia.com"]},{"name":"Kargo","categories":["marketing"],"domains":["*.kargo.com"]},{"name":"Byside","homepage":"http://www.byside.com","categories":["analytics"],"domains":["*.byside.com"],"examples":["byce2.byside.com","wce2.byside.com"]},{"name":"CNET Content Solutions","company":"CBS Interactive","categories":["content"],"domains":["*.cnetcontent.com"],"examples":["cdn.cnetcontent.com","ws.cnetcontent.com"]},{"name":"HotelsCombined","categories":["content"],"domains":["*.datahc.com"]},{"name":"Hawk Search","categories":["utility"],"domains":["*.hawksearch.com"]},{"name":"Vergic Engage Platform","company":"Vergic","categories":["customer-success"],"domains":["*.vergic.com"]},{"name":"Vertical Mass","categories":["ad"],"domains":["*.vmweb.net"]},{"name":"ShopStorm","categories":["utility"],"domains":["*.shopstorm.com"]},{"name":"Borderfree","company":"pitney bowes","categories":["utility"],"domains":["*.borderfree.com","*.fiftyone.com"]},{"name":"Fonecall","categories":["analytics"],"domains":["*.web-call-analytics.com"]},{"name":"PebblePost","categories":["ad"],"domains":["*.pbbl.co"]},{"name":"DemandJump","categories":["analytics"],"domains":["*.demandjump.com"]},{"name":"Kiosked","categories":["ad"],"domains":["*.kiosked.com"]},{"name":"Ad6Media","categories":["ad"],"domains":["*.ad6media.fr"]},{"name":"The Publisher Desk","categories":["ad"],"domains":["*.206ads.com","*.publisherdesk.com"]},{"name":"Ghostery Enterprise","company":"Ghostery","categories":["marketing"],"domains":["*.betrad.com"]},{"name":"content.ad","categories":["ad"],"domains":["*.content.ad"]},{"name":"Innovid","categories":["ad"],"homepage":"https://www.innovid.com/","domains":["*.innovid.com"],"examples":["ag.innovid.com","rtr.innovid.com"]},{"name":"RightNow Service Cloud","company":"Oracle","categories":["customer-success"],"domains":["*.rightnowtech.com","*.rnengage.com"]},{"name":"Polyfill service","company":"Polyfill.io","categories":["other"],"domains":["*.polyfill.io"]},{"name":"Prezi","categories":["utility"],"domains":["*.prezi.com"]},{"name":"Sourcepoint","categories":["ad"],"domains":["*.decenthat.com","*.fallingfalcon.com","*.summerhamster.com","d2lv4zbk7v5f93.cloudfront.net","d3qxwzhswv93jk.cloudfront.net"],"examples":["www.decenthat.com","www.fallingfalcon.com","www.summerhamster.com"]},{"name":"PowerFront","categories":["hosting"],"domains":["*.inside-graph.com"]},{"name":"Bidswitch","homepage":"https://www.bidswitch.com/","categories":["ad"],"domains":["*.bidswitch.net"],"examples":["x.bidswitch.net"]},{"name":"Bet365","categories":["ad"],"domains":["*.bet365affiliates.com"]},{"name":"RichRelevance","categories":["analytics"],"domains":["*.richrelevance.com"]},{"name":"Elecard StreamEye","company":"Elecard","categories":["other"],"domains":["*.streameye.net"]},{"name":"NaviStone","categories":["ad"],"domains":["*.murdoog.com"]},{"name":"MailPlus","categories":["ad"],"domains":["*.mailplus.nl"]},{"name":"Cross Pixel Media","categories":["ad"],"domains":["*.crsspxl.com"]},{"name":"TurnTo","homepage":"https://www.turntonetworks.com/","categories":["utility"],"domains":["*.turnto.com"]},{"name":"Connexity","homepage":"http://connexity.com/","categories":["analytics"],"domains":["*.connexity.net"]},{"name":"Iterate","homepage":"https://iteratehq.com/","categories":["analytics"],"domains":["*.iteratehq.com"]},{"name":"OnScroll","categories":["ad"],"domains":["*.onscroll.com"]},{"name":"Web Dissector","company":"Beijing Gridsum Technologies","categories":["analytics"],"domains":["*.gridsumdissector.com","*.webdissector.com"],"examples":["www.webdissector.com"]},{"name":"Bluecore","categories":["analytics"],"domains":["*.bluecore.com"],"examples":["www.bluecore.com"]},{"name":"Flipboard","categories":["social"],"domains":["*.flipboard.com"]},{"name":"UPS i-parcel","company":"UPS","categories":["other"],"domains":["*.i-parcel.com"]},{"name":"TechTarget","categories":["content"],"domains":["*.techtarget.com","*.ttgtmedia.com"]},{"name":"Realytics","categories":["analytics"],"domains":["dcniko1cv0rz.cloudfront.net","*.realytics.net"]},{"name":"Dropbox","categories":["utility"],"domains":["*.dropboxusercontent.com"]},{"name":"StumbleUpon","categories":["content"],"domains":["*.stumble-upon.com","*.stumbleupon.com"]},{"name":"ReCollect","categories":["utility"],"domains":["*.recollect.net"]},{"name":"AdSpruce","categories":["ad"],"domains":["*.adspruce.com"]},{"name":"RebelMouse","categories":["ad"],"domains":["*.rebelmouse.com","*.rbl.ms"],"examples":["www.rebelmouse.com"]},{"name":"Intilery","categories":["customer-success"],"domains":["*.intilery-analytics.com"]},{"name":"Adunity","categories":["ad"],"domains":["*.adunity.com"]},{"name":"UpSellit","categories":["analytics"],"domains":["*.upsellit.com"],"examples":["www.upsellit.com"]},{"name":"AdSupply","categories":["ad"],"domains":["*.doublepimp.com"]},{"name":"Better Business Bureau","categories":["analytics"],"domains":["*.bbb.org"]},{"name":"Spot.IM","categories":["social"],"domains":["*.spot.im"]},{"name":"Improve Digital","categories":["ad"],"domains":["*.360yield.com"]},{"name":"Sociomantic Labs","company":"DunnHumby","categories":["ad"],"domains":["*.sociomantic.com"]},{"name":"MathJax","categories":["utility"],"domains":["*.mathjax.org"]},{"name":"Qualtrics","categories":["analytics"],"domains":["*.qualtrics.com"]},{"name":"ConvertMedia","categories":["ad"],"domains":["*.admailtiser.com","*.basebanner.com","*.cmbestsrv.com","*.vidfuture.com","*.zorosrv.com"],"examples":["www.cmbestsrv.com"]},{"name":"Soundest","categories":["ad"],"domains":["*.soundestlink.com","*.soundest.net"]},{"name":"Xaxis","homepage":"https://www.xaxis.com/","categories":["ad"],"domains":["*.247realmedia.com","*.mookie1.com","*.gmads.net"],"examples":["t.mookie1.com","odr.mookie1.com"]},{"name":"Research Online","company":"Skills Development Scotland","categories":["content"],"domains":["*.org.uk"],"examples":["www.researchonline.org.uk"]},{"name":"DistroScale","categories":["ad"],"domains":["*.jsrdn.com"]},{"name":"StackExchange","categories":["social"],"domains":["*.sstatic.net"]},{"name":"BuySellAds","categories":["ad"],"domains":["*.buysellads.com"]},{"name":"Reklama","categories":["ad"],"domains":["*.o2.pl","*.wp.pl"],"examples":["dot.wp.pl","px.o2.pl","px.wp.pl"]},{"name":"eGain","categories":["analytics"],"domains":["*.analytics-egain.com","*.egain.com"]},{"name":"Sonobi","categories":["ad"],"domains":["*.sonobi.com"]},{"name":"AliveChat","company":"AYU Technology Solutions","categories":["customer-success"],"domains":["*.websitealive.com","*.websitealive7.com"]},{"name":"Zolando","categories":["content"],"domains":["*.ztat.net"]},{"name":"AdCurve","categories":["ad"],"domains":["*.shop2market.com"]},{"name":"Pagefair","categories":["ad"],"domains":["*.pagefair.com","*.pagefair.net"]},{"name":"StackAdapt","categories":["ad"],"domains":["*.stackadapt.com"]},{"name":"United Internet","categories":["hosting"],"domains":["*.uicdn.com"]},{"name":"Nanorep","company":"Nanorep Technologies","categories":["customer-success"],"domains":["*.nanorep.com"]},{"name":"Fastest Forward","categories":["analytics"],"domains":["*.gaug.es"]},{"name":"Ceros","categories":["other"],"domains":["ceros.com","view.ceros.com"]},{"name":"Investis","categories":["utility"],"domains":["*.investis.com"]},{"name":"Channel.me","categories":["customer-success"],"domains":["*.channel.me"]},{"name":"ARM","categories":["analytics"],"domains":["*.tag4arm.com"]},{"name":"Webtrends","categories":["analytics"],"domains":["*.webtrends.com","*.webtrendslive.com","d1q62gfb8siqnm.cloudfront.net"]},{"name":"Scoota","categories":["ad"],"domains":["*.rockabox.co","*.scoota.co","d31i2625d5nv27.cloudfront.net","dyjnzf8evxrp2.cloudfront.net"]},{"name":"TrafficJunky","homepage":"https://www.trafficjunky.com/","categories":["ad"],"domains":["*.contentabc.com","*.trafficjunky.net"],"examples":["ads2.contentabc.com","hw-cdn.contentabc.com","media.trafficjunky.net","ads.trafficjunky.net","hw-cdn.trafficjunky.net"]},{"name":"PrintFriendly","categories":["utility"],"domains":["*.printfriendly.com"]},{"name":"Datawrapper","categories":["utility"],"domains":["*.datawrapper.de","*.dwcdn.net"],"examples":["www.datawrapper.de"]},{"name":"Click4Assistance","categories":["customer-success"],"domains":["*.click4assistance.co.uk"]},{"name":"Glassdoor","categories":["content"],"domains":["*.glassdoor.com"]},{"name":"Highwinds","categories":["utility"],"domains":["*.hwcdn.net"]},{"name":"YoYo","categories":["utility"],"domains":["*.goadservices.com"]},{"name":"Webtrekk","categories":["analytics"],"domains":["*.wbtrk.net","*.webtrekk-asia.net","*.webtrekk.net","*.wt-eu02.net"]},{"name":"Fastly Insights","homepage":"https://insights.fastlylabs.com","categories":["analytics"],"domains":["*.fastly-insights.com"],"examples":["www.fastly-insights.com"]},{"name":"HP Optimost","company":"Hewlett-Packard Development Company","categories":["marketing"],"domains":["*.hp.com","d2uncb19xzxhzx.cloudfront.net"],"examples":["by.marketinghub.hp.com","marketinghub.hp.com"]},{"name":"Eyeota","categories":["ad"],"domains":["*.eyeota.net"]},{"name":"PhotoBucket","categories":["content"],"domains":["*.photobucket.com"]},{"name":"ContextWeb","categories":["ad"],"domains":["*.contextweb.com"]},{"name":"Captify Media","categories":["ad"],"domains":["*.cpx.to"]},{"name":"Intent IQ","categories":["ad"],"domains":["*.intentiq.com"]},{"name":"Vindico","company":"Viant","categories":["ad"],"domains":["*.vindicosuite.com"]},{"name":"Pictela (AOL)","categories":["analytics"],"domains":["*.pictela.net"]},{"name":"PubNation","categories":["ad"],"domains":["*.pubnation.com"]},{"name":"Freshchat","homepage":"https://www.freshworks.com/live-chat-software/","categories":["utility"],"domains":["*.freshchat.com"]},{"name":"Bridgewell DSP","homepage":"https://www.bridgewell.com/","categories":["ad"],"domains":["*.scupio.com"],"examples":["img.scupio.com"]},{"name":"PageSense","homepage":"https://www.zoho.com/pagesense/","categories":["analytics"],"domains":["*.pagesense.io"],"examples":["cdn.pagesense.io"]},{"name":"Wicked Reports","homepage":"https://www.wickedreports.com/","categories":["marketing"],"domains":["*.wickedreports.com"],"examples":["widget.wickedreports.com"]},{"name":"Pendo","homepage":"https://www.pendo.io","categories":["analytics"],"domains":["*.pendo.io"],"examples":["app.pendo.io"]},{"name":"Dynatrace","categories":["analytics"],"domains":["*.ruxit.com","js-cdn.dynatrace.com"]},{"name":"Click Guardian","homepage":"https://www.clickguardian.co.uk/","categories":["advertising"],"domains":["*.clickguardian.app","*.clickguardian.co.uk"],"examples":["v2.clickguardian.app","protection.clickguardian.co.uk"]}];
},{}],185:[function(require,module,exports){
module.exports=require("./lib/subsets/httparchive-nostats.js");

},{"./lib/subsets/httparchive-nostats.js":187}],186:[function(require,module,exports){
const DOMAIN_IN_URL_REGEX=/:\/\/(\S*?)(:\d+)?(\/|$)/;
const DOMAIN_CHARACTERS=/([a-z0-9.-]+\.[a-z0-9]+|localhost)/i;
const IP_REGEX=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
const ROOT_DOMAIN_REGEX=/[^.]+\.([^.]+|(gov|com|co|ne)\.\w{2})$/i;

function getDomainFromOriginOrURL(originOrURL){
if(typeof originOrURL!=='string')return null;
if(originOrURL.length>10000||originOrURL.startsWith('data:'))return null;
if(DOMAIN_IN_URL_REGEX.test(originOrURL))return originOrURL.match(DOMAIN_IN_URL_REGEX)[1];
if(DOMAIN_CHARACTERS.test(originOrURL))return originOrURL.match(DOMAIN_CHARACTERS)[0];
throw new Error(`Unable to find domain in "${originOrURL}"`);
}

function getRootDomain(originOrURL){
const domain=getDomainFromOriginOrURL(originOrURL);
if(!domain)return null;
if(IP_REGEX.test(domain))return domain;
const match=domain.match(ROOT_DOMAIN_REGEX);
return match&&match[0]||domain;
}

function getEntityInDataset(entityByDomain,entityByRootDomain,originOrURL){
const domain=getDomainFromOriginOrURL(originOrURL);
const rootDomain=getRootDomain(domain);
if(!domain||!rootDomain)return undefined;
if(entityByDomain.has(domain))return entityByDomain.get(domain);
if(entityByRootDomain.has(rootDomain))return entityByRootDomain.get(rootDomain);
return undefined;
}

function createAPIFromDataset(entities_){
const entities=JSON.parse(JSON.stringify(entities_));
const entityByDomain=new Map();
const entityByRootDomain=new Map();

for(const entity of entities){
if(!entity.company)entity.company=entity.name;
entity.totalExecutionTime=Number(entity.totalExecutionTime)||0;
entity.totalOccurrences=Number(entity.totalOccurrences)||0;
entity.averageExecutionTime=entity.totalExecutionTime/entity.totalOccurrences;

for(const domain of entity.domains){
if(entityByDomain.has(domain))throw new Error(`Duplicate domain ${domain}`);
entityByDomain.set(domain,entity);

const rootDomain=getRootDomain(domain);
if(domain.startsWith('*.')){
entityByRootDomain.set(rootDomain,entity);
}
}
}

for(const[rootDomain,entity]of entityByRootDomain.entries()){
if(!entity)entityByRootDomain.delete(rootDomain);
}

const getEntity=getEntityInDataset.bind(null,entityByDomain,entityByRootDomain);
return{getEntity,getRootDomain,entities};
}

module.exports={createAPIFromDataset};

},{}],187:[function(require,module,exports){
const{createAPIFromDataset}=require('../create-entity-finder-api.js');
const entities=require('../../dist/entities-httparchive-nostats.json');
module.exports=createAPIFromDataset(entities);

},{"../../dist/entities-httparchive-nostats.json":184,"../create-entity-finder-api.js":186}],188:[function(require,module,exports){
(function(setImmediate,clearImmediate){
var nextTick=require('process/browser.js').nextTick;
var apply=Function.prototype.apply;
var slice=Array.prototype.slice;
var immediateIds={};
var nextImmediateId=0;



exports.setTimeout=function(){
return new Timeout(apply.call(setTimeout,window,arguments),clearTimeout);
};
exports.setInterval=function(){
return new Timeout(apply.call(setInterval,window,arguments),clearInterval);
};
exports.clearTimeout=
exports.clearInterval=function(timeout){timeout.close();};

function Timeout(id,clearFn){
this._id=id;
this._clearFn=clearFn;
}
Timeout.prototype.unref=Timeout.prototype.ref=function(){};
Timeout.prototype.close=function(){
this._clearFn.call(window,this._id);
};


exports.enroll=function(item,msecs){
clearTimeout(item._idleTimeoutId);
item._idleTimeout=msecs;
};

exports.unenroll=function(item){
clearTimeout(item._idleTimeoutId);
item._idleTimeout=-1;
};

exports._unrefActive=exports.active=function(item){
clearTimeout(item._idleTimeoutId);

var msecs=item._idleTimeout;
if(msecs>=0){
item._idleTimeoutId=setTimeout(function onTimeout(){
if(item._onTimeout)
item._onTimeout();
},msecs);
}
};


exports.setImmediate=typeof setImmediate==="function"?setImmediate:function(fn){
var id=nextImmediateId++;
var args=arguments.length<2?false:slice.call(arguments,1);

immediateIds[id]=true;

nextTick(function onNextTick(){
if(immediateIds[id]){


if(args){
fn.apply(null,args);
}else{
fn.call(null);
}

exports.clearImmediate(id);
}
});

return id;
};

exports.clearImmediate=typeof clearImmediate==="function"?clearImmediate:function(id){
delete immediateIds[id];
};
}).call(this,require("timers").setImmediate,require("timers").clearImmediate);
},{"process/browser.js":158,"timers":188}],189:[function(require,module,exports){
(function(global){





module.exports=deprecate;



















function deprecate(fn,msg){
if(config('noDeprecation')){
return fn;
}

var warned=false;
function deprecated(){
if(!warned){
if(config('throwDeprecation')){
throw new Error(msg);
}else if(config('traceDeprecation')){
console.trace(msg);
}else{
console.warn(msg);
}
warned=true;
}
return fn.apply(this,arguments);
}

return deprecated;
}









function config(name){

try{
if(!global.localStorage)return false;
}catch(_){
return false;
}
var val=global.localStorage[name];
if(null==val)return false;
return String(val).toLowerCase()==='true';
}

}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
},{}],190:[function(require,module,exports){
arguments[4][94][0].apply(exports,arguments);
},{"dup":94}],191:[function(require,module,exports){
arguments[4][95][0].apply(exports,arguments);
},{"./support/isBuffer":190,"_process":158,"dup":95,"inherits":113}],192:[function(require,module,exports){
module.exports={
"version":"5.7.0"};

},{}],193:[function(require,module,exports){






'use strict';


const stackPacks=[
require('./packs/wordpress.js'),
require('./packs/react.js'),
require('./packs/angular.js'),
require('./packs/amp.js'),
require('./packs/magento.js')];


module.exports=stackPacks;

},{"./packs/amp.js":194,"./packs/angular.js":195,"./packs/magento.js":196,"./packs/react.js":197,"./packs/wordpress.js":198}],194:[function(require,module,exports){
(function(__filename){







'use strict';

const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');

const ampIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"%3E%3Cpath d="M171.887 116.28l-53.696 89.36h-9.728l9.617-58.227-30.2.047a4.852 4.852 0 01-4.855-4.855c0-1.152 1.07-3.102 1.07-3.102l53.52-89.254 9.9.043-9.86 58.317 30.413-.043a4.852 4.852 0 014.855 4.855c0 1.088-.427 2.044-1.033 2.854l.004.004zM128 0C57.306 0 0 57.3 0 128s57.306 128 128 128 128-57.306 128-128S198.7 0 128 0z" fill="%230379c4" fill-rule="evenodd"/%3E%3C/svg%3E`;

const UIStrings={

uses_webp_images:'Consider displaying all your `amp-img` components in WebP formats while specifying an appropriate fallback for other browsers. [Learn more](https://amp.dev/documentation/components/amp-img/#example:-specifying-a-fallback-image).',

offscreen_images:'Ensure that you are you using valid `amp-img` tags for your images which automatically lazy-load outside the first viewport. [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/media_iframes_3p/?format=websites#images).',

render_blocking_resources:'Use tools such as [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/master/packages/optimizer) to [server-side render AMP layouts](https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/server-side-rendering/).',

unminified_css:'Refer to the [AMP documentation](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/style_pages/) to ensure all your styles are supported.',

efficient_animated_content:'For animated content, use [amp-anim](https://amp.dev/documentation/components/amp-anim/) to minimize CPU usage while the content remains offscreen.',

uses_responsive_images:'The `amp-img` element supports the `srcset` attribute to specify which image assets to use based on the screen size.  [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/art_direction/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

module.exports={
id:'amp',
iconDataURL:ampIcon,
title:'AMP',
descriptions:{
'uses-webp-images':str_(UIStrings.uses_webp_images),
'offscreen-images':str_(UIStrings.offscreen_images),
'render-blocking-resources':str_(UIStrings.render_blocking_resources),
'unminified-css':str_(UIStrings.unminified_css),
'efficient-animated-content':str_(UIStrings.efficient_animated_content),
'uses-responsive-images':str_(UIStrings.uses_responsive_images)}};


module.exports.UIStrings=UIStrings;

}).call(this,"/stack-packs/packs/amp.js");
},{"../../lighthouse-core/lib/i18n/i18n.js":66}],195:[function(require,module,exports){
(function(__filename){







'use strict';

const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');

const angularIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"%3E%3Cpath fill="%23dd0031" d="M125 30L31.9 63.2l14.2 123.1L125 230l78.9-43.7 14.2-123.1z"/%3E%3Cpath fill="%23c3002f" d="M125 30v22.2-.1V230l78.9-43.7 14.2-123.1L125 30z"/%3E%3Cpath d="M125 52.1L66.8 182.6h21.7l11.7-29.2h49.4l11.7 29.2H183L125 52.1zm17 83.3h-34l17-40.9 17 40.9z" fill="%23fff"/%3E%3C/svg%3E`;

const UIStrings={

total_byte_weight:'Apply [route-level code-splitting](https://web.dev/route-level-code-splitting-in-angular/) to minimize the size of your JavaScript bundles. Also, consider precaching assets with the [Angular service worker](https://web.dev/precaching-with-the-angular-service-worker/).',

unminified_warning:'If you are using Angular CLI, ensure that builds are generated in production mode. [Learn more](https://angular.io/guide/deployment#enable-runtime-production-mode).',

unused_javascript:'If you are using Angular CLI, include source maps into your production build to inspect your bundles. [Learn more](https://angular.io/guide/deployment#inspect-the-bundles).',

uses_responsive_images:'Consider using the `BreakpointObserver` utility in the Component Dev Kit (CDK) to manage image breakpoints. [Learn more](https://material.angular.io/cdk/layout/overview).',

uses_rel_preload:'Preload routes ahead of time to speed up navigation. [Learn more](https://web.dev/route-preloading-in-angular/).',

dom_size:'Consider virtual scrolling with the Component Dev Kit (CDK) if very large lists are being rendered. [Learn more](https://web.dev/virtualize-lists-with-angular-cdk/).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

module.exports={
id:'angular',
iconDataURL:angularIcon,
title:'Angular',
descriptions:{
'total-byte-weight':str_(UIStrings.total_byte_weight),
'unminified-css':str_(UIStrings.unminified_warning),
'unminified-javascript':str_(UIStrings.unminified_warning),
'unused-javascript':str_(UIStrings.unused_javascript),
'uses-responsive-images':str_(UIStrings.uses_responsive_images),
'uses-rel-preload':str_(UIStrings.uses_rel_preload),
'dom-size':str_(UIStrings.dom_size)}};


module.exports.UIStrings=UIStrings;

}).call(this,"/stack-packs/packs/angular.js");
},{"../../lighthouse-core/lib/i18n/i18n.js":66}],196:[function(require,module,exports){
(function(__filename){







'use strict';

const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');

const magentoIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23f26322" viewBox="0 0 1000 1000"%3E%3Cpath d="M916.9 267.4v465.3l-111.3 67.4V331.4l-1.5-.9-303.9-189-304.6 189.2-1.2.8V799L83.1 732.6V267.4l.7-.4L500.3 10l416 257 .6.4zM560.7 468.5v383.3L500.3 890l-61-38.2V306.7l-136 84.3v476.6l197 122.5 196.4-122.5V391l-136-84.3v161.8z"/%3E%3C/svg%3E`;

const UIStrings={

uses_webp_images:'Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=webp) for a variety of third-party extensions to leverage newer image formats.',

offscreen_images:'Consider modifying your product and catalog templates to make use of the web platform\'s [lazy loading](https://web.dev/native-lazy-loading) feature.',

disable_bundling:'Disable Magento\'s built-in [JavaScript bundling and minification](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html), and consider using [baler](https://github.com/magento/baler/) instead.',

unminified_css:'Enable the "Minify CSS Files" option in your store\'s Developer settings. [Learn more](https://devdocs.magento.com/guides/v2.3/performance-best-practices/configuration.html?itm_source=devdocs&itm_medium=search_page&itm_campaign=federated_search&itm_term=minify%20css%20files).',

unminified_javascript:'Use [Terser](https://www.npmjs.com/package/terser) to minify all JavaScript assets outfrom from static content deployment, and disable the built-in minification feature.',

unused_javascript:'Disable Magento\'s built-in [JavaScript bundling](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html).',

uses_optimized_images:'Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=optimize%20image) for a variety of third party extensions to optimize images.',

time_to_first_byte:'Use Magento\'s [Varnish integration](https://devdocs.magento.com/guides/v2.3/config-guide/varnish/config-varnish.html).',

uses_rel_preconnect:'Preconnect or dns-prefetch resource hints can be added by [modifying a themes\'s layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).',

uses_rel_preload:'`<link rel=preload>` tags can be added by [modifying a themes\'s layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).',

critical_request_chains:'If you are not bundling your JavaScript assets, consider using [baler](https://github.com/magento/baler).',

font_display:'Specify `@font-display` when [defining custom fonts](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/css-topics/using-fonts.html).'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

module.exports={
id:'magento',
iconDataURL:magentoIcon,
title:'Magento',
descriptions:{
'uses-webp-images':str_(UIStrings.uses_webp_images),
'offscreen-images':str_(UIStrings.offscreen_images),
'total-byte-weight':str_(UIStrings.disable_bundling),
'render-blocking-resources':str_(UIStrings.disable_bundling),
'unminified-css':str_(UIStrings.unminified_css),
'unminified-javascript':str_(UIStrings.unminified_javascript),
'unused-javascript':str_(UIStrings.unused_javascript),
'uses-optimized-images':str_(UIStrings.uses_optimized_images),
'time-to-first-byte':str_(UIStrings.time_to_first_byte),
'uses-rel-preconnect':str_(UIStrings.uses_rel_preconnect),
'uses-rel-preload':str_(UIStrings.uses_rel_preload),
'critical-request-chains':str_(UIStrings.critical_request_chains),
'font-display':str_(UIStrings.font_display)}};


module.exports.UIStrings=UIStrings;

}).call(this,"/stack-packs/packs/magento.js");
},{"../../lighthouse-core/lib/i18n/i18n.js":66}],197:[function(require,module,exports){
(function(__filename){







'use strict';

const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');

const reactIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"%3E %3Cg fill="%2361DAFB"%3E%3Cpath d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/%3E %3Ccircle cx="420.9" cy="296.5" r="45.7"/%3E %3Cpath d="M520.5 78.1z"/%3E%3C/g%3E%3C/svg%3E`;

const UIStrings={

unminified_css:'If your build system minifies your CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).',

unminified_javascript:'If your build system minifies your JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).',

unused_javascript:'If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://www.smooth-code.com/open-source/loadable-components/docs/getting-started/).',

time_to_first_byte:'If you are server-side rendering any React components, consider using `renderToNodeStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#rendertonodestream).',

redirects:'If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).',

user_timings:'Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)',

dom_size:'Consider using a “windowing” library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unecessary re-renders using [shouldComponentUpdate](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [PureComponent](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [React.memo](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the Effect hook to improve runtime performance.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

module.exports={
id:'react',
iconDataURL:reactIcon,
title:'React',
descriptions:{
'unminified-css':str_(UIStrings.unminified_css),
'unminified-javascript':str_(UIStrings.unminified_javascript),
'unused-javascript':str_(UIStrings.unused_javascript),
'time-to-first-byte':str_(UIStrings.time_to_first_byte),
'redirects':str_(UIStrings.redirects),
'user-timings':str_(UIStrings.user_timings),
'dom-size':str_(UIStrings.dom_size)}};


module.exports.UIStrings=UIStrings;

}).call(this,"/stack-packs/packs/react.js");
},{"../../lighthouse-core/lib/i18n/i18n.js":66}],198:[function(require,module,exports){
(function(__filename){







'use strict';

const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');

const wordpressIcon=`data:image/svg+xml,%3Csvg viewBox='0 0 122.5 122.5' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%232f3439'%3E%3Cpath d='M8.7 61.3c0 20.8 12.1 38.7 29.6 47.3l-25-68.7c-3 6.5-4.6 13.7-4.6 21.4zM96.7 58.6c0-6.5-2.3-11-4.3-14.5-2.7-4.3-5.2-8-5.2-12.3 0-4.8 3.7-9.3 8.9-9.3h.7a52.4 52.4 0 0 0-79.4 9.9h3.3c5.5 0 14-.6 14-.6 2.9-.2 3.2 4 .4 4.3 0 0-2.9.4-6 .5l19.1 57L59.7 59l-8.2-22.5c-2.8-.1-5.5-.5-5.5-.5-2.8-.1-2.5-4.5.3-4.3 0 0 8.7.7 13.9.7 5.5 0 14-.7 14-.7 2.8-.2 3.2 4 .3 4.3 0 0-2.8.4-6 .5l19 56.5 5.2-17.5c2.3-7.3 4-12.5 4-17z'/%3E%3Cpath d='M62.2 65.9l-15.8 45.8a52.6 52.6 0 0 0 32.3-.9l-.4-.7zM107.4 36a49.6 49.6 0 0 1-3.6 24.2l-16.1 46.5A52.5 52.5 0 0 0 107.4 36z'/%3E%3Cpath d='M61.3 0a61.3 61.3 0 1 0 .1 122.7A61.3 61.3 0 0 0 61.3 0zm0 119.7a58.5 58.5 0 1 1 .1-117 58.5 58.5 0 0 1-.1 117z'/%3E%3C/g%3E%3C/svg%3E`;

const UIStrings={

unused_css_rules:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.',

uses_webp_images:'Consider using a [plugin](https://wordpress.org/plugins/search/convert+webp/) or service that will automatically convert your uploaded images to the optimal formats.',

offscreen_images:'Install a [lazy-load WordPress plugin](https://wordpress.org/plugins/search/lazy+load/) that provides the ability to defer any offscreen images, or switch to a theme that provides that functionality. Also consider using [the AMP plugin](https://wordpress.org/plugins/amp/).',

total_byte_weight:'Consider showing excerpts in your post lists (e.g. via the more tag), reducing the number of posts shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.',

render_blocking_resources:'There are a number of WordPress plugins that can help you [inline critical assets](https://wordpress.org/plugins/search/critical+css/) or [defer less important resources](https://wordpress.org/plugins/search/defer+css+javascript/). Beware that optimizations provided by these plugins may break features of your theme or plugins, so you will likely need to make code changes.',

unminified_css:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+css/) can speed up your site by concatenating, minifying, and compressing your styles. You may also want to use a build process to do this minification up-front if possible.',

unminified_javascript:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+javascript/) can speed up your site by concatenating, minifying, and compressing your scripts. You may also want to use a build process to do this minification up front if possible.',

efficient_animated_content:'Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.',

unused_javascript:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused JavaScript in your page. To identify plugins that are adding extraneous JS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the script. Look out for plugins that have many scripts in the list which have a lot of red in code coverage. A plugin should only enqueue a script if it is actually used on the page.',

uses_long_cache_ttl:'Read about [Browser Caching in WordPress](https://codex.wordpress.org/WordPress_Optimization#Browser_Caching).',

uses_optimized_images:'Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.',

uses_text_compression:'You can enable text compression in your web server configuration.',

uses_responsive_images:'Upload images directly through the [media library](https://codex.wordpress.org/Media_Library_Screen) to ensure that the required image sizes are available, and then insert them from the media library or use the image widget to ensure the optimal image sizes are used (including those for the responsive breakpoints). Avoid using `Full Size` images unless the dimensions are adequate for their usage. [Learn More](https://codex.wordpress.org/Inserting_Images_into_Posts_and_Pages#Image_Size).',

time_to_first_byte:'Themes, plugins, and server specifications all contribute to server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin, and/or upgrading your server.'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

module.exports={
id:'wordpress',
iconDataURL:wordpressIcon,
title:'WordPress',
descriptions:{
'unused-css-rules':str_(UIStrings.unused_css_rules),
'uses-webp-images':str_(UIStrings.uses_webp_images),
'offscreen-images':str_(UIStrings.offscreen_images),
'total-byte-weight':str_(UIStrings.total_byte_weight),
'render-blocking-resources':str_(UIStrings.render_blocking_resources),
'unminified-css':str_(UIStrings.unminified_css),
'unminified-javascript':str_(UIStrings.unminified_javascript),
'efficient-animated-content':str_(UIStrings.efficient_animated_content),
'unused-javascript':str_(UIStrings.unused_javascript),
'uses-long-cache-ttl':str_(UIStrings.uses_long_cache_ttl),
'uses-optimized-images':str_(UIStrings.uses_optimized_images),
'uses-text-compression':str_(UIStrings.uses_text_compression),
'uses-responsive-images':str_(UIStrings.uses_responsive_images),
'time-to-first-byte':str_(UIStrings.time_to_first_byte)}};


module.exports.UIStrings=UIStrings;

}).call(this,"/stack-packs/packs/wordpress.js");
},{"../../lighthouse-core/lib/i18n/i18n.js":66}],199:[function(require,module,exports){
module.exports={
"npm":{
"angular":[
{"id":"SNYK-JS-ANGULAR-471885","severity":"medium","semver":{"vulnerable":["<1.6.3"]}},
{"id":"SNYK-JS-ANGULAR-471882","severity":"medium","semver":{"vulnerable":["<1.6.5"]}},
{"id":"SNYK-JS-ANGULAR-471879","severity":"medium","semver":{"vulnerable":["<1.6.0-rc.0"]}},
{"id":"npm:angular:20180202","severity":"medium","semver":{"vulnerable":["<1.6.9"]}},
{"id":"npm:angular:20171018","severity":"medium","semver":{"vulnerable":["<1.6.7"]}},
{"id":"npm:angular:20160527","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.2.30"]}},
{"id":"npm:angular:20160122","severity":"medium","semver":{"vulnerable":[">=1.3.0 <1.5.0-rc.2"]}},
{"id":"npm:angular:20140608","severity":"low","semver":{"vulnerable":["<1.3.0"]}},
{"id":"npm:angular:20131113","severity":"high","semver":{"vulnerable":["<1.2.2"]}},
{"id":"npm:angular:20140908","severity":"medium","semver":{"vulnerable":["<1.3.0-rc.4"]}},
{"id":"npm:angular:20161101","severity":"medium","semver":{"vulnerable":[">=1.5.0 <1.5.9"]}},
{"id":"npm:angular:20150909","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
{"id":"npm:angular:20151205","severity":"medium","semver":{"vulnerable":["<1.5.0-rc.0"]}},
{"id":"npm:angular:20151130","severity":"medium","semver":{"vulnerable":["<1.4.10"]}},
{"id":"npm:angular:20130622","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.2.0"]}},
{"id":"npm:angular:20150807-1","severity":"medium","semver":{"vulnerable":[">=1.3.1 <1.5.0-beta.0"]}},
{"id":"npm:angular:20150807","severity":"high","semver":{"vulnerable":[">=1.0.0 <1.5.0-beta.0"]}},
{"id":"npm:angular:20150315","severity":"medium","semver":{"vulnerable":["<1.6.1"]}},
{"id":"npm:angular:20150310","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
{"id":"npm:angular:20141104","severity":"medium","semver":{"vulnerable":["<1.3.2"]}},
{"id":"npm:angular:20130621","severity":"medium","semver":{"vulnerable":["<1.2.0"]}},
{"id":"npm:angular:20140909","severity":"high","semver":{"vulnerable":[">=1.2.19 <1.2.24"]}},
{"id":"npm:angular:20130625","severity":"high","semver":{"vulnerable":["<1.1.5"]}}],

"backbone":[
{"id":"npm:backbone:20160523","severity":"medium","semver":{"vulnerable":["<= 0.3.3"]}},
{"id":"npm:backbone:20110701","severity":"medium","semver":{"vulnerable":["<0.5.0"]}}],

"bootstrap":[
{"id":"SNYK-JS-BOOTSTRAP-173700","severity":"medium","semver":{"vulnerable":["<3.4.1",">=4.0.0 <4.3.1"]}},
{"id":"SNYK-JS-BOOTSTRAP-73560","severity":"medium","semver":{"vulnerable":[">=4.0.0 <4.1.2"]}},
{"id":"SNYK-JS-BOOTSTRAP-72890","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
{"id":"SNYK-JS-BOOTSTRAP-72889","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
{"id":"npm:bootstrap:20180529","severity":"medium","semver":{"vulnerable":["<3.4.0",">=4.0.0 <4.1.2"]}},
{"id":"npm:bootstrap:20160627","severity":"medium","semver":{"vulnerable":["<3.4.0",">=4.0.0-alpha <4.0.0-beta.2"]}},
{"id":"npm:bootstrap:20120510","severity":"medium","semver":{"vulnerable":["<2.1.0"]}}],

"dojo":[
{"id":"SNYK-JS-DOJO-174934","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.0.3",">=1.1.0 <1.1.2",">=1.2.0 <1.2.4",">=1.3.0 <1.3.3",">=1.4.0 <1.4.2"]}},
{"id":"SNYK-JS-DOJO-174933","severity":"medium","semver":{"vulnerable":["<1.2.0"]}},
{"id":"SNYK-JS-DOJO-72305","severity":"medium","semver":{"vulnerable":["<1.14"]}},
{"id":"npm:dojo:20180818","severity":"medium","semver":{"vulnerable":["<1.10.10 || >=1.11.0 <1.11.6 || >=1.12.0 <1.12.4 || >=1.13.0 <1.13.1"]}},
{"id":"npm:dojo:20160523","severity":"medium","semver":{"vulnerable":["<1.1.0"]}},
{"id":"npm:dojo:20100614-6","severity":"medium","semver":{"vulnerable":["<1.4.2"]}},
{"id":"npm:dojo:20100614","severity":"high","semver":{"vulnerable":[">=0.4 <0.4.4 || >=1.0 <1.0.3 || >=1.1 <1.1.2 || >=1.2 <1.2.4 || >=1.3 <1.3.3 || >=1.4 <1.4.2"]}},
{"id":"npm:dojo:20090409","severity":"medium","semver":{"vulnerable":["<1.1"]}}],

"foundation-sites":[
{"id":"npm:foundation-sites:20170802","severity":"medium","semver":{"vulnerable":["<6.0.0"]}},
{"id":"npm:foundation-sites:20150619","severity":"medium","semver":{"vulnerable":["<5.5.3"]}},
{"id":"npm:foundation-sites:20120717","severity":"medium","semver":{"vulnerable":["<3.0.6 >=3.0.0"]}}],

"google-closure-library":[
{"id":"SNYK-JS-GOOGLECLOSURELIBRARY-174519","severity":"medium","semver":{"vulnerable":[">=20190121.0.0 <20190301.0.0"]}}],

"handlebars":[
{"id":"SNYK-JS-HANDLEBARS-469063","severity":"high","semver":{"vulnerable":["<4.3.0"]}},
{"id":"SNYK-JS-HANDLEBARS-174183","severity":"high","semver":{"vulnerable":["<3.0.7",">=4.1.0 <4.1.2","<4.0.14"]}},
{"id":"SNYK-JS-HANDLEBARS-173692","severity":"high","semver":{"vulnerable":["<4.0.13"]}},
{"id":"npm:handlebars:20151207","severity":"medium","semver":{"vulnerable":["<4.0.0"]}},
{"id":"npm:handlebars:20110425","severity":"medium","semver":{"vulnerable":["<=1.0.0-beta.3"]}}],

"highcharts":[
{"id":"npm:highcharts:20180225","severity":"high","semver":{"vulnerable":["<6.1.0"]}}],

"jquery":[
{"id":"SNYK-JS-JQUERY-174006","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
{"id":"npm:jquery:20160529","severity":"low","semver":{"vulnerable":[">=3.0.0-rc1 <3.0.0"]}},
{"id":"npm:jquery:20150627","severity":"medium","semver":{"vulnerable":["<1.12.2",">=1.12.3 <2.2.2",">=2.2.3 <3.0.0"]}},
{"id":"npm:jquery:20140902","severity":"medium","semver":{"vulnerable":[">=1.4.2 <1.6.2"]}},
{"id":"npm:jquery:20120206","severity":"medium","semver":{"vulnerable":[">=1.7.1 <1.9.0"]}},
{"id":"npm:jquery:20110606","severity":"medium","semver":{"vulnerable":["<1.6.3"]}}],

"jquery-mobile":[
{"id":"SNYK-JS-JQUERYMOBILE-174599","severity":"medium","semver":{"vulnerable":["<=1.5.0-alpha.1"]}},
{"id":"npm:jquery-mobile:20120802","severity":"medium","semver":{"vulnerable":["<1.2.0"]}}],

"jquery-ui":[
{"id":"npm:jquery-ui:20121127","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
{"id":"npm:jquery-ui:20100903","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
{"id":"npm:jquery-ui:20160721","severity":"high","semver":{"vulnerable":["<1.12.0"]}}],

"knockout":[
{"id":"npm:knockout:20180213","severity":"medium","semver":{"vulnerable":["<3.5.0-beta"]}},
{"id":"npm:knockout:20130701","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.1.0-pre"]}}],

"lodash":[
{"id":"SNYK-JS-LODASH-450202","severity":"high","semver":{"vulnerable":["<4.17.12"]}},
{"id":"SNYK-JS-LODASH-73639","severity":"medium","semver":{"vulnerable":["<4.17.11"]}},
{"id":"SNYK-JS-LODASH-73638","severity":"high","semver":{"vulnerable":["<4.17.11"]}},
{"id":"npm:lodash:20180130","severity":"medium","semver":{"vulnerable":["<4.17.5"]}}],

"moment":[
{"id":"npm:moment:20170905","severity":"low","semver":{"vulnerable":["<2.19.3"]}},
{"id":"npm:moment:20161019","severity":"medium","semver":{"vulnerable":["<2.15.2"]}},
{"id":"npm:moment:20160126","severity":"medium","semver":{"vulnerable":["<2.11.2"]}}],

"mustache":[
{"id":"npm:mustache:20151207","severity":"medium","semver":{"vulnerable":["<2.2.1"]}},
{"id":"npm:mustache:20110814","severity":"medium","semver":{"vulnerable":["< 0.3.1"]}}],

"react":[
{"id":"npm:react:20150318","severity":"high","semver":{"vulnerable":["<0.14.0"]}},
{"id":"npm:react:20131217","severity":"medium","semver":{"vulnerable":[">=0.5.0 <0.5.2 || >=0.4.0 <0.4.2"]}}],

"riot":[
{"id":"npm:riot:20131114","severity":"medium","semver":{"vulnerable":["<0.9.6"]}}],

"socket.io":[
{"id":"npm:socket.io:20120417","severity":"medium","semver":{"vulnerable":["<0.9.6"]}},
{"id":"npm:socket.io:20120323","severity":"medium","semver":{"vulnerable":["<0.9.7"]}}],

"vue":[
{"id":"npm:vue:20170829","severity":"medium","semver":{"vulnerable":["<2.4.3"]}},
{"id":"npm:vue:20170401","severity":"medium","semver":{"vulnerable":["<2.3.0-beta.1"]}},
{"id":"npm:vue:20180802","severity":"medium","semver":{"vulnerable":["<2.5.17"]}},
{"id":"npm:vue:20180222","severity":"low","semver":{"vulnerable":["<2.5.14"]}}],

"yui":[
{"id":"npm:yui:20130604","severity":"medium","semver":{"vulnerable":[">=3.0.0 <3.10.1 || =3.10.2"]}},
{"id":"npm:yui:20130515","severity":"medium","semver":{"vulnerable":["<3.10.0 >=3.0.0"]}},
{"id":"npm:yui:20121030","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.4.0"]}},
{"id":"npm:yui:20120428","severity":"medium","semver":{"vulnerable":["<3.5.1 >=3.5.0-PR1"]}},
{"id":"npm:yui:20101025","severity":"medium","semver":{"vulnerable":["<2.8.2 >=2.4.0"]}}]}};



},{}],"lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks":[function(require,module,exports){
(function(__filename){









const AdRequestTime=require('../computed/ad-request-time');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const LongTasks=require('../computed/long-tasks');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{getAttributableUrl}=require('../utils/tasks');
const{isAdScript}=require('../utils/resource-classification');
const{URL}=require('url');

const UIStrings={

title:'No long tasks blocking ad-related network requests',
failureTitle:'Avoid long tasks that block ad-related network requests',
description:'Tasks blocking the main thread can delay ad requests and cause '+
'a poor user experience. Consider removing long blocking tasks or moving '+
'them off of the main thread. These tasks can be especially detrimental to '+
'performance on less powerful devices. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/ad-blocking-tasks'+
').',
failureDisplayValue:'{timeInMs, number, seconds} s blocked',
columnScript:'Attributable URL',
columnStartTime:'Start',
columnDuration:'Duration'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);













const LONG_TASK_DUR_MS=100;





const HEADINGS=[
{
key:'script',
itemType:'url',
text:str_(UIStrings.columnScript)},

{
key:'startTime',
itemType:'ms',
text:str_(UIStrings.columnStartTime),
granularity:1},

{
key:'duration',
itemType:'ms',
text:str_(UIStrings.columnDuration),
granularity:1}];




class AdBlockingTasks extends Audit{




static get meta(){
return{
id:'ad-blocking-tasks',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['traces','devtoolsLogs']};

}







static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricData={trace,devtoolsLog,settings:context.settings};
let longTasks=[];
try{
longTasks=await LongTasks.request(metricData,context);
}catch(e){
return auditNotApplicable.InvalidTiming;
}

if(!longTasks.length){
return auditNotApplicable.NoTasks;
}

const{timing:endTime}=
await AdRequestTime.request(metricData,context);

if(!(endTime>0)){
return auditNotApplicable.NoAdRelatedReq;
}

let blocking=[];
for(const longTask of longTasks){
if(longTask.startTime>endTime||
longTask.duration<LONG_TASK_DUR_MS){
continue;
}
const scriptUrl=getAttributableUrl(longTask);
if(scriptUrl&&isAdScript(new URL(scriptUrl))){
continue;
}

const url=scriptUrl&&new URL(scriptUrl);
const displayUrl=url&&url.origin+url.pathname;

blocking.push({

script:displayUrl,
startTime:longTask.startTime,
endTime:longTask.endTime,
duration:longTask.duration,
isTopLevel:!longTask.parent});

}

const taskLimit=10;
if(blocking.length>taskLimit){



blocking=blocking.filter(b=>b.script&&b.isTopLevel).

sort((a,b)=>b.duration-a.duration).
splice(0,taskLimit).
sort((a,b)=>a.startTime-b.startTime);
}

const blockedTime=blocking.reduce(
(sum,t)=>t.isTopLevel?sum+t.duration:sum,0);
const failed=blocking.length>0;
return{
score:failed?0:1,
displayValue:failed?
str_(UIStrings.failureDisplayValue,{timeInMs:blockedTime}):
'',
details:AdBlockingTasks.makeTableDetails(HEADINGS,blocking)};

}}


module.exports=AdBlockingTasks;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks.js");
},{"../computed/ad-request-time":128,"../computed/long-tasks":130,"../messages/common-strings":132,"../utils/resource-classification":140,"../utils/tasks":141,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');

const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{getTimingsByRecord}=require('../utils/network-timing');
const{isAdTag}=require('../utils/resource-classification');
const{URL}=require('url');

const UIStrings={
title:'Minimal render-blocking resources found',
failureTitle:'Avoid render-blocking resources',
description:'Render-blocking resources slow down tag load times. Consider '+
'loading critical JS/CSS inline or loading scripts asynchronously or '+
'loading the tag earlier in the head. [Learn more]('+
'https://developers.google.com/web/tools/lighthouse/audits/blocking-resources'+
').',
failureDisplayValue:'Up to {timeInMs, number, seconds} s tag load time '+
'improvement',
columnUrl:'Resource',
columnStartTime:'Start',
columnDuration:'Duration'};





const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





const HEADINGS=[
{
key:'url',
itemType:'url',
text:str_(UIStrings.columnUrl)},

{
key:'startTime',
itemType:'ms',
text:str_(UIStrings.columnStartTime),
granularity:1},

{
key:'duration',
itemType:'ms',
text:str_(UIStrings.columnDuration),
granularity:1}];




class AdRenderBlockingResources extends Audit{




static get meta(){
return{
id:'ad-render-blocking-resources',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
scoreDisplayMode:'binary',
description:str_(UIStrings.description),
requiredArtifacts:
['LinkElements','ScriptElements','devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const tag=networkRecords.find(req=>isAdTag(new URL(req.url)));
if(!tag){
return auditNotApplicable.NoTag;
}


const timingsByRecord=
await getTimingsByRecord(trace,devtoolsLog,context);




const blockingElementUrls=new Set();
for(const link of artifacts.LinkElements){


if(link.href&&link.rel=='stylesheet'){

blockingElementUrls.add(link.href);
}
}
for(const script of artifacts.ScriptElements){
if(script.src&&!script.defer&&!script.async){
blockingElementUrls.add(script.src);
}
}

const blockingNetworkRecords=networkRecords.


filter(r=>r.endTime<tag.startTime).
filter(r=>r!=tag.initiatorRequest).



filter(r=>r.initiator.type='parser').
filter(r=>blockingElementUrls.has(r.url));

const tableView=blockingNetworkRecords.
map(r=>Object.assign({url:r.url},timingsByRecord.get(r)));

tableView.sort((a,b)=>a.endTime-b.endTime);


const endTimes=tableView.map(r=>r.endTime);
const opportunity=Math.max(...endTimes)-Math.min(...endTimes);
let displayValue='';
if(tableView.length>0&&opportunity>0){
displayValue=str_(
UIStrings.failureDisplayValue,{timeInMs:opportunity});
}

const failed=tableView.length>0;
return{
score:failed?0:1,
numericValue:tableView.length,
displayValue,
details:AdRenderBlockingResources.makeTableDetails(HEADINGS,tableView)};

}}


module.exports=AdRenderBlockingResources;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources.js");
},{"../messages/common-strings":132,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/ad-request-critical-path":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{computeAdRequestWaterfall}=require('../utils/graph');




const UIStrings={
title:'Ad request waterfall',
failureTitle:'Reduce critical path for ad loading',
description:'Consider reducing the number of resources, loading multiple '+
'resources simultaneously, or loading resources earlier to improve ad '+
'speed. Requests that block ad loading can be found below. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-critical-path'+
').',
displayValue:'{serialResources, plural, =1 {1 serial resource} other {# serial resources}}',
columnUrl:'Request',
columnType:'Type',
columnStartTime:'Start',
columnEndTime:'End'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





const HEADINGS=[
{
key:'url',
itemType:'url',
text:str_(UIStrings.columnUrl)},

{
key:'type',
itemType:'text',
text:str_(UIStrings.columnType)},

{
key:'startTime',
itemType:'ms',
text:str_(UIStrings.columnStartTime),
granularity:1},

{
key:'endTime',
itemType:'ms',
text:str_(UIStrings.columnEndTime),
granularity:1}];








function computeDepth(requests){
let prevEnd=0;
let hops=0;
for(const{startTime,endTime}of requests){
if(startTime>prevEnd){
++hops;
prevEnd=endTime;
}else{
prevEnd=Math.min(prevEnd,endTime);
}
}
return hops;
}





class AdRequestCriticalPath extends Audit{




static get meta(){
return{
id:'ad-request-critical-path',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
scoreDisplayMode:'informative',
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];

const tableView=
(await computeAdRequestWaterfall(trace,devtoolsLog,context)).
filter(r=>r.startTime>0);
if(!tableView.length){
return auditNotApplicable.NoAds;
}
const depth=computeDepth(tableView);
const failed=depth>3;

for(const row of tableView){
delete row.record;
}

return{
numericValue:depth,
score:failed?0:1,
displayValue:str_(UIStrings.displayValue,
{
serialResources:depth}),

details:AdRequestCriticalPath.makeTableDetails(HEADINGS,tableView)};

}}


module.exports=AdRequestCriticalPath;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-critical-path.js");
},{"../messages/common-strings":132,"../utils/graph":137,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start":[function(require,module,exports){
(function(__filename){














const ComputedAdRequestTime=require('../computed/ad-request-time');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable,runWarning}=require('../messages/common-strings');
const{Audit}=require('lighthouse');

const UIStrings={
title:'First ad request time',
failureTitle:'Reduce time to send the first ad request',
description:'This metric measures the elapsed time from the start of page '+
'load until the first ad request is made. Delayed ad requests will '+
'decrease impressions and viewability, and have a negative impact on ad '+
'revenue. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
').',
displayValue:'{timeInMs, number, seconds} s'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const PODR=1500;
const MEDIAN=3500;




class AdRequestFromPageStart extends Audit{




static get meta(){
return{
id:'ad-request-from-page-start',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),

scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricData={trace,devtoolsLog,settings:context.settings};

const{timing}=await ComputedAdRequestTime.request(metricData,context);
if(!(timing>0)){
context.LighthouseRunWarnings.push(runWarning.NoAds);
return auditNotApplicable.NoAds;
}

let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);


if(normalScore>=.9){
normalScore=1;
}

return{
numericValue:timing*1e-3,
score:normalScore,
displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};

}}


module.exports=AdRequestFromPageStart;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start.js");
},{"../computed/ad-request-time":128,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{isAdIframe}=require('../utils/resource-classification');

const UIStrings={
title:'No ad found at the very top of the viewport',
failureTitle:'Move the top ad further down the page',
description:'Over 10% of ads are never viewed because users scroll past '+
'them before they become viewable. By moving ad slots away from the very '+
'top of the viewport, users are more likely to see ads before scrolling '+
'away. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/ad-top-of-viewport'+
').',
failureDisplayValue:'A scroll of {valueInPx, number} px would hide half of your topmost ad',
columnSlot:'Top Slot ID'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const SCROLL_PX_THRESHOLD=100;





const HEADINGS=[
{key:'slot',itemType:'text',text:str_(UIStrings.columnSlot)}];




class AdTopOfViewport extends Audit{




static get meta(){
return{
id:'ad-top-of-viewport',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ViewportDimensions','IFrameElements']};

}






static audit(artifacts){
const viewport=artifacts.ViewportDimensions;
const slots=artifacts.IFrameElements.filter(isAdIframe).
filter(slot=>
slot.clientRect.width*slot.clientRect.height>1&&
!slot.isPositionFixed).
map(slot=>({
midpoint:slot.clientRect.top+slot.clientRect.height/2,
id:slot.id}));


if(!slots.length){
return auditNotApplicable.NoVisibleSlots;
}

const topSlot=slots.reduce((a,b)=>a.midpoint<b.midpoint?a:b);

const inViewport=topSlot.midpoint<viewport.innerHeight;

if(!inViewport){
return auditNotApplicable.NoAdsViewport;
}

const score=inViewport&&topSlot.midpoint<SCROLL_PX_THRESHOLD?0:1;

return{
score,
numericValue:topSlot.midpoint,

displayValue:score?'':
str_(UIStrings.failureDisplayValue,{valueInPx:topSlot.midpoint}),
details:AdTopOfViewport.makeTableDetails(
HEADINGS,
score?[]:[{slot:topSlot.id}])};


}}


module.exports=AdTopOfViewport;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport.js");
},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ads-in-viewport":[function(require,module,exports){
(function(__filename){














const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');

const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{isAdIframe}=require('../utils/resource-classification');
const{isBoxInViewport}=require('../utils/geometry');

const UIStrings={
title:'Few or no ads loaded outside viewport',
failureTitle:'Avoid loading ads until they are nearly on-screen',
description:'Too many ads loaded outside the viewport lowers viewability '+
'rates and impacts user experience. Consider loading ads below the fold '+
'lazily as the user scrolls down. Consider using GPT\'s [Lazy Loading API]('+
'https://developers.google.com/doubleclick-gpt/reference#googletag.PubAdsService_enableLazyLoad'+
'). [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/ads-in-viewport'+
').',
failureDisplayValue:'{hiddenAds, plural, =1 {1 ad} '+
'other {# ads}} out of view',
columnSlot:'Slots Outside Viewport'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





const HEADINGS=[
{key:'slot',itemType:'text',text:str_(UIStrings.columnSlot)}];



class AdsInViewport extends Audit{




static get meta(){
return{
id:'ads-in-viewport',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ViewportDimensions','IFrameElements']};

}





static audit(artifacts){
const viewport=artifacts.ViewportDimensions;
const slots=artifacts.IFrameElements.
filter(iframe=>isAdIframe(iframe)&&
iframe.clientRect.height*iframe.clientRect.width>1);

if(!slots.length){
return auditNotApplicable.NoVisibleSlots;
}


const nonvisible=slots.
filter(slot=>!isBoxInViewport(slot.clientRect,viewport)).
map(slot=>({slot:slot.id})).
sort((a,b)=>a.slot.localeCompare(b.slot));

const visibleCount=slots.length-nonvisible.length;

return{
numericValue:visibleCount/slots.length,
score:nonvisible.length>3?0:1,
displayValue:nonvisible.length?
str_(UIStrings.failureDisplayValue,{hiddenAds:nonvisible.length}):
'',
details:AdsInViewport.makeTableDetails(HEADINGS,nonvisible)};

}}


module.exports=AdsInViewport;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ads-in-viewport.js");
},{"../messages/common-strings":132,"../utils/geometry":136,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/async-ad-tags":[function(require,module,exports){
(function(__filename){














const array=require('../utils/array.js');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');

const MainResource=require('lighthouse/lighthouse-core/computed/main-resource');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{isAdTag,isStaticRequest}=require('../utils/resource-classification');
const{URL}=require('url');

const UIStrings={
title:'Ad tag is loaded asynchronously',
failureTitle:'Load ad tag asynchronously',
description:'Loading the ad tag synchronously blocks content rendering '+
'until the tag is fetched and loaded. Consider using the `async` attribute '+
'to load gpt.js and/or adsbygoogle.js asynchronously. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags'+
').'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);




function isAsync(tagReq){




return tagReq.priority=='Low'||isStaticRequest(tagReq);
}


class AsyncAdTags extends Audit{




static get meta(){
return{
id:'async-ad-tags',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','URL']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const mainResource=
await MainResource.request({URL:artifacts.URL,devtoolsLog},context);
const tagReqs=networkRecords.
filter(req=>isAdTag(new URL(req.url))).
filter(req=>req.frameId===mainResource.frameId);

if(!tagReqs.length){
return auditNotApplicable.NoTag;
}

const numAsync=array.count(tagReqs,isAsync);
const numTags=tagReqs.length;
return{
score:Number(numAsync===numTags)};

}}


module.exports=AsyncAdTags;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/async-ad-tags.js");
},{"../messages/common-strings":132,"../utils/array.js":133,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/main-resource":11,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start":[function(require,module,exports){
(function(__filename){














const ComputedBidRequestTime=require('../computed/bid-request-time');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');

const UIStrings={
title:'First bid request time',
failureTitle:'Reduce time to send the first bid request',
description:'This metric measures the elapsed time from the start of page '+
'load until the first bid request is made. Delayed bid requests will '+
'decrease impressions and viewability, and have a negative impact on ad '+
'revenue. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
').',
displayValue:'{timeInMs, number, seconds} s'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const PODR=1500;
const MEDIAN=3500;




class BidRequestFromPageStart extends Audit{




static get meta(){
return{
id:'bid-request-from-page-start',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),

scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricData={trace,devtoolsLog,settings:context.settings};

const{timing}=await ComputedBidRequestTime.request(metricData,context);
if(!(timing>0)){
return auditNotApplicable.NoBids;
}

let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);


if(normalScore>=.9){
normalScore=1;
}

return{
numericValue:timing*1e-3,
score:normalScore,
displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};

}}


module.exports=BidRequestFromPageStart;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start.js");
},{"../computed/bid-request-time":129,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/blocking-load-events":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');

const TraceOfTab=require('lighthouse/lighthouse-core/computed/trace-of-tab');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{computeAdRequestWaterfall}=require('../utils/graph');
const{getTimingsByRecord}=require('../utils/network-timing');




const UIStrings={
title:'Ads not blocked by load events',
failureTitle:'Avoid waiting on load events',
description:'Waiting on load events increases ad latency. '+
'To speed up ads, eliminate the following load event handlers.',
displayValue:'{timeInMs, number, seconds} s blocked',
columnEvent:'Event Name',
columnTime:'Event Time',
columnScript:'Script',
columnBlockedUrl:'Blocked URL',
columnFunctionName:'Function'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





const HEADINGS=[
{key:'eventName',itemType:'text',text:str_(UIStrings.columnEvent)},
{key:'time',itemType:'ms',text:str_(UIStrings.columnTime),granularity:1},
{key:'url',itemType:'url',text:str_(UIStrings.columnScript)},
{key:'functionName',itemType:'text',text:str_(UIStrings.columnFunctionName)}];








function findOriginalCallFrame(request){
const{record}=request;
let stack=record&&record.initiator&&record.initiator.stack;
if(!stack){
return undefined;
}
while(stack.parent){
stack=stack.parent;
}
return stack.callFrames[stack.callFrames.length-1];
}





function findTraceEventOfCallFrame(callFrame,traceEvents){
return traceEvents.find(e=>e.name=='FunctionCall'&&
e.args.data&&

e.args.data.functionName==callFrame.functionName&&

e.args.data.scriptId==callFrame.scriptId&&

e.args.data.url==callFrame.url&&


Math.abs(e.args.data.lineNumber==callFrame.lineNumber)<2&&

Math.abs(e.args.data.columnNumber==callFrame.columnNumber)<2);
}















function findEventIntervals(eventName,traceEvents){
let openInterval={};
const intervals=[];
for(const e of traceEvents){
if(e.name==`${eventName}EventStart`){
openInterval={start:e.ts,end:Infinity,eventName};
}else if(e.name==`${eventName}EventEnd`){
openInterval.end=e.ts;
intervals.push(openInterval);
}
}
return intervals;
}















function quantifyBlockedTime(blockingEvent,networkRecords,timingsByRecord){
const eventScript=networkRecords.find(
r=>r.url==blockingEvent.url);
const blockedRequest=networkRecords.find(
r=>r.url==blockingEvent.blockedUrl);
if(!eventScript||!blockedRequest){
return 0;
}
const scriptLoadTime=timingsByRecord.get(eventScript);
const blockedRequestLoadTime=timingsByRecord.get(blockedRequest);
if(!scriptLoadTime||!blockedRequestLoadTime){
return 0;
}
return blockedRequestLoadTime.startTime-scriptLoadTime.endTime;
}





class BlockingLoadEvents extends Audit{




static get meta(){
return{
id:'blocking-load-events',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const{timings,processEvents}=await TraceOfTab.request(trace,context);

const timingsByRecord=
await getTimingsByRecord(trace,devtoolsLog,context);

const criticalRequests=
(await computeAdRequestWaterfall(trace,devtoolsLog,context)).

sort((a,b)=>a.startTime-b.startTime);

if(!criticalRequests.length){
return auditNotApplicable.NoAdRelatedReq;
}

const eventTimes=[
...findEventIntervals('domContentLoaded',processEvents),
...findEventIntervals('load',processEvents)];

const blockingEvents=[];
const seen=new Set();
for(const r of criticalRequests){
const callFrame=findOriginalCallFrame(r);
if(!callFrame){


continue;
}
const json=JSON.stringify(callFrame);
if(seen.has(json)){

continue;
}
seen.add(json);
const traceEvent=findTraceEventOfCallFrame(callFrame,processEvents);
if(!traceEvent){
continue;
}
const interval=eventTimes.find(interval=>
interval.start<=traceEvent.ts&&traceEvent.ts<=interval.end);
if(interval){

const blockingEvent=Object.assign({
eventName:interval.eventName,
blockedUrl:r.url,
time:timings[interval.eventName],
blockedTime:Infinity},
callFrame);
blockingEvent.blockedTime=quantifyBlockedTime(
blockingEvent,networkRecords,timingsByRecord);
blockingEvents.push(blockingEvent);
}
}

const failed=blockingEvents.length>0;
let blockedTime=0;
if(failed){
blockedTime=Math.min(...blockingEvents.map(e=>e.blockedTime));
}
return{
numericValue:blockingEvents.length,
score:failed?0:1,
displayValue:failed&&blockedTime?
str_(UIStrings.displayValue,{timeInMs:blockedTime}):
'',
details:BlockingLoadEvents.makeTableDetails(HEADINGS,blockingEvents)};

}}


module.exports=BlockingLoadEvents;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/blocking-load-events.js");
},{"../messages/common-strings":132,"../utils/graph":137,"../utils/network-timing":138,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/trace-of-tab":39,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/bottleneck-requests":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{computeAdRequestWaterfall}=require('../utils/graph');




const UIStrings={
title:'No bottleneck requests found',
failureTitle:'Avoid bottleneck requests',
description:'Speed up, load earlier, parallelize, or eliminate the '+
'following requests and their dependencies in order to speed up ad '+
'loading.',
displayValue:'{blockedTime, number, seconds} s spent blocked on requests',
columnUrl:'Blocking Request',
columnInitiatorUrl:'Initiator Request',
columnStartTime:'Start',
columnSelfTime:'Exclusive Time',
columnDuration:'Total Time'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);






const HEADINGS=[
{
key:'url',
itemType:'url',
text:str_(UIStrings.columnUrl)},

{
key:'selfTime',
itemType:'ms',
text:str_(UIStrings.columnSelfTime),
granularity:1},

{
key:'duration',
itemType:'ms',
text:str_(UIStrings.columnDuration),
granularity:1}];







class BottleneckRequests extends Audit{




static get meta(){
return{
id:'bottleneck-requests',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];

const waterfall=
(await computeAdRequestWaterfall(trace,devtoolsLog,context)).
filter(r=>r.startTime>0);
if(!waterfall.length){
return auditNotApplicable.NoAdRelatedReq;
}
const CRITICAL_SELF_TIME_MS=250;
const CRITICAL_DURATION_MS=1000;

const isBottleneck=r=>
r.selfTime>CRITICAL_SELF_TIME_MS||r.duration>CRITICAL_DURATION_MS;


const cost=r=>r.selfTime*3+r.duration;
const criticalRequests=waterfall.
filter(isBottleneck).
sort((a,b)=>cost(b)-cost(a)).

slice(0,5);
const blockedTime=

criticalRequests.reduce((sum,r)=>sum+r.selfTime,0)/1000;
const failed=blockedTime*1e3>CRITICAL_SELF_TIME_MS*4;

for(const row of criticalRequests){
delete row.record;
}
return{
numericValue:criticalRequests.length,
score:failed?0:1,
displayValue:failed?str_(UIStrings.displayValue,{blockedTime}):'',
details:
BottleneckRequests.makeTableDetails(HEADINGS,criticalRequests)};

}}


module.exports=BottleneckRequests;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/bottleneck-requests.js");
},{"../messages/common-strings":132,"../utils/graph":137,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/duplicate-tags":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{containsAnySubstring}=require('../utils/resource-classification');
const{URL}=require('url');

const UIStrings={
title:'No duplicate tags found in any frame',
failureTitle:'Load tags only once per frame',
description:'Loading a tag more than once in the same frame is redundant '+
'and adds overhead without benefit. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/duplicate-tags'+
').',
failureDisplayValue:'{duplicateTags, plural, =1 {1 duplicate tag} other {# duplicate tags}}',
columnScript:'Script',
columnNumReqs:'Duplicate Requests',
columnFrameId:'Frame ID'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);

const tags=[
'googletagservices.com/tag/js/gpt.js',
'securepubads.g.doubleclick.net/tag/js/gpt.js',
'pagead2.googlesyndication.com/pagead/js/adsbygoogle.js',
'imasdk.googleapis.com/js/sdkloader/ima3.js',
'google-analytics.com/analytics.js'];






const HEADINGS=[
{key:'script',itemType:'url',text:str_(UIStrings.columnScript)},
{key:'numReqs',itemType:'text',text:str_(UIStrings.columnNumReqs)},
{key:'frameId',itemType:'text',text:str_(UIStrings.columnFrameId)}];





class DuplicateTags extends Audit{




static get meta(){
return{
id:'duplicate-tags',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs']};

}






static async audit(artifacts,context){
const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
const tagReqs=networkRecords.
filter(record=>containsAnySubstring(record.url,tags));

if(!tagReqs.length){
return auditNotApplicable.NoTags;
}

const tagsByFrame={};
tagReqs.forEach(record=>{
const frameId=record.frameId||'';

const script=new URL(record.url).pathname;
if(!tagsByFrame[frameId]){
tagsByFrame[frameId]={};
}
tagsByFrame[frameId][script]=
tagsByFrame[frameId][script]?tagsByFrame[frameId][script]+1:1;
});


const dups=[];
for(const frameId of Object.keys(tagsByFrame)){
for(const script of Object.keys(tagsByFrame[frameId])){
const numReqs=tagsByFrame[frameId][script];
if(numReqs>1){
dups.push({script,numReqs,frameId});
}
}
}

return{
numericValue:dups.length,
score:dups.length?0:1,
details:DuplicateTags.makeTableDetails(HEADINGS,dups),
displayValue:dups.length?
str_(UIStrings.failureDisplayValue,{duplicateTags:dups.length}):
''};

}}


module.exports=DuplicateTags;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/duplicate-tags.js");
},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/first-ad-render":[function(require,module,exports){
(function(__filename){














const ComputedAdRenderTime=require('../computed/ad-render-time');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable,runWarning}=require('../messages/common-strings');
const{Audit}=require('lighthouse');

const UIStrings={
title:'Latency of first ad render',
failureTitle:'Reduce time to render first ad',
description:'This metric measures the time for the first ad iframe to '+
'render from page navigation. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
').',
displayValue:'{timeInMs, number, seconds} s'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const PODR=2700;
const MEDIAN=3700;




class FirstAdRender extends Audit{




static get meta(){

return{
id:'first-ad-render',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),

scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,

requiredArtifacts:['devtoolsLogs','traces']};

}





static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricData={
devtoolsLog,
trace,
settings:context.settings};

const{timing}=await ComputedAdRenderTime.request(metricData,context);

if(!(timing>0)){
context.LighthouseRunWarnings.push(runWarning.NoAdRendered);
return auditNotApplicable.NoAdRendered;
}

let normalScore=
Audit.computeLogNormalScore(timing,PODR,MEDIAN);
if(normalScore>=0.9)normalScore=1;

return{
numericValue:timing*1e-3,
score:normalScore,
displayValue:
str_(UIStrings.displayValue,{timeInMs:timing})};

}}

module.exports=FirstAdRender;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/first-ad-render.js");
},{"../computed/ad-render-time":127,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/full-width-slots":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{isAdRequest}=require('../utils/resource-classification');
const{URL}=require('url');

const UIStrings={
title:'Ad slots effectively use horizontal space',
failureTitle:'Increase the width of ad slots',
description:'Ad slots that utilize most of the page width generally '+
'experience increased click-through rate over smaller ad sizes. We '+
'recommend leaving no more than 25% of the viewport width unutilized on '+
'mobile devices.',
failureDisplayValue:'{percentUnused, number, percent} of viewport width '+
'is underutilized'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


class FullWidthSlots extends Audit{




static get meta(){
return{
id:'full-width-slots',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ViewportDimensions','devtoolsLogs']};

}






static async audit(artifacts,context){
const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
const viewport=artifacts.ViewportDimensions;
const vpWidth=viewport.innerWidth;


const adRequestUrls=networkRecords.
filter(isAdRequest).
map(record=>new URL(record.url));

if(!adRequestUrls.length){
return auditNotApplicable.NoAds;
}

const sizeArrs=adRequestUrls.map(url=>
url.searchParams.get('prev_iu_szs')||url.searchParams.get('sz'));



const sizes=sizeArrs.join('|').split(/[|,]/);

const widths=sizes.map(size=>parseInt(size.split('x')[0])).
filter(w=>w<=vpWidth&&w>1);

if(!widths.length){
return auditNotApplicable.NoValidAdWidths;
}

const maxWidth=Math.max(...widths);

const pctUnoccupied=1-maxWidth/vpWidth;

const score=pctUnoccupied>.25?0:1;


return{
score,
numericValue:pctUnoccupied,

displayValue:score?
'':
str_(UIStrings.failureDisplayValue,{percentUnused:pctUnoccupied})};

}}


module.exports=FullWidthSlots;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/full-width-slots.js");
},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/gpt-bids-parallel":[function(require,module,exports){














const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{assert}=require('../utils/asserts');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{getCriticalGraph}=require('../utils/graph');
const{getTimingsByRecord}=require('../utils/network-timing');
const{isGptImplTag,isBidRequest,getAbbreviatedUrl,getHeaderBidder}=require('../utils/resource-classification');




const id='gpt-bids-parallel';
const UIStrings={
title:'GPT and bids loaded in parallel',
failureTitle:'Load GPT and bids in parallel',
description:'To optimize ad loading, bid requests should not wait on GPT to load. This issue can often be fixed by making sure that bid requests do not wait on `googletag.pubadsReady` or `googletag.cmd.push`.',
columnBidder:'Bidder',
columnUrl:'URL',
columnStartTime:'Start',
columnDuration:'Duration'};






const HEADINGS=[
{key:'bidder',itemType:'text',text:UIStrings.columnBidder},
{key:'url',itemType:'url',text:UIStrings.columnUrl},
{key:'startTime',itemType:'ms',text:UIStrings.columnStartTime},
{key:'duration',itemType:'ms',text:UIStrings.columnDuration}];





class GptBidsInParallel extends Audit{




static get meta(){
return{
id,
title:UIStrings.title,
failureTitle:UIStrings.failureTitle,
description:UIStrings.description,
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const network=await NetworkRecords.request(devtoolsLog,context);

const pubadsImpl=network.find(r=>isGptImplTag(r.url));
if(!pubadsImpl){
return auditNotApplicable.NoGpt;
}

const bids=network.filter(isBidRequest).
filter(b=>b.frameId==pubadsImpl.frameId);
if(!bids.length){
return auditNotApplicable.NoBids;
}


const timingsByRecord=await getTimingsByRecord(
trace,devtoolsLog,context);
const tableView=[];
const seen=new Set();
for(const bid of bids){
if(getCriticalGraph(network,trace.traceEvents,bid).has(pubadsImpl)){
const{startTime,endTime}=timingsByRecord.get(bid)||bid;
const bidder=assert(getHeaderBidder(bid.url));
if(seen.has(bidder)){


continue;
}
seen.add(bidder);
tableView.push({
bidder,
url:getAbbreviatedUrl(bid.url),
startTime,
duration:endTime-startTime});

}
}
const failed=tableView.length>0;
return{
numericValue:tableView.length,
score:failed?0:1,
details:failed?
GptBidsInParallel.makeTableDetails(HEADINGS,tableView):undefined};

}}


module.exports=GptBidsInParallel;
module.exports.UIStrings=UIStrings;

},{"../messages/common-strings":132,"../utils/asserts":134,"../utils/graph":137,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34}],"lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{isAdTag}=require('../utils/resource-classification');
const{URL}=require('url');

const UIStrings={
title:'Ad tag is loaded over HTTPS',
failureTitle:'Load ad tag over HTTPS',
description:'For privacy and security, always load GPT/AdSense over '+
'HTTPS. Insecure pages should explicitly request the ad script securely. '+
'GPT Example: `<script async '+
'src=\"https://securepubads.g.doubleclick.net/tag/js/gpt.js\">` '+
'AdSense Example: `<script async '+
'src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\">`'+
'. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/loads-ad-tag-over-https'+
').'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);







class LoadsAdTagOverHttps extends Audit{




static get meta(){
return{
id:'loads-ad-tag-over-https',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs']};

}






static async audit(artifacts,context){
const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLogs,context);

const pageReq=networkRecords.find(record=>record.statusCode==200);
if(!pageReq){
return auditNotApplicable.NoRecords;
}

const adRequests=networkRecords.
filter(record=>isAdTag(new URL(record.url)));

const secureAdRequests=adRequests.filter(request=>request.isSecure);


const details={
type:'debugdata',
numAdTagHttpReqs:adRequests.length-secureAdRequests.length,
numAdTagHttpsReqs:secureAdRequests.length};


if(!adRequests.length){
const returnVal=auditNotApplicable.NoTag;
returnVal.details=details;
return returnVal;
}



return{
numericValue:details.numAdTagHttpReqs,
score:details.numAdTagHttpReqs?0:1,
details};

}}


module.exports=LoadsAdTagOverHttps;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https.js");
},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/loads-gpt-from-sgdn":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{isGptTag}=require('../utils/resource-classification');
const{URL}=require('url');

const UIStrings={
title:'GPT tag is loaded from recommended host',
failureTitle:'Load GPT from recommended host',
description:'Load GPT from \'securepubads.g.doubleclick.net\' to reduce '+
'GPT load time. By loading GPT from the same host as ad requests, browsers '+
'can avoid an additional DNS lookup and HTTP connection. Example:`'+
'<script async src=\"https://securepubads.g.doubleclick.net/tag/js/gpt.js\">'+
'`. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/loads-gpt-from-sgdn'+
').'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);




class LoadsGptFromSgdn extends Audit{




static get meta(){
return{
id:'loads-gpt-from-sgdn',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const networkRecords=await NetworkRecords.request(devtoolsLog,context);
const gptUrl=networkRecords.map(r=>new URL(r.url)).find(isGptTag);
if(!gptUrl){
return auditNotApplicable.NoGpt;
}
return{
score:Number(gptUrl.host==='securepubads.g.doubleclick.net')};

}}


module.exports=LoadsGptFromSgdn;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/loads-gpt-from-sgdn.js");
},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/script-injected-tags":[function(require,module,exports){
(function(__filename){














const array=require('../utils/array.js');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{computeAdRequestWaterfall}=require('../utils/graph');
const{getScriptEvaluationTimes}=require('../utils/network-timing');






const MINIMUM_LOAD_TIME_MS=400;

const UIStrings={
title:'Ad scripts are loaded statically',
failureTitle:'Load ad scripts statically',
description:'Load the following scripts directly with '+
'`<script async src=...>` instead of injecting scripts with JavaScript. '+
'Doing so allows the browser to preload scripts sooner. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags'+
').',
failureDisplayValue:'Load {tags, plural, =1 {1 script} other {# scripts}} statically',
columnUrl:'Script',
columnLoadTime:'Load Time'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);





const HEADINGS=[
{
key:'url',
itemType:'url',
text:str_(UIStrings.columnUrl)},

{
key:'loadTime',
itemType:'ms',
granularity:1,
text:str_(UIStrings.columnLoadTime)}];



const STATICALLY_LOADABLE_TAGS=[
/amazon-adsystem\.com\/aax2\/apstag.js/,
/js-sec\.indexww\.com\/ht\/p\/.*\.js/,
/pubads\.g\.doubleclick\.net\/tag\/js\/gpt\.js/,
/static\.criteo\.net\/js\/.*\/publishertag\.js/,
/www\.googletagservices\.com\/tag\/js\/gpt\.js/,
/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js/];










function initiatedByInlineScript(record){
if(record.initiator.type!=='script'){

return false;
}
const initiators=PageDependencyGraph.getNetworkInitiators(record);
if(initiators.length!==1||initiators[0]!==record.documentURL){

return false;
}
return true;
}







async function findStaticallyLoadableTags(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const trace=artifacts.traces[Audit.DEFAULT_PASS];

const tagReqs=[];



const criticalRequests=
await computeAdRequestWaterfall(trace,devtoolsLog,context);
for(const{record}of criticalRequests){
if(record.resourceType!=='Script'){

continue;
}
if(initiatedByInlineScript(record)||
STATICALLY_LOADABLE_TAGS.find(t=>record.url.match(t))){
tagReqs.push(record);
}
}
return tagReqs;
}


class StaticAdTags extends Audit{




static get meta(){
return{
id:'script-injected-tags',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const tagReqs=await findStaticallyLoadableTags(artifacts,context);
if(!tagReqs.length){
return auditNotApplicable.NoTag;
}

const seenUrls=new Set();
const tableView=[];

const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const scriptTimes=
await getScriptEvaluationTimes(trace,devtoolsLog,context);
for(const tag of tagReqs){
if(seenUrls.has(tag.url))continue;
seenUrls.add(tag.url);
const relatedTags=tagReqs.filter(t=>t.url===tag.url);

const numStatic=array.count(
relatedTags,t=>t.initiator.type==='parser'&&!t.isLinkPreload);
if(numStatic===0){
const loadTime=scriptTimes.get(tag.url)||0;
if(loadTime<MINIMUM_LOAD_TIME_MS){
continue;
}
tableView.push({
url:tag.url,
loadTime});

}
}
tableView.sort((a,b)=>a.loadTime-b.loadTime);

const failed=tableView.length>0;
return{
displayValue:failed?
str_(UIStrings.failureDisplayValue,{tags:tableView.length}):'',
score:Number(!failed),
numericValue:tableView.length,
details:StaticAdTags.makeTableDetails(HEADINGS,tableView)};

}}


module.exports=StaticAdTags;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/script-injected-tags.js");
},{"../messages/common-strings":132,"../utils/array.js":133,"../utils/graph":137,"../utils/network-timing":138,"lighthouse":54,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/serial-header-bidding":[function(require,module,exports){
(function(__filename){














const ComputedAdRequestTime=require('../computed/ad-request-time');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
const{auditNotApplicable}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{bucket}=require('../utils/array');
const{getTimingsByRecord}=require('../utils/network-timing');
const{isCacheable}=require('../utils/network');
const{isGoogleAds,getHeaderBidder,getAbbreviatedUrl}=require('../utils/resource-classification');
const{URL}=require('url');




const UIStrings={
title:'Header bidding is parallelized',
failureTitle:'Parallelize bid requests',
description:'Send header bidding requests simultaneously, rather than '+
'serially, to retrieve bids more quickly. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/serial-header-bidding'+
').',
columnBidder:'Bidder',
columnUrl:'URL',
columnStartTime:'Start',
columnDuration:'Duration'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const MIN_BID_DURATION=.05;














const HEADINGS=[
{key:'bidder',itemType:'text',text:str_(UIStrings.columnBidder)},
{key:'url',itemType:'url',text:str_(UIStrings.columnUrl)},
{key:'startTime',itemType:'ms',text:str_(UIStrings.columnStartTime)},
{key:'duration',itemType:'ms',text:str_(UIStrings.columnDuration)}];







const RequestType={
AD:'ad',
BID:'bid',
UNKNOWN:'unknown'};









function constructRecords(records,recordType,timings){

const results=[];
for(const record of records){
const timing=timings.get(record);
if(!timing)continue;
results.push(Object.assign({},timing,{
url:getAbbreviatedUrl(record.url),
type:recordType}));

}
return results;
}






function checkRecordType(record){
if(isGoogleAds(new URL(record.url))){
return RequestType.AD;
}else if(getHeaderBidder(record.url)){
return RequestType.BID;
}else{
return RequestType.UNKNOWN;
}
}







function isPossibleBid(rec){
return(rec.resourceSize==null||rec.resourceSize>0)&&
rec.resourceType!='Image'&&
rec.endTime-rec.startTime>=MIN_BID_DURATION&&
!isCacheable(rec);
}






function clearQueryString(url){
const u=new URL(url);
delete u.search;
return u.toString();
}





class SerialHeaderBidding extends Audit{




static get meta(){
return{
id:'serial-header-bidding',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['devtoolsLogs','traces']};

}






static async audit(artifacts,context){
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const unfilteredNetworkRecords=
await NetworkRecords.request(devtoolsLog,context);
if(!unfilteredNetworkRecords.length){
return auditNotApplicable.NoRecords;
}

const mainFrameId=unfilteredNetworkRecords[0].frameId;



const networkRecords=unfilteredNetworkRecords.
filter(isPossibleBid).
filter(r=>r.frameId==mainFrameId);







const recordsByType=bucket(networkRecords,checkRecordType);

if(!recordsByType.has(RequestType.BID)){
return auditNotApplicable.NoBids;
}

const metricData={trace,devtoolsLog,settings:context.settings};
const{timing:adRequestTime}=
await ComputedAdRequestTime.request(metricData,context);


const timingsByRecord=await getTimingsByRecord(
trace,devtoolsLog,context);

const headerBiddingRecords=constructRecords(
recordsByType.get(RequestType.BID)||[],RequestType.BID,
timingsByRecord);

let serialBids=[];
let previousBid;


for(const record of headerBiddingRecords){


if(adRequestTime>0&&record.endTime>adRequestTime){
continue;
}
record.bidder=getHeaderBidder(record.url);
record.url=clearQueryString(record.url);

if(previousBid&&record.startTime>=previousBid.endTime){
serialBids.push(previousBid);
serialBids.push(record);
}

if(!previousBid||record.endTime<previousBid.endTime||

record.startTime>=previousBid.endTime){
previousBid=record;
}
}


serialBids=Array.from(new Set(serialBids));


const hasSerialHeaderBidding=serialBids.length>1;
return{
numericValue:Number(hasSerialHeaderBidding),
score:hasSerialHeaderBidding?0:1,
details:hasSerialHeaderBidding?
SerialHeaderBidding.makeTableDetails(HEADINGS,serialBids):undefined};

}}


module.exports=SerialHeaderBidding;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/serial-header-bidding.js");
},{"../computed/ad-request-time":128,"../messages/common-strings":132,"../utils/array":133,"../utils/network":139,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/tag-load-time":[function(require,module,exports){
(function(__filename){














const ComputedTagLoadTime=require('../computed/tag-load-time');
const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable,runWarning}=require('../messages/common-strings');
const{Audit}=require('lighthouse');

const UIStrings={
title:'Tag load time',
failureTitle:'Reduce tag load time',
description:'This metric measures the time for the ad tag\'s '+
'implementation script (pubads_impl.js for GPT; adsbygoogle.js for '+
'AdSense) to load after the page loads. [Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
').',
displayValue:'{timeInMs, number, seconds} s'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


const PODR=1000;
const MEDIAN=2000;




class TagLoadTime extends Audit{




static get meta(){
return{
id:'tag-load-time',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),

scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
requiredArtifacts:['devtoolsLogs','traces']};

}





static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
const metricData={trace,devtoolsLog,settings:context.settings};

const{timing}=await ComputedTagLoadTime.request(metricData,context);
if(!(timing>0)){
context.LighthouseRunWarnings.push(runWarning.NoTag);
return auditNotApplicable.NoTag;
}



let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);


if(normalScore>=.9){
normalScore=1;
}

return{
numericValue:timing*1e-3,
score:normalScore,
displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};

}}

module.exports=TagLoadTime;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/tag-load-time.js");
},{"../computed/tag-load-time":131,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/viewport-ad-density":[function(require,module,exports){
(function(__filename){














const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
const{auditNotApplicable,auditError}=require('../messages/common-strings');
const{Audit}=require('lighthouse');
const{boxViewableArea}=require('../utils/geometry');
const{isAdIframe}=require('../utils/resource-classification');

const UIStrings={
title:'Ad density in initial viewport is within recommended range',
failureTitle:'Reduce ad density in initial viewport',
description:'The ads-to-content ratio inside the viewport can have an '+
'impact on user experience and ultimately user retention. The Better Ads '+
'Standard [recommends having an ad density below 30%]'+
'(https://www.betterads.org/mobile-ad-density-higher-than-30/). '+
'[Learn more]('+
'https://developers.google.com/publisher-ads-audits/reference/audits/viewport-ad-density'+
').',
displayValue:'{adDensity, number, percent} covered by ads'};


const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);


class ViewportAdDensity extends Audit{




static get meta(){
return{
id:'viewport-ad-density',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
requiredArtifacts:['ViewportDimensions','IFrameElements']};

}






static audit(artifacts){
const viewport=artifacts.ViewportDimensions;
const slots=artifacts.IFrameElements.filter(
slot=>isAdIframe(slot)&&
slot.clientRect.width*slot.clientRect.height>1);

if(!slots.length){
return auditNotApplicable.NoVisibleSlots;
}

const adArea=slots.reduce((sum,slot)=>
sum+boxViewableArea(slot.clientRect,viewport),0);

const viewArea=viewport.innerWidth*viewport.innerHeight;

if(viewArea<=0){
throw new Error(auditError.ViewportAreaZero);
}
if(adArea>viewArea){
throw new Error(auditError.AreaLargerThanViewport);
}
const adDensity=adArea/viewArea;
const score=adDensity>0.3?0:1;
return{
score,
numericValue:adArea/viewArea,
displayValue:str_(UIStrings.displayValue,{adDensity})};

}}


module.exports=ViewportAdDensity;
module.exports.UIStrings=UIStrings;

}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/viewport-ad-density.js");
},{"../messages/common-strings":132,"../utils/geometry":136,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads":[function(require,module,exports){














const{group}=require('./messages/common-strings');

const PLUGIN_PATH='lighthouse-plugin-publisher-ads';


module.exports={
audits:[
{path:`${PLUGIN_PATH}/audits/ad-blocking-tasks`},
{path:`${PLUGIN_PATH}/audits/ad-render-blocking-resources`},
{path:`${PLUGIN_PATH}/audits/ad-request-critical-path`},
{path:`${PLUGIN_PATH}/audits/bid-request-from-page-start`},
{path:`${PLUGIN_PATH}/audits/ad-request-from-page-start`},
{path:`${PLUGIN_PATH}/audits/ad-top-of-viewport`},
{path:`${PLUGIN_PATH}/audits/ads-in-viewport`},
{path:`${PLUGIN_PATH}/audits/async-ad-tags`},
{path:`${PLUGIN_PATH}/audits/blocking-load-events`},
{path:`${PLUGIN_PATH}/audits/bottleneck-requests`},
{path:`${PLUGIN_PATH}/audits/duplicate-tags`},
{path:`${PLUGIN_PATH}/audits/first-ad-render`},
{path:`${PLUGIN_PATH}/audits/full-width-slots`},
{path:`${PLUGIN_PATH}/audits/gpt-bids-parallel`},
{path:`${PLUGIN_PATH}/audits/loads-gpt-from-sgdn`},
{path:`${PLUGIN_PATH}/audits/loads-ad-tag-over-https`},
{path:`${PLUGIN_PATH}/audits/script-injected-tags`},
{path:`${PLUGIN_PATH}/audits/serial-header-bidding`},
{path:`${PLUGIN_PATH}/audits/tag-load-time`},
{path:`${PLUGIN_PATH}/audits/viewport-ad-density`}],

groups:{
'metrics':{
title:group.Metrics},

'ads-performance':{
title:group.AdsPerformance},

'ads-best-practices':{
title:group.AdsBestPractices}},


category:{
title:'Publisher Ads [Beta]',
auditRefs:[

{id:'tag-load-time',weight:4,group:'metrics'},
{id:'ad-request-from-page-start',weight:4,group:'metrics'},
{id:'bid-request-from-page-start',weight:8,group:'metrics'},
{id:'first-ad-render',weight:8,group:'metrics'},

{id:'gpt-bids-parallel',weight:1,group:'ads-performance'},
{id:'serial-header-bidding',weight:1,group:'ads-performance'},
{id:'bottleneck-requests',weight:1,group:'ads-performance'},
{id:'script-injected-tags',weight:1,group:'ads-performance'},
{id:'blocking-load-events',weight:1,group:'ads-performance'},
{id:'ad-render-blocking-resources',weight:1,group:'ads-performance'},
{id:'ad-blocking-tasks',weight:1,group:'ads-performance'},
{id:'ad-request-critical-path',weight:1,group:'ads-performance'},

{id:'ads-in-viewport',weight:4,group:'ads-best-practices'},
{id:'async-ad-tags',weight:2,group:'ads-best-practices'},
{id:'loads-ad-tag-over-https',weight:1,group:'ads-best-practices'},
{id:'loads-gpt-from-sgdn',weight:1,group:'ads-best-practices'},
{id:'viewport-ad-density',weight:1,group:'ads-best-practices'},
{id:'ad-top-of-viewport',weight:2,group:'ads-best-practices'},
{id:'duplicate-tags',weight:1,group:'ads-best-practices'}]}};




},{"./messages/common-strings":132}],"url":[function(require,module,exports){





'use strict';







const Util=require('../report/html/renderer/util.js');

const allowedProtocols=[
'https:','http:','chrome:','chrome-extension:'];









function rewriteChromeInternalUrl(url){
if(!url||!url.startsWith('chrome://'))return url;


if(url.endsWith('/'))url=url.replace(/\/$/,'');
return url.replace(/^chrome:\/\/chrome\//,'chrome://');
}


class URLShim extends URL{




static isValid(url){
try{
new URL(url);
return true;
}catch(e){
return false;
}
}






static hostsMatch(urlA,urlB){
try{
return new URL(urlA).host===new URL(urlB).host;
}catch(e){
return false;
}
}






static originsMatch(urlA,urlB){
try{
return new URL(urlA).origin===new URL(urlB).origin;
}catch(e){
return false;
}
}





static getOrigin(url){
try{
const urlInfo=new URL(url);


return urlInfo.host&&urlInfo.origin||null;
}catch(e){
return null;
}
}







static rootDomainsMatch(urlA,urlB){
let urlAInfo;
let urlBInfo;
try{
urlAInfo=Util.createOrReturnURL(urlA);
urlBInfo=Util.createOrReturnURL(urlB);
}catch(err){
return false;
}

if(!urlAInfo.hostname||!urlBInfo.hostname){
return false;
}


const urlARootDomain=Util.getRootDomain(urlAInfo);
const urlBRootDomain=Util.getRootDomain(urlBInfo);

return urlARootDomain===urlBRootDomain;
}






static getURLDisplayName(url,options){
return Util.getURLDisplayName(new URL(url),options);
}






static elideDataURI(url){
try{
const parsed=new URL(url);
return parsed.protocol==='data:'?url.slice(0,100):url;
}catch(e){
return url;
}
}







static equalWithExcludedFragments(url1,url2){
[url1,url2]=[url1,url2].map(rewriteChromeInternalUrl);
try{
const urla=new URL(url1);
urla.hash='';

const urlb=new URL(url2);
urlb.hash='';

return urla.href===urlb.href;
}catch(e){
return false;
}
}






static isProtocolAllowed(url){
try{
const parsed=new URL(url);
return allowedProtocols.includes(parsed.protocol);
}catch(e){
return false;
}
}}


URLShim.URL=URL;

URLShim.NON_NETWORK_PROTOCOLS=['blob','data','intent'];

URLShim.INVALID_URL_DEBUG_STRING=
'Lighthouse was unable to determine the URL of some script executions. '+
'It\'s possible a Chrome extension or other eval\'d code is the source.';

module.exports=URLShim;

},{"../report/html/renderer/util.js":87}]},{},[1]);