This is page 19 of 24. Use http://codebase.md/cloudflare/docs/imgs/%7B%7Bg.doc('/content/pages/%7B%7Blatest.twitter.account_href%7D%7D?format=md&lines=true&page={x} to view the full context.

# Directory Structure

```
├── .editorconfig
├── .eslintrc.json
├── .firebaserc
├── .github
│   └── workflows
│       └── semgrep.yml
├── .gitignore
├── .travis.yml
├── assets
│   ├── extra
│   │   └── brand_assets.zip
│   ├── img
│   │   ├── about
│   │   │   ├── case-studies
│   │   │   │   └── bg_lines.png
│   │   │   ├── design-principles
│   │   │   │   ├── bg1.svg
│   │   │   │   ├── bg2.svg
│   │   │   │   ├── design_icon_break.svg
│   │   │   │   ├── design_icon_fast.svg
│   │   │   │   ├── design_icon_future.svg
│   │   │   │   ├── design_icon_layers.svg
│   │   │   │   ├── design_icon_priorities.svg
│   │   │   │   ├── design_icon_ux.svg
│   │   │   │   ├── design_icon_whitelist.svg
│   │   │   │   ├── lines1.svg
│   │   │   │   └── lines2.svg
│   │   │   ├── how-amp-works
│   │   │   │   ├── line_behind.svg
│   │   │   │   └── lines_front.svg
│   │   │   ├── overview
│   │   │   │   ├── bg2.svg
│   │   │   │   ├── herobg.svg
│   │   │   │   ├── herolines1.svg
│   │   │   │   ├── herolines2.svg
│   │   │   │   ├── line4.svg
│   │   │   │   ├── lines3.svg
│   │   │   │   ├── what_phone.png
│   │   │   │   ├── what_phone@1_5x.png
│   │   │   │   └── what_phone@1x.png
│   │   │   └── who-use-amp
│   │   │       ├── adtech
│   │   │       │   ├── adtech_icon_customize.svg
│   │   │       │   ├── adtech_icon_intro.svg
│   │   │       │   ├── adtech_icon_reach.svg
│   │   │       │   ├── adtech_icon_revenue.svg
│   │   │       │   ├── indexexchange_logo.png
│   │   │       │   ├── lines.svg
│   │   │       │   ├── sharethrough_logo.png
│   │   │       │   ├── teads_logo.svg
│   │   │       │   └── triplelift_logo.png
│   │   │       ├── advertisers
│   │   │       │   ├── advertiser_phone_wired.png
│   │   │       │   ├── advertiser_phone_wired@1_5x.png
│   │   │       │   ├── advertiser_phone_wired@1x.png
│   │   │       │   ├── advertisers_bg.svg
│   │   │       │   ├── advertisers_icon_audience.svg
│   │   │       │   ├── advertisers_icon_everywhere.svg
│   │   │       │   ├── advertisers_icon_intro.svg
│   │   │       │   ├── advertisers_icon_ROI.svg
│   │   │       │   └── advertisers_lines.svg
│   │   │       ├── amp-ads
│   │   │       │   ├── ads_icon.svg
│   │   │       │   ├── cloudflare_logo.png
│   │   │       │   ├── doubleclick_logo.png
│   │   │       │   ├── google_logo.png
│   │   │       │   ├── lines_bottom1.svg
│   │   │       │   ├── lines_bottom2.svg
│   │   │       │   ├── lines.svg
│   │   │       │   ├── roi_icon.svg
│   │   │       │   ├── speed_icon.svg
│   │   │       │   └── triplelift_logo.png
│   │   │       ├── card_developers.png
│   │   │       ├── card_developers.svg
│   │   │       ├── card_smb.png
│   │   │       ├── card_smb.svg
│   │   │       ├── hero_triangle.png
│   │   │       ├── publishers
│   │   │       │   ├── globo_logo.svg
│   │   │       │   ├── nyt_logo.svg
│   │   │       │   ├── publisher_icon_business.svg
│   │   │       │   ├── publisher_icon_fast.svg
│   │   │       │   ├── publisher_icon_intro.svg
│   │   │       │   ├── publisher_icon_simple.svg
│   │   │       │   ├── publisher_phone_cnn.png
│   │   │       │   ├── publisher_phone_cnn@1_5x.png
│   │   │       │   ├── publisher_phone_cnn@1x.png
│   │   │       │   ├── wapo_logo.png
│   │   │       │   └── wired_logo.png
│   │   │       ├── who_icon_adtech.svg
│   │   │       ├── who_icon_advertisers.svg
│   │   │       ├── who_icon_publishers.svg
│   │   │       ├── who_lines1.svg
│   │   │       ├── who_lines2.svg
│   │   │       ├── who_phones_hero.png
│   │   │       ├── who_phones_hero@1_5x.png
│   │   │       └── who_phones_hero@1x.png
│   │   ├── amp_favicon.png
│   │   ├── amp-conf
│   │   │   └── speakers
│   │   │       ├── alex.jpg
│   │   │       ├── ali.jpg
│   │   │       ├── ardan.jpg
│   │   │       ├── beck.jpg
│   │   │       ├── bez.jpg
│   │   │       ├── chen.jpg
│   │   │       ├── dane.jpg
│   │   │       ├── eric.jpg
│   │   │       ├── gina.jpg
│   │   │       ├── honey.jpg
│   │   │       ├── jeremy.jpg
│   │   │       ├── john.jpg
│   │   │       ├── le.jpg
│   │   │       ├── madison.jpg
│   │   │       ├── malte.jpg
│   │   │       ├── malteandrudy.jpg
│   │   │       ├── mariko.jpg
│   │   │       ├── matthew.jpg
│   │   │       ├── mike.jpg
│   │   │       ├── natalia.jpg
│   │   │       ├── nicole.jpg
│   │   │       ├── paul.jpg
│   │   │       ├── ranna.jpg
│   │   │       ├── richard.jpg
│   │   │       ├── rudy.jpg
│   │   │       ├── sam.jpg
│   │   │       ├── sarah.jpg
│   │   │       ├── sebastian.jpg
│   │   │       ├── senthil.jpg
│   │   │       ├── sriram.jpg
│   │   │       ├── vadim.jpg
│   │   │       ├── vamsee.jpg
│   │   │       ├── will.jpg
│   │   │       └── yamini.jpg
│   │   ├── arrow-blue.svg
│   │   ├── arrow.svg
│   │   ├── background.jpg
│   │   ├── blog-icon.svg
│   │   ├── brand-guidelines.pdf
│   │   ├── case-studies
│   │   │   ├── gizmodo_logo.png
│   │   │   ├── gizmodo_phone1.png
│   │   │   ├── gizmodo_phone1@1_5x.png
│   │   │   ├── gizmodo_phone1@1x.png
│   │   │   ├── gizmodo_phone2.png
│   │   │   ├── gizmodo_phone2@1_5x.png
│   │   │   ├── gizmodo_phone2@1x.png
│   │   │   ├── gizmodo_thumb.jpg
│   │   │   ├── gizmodo.pdf
│   │   │   ├── hearst_framed.png
│   │   │   ├── hearst_framed2.png
│   │   │   ├── hearst_logo.png
│   │   │   ├── hearst_thumb.jpg
│   │   │   ├── hearst.pdf
│   │   │   ├── milestone_home_framed.png
│   │   │   ├── milestone_logo.png
│   │   │   ├── milestone_search_framed.png
│   │   │   ├── milestone_thumb.jpg
│   │   │   ├── milestone.pdf
│   │   │   ├── plista_graphic.png
│   │   │   ├── plista_logo.png
│   │   │   ├── plista_thumb.jpg
│   │   │   ├── plista.pdf
│   │   │   ├── relay_media_logo.png
│   │   │   ├── relay_media_thumb.jpg
│   │   │   ├── relay_media.pdf
│   │   │   ├── relaymedia_phone1.png
│   │   │   ├── relaymedia_phone1@1_5x.png
│   │   │   ├── relaymedia_phone1@1x.png
│   │   │   ├── relaymedia_phone2.png
│   │   │   ├── relaymedia_phone2@1_5x.png
│   │   │   ├── relaymedia_phone2@1x.png
│   │   │   ├── slate_logo.png
│   │   │   ├── slate_phone1.png
│   │   │   ├── slate_phone1@1_5x.png
│   │   │   ├── slate_phone1@1x.png
│   │   │   ├── slate_phone2.png
│   │   │   ├── slate_phone2@1_5x.png
│   │   │   ├── slate_phone2@1x.png
│   │   │   ├── slate_thumb.jpg
│   │   │   ├── slate.pdf
│   │   │   ├── teads_logo.png
│   │   │   ├── teads_logo2.png
│   │   │   ├── teads_phone.png
│   │   │   ├── teads_phone@1_5x.png
│   │   │   ├── teads_phone@1x.png
│   │   │   ├── teads_thumb.jpg
│   │   │   ├── teads.pdf
│   │   │   ├── terra_framed1.png
│   │   │   ├── terra_framed2.png
│   │   │   ├── terra_logo.png
│   │   │   ├── terra_thumb.jpg
│   │   │   ├── terra.pdf
│   │   │   ├── wapo_logo.png
│   │   │   ├── wapo_thumb.png
│   │   │   ├── wapo.pdf
│   │   │   ├── washingtonpost_phone.png
│   │   │   ├── washingtonpost_phone@1_5x.png
│   │   │   ├── washingtonpost_phone@1x.png
│   │   │   ├── wired_logo.png
│   │   │   ├── wired_phone1.png
│   │   │   ├── wired_phone1@1_5x.png
│   │   │   ├── wired_phone1@1x.png
│   │   │   ├── wired_phone2.png
│   │   │   ├── wired_phone2@1_5x.png
│   │   │   ├── wired_phone2@1x.png
│   │   │   ├── wired_thumb.jpg
│   │   │   └── wired.pdf
│   │   ├── cheveron-down.svg
│   │   ├── close.svg
│   │   ├── comment.png
│   │   ├── docs
│   │   │   ├── icon_important.svg
│   │   │   ├── icon_note.svg
│   │   │   ├── icon_read.svg
│   │   │   ├── icon_tip.svg
│   │   │   ├── responsive_amp_img.png
│   │   │   ├── too_much_css.png
│   │   │   ├── validator_console_imgerror.png
│   │   │   ├── validator_errors.png
│   │   │   ├── validator_extension_imgerror.png
│   │   │   ├── validator_icon_invalid.png
│   │   │   ├── validator_icon_link.png
│   │   │   ├── validator_icon_valid.png
│   │   │   ├── validator_mandatory_error.png
│   │   │   ├── validator_web_ui.png
│   │   │   └── validator_webui_imgerror.png
│   │   ├── enforce-comment.png
│   │   ├── footer
│   │   │   ├── line-left.png
│   │   │   ├── line-right-2.png
│   │   │   └── line-right.png
│   │   ├── github.png
│   │   ├── hamburger.svg
│   │   ├── home
│   │   │   ├── bg_experience.png
│   │   │   ├── home_hero_phone.png
│   │   │   ├── home_hero_phone@1_5x.png
│   │   │   ├── home_hero_phone@1x.png
│   │   │   ├── home_icon_flexibility.svg
│   │   │   ├── home_icon_performance.svg
│   │   │   ├── home_phone_ebay.png
│   │   │   ├── home_phone_ebay@1_5x.png
│   │   │   ├── home_phone_ebay@1x.png
│   │   │   ├── lines2.svg
│   │   │   ├── lines3.svg
│   │   │   ├── shapebg.svg
│   │   │   ├── teads_logo.svg
│   │   │   ├── wapo_logo.png
│   │   │   └── wired_logo.png
│   │   ├── ic_open_in_new_black.svg
│   │   ├── ic_open_in_new_white.svg
│   │   ├── icons
│   │   │   ├── 120.png
│   │   │   ├── 144.png
│   │   │   ├── 152.png
│   │   │   ├── 168.png
│   │   │   ├── 180.png
│   │   │   ├── 192.png
│   │   │   ├── 48.png
│   │   │   ├── 512.png
│   │   │   ├── 72.png
│   │   │   ├── 96.png
│   │   │   └── any.svg
│   │   ├── latest
│   │   │   ├── events
│   │   │   │   ├── event_empty.png
│   │   │   │   ├── event_empty.svg
│   │   │   │   └── event_hero.svg
│   │   │   ├── icon_audience.png
│   │   │   ├── icon_audience.svg
│   │   │   ├── icon_calendar.png
│   │   │   ├── icon_calendar.svg
│   │   │   ├── icon_location.png
│   │   │   ├── icon_location.svg
│   │   │   ├── icon_retweet.png
│   │   │   ├── icon_retweet.svg
│   │   │   ├── icon_twitter.svg
│   │   │   ├── latest_hero.jpg
│   │   │   ├── line_hero_back.svg
│   │   │   └── line_hero_front.svg
│   │   ├── liveblog-pagination.png
│   │   ├── login-button.png
│   │   ├── logo-blue.svg
│   │   ├── logout-button.png
│   │   ├── malte.jpg
│   │   ├── motions
│   │   │   └── amp-lines-motions.png
│   │   ├── nav
│   │   │   ├── back_arrow.png
│   │   │   ├── back_arrow.svg
│   │   │   ├── close.png
│   │   │   ├── close.svg
│   │   │   ├── next_level.png
│   │   │   └── next_level.svg
│   │   ├── partners
│   │   │   ├── adobe_analytics.png
│   │   │   ├── chartbeat.png
│   │   │   ├── comscore.png
│   │   │   ├── ggl_bw.png
│   │   │   ├── ggl.png
│   │   │   ├── li.png
│   │   │   ├── nuzzel.png
│   │   │   ├── parsely.png
│   │   │   ├── pinterest.png
│   │   │   ├── tw.png
│   │   │   └── wp.png
│   │   ├── platforms
│   │   │   ├── chrome.png
│   │   │   ├── criteo.png
│   │   │   ├── edge.png
│   │   │   ├── firefox.png
│   │   │   ├── google.png
│   │   │   ├── inmobi.png
│   │   │   ├── kargo.png
│   │   │   ├── mediavine.png
│   │   │   ├── opera.png
│   │   │   ├── plista.png
│   │   │   ├── safari.png
│   │   │   └── yahoo.png
│   │   ├── publishers
│   │   │   ├── abril.png
│   │   │   ├── asahi.png
│   │   │   ├── atlantic_media.png
│   │   │   ├── bbc_news.png
│   │   │   ├── buzzfeed.png
│   │   │   ├── condenast.png
│   │   │   ├── daily_mail.png
│   │   │   ├── economist.png
│   │   │   ├── editora_globo.png
│   │   │   ├── el_pais.png
│   │   │   ├── fairfax_media.png
│   │   │   ├── folha_de_s.paulo.png
│   │   │   ├── franzfurter_allgemeine.png
│   │   │   ├── ft.png
│   │   │   ├── gannett.png
│   │   │   ├── guardian.png
│   │   │   ├── hearst.png
│   │   │   ├── huffington_post.png
│   │   │   ├── la_stampa.png
│   │   │   ├── les_echos.png
│   │   │   ├── mainichi.png
│   │   │   ├── mashable.png
│   │   │   ├── mcclatchy.png
│   │   │   ├── new_york_times.png
│   │   │   ├── newscorp_australia.png
│   │   │   ├── nine_msn.png
│   │   │   ├── nrc.png
│   │   │   ├── ny_daily_news.png
│   │   │   ├── nypost.png
│   │   │   ├── pearson.png
│   │   │   ├── sankei.png
│   │   │   ├── telegraph.png
│   │   │   ├── time.png
│   │   │   ├── uol.png
│   │   │   ├── us_news.png
│   │   │   ├── vox_media.png
│   │   │   ├── wallstreetjournal.png
│   │   │   ├── washington_post.png
│   │   │   └── zeit_online.png
│   │   ├── quotes
│   │   │   ├── chartbeat.jpg
│   │   │   ├── ebay.jpg
│   │   │   ├── faz.jpg
│   │   │   ├── folha.jpg
│   │   │   ├── google.jpg
│   │   │   ├── guardian.jpg
│   │   │   ├── hearst.jpg
│   │   │   ├── lastampa.jpg
│   │   │   ├── newyorktimes.jpeg
│   │   │   ├── twitter.jpg
│   │   │   └── vox.jpg
│   │   ├── return-parameter.png
│   │   ├── sprite.svg
│   │   ├── symbols
│   │   │   ├── carat-down.svg
│   │   │   ├── carat.svg
│   │   │   ├── caret-right.svg
│   │   │   ├── close.svg
│   │   │   ├── lang-icon.svg
│   │   │   ├── logo-blue-standalone.svg
│   │   │   ├── return.svg
│   │   │   ├── search.svg
│   │   │   ├── share-close.svg
│   │   │   ├── share.svg
│   │   │   ├── template.scss
│   │   │   ├── twitter.svg
│   │   │   ├── video-play.svg
│   │   │   └── wordpress.svg
│   │   └── twitter.png
│   ├── manifest.json
│   ├── sass
│   │   ├── _accordions.scss
│   │   ├── _animated_lines.scss
│   │   ├── _animations.scss
│   │   ├── _bg-triangle.scss
│   │   ├── _callouts.scss
│   │   ├── _cards.scss
│   │   ├── _carousel.scss
│   │   ├── _config.scss
│   │   ├── _content-post.scss
│   │   ├── _content-section.scss
│   │   ├── _content.scss
│   │   ├── _doc-nav.scss
│   │   ├── _footer.scss
│   │   ├── _global.scss
│   │   ├── _grid.scss
│   │   ├── _header.scss
│   │   ├── _inline-toc.scss
│   │   ├── _lang_switcher.scss
│   │   ├── _large-cta.scss
│   │   ├── _lightbox.scss
│   │   ├── _mixins.scss
│   │   ├── _nav.scss
│   │   ├── _points.scss
│   │   ├── _post-item.scss
│   │   ├── _responsive.scss
│   │   ├── _search.scss
│   │   ├── _share.scss
│   │   ├── _sidebar.scss
│   │   ├── _sprite_generated.scss
│   │   ├── _sprite.scss
│   │   ├── _syntax_highlighting.scss
│   │   ├── _tables.scss
│   │   ├── _toc.scss
│   │   ├── about-how.min.scss
│   │   ├── about-overview.min.scss
│   │   ├── about-who-vertical.min.scss
│   │   ├── about-who.min.scss
│   │   ├── blog.min.scss
│   │   ├── case-study.min.scss
│   │   ├── design-principles.min.scss
│   │   ├── docs.min.scss
│   │   ├── home.min.scss
│   │   ├── list.min.scss
│   │   ├── main.min.scss
│   │   ├── pages
│   │   │   ├── _about-how.scss
│   │   │   ├── _about-overview.scss
│   │   │   ├── _about-who-vertical.scss
│   │   │   ├── _about-who.scss
│   │   │   ├── _case-study.scss
│   │   │   ├── _design-principles.scss
│   │   │   ├── _events.scss
│   │   │   ├── _faqs.scss
│   │   │   ├── _home.scss
│   │   │   ├── _latest.scss
│   │   │   ├── _list.scss
│   │   │   ├── _post-detail.scss
│   │   │   ├── _roadmap.scss
│   │   │   ├── _who.scss
│   │   │   └── amp-conf.scss
│   │   └── section.min.scss
│   └── video
│       ├── amp-phone.mp4
│       └── amp-phone.webm
├── content
│   ├── contribute
│   │   └── governance.md
│   ├── docs
│   │   ├── _blueprint.yaml
│   │   ├── blank.html
│   │   ├── build.md
│   │   ├── contribute
│   │   │   ├── _blueprint.yaml
│   │   │   ├── contribute.md
│   │   │   ├── contribute@ar.md
│   │   │   ├── contribute@de.md
│   │   │   ├── contribute@es.md
│   │   │   ├── contribute@fr.md
│   │   │   ├── file-a-bug.md
│   │   │   └── github.md
│   │   ├── contribute.md
│   │   ├── get_started
│   │   │   ├── _blueprint.yaml
│   │   │   ├── create
│   │   │   │   ├── _blueprint.yaml
│   │   │   │   ├── basic_markup.md
│   │   │   │   ├── basic_markup@ar.md
│   │   │   │   ├── basic_markup@de.md
│   │   │   │   ├── basic_markup@es.md
│   │   │   │   ├── basic_markup@fr.md
│   │   │   │   ├── basic_markup@id.md
│   │   │   │   ├── basic_markup@it.md
│   │   │   │   ├── basic_markup@ja.md
│   │   │   │   ├── basic_markup@ko.md
│   │   │   │   ├── basic_markup@pl.md
│   │   │   │   ├── basic_markup@pt_BR.md
│   │   │   │   ├── basic_markup@ru.md
│   │   │   │   ├── basic_markup@th.md
│   │   │   │   ├── basic_markup@tr.md
│   │   │   │   ├── basic_markup@zh_CN.md
│   │   │   │   ├── include_image.md
│   │   │   │   ├── include_image@ar.md
│   │   │   │   ├── include_image@de.md
│   │   │   │   ├── include_image@es.md
│   │   │   │   ├── include_image@fr.md
│   │   │   │   ├── include_image@id.md
│   │   │   │   ├── include_image@it.md
│   │   │   │   ├── include_image@ja.md
│   │   │   │   ├── include_image@ko.md
│   │   │   │   ├── include_image@pl.md
│   │   │   │   ├── include_image@pt_BR.md
│   │   │   │   ├── include_image@ru.md
│   │   │   │   ├── include_image@th.md
│   │   │   │   ├── include_image@tr.md
│   │   │   │   ├── include_image@zh_CN.md
│   │   │   │   ├── prepare_for_discovery.md
│   │   │   │   ├── prepare_for_discovery@ar.md
│   │   │   │   ├── prepare_for_discovery@de.md
│   │   │   │   ├── prepare_for_discovery@es.md
│   │   │   │   ├── prepare_for_discovery@fr.md
│   │   │   │   ├── prepare_for_discovery@id.md
│   │   │   │   ├── prepare_for_discovery@it.md
│   │   │   │   ├── prepare_for_discovery@ja.md
│   │   │   │   ├── prepare_for_discovery@ko.md
│   │   │   │   ├── prepare_for_discovery@pl.md
│   │   │   │   ├── prepare_for_discovery@pt_BR.md
│   │   │   │   ├── prepare_for_discovery@ru.md
│   │   │   │   ├── prepare_for_discovery@th.md
│   │   │   │   ├── prepare_for_discovery@tr.md
│   │   │   │   ├── prepare_for_discovery@zh_CN.md
│   │   │   │   ├── presentation_layout.md
│   │   │   │   ├── presentation_layout@ar.md
│   │   │   │   ├── presentation_layout@de.md
│   │   │   │   ├── presentation_layout@es.md
│   │   │   │   ├── presentation_layout@fr.md
│   │   │   │   ├── presentation_layout@id.md
│   │   │   │   ├── presentation_layout@it.md
│   │   │   │   ├── presentation_layout@ja.md
│   │   │   │   ├── presentation_layout@ko.md
│   │   │   │   ├── presentation_layout@pl.md
│   │   │   │   ├── presentation_layout@pt_BR.md
│   │   │   │   ├── presentation_layout@ru.md
│   │   │   │   ├── presentation_layout@th.md
│   │   │   │   ├── presentation_layout@tr.md
│   │   │   │   ├── presentation_layout@zh_CN.md
│   │   │   │   ├── preview_and_validate.md
│   │   │   │   ├── preview_and_validate@ar.md
│   │   │   │   ├── preview_and_validate@de.md
│   │   │   │   ├── preview_and_validate@es.md
│   │   │   │   ├── preview_and_validate@fr.md
│   │   │   │   ├── preview_and_validate@id.md
│   │   │   │   ├── preview_and_validate@it.md
│   │   │   │   ├── preview_and_validate@ja.md
│   │   │   │   ├── preview_and_validate@ko.md
│   │   │   │   ├── preview_and_validate@pl.md
│   │   │   │   ├── preview_and_validate@pt_BR.md
│   │   │   │   ├── preview_and_validate@ru.md
│   │   │   │   ├── preview_and_validate@th.md
│   │   │   │   ├── preview_and_validate@tr.md
│   │   │   │   ├── preview_and_validate@zh_CN.md
│   │   │   │   ├── publish.md
│   │   │   │   ├── publish@ar.md
│   │   │   │   ├── publish@de.md
│   │   │   │   ├── publish@es.md
│   │   │   │   ├── publish@fr.md
│   │   │   │   ├── publish@id.md
│   │   │   │   ├── publish@it.md
│   │   │   │   ├── publish@ja.md
│   │   │   │   ├── publish@ko.md
│   │   │   │   ├── publish@pl.md
│   │   │   │   ├── publish@pt_BR.md
│   │   │   │   ├── publish@ru.md
│   │   │   │   ├── publish@th.md
│   │   │   │   ├── publish@tr.md
│   │   │   │   └── publish@zh_CN.md
│   │   │   ├── create.md
│   │   │   ├── create@ar.md
│   │   │   ├── create@de.md
│   │   │   ├── create@es.md
│   │   │   ├── create@fr.md
│   │   │   ├── create@id.md
│   │   │   ├── create@it.md
│   │   │   ├── create@ja.md
│   │   │   ├── create@ko.md
│   │   │   ├── create@pl.md
│   │   │   ├── create@pt_BR.md
│   │   │   ├── create@ru.md
│   │   │   ├── create@th.md
│   │   │   ├── create@tr.md
│   │   │   ├── create@zh_CN.md
│   │   │   ├── live_blog.md
│   │   │   ├── live_blog@ko.md
│   │   │   ├── login_requiring
│   │   │   │   ├── _blueprint.yaml
│   │   │   │   ├── add_comment.md
│   │   │   │   ├── add_comment@ko.md
│   │   │   │   ├── login.md
│   │   │   │   ├── login@ko.md
│   │   │   │   ├── logout.md
│   │   │   │   ├── logout@ko.md
│   │   │   │   ├── summary.md
│   │   │   │   └── summary@ko.md
│   │   │   ├── login_requiring.md
│   │   │   └── login_requiring@ko.md
│   │   ├── getting-started.md
│   │   ├── guides
│   │   │   ├── _blueprint.yaml
│   │   │   ├── author_develop
│   │   │   │   ├── _blueprint.yaml
│   │   │   │   ├── ads_on_amp
│   │   │   │   │   ├── _blueprint.yaml
│   │   │   │   │   ├── ads_getting_started.md
│   │   │   │   │   ├── ads_getting_started@ko.md
│   │   │   │   │   ├── ads_tips.md
│   │   │   │   │   └── ads_tips@ko.md
│   │   │   │   ├── ads_on_amp.md
│   │   │   │   ├── ads_on_amp@ko.md
│   │   │   │   ├── amp_replacements.md
│   │   │   │   ├── amp_replacements@ko.md
│   │   │   │   ├── iframes.md
│   │   │   │   ├── iframes@ko.md
│   │   │   │   ├── responsive_amp
│   │   │   │   │   ├── _blueprint.yaml
│   │   │   │   │   ├── art_direction.md
│   │   │   │   │   ├── art_direction@ko.md
│   │   │   │   │   ├── control_layout.md
│   │   │   │   │   ├── control_layout@ar.md
│   │   │   │   │   ├── control_layout@de.md
│   │   │   │   │   ├── control_layout@es.md
│   │   │   │   │   ├── control_layout@fr.md
│   │   │   │   │   ├── control_layout@id.md
│   │   │   │   │   ├── control_layout@it.md
│   │   │   │   │   ├── control_layout@ja.md
│   │   │   │   │   ├── control_layout@ko.md
│   │   │   │   │   ├── control_layout@pl.md
│   │   │   │   │   ├── control_layout@pt_BR.md
│   │   │   │   │   ├── control_layout@ru.md
│   │   │   │   │   ├── control_layout@th.md
│   │   │   │   │   ├── control_layout@tr.md
│   │   │   │   │   ├── control_layout@zh_CN.md
│   │   │   │   │   ├── custom_fonts.md
│   │   │   │   │   ├── custom_fonts@ko.md
│   │   │   │   │   ├── placeholders.md
│   │   │   │   │   ├── placeholders@ko.md
│   │   │   │   │   ├── style_pages.md
│   │   │   │   │   ├── style_pages@ar.md
│   │   │   │   │   ├── style_pages@de.md
│   │   │   │   │   ├── style_pages@es.md
│   │   │   │   │   ├── style_pages@fr.md
│   │   │   │   │   ├── style_pages@id.md
│   │   │   │   │   ├── style_pages@it.md
│   │   │   │   │   ├── style_pages@ja.md
│   │   │   │   │   ├── style_pages@ko.md
│   │   │   │   │   ├── style_pages@pl.md
│   │   │   │   │   ├── style_pages@pt_BR.md
│   │   │   │   │   ├── style_pages@ru.md
│   │   │   │   │   ├── style_pages@th.md
│   │   │   │   │   ├── style_pages@tr.md
│   │   │   │   │   └── style_pages@zh_CN.md
│   │   │   │   ├── responsive_amp.md
│   │   │   │   ├── responsive_amp@ar.md
│   │   │   │   ├── responsive_amp@de.md
│   │   │   │   ├── responsive_amp@es.md
│   │   │   │   ├── responsive_amp@fr.md
│   │   │   │   ├── responsive_amp@id.md
│   │   │   │   ├── responsive_amp@it.md
│   │   │   │   ├── responsive_amp@ja.md
│   │   │   │   ├── responsive_amp@ko.md
│   │   │   │   ├── responsive_amp@pl.md
│   │   │   │   ├── responsive_amp@pt_BR.md
│   │   │   │   ├── responsive_amp@ru.md
│   │   │   │   ├── responsive_amp@th.md
│   │   │   │   ├── responsive_amp@tr.md
│   │   │   │   ├── responsive_amp@zh_CN.md
│   │   │   │   ├── third_party_components.md
│   │   │   │   ├── third_party_components@ar.md
│   │   │   │   ├── third_party_components@de.md
│   │   │   │   ├── third_party_components@es.md
│   │   │   │   ├── third_party_components@fr.md
│   │   │   │   ├── third_party_components@id.md
│   │   │   │   ├── third_party_components@it.md
│   │   │   │   ├── third_party_components@ja.md
│   │   │   │   ├── third_party_components@ko.md
│   │   │   │   ├── third_party_components@pl.md
│   │   │   │   ├── third_party_components@pt_BR.md
│   │   │   │   ├── third_party_components@ru.md
│   │   │   │   ├── third_party_components@th.md
│   │   │   │   ├── third_party_components@tr.md
│   │   │   │   └── third_party_components@zh_CN.md
│   │   │   ├── author_develop.md
│   │   │   ├── debug
│   │   │   │   ├── _blueprint.yaml
│   │   │   │   ├── validate.md
│   │   │   │   ├── validate@ar.md
│   │   │   │   ├── validate@de.md
│   │   │   │   ├── validate@es.md
│   │   │   │   ├── validate@fr.md
│   │   │   │   ├── validate@id.md
│   │   │   │   ├── validate@it.md
│   │   │   │   ├── validate@ja.md
│   │   │   │   ├── validate@ko.md
│   │   │   │   ├── validate@pl.md
│   │   │   │   ├── validate@pt_BR.md
│   │   │   │   ├── validate@ru.md
│   │   │   │   ├── validate@th.md
│   │   │   │   ├── validate@tr.md
│   │   │   │   └── validate@zh_CN.md
│   │   │   ├── debug.md
│   │   │   ├── deploy
│   │   │   │   ├── _blueprint.yaml
│   │   │   │   ├── analytics_amp
│   │   │   │   │   ├── _blueprint.yaml
│   │   │   │   │   ├── analytics_basics.md
│   │   │   │   │   ├── analytics_basics@ar.md
│   │   │   │   │   ├── analytics_basics@de.md
│   │   │   │   │   ├── analytics_basics@es.md
│   │   │   │   │   ├── analytics_basics@fr.md
│   │   │   │   │   ├── analytics_basics@id.md
│   │   │   │   │   ├── analytics_basics@it.md
│   │   │   │   │   ├── analytics_basics@ja.md
│   │   │   │   │   ├── analytics_basics@ko.md
│   │   │   │   │   ├── analytics_basics@pl.md
│   │   │   │   │   ├── analytics_basics@pt_BR.md
│   │   │   │   │   ├── analytics_basics@ru.md
│   │   │   │   │   ├── analytics_basics@th.md
│   │   │   │   │   ├── analytics_basics@tr.md
│   │   │   │   │   ├── analytics_basics@zh_CN.md
│   │   │   │   │   ├── deep_dive_analytics.md
│   │   │   │   │   ├── deep_dive_analytics@ar.md
│   │   │   │   │   ├── deep_dive_analytics@de.md
│   │   │   │   │   ├── deep_dive_analytics@es.md
│   │   │   │   │   ├── deep_dive_analytics@fr.md
│   │   │   │   │   ├── deep_dive_analytics@id.md
│   │   │   │   │   ├── deep_dive_analytics@it.md
│   │   │   │   │   ├── deep_dive_analytics@ja.md
│   │   │   │   │   ├── deep_dive_analytics@ko.md
│   │   │   │   │   ├── deep_dive_analytics@pl.md
│   │   │   │   │   ├── deep_dive_analytics@pt_BR.md
│   │   │   │   │   ├── deep_dive_analytics@ru.md
│   │   │   │   │   ├── deep_dive_analytics@th.md
│   │   │   │   │   ├── deep_dive_analytics@tr.md
│   │   │   │   │   ├── deep_dive_analytics@zh_CN.md
│   │   │   │   │   ├── use_cases.md
│   │   │   │   │   ├── use_cases@ar.md
│   │   │   │   │   ├── use_cases@de.md
│   │   │   │   │   ├── use_cases@es.md
│   │   │   │   │   ├── use_cases@fr.md
│   │   │   │   │   ├── use_cases@id.md
│   │   │   │   │   ├── use_cases@it.md
│   │   │   │   │   ├── use_cases@ja.md
│   │   │   │   │   ├── use_cases@ko.md
│   │   │   │   │   ├── use_cases@pl.md
│   │   │   │   │   ├── use_cases@pt_BR.md
│   │   │   │   │   ├── use_cases@ru.md
│   │   │   │   │   ├── use_cases@th.md
│   │   │   │   │   ├── use_cases@tr.md
│   │   │   │   │   └── use_cases@zh_CN.md
│   │   │   │   ├── analytics_amp.md
│   │   │   │   ├── analytics_amp@ar.md
│   │   │   │   ├── analytics_amp@de.md
│   │   │   │   ├── analytics_amp@es.md
│   │   │   │   ├── analytics_amp@fr.md
│   │   │   │   ├── analytics_amp@id.md
│   │   │   │   ├── analytics_amp@it.md
│   │   │   │   ├── analytics_amp@ja.md
│   │   │   │   ├── analytics_amp@ko.md
│   │   │   │   ├── analytics_amp@pl.md
│   │   │   │   ├── analytics_amp@pt_BR.md
│   │   │   │   ├── analytics_amp@ru.md
│   │   │   │   ├── analytics_amp@th.md
│   │   │   │   ├── analytics_amp@tr.md
│   │   │   │   ├── analytics_amp@zh_CN.md
│   │   │   │   ├── discovery.md
│   │   │   │   ├── discovery@ar.md
│   │   │   │   ├── discovery@de.md
│   │   │   │   ├── discovery@es.md
│   │   │   │   ├── discovery@fr.md
│   │   │   │   ├── discovery@id.md
│   │   │   │   ├── discovery@it.md
│   │   │   │   ├── discovery@ja.md
│   │   │   │   ├── discovery@ko.md
│   │   │   │   ├── discovery@pl.md
│   │   │   │   ├── discovery@pt_BR.md
│   │   │   │   ├── discovery@ru.md
│   │   │   │   ├── discovery@th.md
│   │   │   │   ├── discovery@tr.md
│   │   │   │   ├── discovery@zh_CN.md
│   │   │   │   ├── engagement.md
│   │   │   │   └── engagement@ko.md
│   │   │   ├── deploy.md
│   │   │   └── embed
│   │   │       ├── _blueprint.yaml
│   │   │       └── login-paywalls.md
│   │   ├── guides.md
│   │   ├── reference
│   │   │   ├── _blueprint.yaml
│   │   │   ├── common_attributes.md
│   │   │   ├── components
│   │   │   │   ├── _blueprint.yaml
│   │   │   │   ├── ads-analytics
│   │   │   │   │   └── _blueprint.yaml
│   │   │   │   ├── dynamic-content
│   │   │   │   │   └── _blueprint.yaml
│   │   │   │   ├── layout
│   │   │   │   │   └── _blueprint.yaml
│   │   │   │   ├── media
│   │   │   │   │   └── _blueprint.yaml
│   │   │   │   ├── presentation
│   │   │   │   │   └── _blueprint.yaml
│   │   │   │   └── social
│   │   │   │       └── _blueprint.yaml
│   │   │   ├── components.md
│   │   │   ├── experimental.md
│   │   │   ├── experimental@ar.md
│   │   │   ├── experimental@de.md
│   │   │   ├── experimental@es.md
│   │   │   ├── experimental@fr.md
│   │   │   ├── experimental@id.md
│   │   │   ├── experimental@it.md
│   │   │   ├── experimental@ja.md
│   │   │   ├── experimental@pl.md
│   │   │   ├── experimental@pt_BR.md
│   │   │   ├── experimental@ru.md
│   │   │   ├── experimental@th.md
│   │   │   ├── experimental@tr.md
│   │   │   ├── experimental@zh_CN.md
│   │   │   ├── validation_errors.md
│   │   │   ├── validation_errors@ar.md
│   │   │   ├── validation_errors@de.md
│   │   │   ├── validation_errors@es.md
│   │   │   ├── validation_errors@fr.md
│   │   │   ├── validation_errors@id.md
│   │   │   ├── validation_errors@it.md
│   │   │   ├── validation_errors@ja.md
│   │   │   ├── validation_errors@pl.md
│   │   │   ├── validation_errors@pt_BR.md
│   │   │   ├── validation_errors@ru.md
│   │   │   ├── validation_errors@th.md
│   │   │   ├── validation_errors@tr.md
│   │   │   └── validation_errors@zh_CN.md
│   │   ├── reference.md
│   │   └── tutorials.md
│   ├── includes
│   │   ├── _blueprint.yaml
│   │   ├── amp-conf-2017.yaml
│   │   ├── amp-iframe.md
│   │   ├── blog_feed.yaml
│   │   ├── doc.yaml
│   │   ├── events.yaml
│   │   ├── home.yaml
│   │   ├── html-example.md
│   │   ├── latest.yaml
│   │   ├── list-blog.yaml
│   │   ├── lists.yaml
│   │   ├── menu.yaml
│   │   ├── roadmap.yaml
│   │   └── tweets.yaml
│   ├── latest
│   │   ├── _blueprint.yaml
│   │   ├── blog
│   │   │   ├── _blueprint.yaml
│   │   │   ├── 1056.md
│   │   │   ├── ads-on-the-web-will-get-better-with-amp-heres-how.md
│   │   │   ├── amp-roadmap-update-for-mid-q1-2017.md
│   │   │   ├── amp-up-for-amp-conf-2017.md
│   │   │   ├── grow-your-business-with-ads-on-amp.md
│   │   │   ├── new-default-placeholders-for-ads-in-amp.md
│   │   │   ├── new-industry-benchmarks-for-mobile-page-speed.md
│   │   │   ├── speeding-up-news-apps-with-amp.md
│   │   │   ├── whats-in-an-amp-url.md
│   │   │   └── why-amp-caches-exist.md
│   │   ├── latest.html
│   │   ├── list-blog.html
│   │   ├── list-event.html
│   │   ├── list-past-event.html
│   │   └── roadmap.html
│   ├── learn
│   │   ├── _blueprint.yaml
│   │   ├── about-amp.md
│   │   ├── about-amp@ar.md
│   │   ├── about-amp@de.md
│   │   ├── about-amp@es.md
│   │   ├── about-amp@fr.md
│   │   ├── about-amp@id.md
│   │   ├── about-amp@it.md
│   │   ├── about-amp@ja.md
│   │   ├── about-amp@ko.md
│   │   ├── about-amp@pl.md
│   │   ├── about-amp@pt_BR.md
│   │   ├── about-amp@ru.md
│   │   ├── about-amp@th.md
│   │   ├── about-amp@tr.md
│   │   ├── about-amp@zh_CN.md
│   │   ├── about-how.yaml
│   │   ├── about-how@ar.yaml
│   │   ├── about-how@es.yaml
│   │   ├── about-how@fr.yaml
│   │   ├── about-how@id.yaml
│   │   ├── about-how@it.yaml
│   │   ├── about-how@ja.yaml
│   │   ├── about-how@ko.yaml
│   │   ├── about-how@pl.yaml
│   │   ├── about-how@pt_BR.yaml
│   │   ├── about-how@ru.yaml
│   │   ├── about-how@th.yaml
│   │   ├── about-how@tr.yaml
│   │   ├── about-how@zh_CN.yaml
│   │   ├── amp-design-principles.yaml
│   │   ├── browsers.md
│   │   ├── case-studies
│   │   │   ├── _blueprint.yaml
│   │   │   ├── category
│   │   │   │   ├── _blueprint.yaml
│   │   │   │   ├── advertisers.md
│   │   │   │   └── publishers.md
│   │   │   ├── gizmodo.md
│   │   │   ├── hearst.md
│   │   │   ├── milestone.md
│   │   │   ├── plista.md
│   │   │   ├── relay_media.md
│   │   │   ├── slate.md
│   │   │   ├── teads.md
│   │   │   ├── terra.md
│   │   │   ├── washingtonpost.md
│   │   │   └── wired.md
│   │   ├── case-studies.html
│   │   ├── how-amp-works.md
│   │   ├── how-amp-works@ar.md
│   │   ├── how-amp-works@es.md
│   │   ├── how-amp-works@fr.md
│   │   ├── how-amp-works@id.md
│   │   ├── how-amp-works@it.md
│   │   ├── how-amp-works@ja.md
│   │   ├── how-amp-works@ko.md
│   │   ├── how-amp-works@pl.md
│   │   ├── how-amp-works@pt_BR.md
│   │   ├── how-amp-works@ru.md
│   │   ├── how-amp-works@th.md
│   │   ├── how-amp-works@tr.md
│   │   ├── how-amp-works@zh_CN.md
│   │   ├── metrics.html
│   │   ├── overview.yaml
│   │   ├── overview@ar.yaml
│   │   ├── overview@de.yaml
│   │   ├── overview@es.yaml
│   │   ├── overview@fr.yaml
│   │   ├── overview@id.yaml
│   │   ├── overview@it.yaml
│   │   ├── overview@ja.yaml
│   │   ├── overview@ko.yaml
│   │   ├── overview@pl.yaml
│   │   ├── overview@pt_BR.yaml
│   │   ├── overview@ru.yaml
│   │   ├── overview@th.yaml
│   │   ├── overview@tr.yaml
│   │   ├── overview@zh_CN.yaml
│   │   ├── who
│   │   │   ├── _blueprint.yaml
│   │   │   ├── ad-tech-platforms.yaml
│   │   │   ├── advertisers.yaml
│   │   │   ├── amp-ads.yaml
│   │   │   └── publishers.yaml
│   │   └── who-uses-amp.yaml
│   ├── pages
│   │   ├── _blueprint.yaml
│   │   ├── amp-conf-2017
│   │   │   ├── _blueprint.yaml
│   │   │   ├── accessibility.html
│   │   │   └── code-of-conduct.html
│   │   ├── amp-conf-2017.html
│   │   ├── home.html
│   │   ├── how-it-works.html
│   │   └── metrics_chart.html
│   └── support
│       ├── _blueprint.yaml
│       ├── developer
│       │   ├── _blueprint.yaml
│       │   ├── documentation-bug.md
│       │   ├── mailing-list.md
│       │   ├── platform-bug.md
│       │   ├── slack.md
│       │   └── stack-overflow.md
│       ├── developer.md
│       ├── faqs
│       │   ├── _blueprint.yaml
│       │   ├── overview.md
│       │   ├── overview@ar.md
│       │   ├── overview@de.md
│       │   ├── overview@es.md
│       │   ├── overview@fr.md
│       │   ├── overview@id.md
│       │   ├── overview@it.md
│       │   ├── overview@ja.md
│       │   ├── overview@pl.md
│       │   ├── overview@pt_BR.md
│       │   ├── overview@ru.md
│       │   ├── overview@th.md
│       │   ├── overview@tr.md
│       │   ├── overview@zh_CN.md
│       │   ├── platform-involvement.md
│       │   ├── platform-involvement@ar.md
│       │   ├── platform-involvement@de.md
│       │   ├── platform-involvement@es.md
│       │   ├── platform-involvement@fr.md
│       │   ├── platform-involvement@id.md
│       │   ├── platform-involvement@it.md
│       │   ├── platform-involvement@ja.md
│       │   ├── platform-involvement@pl.md
│       │   ├── platform-involvement@pt_BR.md
│       │   ├── platform-involvement@ru.md
│       │   ├── platform-involvement@th.md
│       │   ├── platform-involvement@tr.md
│       │   ├── platform-involvement@zh_CN.md
│       │   ├── publisher-monetization.md
│       │   ├── publisher-monetization@ar.md
│       │   ├── publisher-monetization@de.md
│       │   ├── publisher-monetization@es.md
│       │   ├── publisher-monetization@fr.md
│       │   ├── publisher-monetization@id.md
│       │   ├── publisher-monetization@it.md
│       │   ├── publisher-monetization@ja.md
│       │   ├── publisher-monetization@pl.md
│       │   ├── publisher-monetization@pt_BR.md
│       │   ├── publisher-monetization@ru.md
│       │   ├── publisher-monetization@th.md
│       │   ├── publisher-monetization@tr.md
│       │   ├── publisher-monetization@zh_CN.md
│       │   └── supported-platforms.md
│       ├── faqs.md
│       ├── platform.md
│       ├── support.md
│       ├── vendor
│       │   ├── _blueprint.yaml
│       │   └── amp-certification.md
│       └── vendor.md
├── CONTRIBUTING.md
├── firebase.json
├── gulpfile.js
├── LICENSE
├── npm-shrinkwrap.json
├── package.json
├── podspec.yaml
├── pwa
│   ├── google7199ce9da1ad191b.html
│   ├── pwa.html
│   ├── pwa.js
│   └── service-worker.js
├── README.md
├── scripts
│   ├── component_categories.json
│   ├── import_docs.js
│   ├── import_docs.json
│   ├── update_blog_links.js
│   ├── update_platforms_page.js
│   └── update_tweets.js
├── translations
│   ├── ar
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── de
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── es
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── fr
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── id
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── it
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── ja
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── ko
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── messages.pot
│   ├── pl
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── pt_BR
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── ru
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── th
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   ├── tr
│   │   └── LC_MESSAGES
│   │       └── messages.po
│   └── zh_CN
│       └── LC_MESSAGES
│           └── messages.po
└── views
    ├── about-casestudies.html
    ├── about-how.html
    ├── about-overview.html
    ├── about-who-vertical.html
    ├── about-who.html
    ├── base.html
    ├── blank.html
    ├── blog_detail.html
    ├── case-study.html
    ├── design-principles.html
    ├── doc.html
    ├── grid_page.html
    ├── list_page.html
    ├── partials
    │   ├── breadcrumb-nav.html
    │   ├── doc_nav.html
    │   ├── faq-accordion.html
    │   ├── footer-cta.html
    │   ├── footer.html
    │   ├── grid-card.html
    │   ├── head.html
    │   ├── header.html
    │   ├── lang_switcher.html
    │   ├── large-cta.html
    │   ├── lines.html
    │   ├── nav.html
    │   ├── points.html
    │   ├── post-item.html
    │   ├── promo_banner.html
    │   ├── search.html
    │   ├── share.html
    │   ├── sidebar.html
    │   └── sub_nav.html
    └── section_page.html
```

# Files

--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------

```json
  1 | {
  2 |   "hosting": {
  3 |     "public": "build",
  4 |     "cleanUrls": true,
  5 |     "headers": [
  6 |       {
  7 |         "source": "**/*.@(jpg|jpeg|gif|png|svg|mp4)",
  8 |         "headers": [
  9 |           {
 10 |             "key": "Cache-Control",
 11 |             "value": "max-age=604800"
 12 |           }
 13 |         ]
 14 |       },
 15 |       {
 16 |         "source": "service-worker.js",
 17 |         "headers": [
 18 |           {
 19 |             "key": "Cache-Control",
 20 |             "value": "no-cache"
 21 |           }
 22 |         ]
 23 |       },
 24 |       {
 25 |         "source": "/amp-conf-2017/",
 26 |         "headers": [
 27 |           {
 28 |             "key": "Cache-Control",
 29 |             "value": "no-cache"
 30 |           }
 31 |         ]
 32 |       },
 33 |       {
 34 |         "source": "/amp-conf-2017-pwa/",
 35 |         "headers": [
 36 |           {
 37 |             "key": "Cache-Control",
 38 |             "value": "no-cache"
 39 |           }
 40 |         ]
 41 |       }
 42 |     ],
 43 |     "redirects": [
 44 |       {
 45 |         "source": "/who",
 46 |         "destination": "/learn/who/",
 47 |         "type": 301
 48 |       },
 49 |       {
 50 |         "source": "/who/",
 51 |         "destination": "/learn/who/",
 52 |         "type": 301
 53 |       },
 54 |       {
 55 |         "source": "/docs/get_started/technical_overview.html",
 56 |         "destination": "/learn/how-amp-works/",
 57 |         "type": 301
 58 |       },
 59 |       {
 60 |         "source": "/docs/get_started/about-amp.html",
 61 |         "destination": "/learn/overview/",
 62 |         "type": 301
 63 |       },
 64 |       {
 65 |         "source": "/docs/guides/responsive_amp?(.html)",
 66 |         "destination": "/docs/guides/author-develop/responsive_amp",
 67 |         "type": 301
 68 |       },
 69 |       {
 70 |         "source": "/docs/guides/responsive/style_pages?(.html)",
 71 |         "destination": "/docs/guides/author-develop/responsive/style_pages.html",
 72 |         "type": 301
 73 |       },
 74 |       {
 75 |         "source": "/docs/guides/responsive/control_layout?(.html)",
 76 |         "destination": "/docs/guides/author-develop/responsive/control_layout.html",
 77 |         "type": 301
 78 |       },
 79 |       {
 80 |         "source": "/docs/guides/responsive/placeholders?(.html)",
 81 |         "destination": "/docs/guides/author-develop/responsive/placeholders.html",
 82 |         "type": 301
 83 |       },
 84 |       {
 85 |         "source": "/docs/guides/responsive/art_direction?(.html)",
 86 |         "destination": "/docs/guides/author-develop/responsive/art_direction.html",
 87 |         "type": 301
 88 |       },
 89 |       {
 90 |         "source": "/docs/guides/responsive/custom_fonts?(.html)",
 91 |         "destination": "/docs/guides/author-develop/responsive/custom_fonts.html",
 92 |         "type": 301
 93 |       },
 94 |       {
 95 |         "source": "/docs/guides/amp_replacements?(.html)",
 96 |         "destination": "/docs/guides/author-develop/amp_replacements.html",
 97 |         "type": 301
 98 |       },
 99 |       {
100 |         "source": "/docs/guides/iframes?(.html)",
101 |         "destination": "/docs/guides/author-develop/iframes.html",
102 |         "type": 301
103 |       },
104 |       {
105 |         "source": "/docs/guides/third_party_components?(.html)",
106 |         "destination": "/docs/guides/author-develop/third_party_components.html",
107 |         "type": 301
108 |       },
109 |       {
110 |         "source": "/docs/guides/ads_on_amp?(.html)",
111 |         "destination": "/docs/guides/author-develop/ads_on_amp.html",
112 |         "type": 301
113 |       },
114 |       {
115 |         "source": "/docs/guides/validate?(.html)",
116 |         "destination": "/docs/guides/debug/validate.html",
117 |         "type": 301
118 |       },
119 |       {
120 |         "source": "/docs/guides/analytics_amp?(.html)",
121 |         "destination": "/docs/guides/deploy/analytics_amp.html",
122 |         "type": 301
123 |       },
124 |       {
125 |         "source": "/docs/guides/discovery?(.html)",
126 |         "destination": "/docs/guides/deploy/discovery.html",
127 |         "type": 301
128 |       },
129 |       {
130 |         "source": "/docs/guides/engagement?(.html)",
131 |         "destination": "/docs/guides/deploy/engagement.html",
132 |         "type": 301
133 |       },
134 |       {
135 |         "source": "/docs/guides/login-paywalls",
136 |         "destination": "/docs/get_started/login_requiring",
137 |         "type": 301
138 |       },
139 |       {
140 |         "source": "/docs/reference/components/amp-pixel?(.html)",
141 |         "destination": "/docs/reference/components/ads/amp-pixel.html",
142 |         "type": 301
143 |       },
144 |       {
145 |         "source": "/docs/reference/components/amp-ad?(.html)",
146 |         "destination": "/docs/reference/components/ads/amp-ad.html",
147 |         "type": 301
148 |       },
149 |       {
150 |         "source": "/docs/reference/components/amp-analytics?(.html)",
151 |         "destination": "/docs/reference/components/ads/amp-analytics.html",
152 |         "type": 301
153 |       },
154 |       {
155 |         "source": "/docs/reference/components/amp-auto-ads?(.html)",
156 |         "destination": "/docs/reference/components/ads/amp-auto-ads.html",
157 |         "type": 301
158 |       },
159 |       {
160 |         "source": "/docs/reference/components/amp-call-tracking?(.html)",
161 |         "destination": "/docs/reference/components/ads/amp-call-tracking.html",
162 |         "type": 301
163 |       },
164 |       {
165 |         "source": "/docs/reference/components/amp-experiment?(.html)",
166 |         "destination": "/docs/reference/components/ads/amp-experiment.html",
167 |         "type": 301
168 |       },
169 |       {
170 |         "source": "/docs/reference/components/amp-sticky-ad?(.html)",
171 |         "destination": "/docs/reference/components/ads/amp-sticky-ad.html",
172 |         "type": 301
173 |       },
174 |       {
175 |         "source": "/docs/reference/components/amp-access-laterpay?(.html)",
176 |         "destination": "/docs/reference/components/dynamic/amp-access-laterpay.html",
177 |         "type": 301
178 |       },
179 |       {
180 |         "source": "/docs/reference/components/amp-access?(.html)",
181 |         "destination": "/docs/reference/components/dynamic/amp-access.html",
182 |         "type": 301
183 |       },
184 |       {
185 |         "source": "/docs/reference/components/amp-bind?(.html)",
186 |         "destination": "/docs/reference/components/dynamic/amp-bind.html",
187 |         "type": 301
188 |       },
189 |       {
190 |         "source": "/docs/reference/components/amp-form?(.html)",
191 |         "destination": "/docs/reference/components/dynamic/amp-form.html",
192 |         "type": 301
193 |       },
194 |       {
195 |         "source": "/docs/reference/components/amp-install-serviceworker?(.html)",
196 |         "destination": "/docs/reference/components/dynamic/amp-install-serviceworker.html",
197 |         "type": 301
198 |       },
199 |       {
200 |         "source": "/docs/reference/components/amp-list?(.html)",
201 |         "destination": "/docs/reference/components/dynamic/amp-list.html",
202 |         "type": 301
203 |       },
204 |       {
205 |         "source": "/docs/reference/components/amp-live-list?(.html)",
206 |         "destination": "/docs/reference/components/dynamic/amp-live-list.html",
207 |         "type": 301
208 |       },
209 |       {
210 |         "source": "/docs/reference/components/amp-mustache?(.html)",
211 |         "destination": "/docs/reference/components/dynamic/amp-mustache.html",
212 |         "type": 301
213 |       },
214 |       {
215 |         "source": "/docs/reference/components/amp-selector?(.html)",
216 |         "destination": "/docs/reference/components/dynamic/amp-selector.html",
217 |         "type": 301
218 |       },
219 |       {
220 |         "source": "/docs/reference/components/amp-user-notification?(.html)",
221 |         "destination": "/docs/reference/components/dynamic/amp-user-notification.html",
222 |         "type": 301
223 |       },
224 |       {
225 |         "source": "/docs/reference/components/amp-accordion?(.html)",
226 |         "destination": "/docs/reference/components/layout/amp-accordion.html",
227 |         "type": 301
228 |       },
229 |       {
230 |         "source": "/docs/reference/components/amp-app-banner?(.html)",
231 |         "destination": "/docs/reference/components/layout/amp-app-banner.html",
232 |         "type": 301
233 |       },
234 |       {
235 |         "source": "/docs/reference/components/amp-carousel?(.html)",
236 |         "destination": "/docs/reference/components/layout/amp-carousel.html",
237 |         "type": 301
238 |       },
239 |       {
240 |         "source": "/docs/reference/components/amp-fx-flying-carpet?(.html)",
241 |         "destination": "/docs/reference/components/layout/amp-fx-flying-carpet.html",
242 |         "type": 301
243 |       },
244 |       {
245 |         "source": "/docs/reference/components/amp-fx-parallax?(.html)",
246 |         "destination": "/docs/reference/components/layout/amp-fx-parallax.html",
247 |         "type": 301
248 |       },
249 |       {
250 |         "source": "/docs/reference/components/amp-iframe?(.html)",
251 |         "destination": "/docs/reference/components/layout/amp-iframe.html",
252 |         "type": 301
253 |       },
254 |       {
255 |         "source": "/docs/reference/components/amp-lightbox?(.html)",
256 |         "destination": "/docs/reference/components/layout/amp-lightbox.html",
257 |         "type": 301
258 |       },
259 |       {
260 |         "source": "/docs/reference/components/amp-sidebar?(.html)",
261 |         "destination": "/docs/reference/components/layout/amp-sidebar.html",
262 |         "type": 301
263 |       },
264 |       {
265 |         "source": "/docs/reference/components/amp-img?(.html)",
266 |         "destination": "/docs/reference/components/media/amp-img.html",
267 |         "type": 301
268 |       },
269 |       {
270 |         "source": "/docs/reference/components/amp-anim?(.html)",
271 |         "destination": "/docs/reference/components/media/amp-anim.html",
272 |         "type": 301
273 |       },
274 |       {
275 |         "source": "/docs/reference/components/amp-apester-media?(.html)",
276 |         "destination": "/docs/reference/components/media/amp-apester-media.html",
277 |         "type": 301
278 |       },
279 |       {
280 |         "source": "/docs/reference/components/amp-audio?(.html)",
281 |         "destination": "/docs/reference/components/media/amp-audio.html",
282 |         "type": 301
283 |       },
284 |       {
285 |         "source": "/docs/reference/components/amp-brid-player?(.html)",
286 |         "destination": "/docs/reference/components/media/amp-brid-player.html",
287 |         "type": 301
288 |       },
289 |       {
290 |         "source": "/docs/reference/components/amp-brightcove?(.html)",
291 |         "destination": "/docs/reference/components/media/amp-brightcove.html",
292 |         "type": 301
293 |       },
294 |       {
295 |         "source": "/docs/reference/components/amp-dailymotion?(.html)",
296 |         "destination": "/docs/reference/components/media/amp-dailymotion.html",
297 |         "type": 301
298 |       },
299 |       {
300 |         "source": "/docs/reference/components/amp-google-vrview-image?(.html)",
301 |         "destination": "/docs/reference/components/media/amp-google-vrview-image.html",
302 |         "type": 301
303 |       },
304 |       {
305 |         "source": "/docs/reference/components/amp-hulu?(.html)",
306 |         "destination": "/docs/reference/components/media/amp-hulu.html",
307 |         "type": 301
308 |       },
309 |       {
310 |         "source": "/docs/reference/components/amp-image-lightbox?(.html)",
311 |         "destination": "/docs/reference/components/media/amp-image-lightbox.html",
312 |         "type": 301
313 |       },
314 |       {
315 |         "source": "/docs/reference/components/amp-izlesene?(.html)",
316 |         "destination": "/docs/reference/components/media/amp-izlesene.html",
317 |         "type": 301
318 |       },
319 |       {
320 |         "source": "/docs/reference/components/amp-jwplayer?(.html)",
321 |         "destination": "/docs/reference/components/media/amp-jwplayer.html",
322 |         "type": 301
323 |       },
324 |       {
325 |         "source": "/docs/reference/components/amp-kaltura-player?(.html)",
326 |         "destination": "/docs/reference/components/media/amp-kaltura-player.html",
327 |         "type": 301
328 |       },
329 |       {
330 |         "source": "/docs/reference/components/amp-o2-player?(.html)",
331 |         "destination": "/docs/reference/components/media/amp-o2-player.html",
332 |         "type": 301
333 |       },
334 |       {
335 |         "source": "/docs/reference/components/amp-ooyala-player?(.html)",
336 |         "destination": "/docs/reference/components/media/amp-ooyala-player.html",
337 |         "type": 301
338 |       },
339 |       {
340 |         "source": "/docs/reference/components/amp-playbuzz?(.html)",
341 |         "destination": "/docs/reference/components/media/amp-playbuzz.html",
342 |         "type": 301
343 |       },
344 |       {
345 |         "source": "/docs/reference/components/amp-reach-player?(.html)",
346 |         "destination": "/docs/reference/components/media/amp-reach-player.html",
347 |         "type": 301
348 |       },
349 |       {
350 |         "source": "/docs/reference/components/amp-soundcloud?(.html)",
351 |         "destination": "/docs/reference/components/media/amp-soundcloud.html",
352 |         "type": 301
353 |       },
354 |       {
355 |         "source": "/docs/reference/components/amp-springboard-player?(.html)",
356 |         "destination": "/docs/reference/components/media/amp-springboard-player.html",
357 |         "type": 301
358 |       },
359 |       {
360 |         "source": "/docs/reference/components/amp-video?(.html)",
361 |         "destination": "/docs/reference/components/media/amp-video.html",
362 |         "type": 301
363 |       },
364 |       {
365 |         "source": "/docs/reference/components/amp-vimeo?(.html)",
366 |         "destination": "/docs/reference/components/media/amp-vimeo.html",
367 |         "type": 301
368 |       },
369 |       {
370 |         "source": "/docs/reference/components/amp-youtube?(.html)",
371 |         "destination": "/docs/reference/components/media/amp-youtube.html",
372 |         "type": 301
373 |       },
374 |       {
375 |         "source": "/docs/reference/components/amp-animation?(.html)",
376 |         "destination": "/docs/reference/components/presentation/amp-animation.html",
377 |         "type": 301
378 |       },
379 |       {
380 |         "source": "/docs/reference/components/amp-dynamic-css-classes?(.html)",
381 |         "destination": "/docs/reference/components/presentation/amp-dynamic-css-classes.html",
382 |         "type": 301
383 |       },
384 |       {
385 |         "source": "/docs/reference/components/amp-fit-text?(.html)",
386 |         "destination": "/docs/reference/components/presentation/amp-fit-text.html",
387 |         "type": 301
388 |       },
389 |       {
390 |         "source": "/docs/reference/components/amp-font?(.html)",
391 |         "destination": "/docs/reference/components/presentation/amp-font.html",
392 |         "type": 301
393 |       },
394 |       {
395 |         "source": "/docs/reference/components/amp-viz-vega?(.html)",
396 |         "destination": "/docs/reference/components/presentation/amp-viz-vega.html",
397 |         "type": 301
398 |       },
399 |       {
400 |         "source": "/docs/reference/components/amp-facebook?(.html)",
401 |         "destination": "/docs/reference/components/social/amp-facebook.html",
402 |         "type": 301
403 |       },
404 |       {
405 |         "source": "/docs/reference/components/amp-gfycat?(.html)",
406 |         "destination": "/docs/reference/components/social/amp-gfycat.html",
407 |         "type": 301
408 |       },
409 |       {
410 |         "source": "/docs/reference/components/amp-instagram?(.html)",
411 |         "destination": "/docs/reference/components/social/amp-instagram.html",
412 |         "type": 301
413 |       },
414 |       {
415 |         "source": "/docs/reference/components/amp-pinterest?(.html)",
416 |         "destination": "/docs/reference/components/social/amp-pinterest.html",
417 |         "type": 301
418 |       },
419 |       {
420 |         "source": "/docs/reference/components/amp-reddit?(.html)",
421 |         "destination": "/docs/reference/components/social/amp-reddit.html",
422 |         "type": 301
423 |       },
424 |       {
425 |         "source": "/docs/reference/components/amp-share-tracking?(.html)",
426 |         "destination": "/docs/reference/components/social/amp-share-tracking.html",
427 |         "type": 301
428 |       },
429 |       {
430 |         "source": "/docs/reference/components/amp-social-share?(.html)",
431 |         "destination": "/docs/reference/components/social/amp-social-share.html",
432 |         "type": 301
433 |       },
434 |       {
435 |         "source": "/docs/reference/components/amp-twitter?(.html)",
436 |         "destination": "/docs/reference/components/social/amp-twitter.html",
437 |         "type": 301
438 |       },
439 |       {
440 |         "source": "/docs/reference/components/amp-vine?(.html)",
441 |         "destination": "/docs/reference/components/social/amp-vine.html",
442 |         "type": 301
443 |       },
444 |       {
445 |         "source": "/contribute/governance/",
446 |         "destination": "/docs/contribute/governance/",
447 |         "type": 301
448 |       },
449 |       {
450 |         "source": "/docs",
451 |         "destination": "/learn/overview/",
452 |         "type": 301
453 |       },
454 |       {
455 |         "source": "/docs/index.html",
456 |         "destination": "/learn/overview/",
457 |         "type": 301
458 |       },
459 |       {
460 |         "source": "/learn/about-amp/",
461 |         "destination": "/learn/overview/",
462 |         "type": 301
463 |       },
464 |       {
465 |         "source": "/learn/how-amp-works/",
466 |         "destination": "/learn/about-how/",
467 |         "type": 301
468 |       },
469 |       {
470 |         "source": "/learn/design-principles/",
471 |         "destination": "/learn/amp-design-principles/",
472 |         "type": 301
473 |       },
474 |       {
475 |         "source": "/learn/@(browsers|who)/",
476 |         "destination": "/support/faqs/supported-platforms.html",
477 |         "type": 301
478 |       },
479 |       {
480 |         "source": "/docs/support/contribute.html",
481 |         "destination": "/contribute/",
482 |         "type": 301
483 |       },
484 |       {
485 |         "source": "/docs/support/faqs.html",
486 |         "destination": "/support/faqs/",
487 |         "type": 301
488 |       },
489 |       {
490 |         "source": "/docs/reference/amp-ad.html",
491 |         "destination": "/docs/reference/extended/amp-ad.html",
492 |         "type": 301
493 |       },
494 |       {
495 |         "source": "/faq",
496 |         "destination": "/support/faqs/",
497 |         "type": 301
498 |       },
499 |       {
500 |         "source": "/faq/",
501 |         "destination": "/support/faqs/",
502 |         "type": 301
503 |       },
504 |       {
505 |         "source": "/faq/index.html",
506 |         "destination": "/support/faqs/",
507 |         "type": 301
508 |       },
509 |       {
510 |         "source": "/docs/get_started/create_page.html",
511 |         "destination": "/docs/get_started/create.html",
512 |         "type": 301
513 |       },
514 |       {
515 |         "source": "/contact",
516 |         "destination": "https://github.com/ampproject/amphtml/issues/new",
517 |         "type": 301
518 |       },
519 |       {
520 |         "source": "/contact/",
521 |         "destination": "https://github.com/ampproject/amphtml/issues/new",
522 |         "type": 301
523 |       },
524 |       {
525 |         "source": "/contact/",
526 |         "destination": "https://github.com/ampproject/amphtml/issues/new",
527 |         "type": 301
528 |       },
529 |       {
530 |         "source": "/docs/reference/extended.html",
531 |         "destination": "/docs/reference/components.html",
532 |         "type": 301
533 |       },
534 |       {
535 |         "source": "/docs/reference/amp-img.html",
536 |         "destination": "/docs/reference/components/amp-img.html",
537 |         "type": 301
538 |       },
539 |       {
540 |         "source": "/docs/reference/amp-pixel.html",
541 |         "destination": "/docs/reference/components/amp-pixel.html",
542 |         "type": 301
543 |       },
544 |       {
545 |         "source": "/docs/reference/amp-ad.html",
546 |         "destination": "/docs/reference/components/amp-ad.html",
547 |         "type": 301
548 |       },
549 |       {
550 |         "source": "/docs/reference/amp-video.html",
551 |         "destination": "/docs/reference/components/amp-video.html",
552 |         "type": 301
553 |       },
554 |       {
555 |         "source": "/docs/reference/extended/:post*",
556 |         "destination": "/docs/reference/components/:post*",
557 |         "type": 301
558 |       }
559 |     ],
560 |     "ignore": [
561 |       ".grow"
562 |     ]
563 |   }
564 | }
565 | 
```

--------------------------------------------------------------------------------
/content/includes/amp-conf-2017.yaml:
--------------------------------------------------------------------------------

```yaml
  1 | registration_link: https://events.withgoogle.com/amp-conf-2017/registrations/new
  2 | speakers:
  3 |   davidbesbris:
  4 |     name: David Besbris
  5 |     company: Google
  6 |     pic: /static/img/amp-conf/speakers/bez.jpg
  7 |     bio: Bez joined Google in 2008 and leads the Google News, Google Play Newsstand, AMP and Google Search fresh content teams. Before that he's led several other products, including Google+, Google Photos, Gmail and Google Calendar.
  8 |   nataliabaltazar:
  9 |     name: Natalia Baltazar
 10 |     company: The Guardian
 11 |     pic: /static/img/amp-conf/speakers/natalia.jpg
 12 |     bio: Natalia Baltazar is a full stack software engineer at the Guardian. She works mainly on the theguardian.com, coding in Javascript and Scala. At the Guardian she is the lead developer creating Google AMP versions of article pages and helping spearhead diversity initiatives. Outside of work she organises one-day workshops teaching Node.js with nodegirls.io, is an organiser for Ladies of Code, and volunteers as a mentor for a variety of free coding meetups. In her spare time she focuses on learning new programming languages, furniture refurbishment, and fashion design.
 13 |   lewei:
 14 |     name: Le Wei
 15 |     company: UpperQuad
 16 |     twitter: lewei
 17 |     pic: /static/img/amp-conf/speakers/le.jpg
 18 |     bio: Le is a Senior Developer at Upperquad, a design studio in San Francisco, where she works on a variety of projects for clients such as Google, Github, and Facebook. Most recently she has been working with the AMP team on a redesign of ampproject.org. Prior to UQ, Le was a software engineer at Google.
 19 |   willchou:
 20 |     name: William Chou
 21 |     company: Google
 22 |     pic: /static/img/amp-conf/speakers/will.jpg
 23 |     bio: William Chou is a Software Engineer who's working on new dynamic content in AMP. William worked in the games industry prior to joining Google.
 24 |   alexrussell:
 25 |     name: Alex Russell
 26 |     company: Google
 27 |     pic: /static/img/amp-conf/speakers/alex.jpg
 28 |     bio: Alex Russell is a Software Engineer on the Chrome team at Google where he designs new features for the web platform and leads Chrome's Standards work. He's a member of TC39, the committee standardizing ECMAScript/JavaScript, and is an elected member of the W3C’s Technical Architecture Group where he works with a group of like-minded reformers to improve the state of layering and API design for the web. Progressive Web Apps are his jam.
 29 |   johnpettitt:
 30 |     name: John Pettitt
 31 |     company: Relay Media
 32 |     pic: /static/img/amp-conf/speakers/john.jpg
 33 |     bio: "John is co-founder/CTO of Relay Media, a company dedicated to AMP.  Relay provides automated AMP conversion services for many TV and Newspaper sites. John was VP of engineering for BitTorrent, and co-founder/CTO of Beyond.com and CyberSource. John’s photojournalism has appeared in Wired, Vanity Fair, NY Times, Washington Post, on CNN, and on CBS news.  He's had an Internet email address since 1983."
 34 |     twitter: jpp123
 35 |   chenshay:
 36 |     name: Chen Shay
 37 |     company: Google
 38 |     pic: /static/img/amp-conf/speakers/chen.jpg
 39 |     bio: Chen is a Software Engineer on the AMP Team @ Google. Prior to AMP, Chen worked on Google Saves and most recently, Health Search. Chen launched Health Cards in developing countries, and Google Answers to Health questions. Chen is a Silicon Valley native. She holds a bachelor's degree in Computer Science from UC Santa Barbara and a Master's degree in Computer Science from Ben Gurion University in Israel.
 40 |   rannazhou:
 41 |     name: Ranna Zhou
 42 |     company: Google
 43 |     bio: Ranna Zhou is a product manager on Search working to bring information context and summarization of news to users. She studied computer science at MIT and exercises her degree coding for non-profits.
 44 |     pic: /static/img/amp-conf/speakers/ranna.jpg
 45 |   yaminigupta:
 46 |     name: Yamini Gupta
 47 |     company: Google
 48 |     pic: /static/img/amp-conf/speakers/yamini.jpg
 49 |     bio: As Head of Publisher Marketing at Google, Yamini leads marketing programs aimed at helping publishers thrive and create sustainable businesses with advertising. In this role, Yamini drives industry education and product marketing for DoubleClick's mobile, video and programmatic solutions as well as the open source Accelerated Mobile Pages (AMP) project. Yamini has more than 10 years of experience in marketing and advertising and started her career marketing consumer goods at DDB in India. She holds a Bachelor's degree in English Literature from Bombay University, and an MBA from Columbia University in New York.
 50 |   vamseejasti:
 51 |     name: Vamsee Jasti
 52 |     company: Google
 53 |     pic: /static/img/amp-conf/speakers/vamsee.jpg
 54 |     bio: Vamsee Jasti is the product manager for advertising in AMP. His mission is to keep the web open and free by helping publishers make money without comprising on user experience. The other way he helps publishers is by clicking on every ad he sees on the web.
 55 |   matthewprince:
 56 |     name: Matthew Prince
 57 |     company: Cloudflare
 58 |     pic: /static/img/amp-conf/speakers/matthew.jpg
 59 |     bio: Matthew Prince is co-founder and CEO of CloudFlare. CloudFlare’s mission is to help build a better Internet. Before CloudFlare, he co-founded Unspam Technologies, an anti-spam startup where he continues to serve as Chairman. Since then, Matthew has been an adjunct professor of law at the John Marshall Law School and co-creator of Project Honey Pot, the largest open source community tracking online fraud and abuse. He is a World Economic Forum Technology Pioneer, winner of the 2011 Tech Fellow Award, and serves on the Board of Advisors for the Center for Information Technology and Privacy Law. Matthew holds an MBA from Harvard Business School where he was a George F. Baker Scholar and awarded the Dubliner Prize for Entrepreneurship. He is a member of the Illinois Bar, and earned his J.D. from the University of Chicago and B.A. from Trinity College.
 60 |   daneknecht:
 61 |     name: Dane Knecht
 62 |     company: Cloudflare
 63 |     pic: /static/img/amp-conf/speakers/dane.jpg
 64 |   sammeder:
 65 |     name: Sam Meder
 66 |     company: Pinterest
 67 |     pic: /static/img/amp-conf/speakers/sam.jpg
 68 |     bio: Sam Meder is a engineer at Pinterest where he is responsible for performance across all platforms. Prior to Pinterest he's been a technical leader and manager at a variety of startups.
 69 |   vadimantonov:
 70 |     name: Vadim Antonov
 71 |     company: Pinterest
 72 |     pic: /static/img/amp-conf/speakers/vadim.jpg
 73 |     bio: Vadim Antonov is a Tech Lead for the User Acquisition team at Pinterest. Previously, he worked on search at Bing & Yandex, including work on crawling, index quality, query rewriting and ranking.
 74 |   beckcronindixon:
 75 |     name: Beck Cronin-Dixon
 76 |     company: Eventbrite
 77 |     pic: /static/img/amp-conf/speakers/beck.jpg
 78 |     bio: Beck Cronin-Dixon is an SEO Engineer and lead developer for AMP at Eventbrite. As a Nashville Software School alumni she is passionate about encouraging aspiring coders into engineering careers. Her SEO mantra is ‘search engine optimization and user experience should always go hand in hand’. She is a world traveler who has lived on 4 different continents.
 79 |   sarahsaltrickmeyer:
 80 |     name: Sarah Saltrick Meyer
 81 |     company: Buzzfeed
 82 |     pic: /static/img/amp-conf/speakers/sarah.jpg
 83 |     bio: Sarah Saltrick Meyer is a native New Yorker, employed as software engineer at BuzzFeed. She likes good websites and the opera. After a career in front-end engineering at all sorts of startups in the New York-Boston corridor, she now builds a modern web experience for BuzzFeed's millions of readers.
 84 |   nicolesullivan:
 85 |     name: Nicole Sullivan
 86 |     company: Salesforce
 87 |     pic: /static/img/amp-conf/speakers/nicole.jpg
 88 |     bio: Nicole is an Engineering Director at Salesforce and the creator of Object Oriented CSS, Dr Frankenstyle, CSSLint, and CSSConf. Follow her on [Twitter](https://twitter.com/stubbornella), read her [blog](http://www.stubbornella.org/content/).
 89 |   jeremykeith:
 90 |     name: Jeremy Keith
 91 |     company: Clearleft
 92 |     pic: /static/img/amp-conf/speakers/jeremy.jpg
 93 |     bio: Jeremy Keith is an Irish web developer living in Brighton, England where he co-founded the splendid design agency Clearleft. He wrote the books DOM Scripting, Bulletproof Ajax, HTML5 For Web Designers, and most recently Resilient Web Design. He also organised events like dConstruct, Responsive Day Out, and the world's first Science Hack Day. Jeremy spends most of his time goofing off on the internet, documenting his time-wasting on adactio.com, where he has been writing for over fifteen years.
 94 |   ginatrapani:
 95 |     name: Gina Trapani
 96 |     company: Postlight
 97 |     pic: /static/img/amp-conf/speakers/gina.jpg
 98 |     bio: Gina Trapani is a writer, podcaster, and Director of Engineering at Postlight, a digital product studio in New York City. Gina helped create Postlight Labs' Mercury AMP Converter, a tool that transforms web pages into AMP with one line of code. Once upon a time, she founded Lifehacker.
 99 |   paulbakaus:
100 |     name: Paul Bakaus
101 |     company: Google
102 |     pic: /static/img/amp-conf/speakers/paul.jpg
103 |     bio: Paul Bakaus is a Developer Advocate at Google, heading up outreach for AMP. He assists developers, designers, and filmmakers to create better, faster, more immersive and more convincing digital experiences.
104 |   malteubl:
105 |     name: Malte Ubl
106 |     company: Google
107 |     pic: /static/img/amp-conf/speakers/malte.jpg
108 |     bio: Malte Ubl is the tech lead of the AMP Project. He previously spent 5 years at Google making JavaScript based apps go fast and in his free time, he is one of the co-organizers of JSConf EU.
109 |   rudygalfi:
110 |     name: Rudy Galfi
111 |     company: Google
112 |     pic: /static/img/amp-conf/speakers/rudy.jpg
113 |     bio: Rudy Galfi is the product management lead for the AMP Project since August 2015. He previously spent four years at Google building personalized content recommendation experiences for various Google products and was product manager for Google News. Prior to Google, Rudy was a software engineer at Microsoft.
114 |   senthilpadmanabhan:
115 |     name: Senthil Padmanabhan
116 |     company: eBay
117 |     pic: /static/img/amp-conf/speakers/senthil.jpg
118 |     bio: Senthil Padmanabhan is a Principal Engineer & Web Platform Lead at eBay, building the multiscreen shopping experience. He is specialized in web technologies such as JavaScript, HTML, CSS, along with web performance & optimization.
119 |   ardanarac:
120 |     name: Ardan Arac
121 |     company: Google
122 |     pic: /static/img/amp-conf/speakers/ardan.jpg
123 |     bio: Ardan leads fresh content products in Google search. She has been a product manager at Google since 2006. She studied electrical engineering previously.
124 |   ericlindley:
125 |     name: Eric Lindley
126 |     company: Google
127 |     pic: /static/img/amp-conf/speakers/eric.jpg
128 |     bio: Eric Lindley is a product manager on the AMP Project, focused on format support. Previously at Google he worked on the initial launch of the standalone Google Photos app.
129 |   richardgingras:
130 |     name: Richard Gingras
131 |     company: Google
132 |     pic: /static/img/amp-conf/speakers/richard.jpg
133 |     bio: Richard Gingras is Vice President of News at Google. In that role he guides Google’s strategies relating to the media ecosystem and oversees many of Google’s news and media related products. Richard was a key instigator of the AMP project and was previously co-founder of the Trust Project, a global effort within the journalism community to insure that high quality journalism is recognized for the credibility it deserves.
134 |   sebastianbenz:
135 |     name: Sebastian Benz
136 |     company: Google
137 |     pic: /static/img/amp-conf/speakers/sebastian.jpg
138 |     bio: Sebastian Benz is a Developer Advocate at Google. He created ampbyexample.com and helps partners be more successful on the web and on Android. Sebastian has a PhD in Computer Science from TU Muenchen.
139 |   madisonminer:
140 |     name: Madison Miner
141 |     company: WompMobile
142 |     pic: /static/img/amp-conf/speakers/madison.jpg
143 |     bio: Madison Miner is co-founder of WompMobile, a mobile optimization company that converts complex, e-commerce websites into AMP pages, bringing to life faster, more compelling digital experiences. Madison, a software engineer, is relentless about finding creative ways to create rich functionality, while keeping mobile architecture lean and performant. In his spare time, Madison can be found peddling his bike, meandering through Washington state.
144 |   mikeadler:
145 |     name: Mike Adler
146 |     company: Etsy
147 |     pic: /static/img/amp-conf/speakers/mike.jpg
148 |     bio: Mike Adler is a Staff Software Engineer at Etsy where he focuses on performance matters. Mike likes to build custom monitoring tools to answer tough questions about performance. He hasn't had a personal web site since 1997.
149 |   alighassemi:
150 |     name: Ali Ghassemi
151 |     company: Google
152 |     pic: /static/img/amp-conf/speakers/ali.jpg
153 |   sriramkrishnan:
154 |     name: Sriram Krishnan
155 |     company: Google
156 |     pic: /static/img/amp-conf/speakers/sriram.jpg
157 |   marikokosaka:
158 |     name: Mariko Kosaka
159 |     company: Scripto
160 |     pic: /static/img/amp-conf/speakers/mariko.jpg
161 |   marcelodebarros:
162 |     name: Marcelo De Barros
163 |     company: Microsoft
164 |   zackhendlin:
165 |     name: Zack Hendlin
166 |     company: LinkedIn
167 |   honeymittal:
168 |     name: Honey Mittal
169 |     company: Wego
170 |     pic: /static/img/amp-conf/speakers/honey.jpg
171 |     bio: Honey is Senior Vice President - Product at Wego.com, a search-driven online travel marketplace operating across the Middle East & Asia-Pacific and backed by top-tier investors. He has been working with 'everything mobile' for the last 8 years. The last 3 of them have been at Wego, building Wego's top-ranked mobile apps and more recently with revamping Wego's web products. Having recently launched Wego's new mobile web experience (PWA and AMP Pages), Wego's product & engineering team hopes to share their experience with the community and also learn from others at the AMP Summit!
172 | 
173 | agenda:
174 |   day_1:
175 |     - title: Registration
176 |       time: "0800"
177 |     - title: Opening notes
178 |       time: "0850"
179 |     - title: Day One Keynote
180 |       time: "0900"
181 |       type: keynote
182 |       speaker: davidbesbris
183 |       description: David Besbris, AMP Project lead, will open the AMP Conf with a look at the past year, present and future of AMP.
184 |     - title: 1B+ Pages AMPed
185 |       time: "0930"
186 |       type: session
187 |       speakers:
188 |         - sammeder
189 |         - vadimantonov
190 |       description: Pinterest has more than a billion pages that are accessible to unauthenticated users and discoverable via Google search. In this talk we will walk through what it took to convert these to AMP and where we are planning to go next.
191 |     - title: AMP in the Wild
192 |       time: "1000"
193 |       type: session
194 |       speaker: nataliabaltazar
195 |       description: Learn how the Guardian turned the limitations of AMP into an opportunity to rethink their article pages, header and navigation and therefore improved their overall user journey.
196 |     - title: Coffee Break
197 |       time: "1030"
198 |     - title: Adding AMP to an e-commerce Workflow
199 |       time: "1100"
200 |       type: session
201 |       speaker: senthilpadmanabhan
202 |       description: eBay is one of the first eCommerce players to launch AMP in production. In this talk we will discuss on how to add AMP to an existing workflow and develop in parallel. We will dive into why we chose AMP, lessons learned, things that are critical for eCommerce and the challenges faced. We will also share some metrics along the way.
203 |     - title: "Beautiful, Canonical, and Responsive AMP Pages"
204 |       time: "1130"
205 |       type: session
206 |       description: Le is the lead developer for the upcoming relaunch of the AMP Project website, and will share lots of lessons learned when building canonical, responsive AMP. She'll also highlight some upcoming AMP features that make it even easier to build attractive AMP Pages.
207 |       speakers:
208 |         - lewei
209 |         - ericlindley
210 |     - title: "Mobile web on flaky networks: When they go slow, Wego fast!"
211 |       time: "1200"
212 |       type: session
213 |       speaker: honeymittal
214 |       description: Delivering an app-like experience to mobile web users on flaky networks has always been a challenge for developers building for both the developed and emerging markets. Until now, that is! Thanks to AMP and PWA, Wego.com has been able to flip their mobile web experience upside down. Come learn about how Wego.com combined the power of both AMP and PWA to create a great end to end mobile web experience with faster acquisition and higher engagement.
215 |     - title: Lunch (with the AMP team!)
216 |       time: "1230"
217 |       description: The AMP team needs sustenance as well, and what better time to grab them to offer feedback and discuss the roadmap. We'll have dedicated tables with project members who want to hear from you.
218 |     - title: "AMP & the web platform"
219 |       time: "1330"
220 |       type: panel
221 |       moderator: paulbakaus
222 |       speakers:
223 |         - jeremykeith
224 |         - nicolesullivan
225 |         - sarahsaltrickmeyer
226 |         - ginatrapani
227 |         - mikeadler
228 |       description: It's hard to argue that AMP improves page speed and usability, but does it actually help the web platform at large or is it just a stop-gap measure? And if it doesn't, how can we fix it? We invited a bunch of advocates for the open web to talk candidly and take a hard look together of where the web is heading, and how we can ensure a healthy open-web for the next generations.
229 |     - title: I can't believe it's AMP!
230 |       time: "1430"
231 |       type: session
232 |       description: Watch Madison, CEO of WompMobile, come up with clever CSS and AMP component production hacks to support all sorts of use-cases, and then marvel at how Sebastian, creator of AMPByExample.com turns a myriad of these and more tricks to create fascinating applications of AMP.
233 |       speakers:
234 |         - madisonminer
235 |         - sebastianbenz
236 |     - title: "Leveraging AMP for e-commerce: Eventbrite’s journey to optimized mobile pages"
237 |       time: "1500"
238 |       type: session
239 |       speaker: beckcronindixon
240 |       description: Eventbrite has seen many wins since launching its event listings pages as AMP. But this journey had its share of technical and design challenges. This discussion will focus on some of those hurdles including accommodating user-generated content, issues specific to ecommerce and ticketing, and structuring HTML and CSS for maintainability. We will detail how Eventbrite  overcame these obstacles without sacrificing user experience or brand alignment.
241 |     - title: Turing complete...AMP Pages?!
242 |       time: "1530"
243 |       type: session
244 |       speaker: willchou
245 |       description: The AMP team has been amazed at the creativity web developers are showing to create interactivity without JS, but we're finally making it a little easier out of the box. Learn how amp-bind, amp-selector, amp-fresh and other exciting new components enable true interactivity.
246 |     - title: Coffee Break
247 |       time: "1600"
248 |     - title: What's next in AMP
249 |       time: "1630"
250 |       type: keynote
251 |       speakers:
252 |         - malteubl
253 |         - rudygalfi
254 |       company: Google
255 |       description: What does the future for AMP look like? Malte Ubl, engineering lead of AMP, and Rudy Galfi, PM on the AMP team, are here to tell you all about it.
256 |     - title: Q&A with Google Search and AMP Leadership
257 |       time: "1700"
258 |       type: panel
259 |       description: It's time to ask the AMP and Google Search leadership all the questions. All keynote speakers as well as a few additional guests from Google Search & News will try their very best to answer every question you throw at them.
260 |       speakers:
261 |         - davidbesbris
262 |         - malteubl
263 |         - rudygalfi
264 |         - richardgingras
265 |         - rannazhou
266 |         - ardanarac
267 |     - title: Party!
268 |       time: "1800"
269 |   day_2:
270 |     - title: Registration
271 |       time: "0800"
272 |     - title: "Day Two Keynote: How Cloudflare is accelerating AMP"
273 |       time: "9000"
274 |       type: keynote
275 |       speaker: matthewprince
276 |       description: Matthew Prince, co-founder and CEO of Cloudflare, opens the second day with his keynote, bringing an exciting outlook on how they're expanding the AMP ecosystem with new Cloudflare-powered solutions.
277 |     - title: "AMP on Google Search: Building the perfect AMP Viewer"
278 |       time: "0930"
279 |       type: session
280 |       speaker: rannazhou
281 |       description: Ranna will talk about how Google Search uses AMP to create experiences like the Top Stories carousel, and how the AMP Viewer works, from top to bottom. It's rare to get a chance to look behind the scenes of Google Search – you don't want to miss this one.
282 |     - title: "Progressive Web AMPs: From AMP to PWA"
283 |       time: "1000"
284 |       type: session
285 |       speaker: alexrussell
286 |       description: AMP gets content in front of users fast – PWAs enable rich experiences and engagement. Learn how to combine the two to get the best of both worlds by the Chrome engineer who coined the term "Progressive Web App".
287 |     - title: Coffee Break
288 |       time: "1030"
289 |     - title: "AMP Conversion: The Good, The Bad and The Ugly"
290 |       time: "1100"
291 |       type: session
292 |       speaker: johnpettitt
293 |       description: Relay Media is converting millions of AMP pages every day, and conversion brings many challenges different than building from scratch. Learn how to compress CSS efficiently, replace functionality smartly and much more.
294 |     - title: "Consuming AMP: The platform panel"
295 |       time: "1130"
296 |       type: panel
297 |       moderator: paulbakaus
298 |       speakers:
299 |        - marcelodebarros
300 |        - zackhendlin
301 |        - daneknecht
302 |       description: Meet the platforms that embed and distribute AMP pages, and learn about their unique challenges, future ideas and more. Featuring an all-star lineup that includes Bing, LinkedIn, Google and more to be announced.
303 |     - title: Lunch (with the AMP team!)
304 |       time: "1230"
305 |       description: The AMP team needs sustenance as well, and what better time to grab them to offer feedback and discuss the roadmap. We'll have dedicated tables with project members who want to hear from you.
306 |     - title: "Better advertising on a faster web: AMP for Ads"
307 |       time: "1330"
308 |       type: session
309 |       speakers:
310 |         - yaminigupta
311 |         - vamseejasti
312 |       description: So, AMP made content faster on the mobile web. But what about ads? Slow, spammy and disruptive ad experiences have eroded the value of content by annoying users even as advertising continues to be at the cornerstone of every publisher's business model. AMP's mission is to build a better, faster mobile web --- and that includes ads. Join us in this session to hear more about AMP for Ads (A4A), a new initiative from the AMP Project that's fundamentally changing the way ads are built and delivered on the web.
313 |     - title: Building a new AMP component
314 |       time: "1400"
315 |       type: session
316 |       speaker: chenshay
317 |       description: So what happens if you discover that an AMP component for your use case doesn't exist? Contributing a new component is actually much easier than many expect, and Chen will walk you through it.
318 |     - title: Workshops
319 |       time: "1430"
320 |       type: workshop
321 |       description: "To wrap up the conference, it's time to get our hands dirty. Bring your laptop and curiosity and participate in one of the three workshops offered by the AMP team:"
322 |       speakers:
323 |         - sebastianbenz
324 |         - alighassemi
325 |         - sriramkrishnan
326 |         - yaminigupta
327 |         - vamseejasti
328 |       workshops:
329 |         - title: "Build and contribute your first AMP Component"
330 |           speakers:
331 |             - chenshay
332 |         - title: "Beautiful, interactive, canonical: Pick three"
333 |           speakers:
334 |             - sebastianbenz
335 |             - alighassemi
336 |             - sriramkrishnan
337 |         - title: "Progressive Web AMPs: From AMP to PWA"
338 |           speakers:
339 |             - albertomedina
340 |     - title: Wrap-up
341 |       time: "1630"
342 | 
```

--------------------------------------------------------------------------------
/content/docs/reference/validation_errors.md:
--------------------------------------------------------------------------------

```markdown
  1 | ---
  2 | $title: AMP Validation Errors
  3 | $order: 7
  4 | toc: true
  5 | ---
  6 | 
  7 | <!---
  8 | Copyright 2015 The AMP HTML Authors. All Rights Reserved.
  9 | 
 10 | Licensed under the Apache License, Version 2.0 (the "License");
 11 | you may not use this file except in compliance with the License.
 12 | You may obtain a copy of the License at
 13 | 
 14 |       http://www.apache.org/licenses/LICENSE-2.0
 15 | 
 16 | Unless required by applicable law or agreed to in writing, software
 17 | distributed under the License is distributed on an "AS-IS" BASIS,
 18 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 19 | See the License for the specific language governing permissions and
 20 | limitations under the License.
 21 | -->
 22 | 
 23 | Valid AMP documents must not inlude any validation errors.
 24 | The purpose of this document is to help you better understand
 25 | and fix any validation errors you encounter
 26 | when you [validate your AMP pages](/docs/guides/validate.html).
 27 | For a complete overview of the validation errors,
 28 | see the [AMP validator specification](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii).
 29 | 
 30 | [TOC]
 31 | 
 32 | ## AMP HTML tag and attribute errors
 33 | 
 34 | ### Mandatory tag missing
 35 | 
 36 | <table>
 37 |    <tr>
 38 |   	<td class="col-thirty"><strong>Code</strong></td>
 39 |   	<td>MANDATORY_TAG_MISSING</td>
 40 |   </tr>
 41 |    <tr>
 42 |   	<td class="col-thirty"><strong>Format</strong></td>
 43 |   	<td>"The mandatory tag '%1' is missing or incorrect."</td>
 44 |   </tr>
 45 |    <tr>
 46 |   	<td class="col-thirty"><strong>Fix</strong></td>
 47 |   	<td>Add (or correct) the mandatory HTML tag.</td>
 48 |   </tr>
 49 | </table>
 50 | 
 51 | The following tags must be present in all AMP docs:
 52 | 
 53 | * <a name="doctype"></a>`<!doctype html>`
 54 | * <a name="html"></a>`<html amp> or <html ⚡>`
 55 | * <a name="head"></a>`<head>`
 56 | * <a name="canonical"></a>`<link rel="canonical" href="$SOME_URL" />`
 57 | * <a name="utf"></a>`<meta charset="utf-8">`
 58 | * <a name="viewport"></a>`<meta name="viewport" content="...">`
 59 | * <a name="boilerplate"></a>`<style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>`
 60 | * <a name="ampscript"></a>`<script async src="https://cdn.ampproject.org/v0.js"></script>`
 61 | * <a name="body"></a>`<body>`
 62 | 
 63 | These mandatory tags include a `mandatory: true` field in the <a href="https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii">AMP validator spec</a>;
 64 | they are also referenced in the [AMP specification](/docs/reference/spec.html).
 65 | 
 66 | ### Tag required by another tag is missing
 67 | 
 68 | <table>
 69 |   </tr>
 70 |    <tr>
 71 |   	<td class="col-thirty"><strong>Code</strong></td>
 72 |   	<td>TAG_REQUIRED_BY_MISSING</td>
 73 |   </tr>
 74 |    <tr>
 75 |   	<td class="col-thirty"><strong>Format</strong></td>
 76 |   	<td>"The '%1' tag is missing or incorrect, but required by '%2'."</td>
 77 |   </tr>
 78 |    <tr>
 79 |   	<td class="col-thirty"><strong>Fix</strong></td>
 80 |   	<td>Add (or correct) the required HTML tag.</td>
 81 |   </tr>
 82 | </table>
 83 | 
 84 | The validator throws the `TAG_REQUIRED_BY_MISSING` error
 85 | when it finds an extended component in the AMP document,
 86 | but doesn't find its equivalent `<script>`.
 87 | 
 88 | [Extended components](/docs/reference/extended.html)
 89 | must be explicitedly included in the AMP document as custom elements.
 90 | To fix these errors, navigate to the extended component's reference page,
 91 | copy its required script, and paste it into the AMP document `<head>`.
 92 | 
 93 | ### Disallowed tag
 94 | 
 95 | <table>
 96 |    <tr>
 97 |   	<td class="col-thirty"><strong>Code</strong></td>
 98 |   	<td>DISALLOWED_TAG</td>
 99 |   </tr>
100 |    <tr>
101 |   	<td class="col-thirty"><strong>Format</strong></td>
102 |   	<td>"The tag '%1' is disallowed."</td>
103 |   </tr>
104 |    <tr>
105 |   	<td class="col-thirty"><strong>Fix</strong></td>
106 |   	<td>Remove the disallowed tag.</td>
107 |   </tr>
108 | </table>
109 | 
110 | Tags are whitelisted, so there is no definitive list of all disallowed tags;
111 | however, the [AMP specification](/docs/reference/spec.html)
112 | broadly defines the set of disallowed tags.
113 | 
114 | ### Mandatory attribute missing
115 | 
116 | <table>
117 |    <tr>
118 |   	<td class="col-thirty"><strong>Code</strong></td>
119 |   	<td>MANDATORY_ATTR_MISSING</td>
120 |   </tr>
121 |    <tr>
122 |   	<td class="col-thirty"><strong>Format</strong></td>
123 |   	<td>"The mandatory attribute '%1' is missing in tag '%2'."</td>
124 |   </tr>
125 |    <tr>
126 |   	<td class="col-thirty"><strong>Fix</strong></td>
127 |   	<td>Add mandatory attribute to tag.</td>
128 |   </tr>
129 | </table>
130 | 
131 | Mandatory attributes for AMP tags are defined within
132 | [AMP's validator spec](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii).
133 | Simply search for the tag,
134 | view the listed attributes,
135 | and check for `mandatory: true`.
136 | Mandatory attributes for each AMP tag are also listed
137 | within the tag's specification.
138 | 
139 | ### Invalid attribute value
140 | 
141 | <table>
142 |    <tr>
143 |   	<td class="col-thirty"><strong>Code</strong></td>
144 |   	<td>INVALID_ATTR_VALUE</td>
145 |   </tr>
146 |    <tr>
147 |   	<td class="col-thirty"><strong>Format</strong></td>
148 |   	<td>"The attribute '%1' in tag '%2' is set to the invalid value '%3'."</td>
149 |   </tr>
150 |    <tr>
151 |   	<td class="col-thirty"><strong>Fix</strong></td>
152 |   	<td>Fix the attribute value to something that is valid.</td>
153 |   </tr>
154 | </table>
155 | 
156 | This error indicates that an HTML tag has an attribute with an allowed name,
157 | but not an allowed value.
158 | For example, one common trigger for this error is invalid values for URLs.
159 | All URLs values (in `href` and `src` attributes) must match one of these
160 | [possible attribute values](http://www.w3schools.com/tags/att_a_href.asp).
161 | 
162 | <strong>IMPORTANT:</strong> Many URL values in AMP require HTTPS.
163 | If you are getting this error, and aren't sure why,
164 | check the relevant AMP tag's specification
165 | to see if the attribute requires HTTPS.
166 | 
167 | ### Disallowed attribute
168 | 
169 | <table>
170 |   <tr>
171 |   	<td class="col-thirty"><strong>Code</strong></td>
172 |   	<td>DISALLOWED_ATTR</td>
173 |   </tr>
174 |   <tr>
175 |   	<td class="col-thirty"><strong>Format</strong></td>
176 |   	<td>"The attribute '%1' may not appear in tag '%2'."</td>
177 |   </tr>
178 |   <tr>
179 |   	<td class="col-thirty"><strong>Fix</strong></td>
180 |   	<td>Remove the attribute from the HTML tag.</td>
181 |   </tr>
182 | </table>
183 | 
184 | Attributes are whitelisted, so there is no definitive list of all disallowed attributes.
185 | To check the supported attributes for each specific tag,
186 | search for HTML tag, and then `attrs`
187 | in the [AMP validator spec](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii).
188 | 
189 | In addition to a whitelist of specific attributes for each tag,
190 | all AMP tags can use any of the attributes white-listed under `$GLOBAL_ATTRS`;
191 | all attributes with a prefix of `"data-"` are also whitelisted.
192 | 
193 | ### Mandatory text missing or incorrect
194 | 
195 | <table>
196 |   <tr>
197 |   	<td class="col-thirty"><strong>Code</strong></td>
198 |   	<td>MANDATORY_CDATA_MISSING_OR_INCORRECT</td>
199 |   </tr>
200 |    <tr>
201 |   	<td class="col-thirty"><strong>Format</strong></td>
202 |   	<td>"The mandatory text (CDATA) inside tag '%1' is missing or incorrect."</td>
203 |   </tr>
204 |    <tr>
205 |   	<td class="col-thirty"><strong>Fix</strong></td>
206 |   	<td>Add or correct the mandatory text inside the tag.</td>
207 |   </tr>
208 | </table>
209 | 
210 | CDATA is the content data between a start and end HTML tag
211 | and is currently evaluated with both whitelists and blacklists.
212 | Tags with mandatory CDATA include:
213 | 
214 | [sourcecode:html]
215 | <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
216 | [/sourcecode]
217 | 
218 | And:
219 | 
220 | [sourcecode:html]
221 | <style amp-custom>
222 | [/sourcecode]
223 | 
224 | Detailed messages for this can be one of the following:
225 | 
226 | * "Mandatory style boilerplate (js enabled)"
227 | * "Mandatory style boilerplate (noscript)"
228 | * "Disallowed -amp- CSS class name prefix"
229 | * "Disallowed !important attribute in CSS"
230 | * "Disallowed &#64;charset in CSS"
231 | * "Disallowed &#64;import in CSS"
232 | * "Disallowed @namespace in CSS"
233 | * "Disallowed @supports in CSS"
234 | * "Disallowed @document in CSS"
235 | * "Disallowed @page in CSS"
236 | * "Disallowed @viewport in CSS"
237 | 
238 | ### Disallowed text inside tag
239 | 
240 | <table>
241 |    <tr>
242 |   	<td class="col-thirty"><strong>Code</strong></td>
243 |   	<td>CDATA_VIOLATES_BLACKLIST</td>
244 |   </tr>
245 |    <tr>
246 |   	<td class="col-thirty"><strong>Format</strong></td>
247 |   	<td>"The text (CDATA) inside tag '%1' matches '%2', which is disallowed."</td>
248 |   </tr>
249 |    <tr>
250 |   	<td class="col-thirty"><strong>Fix</strong></td>
251 |   	<td>Remove disallowed text.</td>
252 |   </tr>
253 | </table>
254 | 
255 | Specific CSS data has been blacklisted
256 | to validate essential CSS AMP rules.
257 | 
258 | The following is the list of blacklisted CSS data
259 | (see also [`blacklisted_cdata_regex` in the AMP validator spec](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii)):
260 | 
261 | * `"\\.i?-amp-"` ("CSS -amp- class name prefix")
262 | * `"!important"`
263 | * `"charset"`
264 | * `"&#64;import"`
265 | * `"@namespace"`
266 | * `"@document"`
267 | * `"@page"`
268 | * `"@viewport"`
269 | 
270 | ### Disallowed property inside attribute in tag
271 | 
272 | <table>
273 |    <tr>
274 |   	<td class="col-thirty"><strong>Code</strong></td>
275 |   	<td>DISALLOWED_PROPERTY_IN_ATTR_VALUE</td>
276 |   </tr>
277 |    <tr>
278 |   	<td class="col-thirty"><strong>Format</strong></td>
279 |   	<td>"The property '%1' in attribute '%2' in tag '%3' is disallowed."</td>
280 |   </tr>
281 |    <tr>
282 |   	<td class="col-thirty"><strong>Fix</strong></td>
283 |   	<td>Remove disallowed property in the specified attribute.</td>
284 |   </tr>
285 | </table>
286 | 
287 | This error occurs when the property name inside an attribute isn't allowed.
288 | The term property in this context means the structured key/value data inside an attribute.
289 | For example, in
290 | `<meta name="viewport content="width=device-width;minimum-scale=1">`,
291 | `width` and `minimum-scale` are property names.
292 | 
293 | The following results in a DISALLOWED_PROPERTY_IN_ATTR_VALUE error:
294 | 
295 | `<meta name="viewport content="width=device-width;invalidfoo=1">`
296 | 
297 | As another example,
298 | the following would result in an error:
299 | 
300 | `<meta http-equiv="X-UA-Compatible" content="invalidfoo=edge">`
301 | 
302 | It should be: `<meta http-equiv="X-UA-Compatible" content="ie=edge">`.
303 | 
304 | ### Invalid property value
305 | 
306 | <table>
307 |    <tr>
308 |   	<td class="col-thirty"><strong>Code</strong></td>
309 |   	<td>INVALID_PROPERTY_VALUE_IN_ATTR_VALUE</td>
310 |   </tr>
311 |    <tr>
312 |   	<td class="col-thirty"><strong>Format</strong></td>
313 |   	<td>"The property '%1' in attribute '%2' in tag '%3' is set to '%4', which is invalid."</td>
314 |   </tr>
315 |    <tr>
316 |   	<td class="col-thirty"><strong>Fix</strong></td>
317 |   	<td>Correct the invalid property value.</td>
318 |   </tr>
319 | </table>
320 | 
321 | This error occurs when the property value inside an attribute is invalid.
322 | The term property in this context means the structured key/value data inside an attribute.
323 | For example, in
324 | `<meta name="viewport content="width=device-width;minimum-scale=1">`,
325 | `device-width` and `1` are property values.
326 | 
327 | The following results in a INVALID_PROPERTY_VALUE_IN_ATTR_VALUE error:
328 | 
329 | `<meta name=viewport content="width=device-width;minimum-scale=invalidfoo">`
330 | 
331 | As another example,
332 | the following would result in an error:
333 | 
334 | `<meta http-equiv="X-UA-Compatible" content="ie=invalidfoo">`
335 | 
336 | It should be: `<meta http-equiv="X-UA-Compatible" content="ie=edge">`
337 | 
338 | ### Missing URL
339 | 
340 | <table>
341 |   <tr>
342 |     <td class="col-thirty"><strong>Code</strong></td>
343 |     <td>MISSING_URL</td>
344 |   </tr>
345 |    <tr>
346 |     <td class="col-thirty"><strong>Format</strong></td>
347 |     <td>"Missing URL for attribute '%1' in tag '%2'."</td>
348 |   </tr>
349 |    <tr>
350 |     <td class="col-thirty"><strong>Fix</strong></td>
351 |     <td>Add the valid URL.</td>
352 |   </tr>
353 | </table>
354 | 
355 | This error occurs when an attribute that requires a URL is missing it,
356 | for example, an empty `href` or `src` attribute.
357 | 
358 | ### Invalid URL
359 | 
360 | <table>
361 |   <tr>
362 |     <td class="col-thirty"><strong>Code</strong></td>
363 |     <td>INVALID_URL_PROTOCOL</td>
364 |   </tr>
365 |    <tr>
366 |     <td class="col-thirty"><strong>Format</strong></td>
367 |     <td>"Malformed URL '%3' for attribute '%1' in tag '%2'"</td>
368 |   </tr>
369 |    <tr>
370 |     <td class="col-thirty"><strong>Fix</strong></td>
371 |     <td>Fix the broken URL.</td>
372 |   </tr>
373 | </table>
374 | 
375 | This error occurs when a attribute has a URL,
376 | but the URL is invalid.
377 | 
378 | ### Invalid URL protocol
379 | 
380 | <table>
381 |   <tr>
382 |     <td class="col-thirty"><strong>Code</strong></td>
383 |     <td>INVALID_URL_PROTOCOL</td>
384 |   </tr>
385 |    <tr>
386 |     <td class="col-thirty"><strong>Format</strong></td>
387 |     <td>Invalid URL protocol '%3:' for attribute '%1' in tag '%2'.</td>
388 |   </tr>
389 |    <tr>
390 |     <td class="col-thirty"><strong>Fix</strong></td>
391 |     <td>Change to a valid protocol, for example, `http` may need to be `https`.</td>
392 |   </tr>
393 | </table>
394 | 
395 | This error occurs for tags that have an `href` or `src`
396 | that must be set to certain protocols.
397 | For example, many tags require `https`.
398 | 
399 | ### Mandatory property missing from attribute
400 | 
401 | <table>
402 |   <tr>
403 |   	<td class="col-thirty"><strong>Code</strong></td>
404 |   	<td>MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE</td>
405 |   </tr>
406 |    <tr>
407 |   	<td class="col-thirty"><strong>Format</strong></td>
408 |   	<td>"The property '%1' is missing from attribute '%2' in tag '%3'."</td>
409 |   </tr>
410 |    <tr>
411 |   	<td class="col-thirty"><strong>Fix</strong></td>
412 |   	<td>Add the missing property.</td>
413 |   </tr>
414 | </table>
415 | 
416 | Currently, this error occurs if these mandatory properties are missing:
417 | 
418 | * `content="...ie=..."`
419 | * `content="...width=..."`
420 | * `content="...minimum-scale=..."`
421 | 
422 | They refer to expected tags:
423 | 
424 | * `<meta http-equiv="X-UA-Compatible" content="ie=edge">`
425 | * `<meta name=viewport content="width=device-width;minimum-scale=1">`
426 | 
427 | ### Mutually exclusive attributes
428 | 
429 | <table>
430 |   <tr>
431 |   	<td class="col-thirty"><strong>Code</strong></td>
432 |   	<td>MUTUALLY_EXCLUSIVE_ATTRS</td>
433 |   </tr>
434 |    <tr>
435 |   	<td class="col-thirty"><strong>Format</strong></td>
436 |   	<td>"Mutually exclusive attributes encountered in tag '%1' - pick one of %2."</td>
437 |   </tr>
438 |    <tr>
439 |   	<td class="col-thirty"><strong>Fix</strong></td>
440 |   	<td>Remove one of the mutually exclusive attributes.</td>
441 |   </tr>
442 | </table>
443 | 
444 | This error occurs when a tag has both of the mutually exclusive attributes.
445 | For example, only one is allowed for the following tags:
446 | 
447 | * [amp-iframe](/docs/reference/extended/amp-iframe.html): `src` or `srcdoc`
448 | * [amp-jwplayer](/docs/reference/extended/amp-jwplayer.html): `data-media-id` or `data-playlist-id`
449 | 
450 | ### Missing mandatory attribute from list
451 | 
452 | <table>
453 |   <tr>
454 |   	<td class="col-thirty"><strong>Code</strong></td>
455 |   	<td>MANDATORY_ONEOF_ATTR_MISSING</td>
456 |   </tr>
457 |    <tr>
458 |   	<td class="col-thirty"><strong>Format</strong></td>
459 |   	<td>"The tag '%1' is missing a mandatory attribute - pick one of %2." </td>
460 |   </tr>
461 |    <tr>
462 |   	<td class="col-thirty"><strong>Fix</strong></td>
463 |   	<td>Add the missing mandatory attribute from the choice of attributes provided.</td>
464 |   </tr>
465 | </table>
466 | 
467 | This error occurs when a tag is missing one required attribute
468 | from multiple choices.
469 | For example, these tags require one attribute from two possible choices:
470 | 
471 | * [amp-twitter](/docs/reference/extended/amp-twitter.html): `data-tweetid` or `src`
472 | * [amp-instagram](/docs/reference/extended/amp-instagram.html): `data-shortcode` or `src`
473 | * [amp-iframe](/docs/reference/extended/amp-iframe.html): `src` or `srcdoc`
474 | * [amp-youtube](/docs/reference/extended/amp-youtube.html): `src` or `data-videoid`
475 | 
476 | ### Wrong parent tag
477 | 
478 | <table>
479 |   <tr>
480 |   	<td class="col-thirty"><strong>Code</strong></td>
481 |   	<td>WRONG_PARENT_TAG</td>
482 |   </tr>
483 |    <tr>
484 |   	<td class="col-thirty"><strong>Format</strong></td>
485 |   	<td>"The parent tag of tag '%1' is '%2', but it can only be '%3'."</td>
486 |   </tr>
487 |    <tr>
488 |   	<td class="col-thirty"><strong>Fix</strong></td>
489 |   	<td>Make the tag a direct child of the required parent.</td>
490 |   </tr>
491 | </table>
492 | 
493 | Specific tags require an immediate parent (as opposed to distant ancestor).
494 | The following lists the required parent for specific tags
495 | (tag, parent):
496 | 
497 | * `!doctype` requires parent tag `root`.
498 | * `html` requires parent tag `!doctype`.
499 | * `head` requires parent tag `html`.
500 | * `body` requires parent tag `html`.
501 | * `link` requires parent tag `head`.
502 | * `meta` requires parent tag `head`.
503 | * `style amp-custom` requires parent tag `head`.
504 | * `style` requires parent tag `boilerplate (noscript)`.
505 | * `noscript` requires parent tag `head`.
506 | * `script` requires parent tag `head`.
507 | * `source` requires a media tag (`amp-audio`, `amp-video`, etc.).
508 | 
509 | ### Disallowed tag ancestor
510 | 
511 | <table>
512 |   <tr>
513 |   	<td class="col-thirty"><strong>Code</strong></td>
514 |   	<td>DISALLOWED_TAG_ANCESTOR</td>
515 |   </tr>
516 |    <tr>
517 |   	<td class="col-thirty"><strong>Format</strong></td>
518 |   	<td>"The tag '%1' may not appear as a descendant of tag '%2'."</td>
519 |   </tr>
520 |    <tr>
521 |   	<td class="col-thirty"><strong>Fix</strong></td>
522 |   	<td>Remove (or move) the disallowed nested tag.</td>
523 |   </tr>
524 | </table>
525 | 
526 | This error occurs when a tag is a descendant of another tag
527 | which doesn't validate.
528 | Currently, the only example is a <code>template</code> tag,
529 | which may not be nested under another <code>template</code> tag.
530 | 
531 | ### Mandatory tag ancestor
532 | 
533 | <table>
534 |   <tr>
535 |   	<td class="col-thirty"><strong>Code</strong></td>
536 |   	<td>MANDATORY_TAG_ANCESTOR</td>
537 |   </tr>
538 |    <tr>
539 |   	<td class="col-thirty"><strong>Format</strong></td>
540 |   	<td>"The tag '%1' may only appear as a descendant of tag '%2'."</td>
541 |   </tr>
542 |    <tr>
543 |   	<td class="col-thirty"><strong>Fix</strong></td>
544 |   	<td>Either remove the tag or make it a descendant of the specific tag.</td>
545 |   </tr>
546 | </table>
547 | 
548 | Mandatory descendants are defined in the
549 | [AMP validator specification](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii)
550 | as `mandatory_ancestor`.
551 | 
552 | The error occurs when the following tags
553 | are missing their `mandatory_ancestor` (tag, ancestor):
554 | 
555 | * `img` must be a descendant of `noscript`.
556 | * `video` must be a descendant of `noscript`.
557 | * `audio` must be a descendant of `noscript`.
558 | * `noscript` must be a descendant of `body`.
559 | 
560 | ### Mandatory tag ancestor with hint
561 | 
562 | <table>
563 |   <tr>
564 |   	<td class="col-thirty"><strong>Code</strong></td>
565 |   	<td>MANDATORY_TAG_ANCESTOR_WITH_HINT</td>
566 |   </tr>
567 |    <tr>
568 |   	<td class="col-thirty"><strong>Format</strong></td>
569 |   	<td>"The tag '%1' may only appear as a descendant of tag '%2'. Did you mean '%3'?"</td>
570 |   </tr>
571 |    <tr>
572 |   	<td class="col-thirty"><strong>Fix</strong></td>
573 |   	<td>Remove the tag, make it a descendate of the specific tag, or replace the tag with the hinted tag.</td>
574 |   </tr>
575 | </table>
576 | 
577 | The error occurs when one of the following tags is found in the AMP document,
578 | and isn't properly nested in its mandatory parent:
579 | 
580 | * `img` isn't within `noscript` parent.
581 | * `video` isn't within `noscript` parent.
582 | * `audio` isn't within `noscript` parent.
583 | * `noscript` isn't within `body` parent.
584 | 
585 | ### Duplicate unique tag
586 | 
587 | <table>
588 |   <tr>
589 |   	<td class="col-thirty"><strong>Code</strong></td>
590 |   	<td>DUPLICATE_UNIQUE_TAG</td>
591 |   </tr>
592 |    <tr>
593 |   	<td class="col-thirty"><strong>Format</strong></td>
594 |   	<td>"The tag '%1' appears more than once in the document."</td>
595 |   </tr>
596 |    <tr>
597 |   	<td class="col-thirty"><strong>Fix</strong></td>
598 |   	<td>Remove one of the duplicate tags from the AMP document.</td>
599 |   </tr>
600 | </table>
601 | 
602 | This error occurs when exactly one instance of the tag is allowed,
603 | and a duplicate is found.
604 | 
605 | The full list of unique tags is known:
606 | 
607 | * `<doctype html>`
608 | * `<html amp>`
609 | * `<head>`
610 | * `<link rel=canonical href=...>`
611 | * `<link rel=amphtml href=...>`
612 | * `<meta charset="utf-8">`
613 | * `<meta viewport>`
614 | * `<style amp-custom>`
615 | * `<style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>`
616 | * `<body>`
617 | * `<script src="https://cdn.ampproject.org/v0.js">`
618 | 
619 | ## Style and layout errors
620 | 
621 | Before diving into style and layout errors,
622 | it's worth understanding how
623 | [styling](/docs/guides/responsive/style_pages.html) and
624 | [layout](/docs/guides/responsive/control_layout.html) work in AMP.
625 | Since AMP pages are HTML pages, styling is very much the same as any HTML page.
626 | But there are some restrictions to ensure pages load fast,
627 | and the AMP validator enforces these restrictions.
628 | 
629 | Layout is more controlled in AMP pages.
630 | Any tag that gets displayed on the page
631 | requires a pre-defined height and width,
632 | significantly reducing rendering and scrolling jank.
633 | This doesn't mean that you have to manually include these attributes.
634 | For certain layout types,
635 | the AMP validator won't throw errors
636 | as default values are assumed.
637 | 
638 | Each AMP tag has a ist of `supported_layouts`,
639 | as defined in the
640 | [AMP validator specification](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii).
641 | The validator will throw errors for unsupported layouts,
642 | and it will check validation rules for the pre-defined layout.
643 | 
644 | ### Stylesheet too long
645 | 
646 | <table>
647 |   <tr>
648 |   	<td class="col-thirty"><strong>Code</strong></td>
649 |   	<td>STYLESHEET_TOO_LONG</td>
650 |   </tr>
651 |    <tr>
652 |   	<td class="col-thirty"><strong>Format</strong></td>
653 |   	<td>"The author stylesheet specified in tag 'style' is too long - we saw %1 bytes whereas the limit is %2 bytes."</td>
654 |   </tr>
655 |    <tr>
656 |   	<td class="col-thirty"><strong>Fix</strong></td>
657 |   	<td>Reduce the size of the stylesheet to be under 50,000 bytes.</td>
658 |   </tr>
659 | </table>
660 | 
661 | The AMP validator throws this error
662 | when it measures the size of the styles content
663 | within `<style amp-custom>` to exceed the 50,000 bytes limit.
664 | 
665 | ### CSS syntax error
666 | 
667 | <table>
668 |    <tr>
669 |   	<td class="col-thirty"><strong>Code</strong></td>
670 |   	<td>CSS_SYNTAX</td>
671 |   </tr>
672 |    <tr>
673 |   	<td class="col-thirty"><strong>Format</strong></td>
674 |   	<td>"CSS syntax error in tag '%1' - %2."</td>
675 |   </tr>
676 |    <tr>
677 |   	<td class="col-thirty"><strong>Fix</strong></td>
678 |   	<td>Fix the CSS syntax error.</td>
679 |   </tr>
680 | </table>
681 | 
682 | This error occurs when you've CSS syntax errors
683 | in the specified tag.
684 | If you aren't sure what's causing the error,
685 | try running the CSS
686 | through an online CSS validator, for example,
687 | [csslint](http://csslint.net/).
688 | 
689 | ### CSS syntax error at specific rule
690 | 
691 | <table>
692 |   <tr>
693 |   	<td class="col-thirty"><strong>Code</strong></td>
694 |   	<td>CSS_SYNTAX_INVALID_AT_RULE</td>
695 |   </tr>
696 |    <tr>
697 |   	<td class="col-thirty"><strong>Format</strong></td>
698 |   	<td>"CSS syntax error in tag '%1' - saw invalid at rule '%2'."</td>
699 |   </tr>
700 |    <tr>
701 |   	<td class="col-thirty"><strong>Fix</strong></td>
702 |   	<td>Fix the specified CSS syntax error.</td>
703 |   </tr>
704 | </table>
705 | 
706 | This error refers to the @-rules within CSS,
707 | for which AMP only allows a handful of rules.
708 | (see also the [AMP specification](/docs/reference/spec.html)).
709 | For example, <code>@import</code> isn't allowed.
710 | The validation error specifically
711 | tells you the rule that's invalid,
712 | making it easier to fix that rule.
713 | 
714 | ### Implied layout isn't supported by AMP tag
715 | 
716 | <table>
717 |   <tr>
718 |   	<td class="col-thirty"><strong>Code</strong></td>
719 |   	<td>IMPLIED_LAYOUT_INVALID</td>
720 |   </tr>
721 |    <tr>
722 |   	<td class="col-thirty"><strong>Format</strong></td>
723 |   	<td>"The implied layout '%1' is not supported by tag '%2'."</td>
724 |   </tr>
725 |    <tr>
726 |   	<td class="col-thirty"><strong>Fix</strong></td>
727 |   	<td>Provide a valid layout attribute for the tag.</td>
728 |   </tr>
729 | </table>
730 | 
731 | This error occurs when you don't specify a layout for the AMP tag,
732 | and the implied layout (based on width, height, and sizes) isn't supported.
733 | Check the `supported_layout` values for the tag
734 | in the [AMP validator specification](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii).
735 | 
736 | Actual layout behavior is determined by the `layout` attribute.
737 | For more on how layout works,
738 | see [How to Control Layout](/docs/guides/responsive/control_layout.html) and
739 | the [AMP HTML layout system specification](https://github.com/ampproject/amphtml/blob/master/spec/amp-html-layout.md).
740 | 
741 | **Note:** If you don't specify the layout,
742 | and you don't include `width` and `height` values,
743 | the layout defaults to CONTAINER.
744 | The validator throws an error
745 | as CONTAINER isn't supported in any AMP tags.
746 | Specify a layout other than CONTAINER,
747 | or add a `width` and/or `height` value and the error goes away.
748 | 
749 | ### Attribute not allowed by implied layout
750 | 
751 | <table>
752 |   <tr>
753 |     <td class="col-thirty"><strong>Code</strong></td>
754 |     <td>ATTR_DISALLOWED_BY_IMPLIED_LAYOUT</td>
755 |   </tr>
756 |    <tr>
757 |     <td class="col-thirty"><strong>Format</strong></td>
758 |     <td>"The attribute '%1' in tag '%2' is disallowed by implied layout '%3'."</td>
759 |   </tr>
760 |    <tr>
761 |     <td class="col-thirty"><strong>Fix</strong></td>
762 |     <td>Remove the disallowed attribute from the tag,
763 |       or else specify a layout that allows it.</td>
764 |   </tr>
765 | </table>
766 | 
767 | This error occurs when you don't specify a layout for the AMP tag,
768 | and the implied layout contains a disallowed attribute.
769 | Disallowed attributes for layout types are described in the
770 | [AMP HTML layout system specification](https://github.com/ampproject/amphtml/blob/master/spec/amp-html-layout.md).
771 | 
772 | ### Specified layout isn't supported by AMP tag
773 | 
774 | <table>
775 |   <tr>
776 |   	<td class="col-thirty"><strong>Code</strong></td>
777 |   	<td>SPECIFIED_LAYOUT_INVALID</td>
778 |   </tr>
779 |    <tr>
780 |   	<td class="col-thirty"><strong>Format</strong></td>
781 |   	<td>"The specified layout '%1' is not supported by tag '%2'."</td>
782 |   </tr>
783 |    <tr>
784 |   	<td class="col-thirty"><strong>Fix</strong></td>
785 |   	<td>Specify a layout that is supported by the tag.</td>
786 |   </tr>
787 | </table>
788 | 
789 | This error occurs when the specified layout
790 | for the tag isn't supported.
791 | Check the `supported_layout` values for the tag
792 | in the [AMP validator specification](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii).
793 | 
794 | Actual layout behavior is determined by the `layout` attribute.
795 | For more on how layout works,
796 | see [How to Control Layout](/docs/guides/responsive/control_layout.html) and
797 | the [AMP HTML layout system specification](https://github.com/ampproject/amphtml/blob/master/spec/amp-html-layout.md).
798 | 
799 | ### Attribute not allowed by specified layout
800 | 
801 | <table>
802 |   <tr>
803 |     <td class="col-thirty"><strong>Code</strong></td>
804 |     <td>ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT</td>
805 |   </tr>
806 |    <tr>
807 |     <td class="col-thirty"><strong>Format</strong></td>
808 |     <td>"The attribute '%1' in tag '%2' is disallowed by implied layout '%3'."</td>
809 |   </tr>
810 |    <tr>
811 |     <td class="col-thirty"><strong>Fix</strong></td>
812 |     <td>Remove the disallowed attribute from the tag,
813 |       or else specify a layout that allows it.</td>
814 |   </tr>
815 | </table>
816 | 
817 | This error occurs when you specify a layout for the AMP tag,
818 | and the layout contains a disallowed attribute.
819 | Disallowed attributes for layout types are described in the
820 | [AMP HTML layout system specification](https://github.com/ampproject/amphtml/blob/master/spec/amp-html-layout.md).
821 | 
822 | ### Invalid value for attribute required by layout
823 | 
824 | <table>
825 |   <tr>
826 |   	<td class="col-thirty"><strong>Code</strong></td>
827 |   	<td>ATTR_VALUE_REQUIRED_BY_LAYOUT</td>
828 |   </tr>
829 |    <tr>
830 |   	<td class="col-thirty"><strong>Format</strong></td>
831 |   	<td>"Invalid value '%1' for attribute '%2' in tag '%3' - for layout '%4', set the attribute '%2' to value '%5'."</td>
832 |   </tr>
833 |    <tr>
834 |   	<td class="col-thirty"><strong>Fix</strong></td>
835 |   	<td>Set the attribute to the specified value.</td>
836 |   </tr>
837 | </table>
838 | 
839 | This error occurs when the attribute value is invalid for the specified layout.
840 | To understand what triggers this error,
841 | you need to familiarize yourself with
842 | the [different behaviors of layouts](/docs/guides/responsive/control_layout.html#size-and-position-elements).
843 | 
844 | Let's say you set the layout to be `fixed-height` and
845 | you include numeric values for both `height` and `width`.
846 | The `fixed-height` layout takes on a `height` value.
847 | The `width` attribute must not be present or else set to `auto`.
848 | The validator throws the ATTR_VALUE_REQUIRED_BY_LAYOUT.
849 | 
850 | ### Inconsistent units for width and height
851 | 
852 | <table>
853 |   <tr>
854 |   	<td class="col-thirty"><strong>Code</strong></td>
855 |   	<td>INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT</td>
856 |   </tr>
857 |    <tr>
858 |   	<td class="col-thirty"><strong>Format</strong></td>
859 |   	<td>"Inconsistent units for width and height in tag '%1' - width is specified in '%2' whereas height is specified in '%3'."</td>
860 |   </tr>
861 |    <tr>
862 |   	<td class="col-thirty"><strong>Fix</strong></td>
863 |   	<td>Provide consistent unit widths and heights.</td>
864 |   </tr>
865 | </table>
866 | 
867 | With the exception of `layout=fixed`,
868 | width and height attributes need to be expressed in the same units.
869 | When they are not, this error is triggered.
870 | 
871 | For example, `<amp-img src="" layout="responsive" width="42px" height="42rem">`,
872 | results in this error message:
873 | 
874 | "Inconsistent units for width and height in tag 'amp-img' - width is specified in 'px' whereas height is specified in 'rem'."
875 | 
876 | ## Templating errors
877 | 
878 | AMP pages can't include templating syntax,
879 | unless that syntax is within an AMP tag specifically
880 | designed to include templates, for example,
881 | [amp-mustache](/docs/reference/extended/amp-mustache.html).
882 | 
883 | It's OK to include templates in your source files,
884 | so long as the generated output of those files doesn't contain the templates
885 | (see also
886 | [Use CSS preprocessors](/docs/guides/responsive/style_pages.html#use-css-preprocessors)).
887 | 
888 | ### Attribute contains template syntax
889 | 
890 | <table>
891 |   <tr>
892 |   	<td class="col-thirty"><strong>Code</strong></td>
893 |   	<td>TEMPLATE_IN_ATTR_NAME</td>
894 |   </tr>
895 |    <tr>
896 |   	<td class="col-thirty"><strong>Format</strong></td>
897 |   	<td>"Mustache template syntax in attribute name '%1' in tag '%2'."</td>
898 |   </tr>
899 |    <tr>
900 |   	<td class="col-thirty"><strong>Fix</strong></td>
901 |   	<td>Remove Mustache template syntax from the attribute.</td>
902 |   </tr>
903 | </table>
904 | 
905 | This error occurs anytime the validator finds
906 | [Mustache template syntax](https://mustache.github.io/mustache.5.html)
907 | in an attribute value.
908 | 
909 | ### Attribute contains unescaped template syntax
910 | 
911 | <table>
912 |   <tr>
913 |   	<td class="col-thirty"><strong>Code</strong></td>
914 |   	<td>UNESCAPED_TEMPLATE_IN_ATTR_VALUE</td>
915 |   </tr>
916 |    <tr>
917 |   	<td class="col-thirty"><strong>Format</strong></td>
918 |   	<td>"The attribute '%1' in tag '%2' is set to '%3', which contains unescaped Mustache template syntax."</td>
919 |   </tr>
920 |    <tr>
921 |   	<td class="col-thirty"><strong>Fix</strong></td>
922 |   	<td>Escape the mustache template.</td>
923 |   </tr>
924 | </table>
925 | 
926 | This error occurs anytime the validator finds
927 | [unescaped Mustache template syntax](https://mustache.github.io/mustache.5.html)
928 | in an attribute value.
929 | 
930 | ### Attribute contains template partial
931 | 
932 | <table>
933 |   <tr>
934 |   	<td class="col-thirty"><strong>Code</strong></td>
935 |   	<td>TEMPLATE_PARTIAL_IN_ATTR_VALUE</td>
936 |   </tr>
937 |    <tr>
938 |   	<td class="col-thirty"><strong>Format</strong></td>
939 |   	<td>"The attribute '%1' in tag '%2' is set to '%3', which contains a Mustache template partial."</td>
940 |   </tr>
941 |    <tr>
942 |   	<td class="col-thirty"><strong>Fix</strong></td>
943 |   	<td>Remove the mustache partial.</td>
944 |   </tr>
945 | </table>
946 | 
947 | This error occurs anytime the validator finds a
948 | [Mustache partial](https://mustache.github.io/mustache.5.html)
949 | in an attribute value.
950 | 
951 | ## Deprecation errors
952 | 
953 | ### Deprecated tag
954 | 
955 | <table>
956 |   <tr>
957 |   	<td class="col-thirty"><strong>Code</strong></td>
958 |   	<td>DEPRECATED_TAG</td>
959 |   </tr>
960 |    <tr>
961 |   	<td class="col-thirty"><strong>Format</strong></td>
962 |   	<td>No error message defined as yet (no deprecated tags).</td>
963 |   </tr>
964 |    <tr>
965 |   	<td class="col-thirty"><strong>Fix</strong></td>
966 |   	<td>Remove the deprecated tag.</td>
967 |   </tr>
968 | </table>
969 | 
970 | This warning occurs when a previously valid AMP tag is found in the AMP document.
971 | It's only a warning; AMP documents with warnings continue to be valid.
972 | Currently no deprecated tags exist; the warning is reserved for future deprecations.
973 | 
974 | ### Deprecated attribute
975 | 
976 | <table>
977 |   <tr>
978 |   	<td class="col-thirty"><strong>Code</strong></td>
979 |   	<td>DEPRECATED_ATTR</td>
980 |   </tr>
981 |    <tr>
982 |   	<td class="col-thirty"><strong>Format</strong></td>
983 |   	<td>"The attribute '%1' in tag '%2' is deprecated - use '%3' instead."</td>
984 |   </tr>
985 |    <tr>
986 |   	<td class="col-thirty"><strong>Fix</strong></td>
987 |   	<td>As good practice, remove the deprecated attribute.</td>
988 |   </tr>
989 | </table>
990 | 
991 | This warning occurs when a previously valid AMP attribute is found in the AMP document.
992 | It's only a warning; AMP documents with warnings continue to be valid.
993 | 
994 | Identify deprecated attributes for each AMP tag
995 | by searching for `deprecation` in the
996 | [AMP validator specification](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii).
```

