├── .babelrc ├── .eslintrc ├── .github ├── ISSUE_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── semgrep.yml ├── .gitignore ├── .travis.yml ├── 3p ├── 3p.js ├── README.md ├── ampcontext-integration.js ├── ampcontext-lib.js ├── ampcontext.js ├── environment.js ├── facebook.js ├── frame-metadata.js ├── frame.max.html ├── github.js ├── iframe-messaging-client.js ├── iframe-transport-client-lib.js ├── iframe-transport-client.js ├── integration.js ├── messaging.js ├── nameframe.max.html ├── polyfills.js ├── reddit.js ├── remote.html └── twitter.js ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── GOVERNANCE.md ├── LICENSE ├── OWNERS.yaml ├── Procfile ├── README.md ├── SUPPORT.md ├── ads ├── OWNERS.yaml ├── README.md ├── _a4a-config.js ├── _config.js ├── _integration-guide.md ├── _ping_.js ├── a8.js ├── a8.md ├── a9.js ├── a9.md ├── accesstrade.js ├── accesstrade.md ├── adblade.js ├── adblade.md ├── adbutler.js ├── adbutler.md ├── adform.js ├── adform.md ├── adfox.js ├── adfox.md ├── adgeneration.js ├── adgeneration.md ├── adhese.js ├── adhese.md ├── adition.js ├── adition.md ├── adman.js ├── adman.md ├── admanmedia.js ├── admanmedia.md ├── adocean.js ├── adocean.md ├── adreactor.js ├── adreactor.md ├── ads.extern.js ├── adsnative.js ├── adsnative.md ├── adspeed.js ├── adspeed.md ├── adspirit.js ├── adspirit.md ├── adstir.js ├── adstir.md ├── adtech.js ├── adtech.md ├── adthrive.js ├── adthrive.md ├── aduptech.js ├── aduptech.md ├── adverline.js ├── adverline.md ├── adverticum.js ├── adverticum.md ├── advertserve.js ├── advertserve.md ├── affiliateb.js ├── affiliateb.md ├── alp │ ├── handler.js │ └── install-alp.js ├── amoad.js ├── amoad.md ├── appnexus.js ├── appnexus.md ├── atomx.js ├── atomx.md ├── bidtellect.js ├── bidtellect.md ├── brainy.js ├── brainy.md ├── bringhub.js ├── bringhub.md ├── caajainfeed.js ├── caajainfeed.md ├── capirs.js ├── capirs.md ├── caprofitx.js ├── caprofitx.md ├── chargeads.js ├── chargeads.md ├── colombia.js ├── colombia.md ├── contentad.js ├── contentad.md ├── criteo.js ├── criteo.md ├── custom.md ├── dable.js ├── dable.md ├── dianomi.md ├── directadvert.js ├── directadvert.md ├── distroscale.js ├── distroscale.md ├── dotandads.js ├── dotandads.md ├── eas.js ├── eas.md ├── engageya.js ├── engageya.md ├── eplanning.js ├── eplanning.md ├── ezoic.js ├── ezoic.md ├── f1e.js ├── f1e.md ├── f1h.js ├── f1h.md ├── felmat.js ├── felmat.md ├── flite.js ├── flite.md ├── fluct.js ├── fluct.md ├── fusion.js ├── fusion.md ├── genieessp.js ├── genieessp.md ├── gmossp.js ├── gmossp.md ├── google │ ├── OWNERS.yaml │ ├── a4a │ │ ├── docs │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── Network-Impl-Guide.md │ │ │ ├── RTBExchangeGuide.md │ │ │ └── a4a-readme.md │ │ ├── google-data-reporter.js │ │ ├── line-delimited-response-handler.js │ │ ├── performance.js │ │ ├── test │ │ │ ├── test-google-ads-a4a-config.js │ │ │ ├── test-google-data-reporter.js │ │ │ ├── test-line-delimited-response-handler.js │ │ │ ├── test-performance.js │ │ │ ├── test-traffic-experiments.js │ │ │ └── test-utils.js │ │ ├── traffic-experiments.js │ │ ├── url-builder.js │ │ └── utils.js │ ├── adsense-amp-auto-ads.js │ ├── adsense.js │ ├── adsense.md │ ├── correlator.js │ ├── csa.js │ ├── csa.md │ ├── doubleclick.js │ ├── doubleclick.md │ ├── imaVideo.js │ ├── test │ │ ├── test-adsense-amp-auto-ads.js │ │ ├── test-adsense.js │ │ ├── test-doubleclick.js │ │ └── test-utils.js │ └── utils.js ├── gumgum.js ├── gumgum.md ├── holder.js ├── holder.md ├── ibillboard.js ├── ibillboard.md ├── imedia.js ├── imedia.md ├── imobile.js ├── imobile.md ├── improvedigital.js ├── improvedigital.md ├── inabox │ ├── frame-overlay-helper.js │ ├── frame-overlay-manager.js │ ├── inabox-host.js │ ├── inabox-host.md │ ├── inabox-messaging-host.js │ ├── position-observer.js │ └── util.js ├── industrybrains.md ├── inmobi.js ├── inmobi.md ├── innity.js ├── innity.md ├── ix.js ├── ix.md ├── kargo.js ├── kargo.md ├── kiosked.js ├── kiosked.md ├── kixer.js ├── kixer.md ├── ligatus.js ├── ligatus.md ├── loka.js ├── loka.md ├── mads.js ├── mads.md ├── mantis.js ├── mantis.md ├── mediaimpact.js ├── mediaimpact.md ├── medianet.js ├── medianet.md ├── mediavine.js ├── mediavine.md ├── meg.js ├── meg.md ├── microad.js ├── microad.md ├── mixpo.js ├── mixpo.md ├── mywidget.js ├── mywidget.md ├── nativo.js ├── nativo.md ├── navegg.js ├── navegg.md ├── nend.js ├── nend.md ├── netletix.js ├── netletix.md ├── nokta.js ├── nokta.md ├── openadstream.js ├── openadstream.md ├── openx.js ├── openx.md ├── outbrain.js ├── outbrain.md ├── plista.js ├── plista.md ├── polymorphicads.js ├── polymorphicads.md ├── popin.js ├── popin.md ├── pubmatic.js ├── pubmatic.md ├── pubmine.js ├── pubmine.md ├── pulsepoint.js ├── pulsepoint.md ├── purch.js ├── purch.md ├── relap.js ├── relap.md ├── revcontent.js ├── revcontent.md ├── rubicon.js ├── rubicon.md ├── sharethrough.js ├── sharethrough.md ├── sklik.js ├── sklik.md ├── slimcutmedia.js ├── slimcutmedia.md ├── smartadserver.js ├── smartadserver.md ├── smartclip.js ├── smartclip.md ├── sogouad.js ├── sogouad.md ├── sortable.js ├── sortable.md ├── sovrn.js ├── sovrn.md ├── spotx.js ├── spotx.md ├── sunmedia.js ├── sunmedia.md ├── swoop.js ├── swoop.md ├── taboola.js ├── taboola.md ├── teads.js ├── teads.md ├── triplelift.js ├── triplelift.md ├── valuecommerce.js ├── valuecommerce.md ├── vmfive.js ├── vmfive.md ├── webediads.js ├── webediads.md ├── weborama.js ├── weborama.md ├── widespace.js ├── widespace.md ├── xlift.js ├── xlift.md ├── yahoo.js ├── yahoo.md ├── yahoojp.js ├── yahoojp.md ├── yandex.js ├── yandex.md ├── yieldbot.js ├── yieldbot.md ├── yieldmo.js ├── yieldmo.md ├── yieldone.js ├── yieldone.md ├── zedo.js ├── zedo.md ├── zergnet.js ├── zergnet.md ├── zucks.js └── zucks.md ├── build-system ├── OWNERS.yaml ├── SERVING.md ├── amp.extern.js ├── amp.nti.extern.js ├── amp.oti.extern.js ├── amp4test.js ├── app.js ├── config.js ├── conformance-config.textproto ├── dep-check-config.js ├── eslint-rules │ ├── dict-string-keys.js │ ├── enforce-private-props.js │ ├── no-array-destructuring.js │ ├── no-es2015-number-props.js │ ├── no-export-side-effect.js │ ├── no-for-of-statement.js │ ├── no-global.js │ ├── no-spread.js │ └── todo-format.js ├── exec.js ├── global-configs │ ├── README.md │ ├── canary-config.json │ ├── prod-config.json │ └── sw-config.json ├── internal-version.js ├── pr-check.js ├── release.sh ├── runner │ ├── .classpath │ ├── .project │ ├── build.xml │ ├── dist │ │ └── runner.jar │ ├── lib │ │ └── jar-in-jar-loader.zip │ ├── runner.iml │ ├── src │ │ └── org │ │ │ └── ampproject │ │ │ ├── AmpCodingConvention.java │ │ │ ├── AmpCommandLineRunner.java │ │ │ └── AmpPass.java │ └── test │ │ └── org │ │ └── ampproject │ │ ├── AmpPassTest.java │ │ └── AmpPassTestEnvTest.java ├── server-a4a-template.html ├── server-inabox-template.html ├── server.js ├── tasks │ ├── ava.js │ ├── babel-helpers.js │ ├── changelog.js │ ├── check-links.js │ ├── clean.js │ ├── compile-access-expr.js │ ├── compile-bind-expr.js │ ├── compile-css-expr.js │ ├── compile.js │ ├── csvify-size │ │ ├── index.js │ │ └── test.js │ ├── dep-check.js │ ├── extension-generator │ │ └── index.js │ ├── gen-codeowners │ │ ├── index.js │ │ └── test.js │ ├── get-zindex │ │ ├── index.js │ │ ├── test-2.css │ │ ├── test.css │ │ └── test.js │ ├── index.js │ ├── js-license.txt │ ├── jsify-css.js │ ├── json-check.js │ ├── karma.conf.js │ ├── lint.js │ ├── make-golden.js │ ├── package.json │ ├── prepend-global │ │ ├── index.js │ │ └── test.js │ ├── presubmit-checks.js │ ├── release-tagging.js │ ├── runtime-test.js │ ├── serve.js │ ├── size.js │ ├── todos.js │ ├── validator.js │ ├── visual-diff.js │ └── visual-diff.rb └── test-server.js ├── builtins ├── README.md ├── amp-img.js ├── amp-img.md ├── amp-pixel.js └── amp-pixel.md ├── caches.json ├── contributing ├── DESIGN_PRINCIPLES.md ├── DEVELOPING.md ├── OWNERS.yaml ├── building-an-amp-extension.md ├── component-validator-rules.md ├── creating-a-welcoming-community.md ├── creating-great-first-issues.md ├── design-reviews.md ├── getting-started-e2e.md ├── getting-started-quick.md ├── git_helpers.sh ├── great-first-issues-template.md ├── issue-priorities.md ├── owners-and-committers.md ├── release-schedule.md ├── working-groups.md └── writing-css.md ├── css ├── OWNERS.yaml ├── Z_INDEX.md └── amp.css ├── examples ├── 3q-player.amp.html ├── OWNERS.yaml ├── a4a-multisize.amp.html ├── a4a.amp.html ├── ac-creative.js ├── ad-lightbox.amp.html ├── ads-legacy.amp.html ├── ads.amp.html ├── adsense.amp.html ├── alp.amp.html ├── alp │ └── creative.html ├── amp-ad-exit.amp.html ├── amp-compare-slider.amp.html ├── amp-fresh.amp.html ├── amp-gist.amp.html ├── amp-imgur.amp.html ├── amp-position-observer.amp.html ├── amp-timeago.amp.html ├── amp-video.amp.html ├── amp-web-push.amp.html ├── amp-youtube.amp.html ├── ampcontext-creative-json.html ├── ampcontext-creative.html ├── analytics-error-reporting.amp.html ├── analytics-iframe-transport-remote-frame.html ├── analytics-iframe-transport.amp.html ├── analytics-notification.amp.html ├── analytics-vendors.amp.html ├── analytics.amp.html ├── analytics.config.json ├── animations.amp.html ├── apester-media.amp.html ├── article-access-laterpay.amp.html ├── article-access.amp.html ├── article-fixed-header.amp.html ├── article-parallax.amp.html ├── article-super-short.amp.html ├── article.amp.html ├── auto-ads.amp.html ├── autosuggest.amp.html ├── av │ ├── ForBiggerJoyrides.mp4 │ └── audio.mp3 ├── bind │ ├── basic.amp.html │ ├── carousels.amp.html │ ├── ecommerce.amp.html │ ├── errors.amp.html │ ├── forms.amp.html │ ├── game.amp.html │ ├── iframe.amp.html │ ├── img │ │ ├── ic_menu_white_24dp_1x.png │ │ ├── ic_menu_white_24dp_2x.png │ │ ├── ic_search_white_24dp_1x.png │ │ └── ic_search_white_24dp_2x.png │ ├── list.amp.html │ ├── live-list.amp.html │ ├── performance.amp.html │ ├── sandbox.amp.html │ ├── shirts │ │ ├── black.jpg │ │ ├── blue.jpg │ │ ├── brown.jpg │ │ ├── dark-green.jpg │ │ ├── gray.jpg │ │ ├── light-gray.jpg │ │ ├── navy.jpg │ │ ├── swatch │ │ │ ├── black.jpg │ │ │ ├── blue.jpg │ │ │ ├── brown.jpg │ │ │ ├── dark-green.jpg │ │ │ ├── gray.jpg │ │ │ ├── light-gray.jpg │ │ │ ├── navy.jpg │ │ │ └── wine.jpg │ │ └── wine.jpg │ ├── turing.amp.html │ ├── video.amp.html │ └── xhr.amp.html ├── brid-player.amp.html ├── brightcove.amp.html ├── carousel.amp.html ├── csa.amp.html ├── csp.amp.html ├── custom.ad.example.json ├── custom.ad.example.single.json ├── dailymotion.amp.html ├── doubleclick-multisize.amp.html ├── doubleclick-rtc.amp.html ├── everything.amp.html ├── experiment.amp.html ├── facebook.amp.html ├── fake-ad.amp.html ├── font.amp.html ├── fonts │ ├── ComicAMP.ttf │ └── ComicAMPBold.ttf ├── forms.amp.html ├── gfycat.amp.html ├── ima-video.amp.html ├── img │ ├── ampicon.png │ ├── analytics.gif │ ├── bigbuckbunny.jpg │ ├── cats-anim-placeholder.gif │ ├── cats-anim.gif │ ├── clock.jpg │ ├── hero@1x.jpg │ ├── hero@2x.jpg │ ├── ima-poster.png │ ├── sample.jpg │ ├── sea@1x.jpg │ ├── sea@2x.jpg │ └── x-icon.png ├── inabox-more.amp.html ├── inabox-tag-integration.js ├── inabox.amp.html ├── inabox.gpt.html ├── inabox.host.html ├── instagram.amp.html ├── izlesene.amp.html ├── jwplayer.amp.html ├── kaltura.amp.html ├── layout-flex-item.amp.html ├── live-blog-non-floating-button.amp.html ├── live-blog.amp.html ├── live-list-update.amp.html ├── live-list.amp.html ├── loads-windowcontext-creative-https.html ├── loads-windowcontext-creative.html ├── medium-manifest.json ├── metadata-examples │ ├── README.md │ ├── article-json-ld-twitter-card.amp.html │ ├── article-json-ld.amp.html │ ├── article-microdata.amp.html │ ├── recipe-json-ld.amp.html │ ├── recipe-microdata.amp.html │ ├── review-json-ld.amp.html │ ├── review-microdata.amp.html │ ├── sports-article-json-ld.amp.html │ ├── video-json-ld.amp.html │ └── video-microdata.amp.html ├── multiple-docs.html ├── nexxtv-player.amp.html ├── o2player.amp.html ├── old-boilerplate.amp.html ├── ooyalaplayer.amp.html ├── openx.amp.html ├── pinterest.amp.html ├── playbuzz.amp.html ├── pwa │ ├── pwa-ampdoc-shell.html │ ├── pwa-sw.js │ ├── pwa.html │ └── pwa.js ├── reach-player.amp.html ├── reddit.amp.html ├── refresh.amp.html ├── released.amp.html ├── responsive.amp.html ├── share-tracking-with-url.amp.html ├── share-tracking.amp.html ├── social-share.amp.html ├── soundcloud.amp.html ├── springboard-player.amp.html ├── standard-actions.amp.html ├── sticky.ads.0.1.amp.html ├── sticky.ads.amp.html ├── twitter.amp.html ├── user-notification.amp.html ├── vega-data │ ├── bar.json │ ├── map.json │ ├── miserables.json │ ├── nodes.json │ ├── unemployment.tsv │ ├── us-10m.json │ └── world-110m.json ├── viewer-cid.amp.html ├── viewer-iframe-poll.html ├── viewer-webview.html ├── viewer.html ├── vimeo.amp.html ├── vine.amp.html ├── visual-tests │ ├── amp-by-example │ │ ├── amp-by-example.html │ │ └── amp_by_example_logo.svg │ ├── article-access.amp │ │ ├── article-access.amp.html │ │ └── img │ │ │ ├── hero@1x.jpg │ │ │ ├── hero@2x.jpg │ │ │ ├── sample.jpg │ │ │ ├── sea@1x.jpg │ │ │ └── sea@2x.jpg │ ├── article.amp │ │ ├── article.amp.html │ │ └── img │ │ │ ├── hero@1x.jpg │ │ │ ├── hero@2x.jpg │ │ │ ├── sample.jpg │ │ │ ├── sea@1x.jpg │ │ │ └── sea@2x.jpg │ ├── blank-page │ │ └── .gitkeep │ ├── font.amp.404 │ │ └── font.amp.html │ └── font.amp │ │ ├── font.amp.html │ │ └── fonts │ │ ├── ComicAMP.ttf │ │ └── ComicAMPBold.ttf ├── viz-vega.amp.html ├── vrview.amp.html └── youtube.amp.html ├── extensions ├── README.md ├── amp-3q-player │ ├── 0.1 │ │ ├── amp-3q-player.js │ │ └── test │ │ │ ├── test-amp-3q-player.js │ │ │ ├── validator-amp-3q-player.html │ │ │ └── validator-amp-3q-player.out │ ├── amp-3q-player.md │ └── validator-amp-3q-player.protoascii ├── amp-a4a │ ├── 0.1 │ │ ├── a4a-variable-source.js │ │ ├── amp-a4a.js │ │ ├── legacy-signature-verifier.js │ │ ├── refresh-manager.js │ │ ├── signature-verifier.js │ │ └── test │ │ │ ├── fetch-mock.js │ │ │ ├── test-a4a-crypto.js │ │ │ ├── test-a4a-integration.js │ │ │ ├── test-a4a-var-source.js │ │ │ ├── test-amp-a4a.js │ │ │ ├── test-legacy-signature-verifier.js │ │ │ ├── test-refresh-manager.js │ │ │ ├── test-signature-verifier.js │ │ │ ├── testdata │ │ │ ├── .eslintrc │ │ │ ├── test_fragments.js │ │ │ ├── valid_css_at_rules_amp.original.html │ │ │ └── valid_css_at_rules_amp.reserialized.js │ │ │ └── utils.js │ ├── OWNERS.yaml │ ├── amp-a4a-format.md │ └── amp-a4a-internal.md ├── amp-access-laterpay │ ├── 0.1 │ │ ├── amp-access-laterpay.css │ │ ├── amp-access-laterpay.js │ │ ├── laterpay-impl.js │ │ └── test │ │ │ ├── test-amp-access-laterpay.js │ │ │ ├── validator-amp-access-laterpay.html │ │ │ └── validator-amp-access-laterpay.out │ ├── OWNERS.yaml │ ├── amp-access-laterpay.md │ └── validator-amp-access-laterpay.protoascii ├── amp-access │ ├── 0.1 │ │ ├── access-expr-impl.jison │ │ ├── access-expr-impl.js │ │ ├── access-expr-impl.md │ │ ├── access-expr.js │ │ ├── access-vendor.js │ │ ├── amp-access-client.js │ │ ├── amp-access-other.js │ │ ├── amp-access-server-jwt.js │ │ ├── amp-access-server.js │ │ ├── amp-access-vendor.js │ │ ├── amp-access.css │ │ ├── amp-access.js │ │ ├── amp-login-done-dialog.js │ │ ├── amp-login-done.html │ │ ├── amp-login-done.js │ │ ├── jwt.js │ │ ├── login-dialog.js │ │ ├── signin.js │ │ └── test │ │ │ ├── test-access-expr.js │ │ │ ├── test-amp-access-client.js │ │ │ ├── test-amp-access-other.js │ │ │ ├── test-amp-access-server-jwt.js │ │ │ ├── test-amp-access-server.js │ │ │ ├── test-amp-access-vendor.js │ │ │ ├── test-amp-access.js │ │ │ ├── test-amp-login-done-dialog.js │ │ │ ├── test-jwt.js │ │ │ ├── test-login-dialog.js │ │ │ ├── test-signin.js │ │ │ ├── validator-amp-access.html │ │ │ └── validator-amp-access.out │ ├── OWNERS.yaml │ ├── amp-access-analytics.md │ ├── amp-access.md │ └── validator-amp-access.protoascii ├── amp-accordion │ ├── 0.1 │ │ ├── amp-accordion.js │ │ └── test │ │ │ ├── test-amp-accordion.js │ │ │ ├── validator-amp-accordion.html │ │ │ └── validator-amp-accordion.out │ ├── OWNERS.yaml │ ├── amp-accordion.md │ └── validator-amp-accordion.protoascii ├── amp-ad-exit │ ├── 0.1 │ │ ├── amp-ad-exit.js │ │ ├── config.js │ │ ├── filters │ │ │ ├── click-delay.js │ │ │ ├── click-location.js │ │ │ ├── factory.js │ │ │ └── filter.js │ │ └── test │ │ │ └── test-amp-ad-exit.js │ ├── amp-ad-exit.md │ └── validator-amp-ad-exit.protoascii ├── amp-ad-network-adsense-impl │ ├── 0.1 │ │ ├── adsense-a4a-config.js │ │ ├── adsense-shared-state.js │ │ ├── amp-ad-network-adsense-impl.js │ │ └── test │ │ │ ├── test-adsense-a4a-config.js │ │ │ └── test-amp-ad-network-adsense-impl.js │ ├── OWNERS.yaml │ └── amp-ad-network-adsense-impl-internal.md ├── amp-ad-network-cloudflare-impl │ ├── 0.1 │ │ ├── amp-ad-network-cloudflare-impl.js │ │ ├── cloudflare-a4a-config.js │ │ ├── data │ │ │ ├── fake_a4a.html │ │ │ └── fake_a4a.json │ │ ├── test │ │ │ └── test-amp-ad-network-cloudflare-impl.js │ │ └── vendors.js │ ├── OWNERS.yaml │ └── amp-ad-network-cloudflare-impl-internal.md ├── amp-ad-network-doubleclick-impl │ ├── 0.1 │ │ ├── amp-ad-network-doubleclick-impl.js │ │ ├── doubleclick-a4a-config.js │ │ └── test │ │ │ ├── test-amp-ad-network-doubleclick-impl.js │ │ │ ├── test-doubleclick-a4a-config.js │ │ │ ├── test-doubleclick-integration.js │ │ │ ├── test-doubleclick-rtc.js │ │ │ └── test-doubleclick-sra.js │ ├── OWNERS.yaml │ └── amp-ad-network-doubleclick-impl-internal.md ├── amp-ad-network-fake-impl │ ├── 0.1 │ │ ├── amp-ad-network-fake-impl.js │ │ ├── data │ │ │ ├── demo_a4a_creative.out │ │ │ ├── fake_amp.json │ │ │ └── fake_amp_ad_with_iframe_transport.html │ │ └── fake-a4a-config.js │ ├── OWNERS.yaml │ └── amp-ad-network-fake-impl-internal.md ├── amp-ad-network-gmossp-impl │ ├── 0.1 │ │ ├── amp-ad-network-gmossp-impl.js │ │ ├── gmossp-a4a-config.js │ │ └── test │ │ │ └── test-amp-ad-network-gmossp-impl.js │ ├── OWNERS.yaml │ └── amp-ad-network-gmossp-impl-internal.md ├── amp-ad-network-triplelift-impl │ ├── 0.1 │ │ ├── amp-ad-network-triplelift-impl.js │ │ ├── test │ │ │ └── test-amp-ad-network-triplelift-impl.js │ │ └── triplelift-a4a-config.js │ ├── OWNERS.yaml │ └── amp-ad-network-triplelift-impl-internal.md ├── amp-ad │ ├── 0.1 │ │ ├── a2a-listener.js │ │ ├── amp-ad-3p-impl.js │ │ ├── amp-ad-custom.js │ │ ├── amp-ad-ui.js │ │ ├── amp-ad-xorigin-iframe-handler.js │ │ ├── amp-ad.css │ │ ├── amp-ad.js │ │ ├── concurrent-load.js │ │ └── test │ │ │ ├── test-a2a-listener.js │ │ │ ├── test-amp-ad-3p-impl.js │ │ │ ├── test-amp-ad-custom.js │ │ │ ├── test-amp-ad-ui.js │ │ │ ├── test-amp-ad-xorigin-iframe-handler.js │ │ │ ├── test-amp-ad.js │ │ │ ├── test-concurrent-load.js │ │ │ ├── validator-amp-ad.html │ │ │ └── validator-amp-ad.out │ ├── OWNERS.yaml │ ├── amp-ad.md │ └── validator-amp-ad.protoascii ├── amp-analytics │ ├── 0.1 │ │ ├── activity-impl.js │ │ ├── amp-analytics.js │ │ ├── analytics-root.js │ │ ├── events.js │ │ ├── iframe-transport-message-queue.js │ │ ├── iframe-transport.js │ │ ├── instrumentation.js │ │ ├── sandbox-vars-whitelist.js │ │ ├── test │ │ │ ├── test-amp-analytics.js │ │ │ ├── test-analytics-root.js │ │ │ ├── test-events.js │ │ │ ├── test-iframe-transport-client.js │ │ │ ├── test-iframe-transport-message-queue.js │ │ │ ├── test-iframe-transport.js │ │ │ ├── test-instrumentation.js │ │ │ ├── test-transport.js │ │ │ ├── test-variables.js │ │ │ ├── test-vendors.js │ │ │ ├── test-visibility-manager.js │ │ │ ├── test-visibility-model.js │ │ │ ├── validator-analytics-notification.html │ │ │ ├── validator-analytics-notification.out │ │ │ ├── validator-analytics.html │ │ │ ├── validator-analytics.out │ │ │ └── vendor-requests.json │ │ ├── transport.js │ │ ├── variables.js │ │ ├── vendors.js │ │ ├── visibility-manager.js │ │ └── visibility-model.js │ ├── OWNERS.yaml │ ├── amp-analytics.md │ ├── amp-video-analytics.md │ ├── analytics-vars.md │ ├── integrating-analytics.md │ ├── validator-amp-analytics.protoascii │ └── why-not-iframe.md ├── amp-anim │ ├── 0.1 │ │ ├── amp-anim.js │ │ └── test │ │ │ └── test-amp-anim.js │ ├── amp-anim.md │ └── validator-amp-anim.protoascii ├── amp-animation │ ├── 0.1 │ │ ├── amp-animation.js │ │ ├── css-expr-ast.js │ │ ├── css-expr-impl.jison │ │ ├── css-expr-impl.js │ │ ├── css-expr.js │ │ ├── keyframes-extractor.js │ │ ├── test │ │ │ ├── test-amp-animation.js │ │ │ ├── test-css-expr.js │ │ │ ├── test-keyframes-extractor.js │ │ │ ├── test-web-animations.js │ │ │ ├── validator-amp-animation.html │ │ │ └── validator-amp-animation.out │ │ ├── web-animation-types.js │ │ └── web-animations.js │ ├── OWNERS.yaml │ ├── amp-animation.md │ └── validator-amp-animation.protoascii ├── amp-apester-media │ ├── 0.1 │ │ ├── amp-apester-media.css │ │ ├── amp-apester-media.js │ │ └── test │ │ │ ├── test-amp-apester-media.js │ │ │ ├── validator-amp-apester-media.html │ │ │ └── validator-amp-apester-media.out │ ├── OWNERS.yaml │ ├── amp-apester-media.md │ └── validator-amp-apester-media.protoascii ├── amp-app-banner │ ├── 0.1 │ │ ├── amp-app-banner.css │ │ ├── amp-app-banner.js │ │ └── test │ │ │ ├── test-amp-app-banner.js │ │ │ ├── validator-amp-app-banner-missing-meta.html │ │ │ ├── validator-amp-app-banner-missing-meta.out │ │ │ ├── validator-amp-app-banner-only-one-meta.html │ │ │ ├── validator-amp-app-banner-only-one-meta.out │ │ │ ├── validator-amp-app-banner.html │ │ │ └── validator-amp-app-banner.out │ ├── OWNERS.yaml │ ├── amp-app-banner.md │ └── validator-amp-app-banner.protoascii ├── amp-audio │ ├── 0.1 │ │ ├── amp-audio.js │ │ └── test │ │ │ ├── test-amp-audio.js │ │ │ ├── validator-amp-audio.html │ │ │ ├── validator-amp-audio.out │ │ │ ├── validator-amp4ads-amp-audio.html │ │ │ └── validator-amp4ads-amp-audio.out │ ├── OWNERS.yaml │ ├── amp-audio.md │ └── validator-amp-audio.protoascii ├── amp-auto-ads │ ├── 0.1 │ │ ├── ad-network-config.js │ │ ├── ad-strategy.js │ │ ├── ad-tracker.js │ │ ├── amp-auto-ads.js │ │ ├── anchor-ad-strategy.js │ │ ├── attributes.js │ │ ├── placement.js │ │ └── test │ │ │ ├── test-ad-network-config.js │ │ │ ├── test-ad-strategy.js │ │ │ ├── test-ad-tracker.js │ │ │ ├── test-amp-auto-ads.js │ │ │ ├── test-anchor-ad-strategy.js │ │ │ ├── test-attributes.js │ │ │ ├── test-placement.js │ │ │ ├── validator-amp-auto-ads.html │ │ │ └── validator-amp-auto-ads.out │ ├── OWNERS.yaml │ ├── amp-auto-ads.md │ └── validator-amp-auto-ads.protoascii ├── amp-bind │ ├── 0.1 │ │ ├── amp-bind.js │ │ ├── amp-state.js │ │ ├── bind-evaluator.js │ │ ├── bind-events.js │ │ ├── bind-expr-defines.js │ │ ├── bind-expr-impl.jison │ │ ├── bind-expr-impl.js │ │ ├── bind-expr-impl.md │ │ ├── bind-expression.js │ │ ├── bind-impl.js │ │ ├── bind-validator.js │ │ └── test │ │ │ ├── integration │ │ │ └── test-bind-impl.js │ │ │ ├── test-amp-state.js │ │ │ ├── test-bind-evaluator.js │ │ │ ├── test-bind-expression.js │ │ │ ├── test-bind-validator.js │ │ │ ├── validator-amp-bind.html │ │ │ ├── validator-amp-bind.out │ │ │ ├── validator-autosuggest.html │ │ │ └── validator-autosuggest.out │ ├── OWNERS.yaml │ ├── amp-bind.md │ └── validator-amp-bind.protoascii ├── amp-brid-player │ ├── 0.1 │ │ ├── amp-brid-player.js │ │ └── test │ │ │ ├── test-amp-brid-player.js │ │ │ ├── validator-amp-brid-player.html │ │ │ └── validator-amp-brid-player.out │ ├── OWNERS.yaml │ ├── amp-brid-player.md │ └── validator-amp-brid-player.protoascii ├── amp-brightcove │ ├── 0.1 │ │ ├── amp-brightcove.js │ │ └── test │ │ │ ├── test-amp-brightcove.js │ │ │ ├── validator-amp-brightcove.html │ │ │ └── validator-amp-brightcove.out │ ├── OWNERS.yaml │ ├── amp-brightcove.md │ └── validator-amp-brightcove.protoascii ├── amp-call-tracking │ ├── 0.1 │ │ ├── amp-call-tracking.js │ │ └── test │ │ │ ├── test-amp-call-tracking.js │ │ │ ├── validator-amp-call-tracking.html │ │ │ └── validator-amp-call-tracking.out │ ├── OWNERS.yaml │ ├── amp-call-tracking.md │ └── validator-amp-call-tracking.protoascii ├── amp-carousel │ ├── 0.1 │ │ ├── amp-carousel.css │ │ ├── amp-carousel.js │ │ ├── base-carousel.js │ │ ├── base-slides.js │ │ ├── scrollable-carousel.js │ │ ├── slidescroll.js │ │ └── test │ │ │ ├── test-base-slide.js │ │ │ ├── test-scrollable-carousel.js │ │ │ ├── test-slidescroll.js │ │ │ ├── validator-amp-carousel.html │ │ │ └── validator-amp-carousel.out │ ├── OWNERS.yaml │ ├── amp-carousel-analytics.md │ ├── amp-carousel.md │ └── validator-amp-carousel.protoascii ├── amp-compare-slider │ ├── 0.1 │ │ ├── amp-compare-slider.js │ │ └── test │ │ │ └── test-amp-compare-slider.js │ └── amp-compare-slider.md ├── amp-crypto-polyfill │ ├── 0.1 │ │ └── amp-crypto-polyfill.js │ └── OWNERS.yaml ├── amp-dailymotion │ ├── 0.1 │ │ ├── amp-dailymotion.js │ │ └── test │ │ │ ├── test-amp-dailymotion.js │ │ │ ├── validator-amp-dailymotion.html │ │ │ └── validator-amp-dailymotion.out │ ├── OWNERS.yaml │ ├── amp-dailymotion.md │ └── validator-amp-dailymotion.protoascii ├── amp-dynamic-css-classes │ ├── 0.1 │ │ ├── amp-dynamic-css-classes.js │ │ └── test │ │ │ ├── test-dynamic-classes.js │ │ │ └── test-runtime-classes.js │ ├── amp-dynamic-css-classes.md │ └── validator-amp-dynamic-css-classes.protoascii ├── amp-experiment │ ├── 0.1 │ │ ├── amp-experiment.js │ │ ├── test │ │ │ ├── test-amp-experiment.js │ │ │ ├── test-variant.js │ │ │ ├── validator-amp-experiment.html │ │ │ └── validator-amp-experiment.out │ │ └── variant.js │ ├── OWNERS.yaml │ ├── amp-experiment.md │ └── validator-amp-experiment.protoascii ├── amp-facebook-comments │ ├── 0.1 │ │ ├── amp-facebook-comments.js │ │ └── test │ │ │ ├── validator-amp-facebook-comments.html │ │ │ └── validator-amp-facebook-comments.out │ ├── OWNERS.yaml │ ├── amp-facebook-comments.md │ └── validator-amp-facebook-comments.protoascii ├── amp-facebook-like │ ├── 0.1 │ │ ├── amp-facebook-like.js │ │ └── test │ │ │ ├── validator-amp-facebook-like.html │ │ │ └── validator-amp-facebook-like.out │ ├── OWNERS.yaml │ ├── amp-facebook-like.md │ └── validator-amp-facebook-like.protoascii ├── amp-facebook │ ├── 0.1 │ │ ├── amp-facebook.js │ │ └── test │ │ │ ├── test-amp-facebook.js │ │ │ ├── validator-amp-facebook.html │ │ │ └── validator-amp-facebook.out │ ├── OWNERS.yaml │ ├── amp-facebook.md │ └── validator-amp-facebook.protoascii ├── amp-fit-text │ ├── 0.1 │ │ ├── amp-fit-text.css │ │ ├── amp-fit-text.js │ │ └── test │ │ │ └── test-amp-fit-text.js │ ├── amp-fit-text.md │ └── validator-amp-fit-text.protoascii ├── amp-font │ ├── 0.1 │ │ ├── amp-font.js │ │ ├── fontloader.js │ │ └── test │ │ │ ├── test-amp-font.js │ │ │ ├── test-fontloader.js │ │ │ ├── validator-amp-font.html │ │ │ └── validator-amp-font.out │ ├── OWNERS.yaml │ ├── amp-font.md │ └── validator-amp-font.protoascii ├── amp-form │ ├── 0.1 │ │ ├── amp-form.css │ │ ├── amp-form.js │ │ ├── form-events.js │ │ ├── form-proxy.js │ │ ├── form-validators.js │ │ ├── form-verifiers.js │ │ ├── test │ │ │ ├── integration │ │ │ │ └── test-integration-form.js │ │ │ ├── test-amp-form.js │ │ │ ├── test-form-proxy.js │ │ │ ├── test-form-validators.js │ │ │ ├── test-form-verifiers.js │ │ │ └── test-validation-bubble.js │ │ └── validation-bubble.js │ ├── OWNERS.yaml │ ├── amp-form.md │ └── validator-amp-form.protoascii ├── amp-fresh │ ├── 0.1 │ │ ├── amp-fresh-manager.js │ │ ├── amp-fresh.css │ │ ├── amp-fresh.js │ │ └── test │ │ │ ├── test-amp-fresh-manager.js │ │ │ └── test-amp-fresh.js │ └── OWNERS.yaml ├── amp-fx-flying-carpet │ ├── 0.1 │ │ ├── amp-fx-flying-carpet.css │ │ ├── amp-fx-flying-carpet.js │ │ └── test │ │ │ ├── test-amp-fx-flying-carpet.js │ │ │ ├── validator-amp-flying-carpet.html │ │ │ └── validator-amp-flying-carpet.out │ ├── OWNERS.yaml │ ├── amp-fx-flying-carpet.md │ └── validator-amp-fx-flying-carpet.protoascii ├── amp-fx-parallax │ ├── 0.1 │ │ ├── amp-fx-parallax.js │ │ └── test │ │ │ └── test-amp-fx-parallax.js │ ├── OWNERS.yaml │ └── amp-fx-parallax.md ├── amp-gfycat │ ├── 0.1 │ │ ├── amp-gfycat.js │ │ └── test │ │ │ ├── test-amp-gfycat.js │ │ │ ├── validator-amp-gfycat.html │ │ │ └── validator-amp-gfycat.out │ ├── OWNERS.yaml │ ├── amp-gfycat.md │ └── validator-amp-gfycat.protoascii ├── amp-gist │ ├── 0.1 │ │ ├── amp-gist.js │ │ └── test │ │ │ └── test-amp-gist.js │ ├── OWNERS.yaml │ ├── amp-gist.md │ └── validator-amp-gist.protoascii ├── amp-google-vrview-image │ ├── 0.1 │ │ ├── amp-google-vrview-image.js │ │ └── test │ │ │ └── test-amp-google-vrview-image.js │ ├── OWNERS.yaml │ └── amp-google-vrview-image.md ├── amp-hulu │ ├── 0.1 │ │ ├── amp-hulu.js │ │ └── test │ │ │ └── test-amp-hulu.js │ ├── OWNERS.yaml │ ├── amp-hulu.md │ └── validator-amp-hulu.protoascii ├── amp-iframe │ ├── 0.1 │ │ ├── amp-iframe.js │ │ └── test │ │ │ ├── test-amp-iframe.js │ │ │ ├── validator-amp-iframe.html │ │ │ └── validator-amp-iframe.out │ ├── OWNERS.yaml │ ├── amp-iframe.md │ └── validator-amp-iframe.protoascii ├── amp-ima-video │ ├── 0.1 │ │ ├── amp-ima-video.js │ │ └── test │ │ │ ├── test-amp-ima-video.js │ │ │ ├── validator-amp-ima-video.html │ │ │ └── validator-amp-ima-video.out │ ├── amp-ima-video.md │ └── validator-amp-ima-video.protoascii ├── amp-image-lightbox │ ├── 0.1 │ │ ├── amp-image-lightbox.css │ │ ├── amp-image-lightbox.js │ │ └── test │ │ │ └── test-amp-image-lightbox.js │ ├── OWNERS.yaml │ ├── amp-image-lightbox.md │ └── validator-amp-image-lightbox.protoascii ├── amp-imgur │ ├── 0.1 │ │ ├── amp-imgur.js │ │ └── test │ │ │ ├── test-amp-imgur.js │ │ │ ├── validator-amp-imgur.html │ │ │ └── validator-amp-imgur.out │ ├── OWNERS.yaml │ ├── amp-imgur.md │ └── validator-amp-imgur.protoascii ├── amp-instagram │ ├── 0.1 │ │ ├── amp-instagram.css │ │ ├── amp-instagram.js │ │ └── test │ │ │ ├── test-amp-instagram.js │ │ │ ├── validator-amp-instagram.html │ │ │ └── validator-amp-instagram.out │ ├── OWNERS.yaml │ ├── amp-instagram.md │ └── validator-amp-instagram.protoascii ├── amp-install-serviceworker │ ├── 0.1 │ │ ├── amp-install-serviceworker.js │ │ └── test │ │ │ └── test-amp-install-serviceworker.js │ ├── OWNERS.yaml │ ├── amp-install-serviceworker.md │ └── validator-amp-install-serviceworker.protoascii ├── amp-izlesene │ ├── 0.1 │ │ ├── amp-izlesene.js │ │ └── test │ │ │ ├── test-amp-izlesene.js │ │ │ ├── validator-amp-izlesene.html │ │ │ └── validator-amp-izlesene.out │ ├── OWNERS.yaml │ ├── amp-izlesene.md │ └── validator-amp-izlesene.protoascii ├── amp-jwplayer │ ├── 0.1 │ │ ├── amp-jwplayer.js │ │ └── test │ │ │ ├── test-amp-jwplayer.js │ │ │ ├── validator-amp-jwplayer.html │ │ │ └── validator-amp-jwplayer.out │ ├── OWNERS.yaml │ ├── amp-jwplayer.md │ └── validator-amp-jwplayer.protoascii ├── amp-kaltura-player │ ├── 0.1 │ │ ├── amp-kaltura-player.js │ │ └── test │ │ │ ├── test-amp-kaltura-player.js │ │ │ ├── validator-amp-kaltura-player.html │ │ │ └── validator-amp-kaltura-player.out │ ├── OWNERS.yaml │ ├── amp-kaltura-player.md │ └── validator-amp-kaltura-player.protoascii ├── amp-lightbox-viewer │ ├── 0.1 │ │ ├── amp-lightbox-viewer.css │ │ ├── amp-lightbox-viewer.js │ │ ├── service │ │ │ ├── lightbox-manager-discovery.js │ │ │ └── lightbox-manager-impl.js │ │ └── test │ │ │ └── test-amp-lightbox-viewer.js │ └── OWNERS.yaml ├── amp-lightbox │ ├── 0.1 │ │ ├── amp-lightbox.css │ │ └── amp-lightbox.js │ ├── OWNERS.yaml │ ├── amp-lightbox.md │ └── validator-amp-lightbox.protoascii ├── amp-list │ ├── 0.1 │ │ ├── amp-list.js │ │ └── test │ │ │ ├── test-amp-list.js │ │ │ ├── validator-amp-list.html │ │ │ └── validator-amp-list.out │ ├── amp-list.md │ └── validator-amp-list.protoascii ├── amp-live-list │ ├── 0.1 │ │ ├── amp-live-list.css │ │ ├── amp-live-list.js │ │ ├── live-list-manager.js │ │ ├── poller.js │ │ └── test │ │ │ ├── test-amp-live-list.js │ │ │ ├── test-live-list-manager.js │ │ │ ├── test-poller.js │ │ │ ├── validator-amp-live-list.html │ │ │ └── validator-amp-live-list.out │ ├── OWNERS.yaml │ ├── amp-live-list-server-side-filtering.md │ ├── amp-live-list.md │ └── validator-amp-live-list.protoascii ├── amp-mustache │ ├── 0.1 │ │ ├── amp-mustache.js │ │ └── test │ │ │ ├── test-amp-mustache.js │ │ │ ├── validator-amp-mustache.html │ │ │ └── validator-amp-mustache.out │ ├── amp-mustache.md │ └── validator-amp-mustache.protoascii ├── amp-nexxtv-player │ ├── 0.1 │ │ ├── amp-nexxtv-player.js │ │ └── test │ │ │ ├── test-amp-nexxtv-player.js │ │ │ ├── validator-amp-nexxtv-player.html │ │ │ └── validator-amp-nexxtv-player.out │ ├── OWNERS.yaml │ ├── amp-nexxtv-player.md │ └── validator-amp-nexxtv-player.protoascii ├── amp-o2-player │ ├── 0.1 │ │ ├── amp-o2-player.js │ │ └── test │ │ │ ├── test-amp-o2-player.js │ │ │ ├── validator-amp-o2-player.html │ │ │ └── validator-amp-o2-player.out │ ├── OWNERS.yaml │ ├── amp-o2-player.md │ └── validator-amp-o2-player.protoascii ├── amp-ooyala-player │ ├── 0.1 │ │ ├── amp-ooyala-player.js │ │ └── test │ │ │ ├── test-amp-ooyala.js │ │ │ ├── validator-amp-ooyala.html │ │ │ └── validator-amp-ooyala.out │ ├── OWNERS.yaml │ ├── amp-ooyala-player.md │ └── validator-amp-ooyala-player.protoascii ├── amp-pinterest │ ├── 0.1 │ │ ├── amp-pinterest.css │ │ ├── amp-pinterest.js │ │ ├── follow-button.js │ │ ├── pin-widget.js │ │ ├── pinit-button.js │ │ ├── test │ │ │ ├── test-amp-pinterest.js │ │ │ ├── validator-amp-pinterest.html │ │ │ └── validator-amp-pinterest.out │ │ └── util.js │ ├── OWNERS.yaml │ ├── amp-pinterest.md │ └── validator-amp-pinterest.protoascii ├── amp-playbuzz │ ├── 0.1 │ │ ├── amp-playbuzz.css │ │ ├── amp-playbuzz.js │ │ ├── images.js │ │ ├── test │ │ │ ├── test-amp-playbuzz.js │ │ │ ├── validator-amp-playbuzz.html │ │ │ └── validator-amp-playbuzz.out │ │ └── utils.js │ ├── OWNERS.yaml │ ├── amp-playbuzz.md │ └── validator-amp-playbuzz.protoascii ├── amp-position-observer │ ├── 0.1 │ │ ├── amp-position-observer.js │ │ └── test │ │ │ ├── test-amp-position-observer.js │ │ │ ├── validator-amp-position-observer.html │ │ │ └── validator-amp-position-observer.out │ ├── OWNERS.yaml │ ├── amp-position-observer.md │ └── validator-amp-position-observer.protoascii ├── amp-reach-player │ ├── 0.1 │ │ ├── amp-reach-player.js │ │ └── test │ │ │ ├── test-amp-reach-player.js │ │ │ ├── validator-amp-reach-player.html │ │ │ └── validator-amp-reach-player.out │ ├── OWNERS.yaml │ ├── amp-reach-player.md │ └── validator-amp-reach-player.protoascii ├── amp-reddit │ ├── 0.1 │ │ ├── amp-reddit.js │ │ └── test │ │ │ └── test-amp-reddit.js │ ├── OWNERS.yaml │ ├── amp-reddit.md │ └── validator-amp-reddit.protoascii ├── amp-selector │ ├── 0.1 │ │ ├── amp-selector.css │ │ ├── amp-selector.js │ │ └── test │ │ │ ├── test-amp-selector.js │ │ │ ├── validator-amp-selector.html │ │ │ └── validator-amp-selector.out │ ├── OWNERS.yaml │ ├── amp-selector.md │ └── validator-amp-selector.protoascii ├── amp-share-tracking │ ├── 0.1 │ │ ├── amp-share-tracking.js │ │ └── test │ │ │ └── test-amp-share-tracking.js │ ├── OWNERS.yaml │ └── amp-share-tracking.md ├── amp-sidebar │ ├── 0.1 │ │ ├── amp-sidebar.css │ │ ├── amp-sidebar.js │ │ ├── test │ │ │ ├── test-amp-sidebar.js │ │ │ ├── test-toolbar.js │ │ │ ├── validator-amp-sidebar.html │ │ │ └── validator-amp-sidebar.out │ │ └── toolbar.js │ ├── 1.0 │ │ ├── amp-sidebar-1.0.md │ │ ├── amp-sidebar.css │ │ ├── amp-sidebar.js │ │ ├── test │ │ │ ├── test-amp-sidebar.js │ │ │ ├── test-toolbar.js │ │ │ ├── validator-amp-sidebar.html │ │ │ └── validator-amp-sidebar.out │ │ └── toolbar.js │ ├── OWNERS.yaml │ ├── amp-sidebar.md │ └── validator-amp-sidebar.protoascii ├── amp-slides │ ├── 0.1 │ │ └── amp-slides.js │ ├── amp-slides-deprecated.md │ └── validator-amp-slides.protoascii ├── amp-social-share │ ├── 0.1 │ │ ├── amp-social-share-config.js │ │ ├── amp-social-share.css │ │ ├── amp-social-share.js │ │ └── test │ │ │ ├── test-amp-social-share.js │ │ │ ├── validator-amp-social-share.html │ │ │ └── validator-amp-social-share.out │ ├── OWNERS.yaml │ ├── amp-social-share.md │ └── validator-amp-social-share.protoascii ├── amp-soundcloud │ ├── 0.1 │ │ ├── amp-soundcloud.js │ │ └── test │ │ │ ├── test-amp-soundcloud.js │ │ │ ├── validator-amp-soundcloud.html │ │ │ └── validator-amp-soundcloud.out │ ├── OWNERS.yaml │ ├── amp-soundcloud.md │ └── validator-amp-soundcloud.protoascii ├── amp-springboard-player │ ├── 0.1 │ │ ├── amp-springboard-player.js │ │ └── test │ │ │ ├── test-amp-springboard-player.js │ │ │ ├── validator-amp-springboard-player.html │ │ │ └── validator-amp-springboard-player.out │ ├── OWNERS.yaml │ ├── amp-springboard-player.md │ └── validator-amp-springboard-player.protoascii ├── amp-sticky-ad │ ├── 0.1 │ │ └── test │ │ │ ├── validator-amp-sticky-ad.html │ │ │ └── validator-amp-sticky-ad.out │ ├── 1.0 │ │ ├── amp-sticky-ad.css │ │ ├── amp-sticky-ad.js │ │ └── test │ │ │ ├── test-amp-sticky-ad.js │ │ │ ├── validator-amp-sticky-ad.html │ │ │ └── validator-amp-sticky-ad.out │ ├── OWNERS.yaml │ ├── amp-sticky-ad.md │ └── validator-amp-sticky-ad.protoascii ├── amp-timeago │ ├── 0.1 │ │ ├── amp-timeago.js │ │ └── test │ │ │ ├── test-amp-timeago.js │ │ │ ├── validator-amp-timeago.html │ │ │ └── validator-amp-timeago.out │ ├── amp-timeago.md │ └── validator-amp-timeago.protoascii ├── amp-twitter │ ├── 0.1 │ │ ├── amp-twitter.js │ │ └── test │ │ │ ├── test-amp-twitter.js │ │ │ ├── validator-amp-twitter.html │ │ │ └── validator-amp-twitter.out │ ├── amp-twitter.md │ └── validator-amp-twitter.protoascii ├── amp-user-notification │ ├── 0.1 │ │ ├── amp-user-notification.css │ │ ├── amp-user-notification.js │ │ └── test │ │ │ ├── test-amp-user-notification.js │ │ │ ├── validator-amp-user-notification.html │ │ │ └── validator-amp-user-notification.out │ ├── amp-user-notification.md │ └── validator-amp-user-notification.protoascii ├── amp-video │ ├── 0.1 │ │ ├── amp-video.js │ │ └── test │ │ │ └── test-amp-video.js │ ├── OWNERS.yaml │ ├── amp-video.md │ └── validator-amp-video.protoascii ├── amp-viewer-integration │ ├── 0.1 │ │ ├── amp-viewer-integration.js │ │ ├── examples │ │ │ └── amp-viewer-host.js │ │ ├── messaging │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── messaging.js │ │ │ └── package.json │ │ ├── test │ │ │ ├── integration │ │ │ │ ├── test-amp-viewer-integration.js │ │ │ │ ├── test-amp-webview-viewer-integration.js │ │ │ │ └── test-viewer-initiated-handshake.js │ │ │ ├── test-touch-handler.js │ │ │ ├── viewer-for-testing.js │ │ │ ├── viewer-initiated-handshake-viewer-for-testing.js │ │ │ └── webview-viewer-for-testing.js │ │ └── touch-handler.js │ ├── OWNERS.yaml │ ├── TICKEVENTS.md │ ├── img │ │ ├── intro.png │ │ ├── mobile-web-handshake1.png │ │ ├── mobile-web-handshake2.png │ │ ├── mobile-web-handshake3.png │ │ ├── mobile-web-handshake4.png │ │ ├── swipe.png │ │ ├── webview-connection1.png │ │ ├── webview-connection2.png │ │ ├── webview-connection3.png │ │ ├── webview-connection4.png │ │ ├── webview-connection5.png │ │ ├── webview-handshake1.png │ │ ├── webview-handshake2.png │ │ └── webview-handshake3.png │ └── integrating-viewer-with-amp-doc-guide.md ├── amp-vimeo │ ├── 0.1 │ │ ├── amp-vimeo.js │ │ └── test │ │ │ ├── test-amp-vimeo.js │ │ │ ├── validator-amp-vimeo.html │ │ │ └── validator-amp-vimeo.out │ ├── OWNERS.yaml │ ├── amp-vimeo.md │ └── validator-amp-vimeo.protoascii ├── amp-vine │ ├── 0.1 │ │ ├── amp-vine.js │ │ └── test │ │ │ ├── test-amp-vine.js │ │ │ ├── validator-amp-vine.html │ │ │ └── validator-amp-vine.out │ ├── OWNERS.yaml │ ├── amp-vine.md │ └── validator-amp-vine.protoascii ├── amp-viz-vega │ ├── 0.1 │ │ ├── amp-viz-vega.css │ │ └── amp-viz-vega.js │ ├── OWNERS.yaml │ └── amp-viz-vega.md ├── amp-web-push │ ├── 0.1 │ │ ├── amp-web-push-config.js │ │ ├── amp-web-push-helper-frame.html │ │ ├── amp-web-push-helper-frame.js │ │ ├── amp-web-push-permission-dialog.html │ │ ├── amp-web-push-permission-dialog.js │ │ ├── amp-web-push-widget.js │ │ ├── amp-web-push.css │ │ ├── amp-web-push.js │ │ ├── amp-web-push.service-worker.js │ │ ├── iframehost.js │ │ ├── test │ │ │ ├── test-web-push-config.js │ │ │ ├── test-web-push-permission-dialog.js │ │ │ ├── test-web-push-service.js │ │ │ ├── validator-amp-web-push.html │ │ │ └── validator-amp-web-push.out │ │ ├── vars.js │ │ ├── web-push-service.js │ │ └── window-messenger.js │ ├── amp-web-push.md │ └── validator-amp-web-push.protoascii └── amp-youtube │ ├── 0.1 │ ├── amp-youtube.js │ └── test │ │ ├── test-amp-youtube.js │ │ ├── validator-amp-youtube.html │ │ └── validator-amp-youtube.out │ ├── OWNERS.yaml │ ├── amp-youtube.md │ └── validator-amp-youtube.protoascii ├── gulpfile.js ├── package.json ├── screenshots └── test │ └── manual │ ├── amp-anim.amp.html.png │ ├── amp-carousel.amp.html.png │ ├── amp-fit-text.amp.html.png │ ├── amp-iframe.amp.html.png │ ├── amp-image-lightbox.amp.html.png │ ├── amp-img.amp.html.png │ └── amp-lightbox.amp.html.png ├── spec ├── amp-actions-and-events.md ├── amp-boilerplate.md ├── amp-cache-debugging.md ├── amp-cache-guidelines.md ├── amp-cache-modifications.everything.amp.html ├── amp-cache-modifications.everything.cache.html ├── amp-cache-modifications.md ├── amp-cors-requests.md ├── amp-errors.md ├── amp-html-components.md ├── amp-html-format.md ├── amp-html-layout.md ├── amp-html-templates.md ├── amp-iframe-origin-policy.md ├── amp-managing-user-state.md ├── amp-shadow-doc.md ├── amp-tag-addendum.md ├── amp-var-substitutions.md ├── amp-versioning-policy.md └── img │ ├── contexts-with-different-storage.png │ ├── identifiers-for-use-cases.png │ ├── link-form-identifier-forwarding.png │ ├── link-identifier-forwarding-example-1.png │ └── link-identifier-forwarding-example-2.png ├── src ├── .eslintrc ├── 3p-frame-messaging.js ├── 3p-frame.js ├── OWNERS.yaml ├── action-trust.js ├── ad-cid.js ├── ad-helper.js ├── amp-babel.js ├── amp-events.js ├── amp-shadow-babel.js ├── amp-shadow.js ├── amp.js ├── analytics.js ├── anchor-click-interceptor.js ├── animation.js ├── base-element.js ├── batched-json.js ├── chunk.js ├── common-signals.js ├── config.js ├── cookies.js ├── curve.js ├── custom-element.js ├── document-ready.js ├── document-submit.js ├── dom.js ├── element-service.js ├── element-stub.js ├── error.js ├── event-helper-listen.js ├── event-helper.js ├── examiner │ └── examiner.js ├── experiments.js ├── exponential-backoff.js ├── extension-analytics.js ├── finite-state-machine.js ├── focus-history.js ├── font-stylesheet-timeout.js ├── form.js ├── friendly-iframe-embed.js ├── full-overlay-frame-helper.js ├── gesture-recognizers.js ├── gesture.js ├── get-html.js ├── iframe-attributes.js ├── iframe-helper.js ├── impression.js ├── inabox │ ├── amp-inabox.js │ ├── inabox-iframe-messaging-client.js │ └── inabox-viewport.js ├── input.js ├── intersection-observer-polyfill.js ├── intersection-observer.js ├── json.js ├── layout-delay-meter.js ├── layout-rect.js ├── layout.js ├── loader.js ├── log.js ├── mediasession-helper.js ├── mode-object.js ├── mode.js ├── motion.js ├── observable.js ├── pass.js ├── polyfills.js ├── polyfills │ ├── array-includes.js │ ├── document-contains.js │ ├── domtokenlist-toggle.js │ ├── math-sign.js │ ├── object-assign.js │ └── promise.js ├── preconnect.js ├── pull-to-refresh.js ├── render-delaying-services.js ├── runtime.js ├── sanitizer.js ├── service-worker │ ├── .eslintrc │ ├── core.js │ ├── install.js │ ├── kill.js │ └── shell.js ├── service.js ├── service │ ├── action-impl.js │ ├── ampdoc-impl.js │ ├── batched-xhr-impl.js │ ├── cid-api.js │ ├── cid-impl.js │ ├── crypto-impl.js │ ├── document-click.js │ ├── document-info-impl.js │ ├── document-state.js │ ├── extension-location.js │ ├── extensions-impl.js │ ├── fixed-layer.js │ ├── history-impl.js │ ├── ie-media-bug.js │ ├── jank-meter.js │ ├── parallax-impl.js │ ├── performance-impl.js │ ├── platform-impl.js │ ├── position-observer-impl.js │ ├── resource.js │ ├── resources-impl.js │ ├── standard-actions-impl.js │ ├── storage-impl.js │ ├── task-queue.js │ ├── template-impl.js │ ├── timer-impl.js │ ├── url-replacements-impl.js │ ├── variable-source.js │ ├── video-manager-impl.js │ ├── video-session-manager.js │ ├── viewer-cid-api.js │ ├── viewer-impl.js │ ├── viewport │ │ ├── ios-scrollfreeze-bug.js │ │ ├── viewport-binding-def.js │ │ ├── viewport-binding-ios-embed-wrapper.js │ │ ├── viewport-binding-natural-ios-embed.js │ │ ├── viewport-binding-natural.js │ │ └── viewport-impl.js │ ├── vsync-impl.js │ └── xhr-impl.js ├── services.js ├── shadow-embed.js ├── size-list.js ├── srcset.js ├── string.js ├── style-installer.js ├── style.js ├── time.js ├── transition.js ├── types.js ├── url-parse-query-string.js ├── url-try-decode-uri-component.js ├── url.js ├── utils │ ├── array.js │ ├── base64.js │ ├── bytes.js │ ├── dom-fingerprint.js │ ├── function.js │ ├── key-codes.js │ ├── math.js │ ├── object.js │ ├── pem.js │ ├── priority-queue.js │ ├── promise.js │ ├── rate-limit.js │ └── signals.js ├── validator-integration.js ├── video-interface.js ├── visibility-state.js ├── web-components.js ├── web-worker │ ├── amp-worker.js │ ├── web-worker-defines.js │ ├── web-worker-polyfills.js │ └── web-worker.js ├── window-interface.js └── worker-error-reporting.js ├── system.properties ├── test ├── OWNERS.yaml ├── SIZE.md ├── _init_tests.js ├── fixtures │ ├── 3p-ad.html │ ├── bind-basic.html │ ├── bind-brightcove.html │ ├── bind-carousel.html │ ├── bind-form.html │ ├── bind-iframe.html │ ├── bind-list.html │ ├── bind-live-list.html │ ├── bind-selector.html │ ├── bind-video.html │ ├── bind-youtube.html │ ├── boilerplate-new-visibility.html │ ├── boilerplate-old-opacity.html │ ├── carousels.html │ ├── configuration.html │ ├── doubleclick.html │ ├── errors.html │ ├── images.html │ ├── released.html │ ├── script-load-extension-footer-v0-footer.html │ ├── script-load-extension-head-v0-head.html │ ├── script-load-extensions.html │ ├── script-load-v0-footer-extension-footer.html │ ├── script-load-v0-head-extension-footer.html │ ├── script-load-v0-head-extension-head.html │ ├── served │ │ ├── ampdoc-with-messaging.html │ │ ├── iframe-clicktoplay.html │ │ ├── iframe-intersection-outer.html │ │ ├── iframe-intersection.html │ │ ├── iframe-resize-outer.html │ │ ├── iframe-stub.html │ │ └── iframe.html │ ├── video-players.html │ └── visibility-state.html ├── functional │ ├── 3p │ │ ├── test-3p-messaging.js │ │ ├── test-ampcontext-integration.js │ │ └── test-iframe-messaging-client.js │ ├── TEST_FAILURE_AND_CRASH.json │ ├── TEST_FAILURE_BLOB2.json │ ├── TEST_FAILURE_BLOBS.json │ ├── ads │ │ └── test-csa.js │ ├── generate-testdata-experiments.js_ │ ├── inabox │ │ ├── test-inabox-frame-overlay-manager.js │ │ ├── test-inabox-messaging-host.js │ │ ├── test-inabox-viewport.js │ │ └── test-position-observer.js │ ├── test-3p-environment.js │ ├── test-3p.js │ ├── test-action.js │ ├── test-activity.js │ ├── test-ad-cid.js │ ├── test-ad-helper.js │ ├── test-ads-config.js │ ├── test-alp-handler.js │ ├── test-amp-context.js │ ├── test-amp-img.js │ ├── test-amp-pixel.js │ ├── test-ampdoc.js │ ├── test-analytics.js │ ├── test-anchor-click-interceptor.js │ ├── test-animation.js │ ├── test-base-element.js │ ├── test-batched-xhr.js │ ├── test-cache-sw-core.js │ ├── test-chunk.js │ ├── test-cid-api.js │ ├── test-cid.js │ ├── test-cookies.js │ ├── test-crypto.js │ ├── test-curve.js │ ├── test-custom-element.js │ ├── test-describes.js │ ├── test-document-click.js │ ├── test-document-info.js │ ├── test-document-ready.js │ ├── test-document-state.js │ ├── test-document-submit.js │ ├── test-dom.js │ ├── test-element-service.js │ ├── test-error.js │ ├── test-event-helper.js │ ├── test-experiments.js │ ├── test-exponential-backoff.js │ ├── test-extension-analytics.js │ ├── test-extension-location.js │ ├── test-extensions.js │ ├── test-finite-state-machine.js │ ├── test-fixed-layer.js │ ├── test-focus-history.js │ ├── test-font-stylesheet-timeout.js │ ├── test-friendly-iframe-embed.js │ ├── test-gesture-recognizers.js │ ├── test-gesture.js │ ├── test-get-html.js │ ├── test-history.js │ ├── test-ie-media-bug.js │ ├── test-iframe-helper.js │ ├── test-iframe-stub.js │ ├── test-impression.js │ ├── test-input.js │ ├── test-integration.js │ ├── test-intersection-observer-polyfill.js │ ├── test-intersection-observer.js │ ├── test-ios-scrollfreeze-bug.js │ ├── test-jank-meter.js │ ├── test-json.js │ ├── test-layout-delay-meter.js │ ├── test-layout-rect.js │ ├── test-layout.js │ ├── test-log.js │ ├── test-mediasession-helper.js │ ├── test-mode.js │ ├── test-motion.js │ ├── test-mustache.js │ ├── test-object.js │ ├── test-observable.js │ ├── test-pass.js │ ├── test-performance.js │ ├── test-platform.js │ ├── test-polyfill-array-includes.js │ ├── test-polyfill-document-contains.js │ ├── test-polyfill-domtokenlist-toggle.js │ ├── test-polyfill-math-sign.js │ ├── test-polyfill-object-assign.js │ ├── test-position-observer.js │ ├── test-preconnect.js │ ├── test-pull-to-refresh.js │ ├── test-render-delaying-services.js │ ├── test-resource.js │ ├── test-resources.js │ ├── test-runtime.js │ ├── test-sanitizer.js │ ├── test-service.js │ ├── test-shadow-embed.js │ ├── test-size-list.js │ ├── test-srcset.js │ ├── test-standard-actions.js │ ├── test-storage.js │ ├── test-string.js │ ├── test-style-installer.js │ ├── test-style.js │ ├── test-task-queue.js │ ├── test-template.js │ ├── test-timer.js │ ├── test-transition.js │ ├── test-types.js │ ├── test-url-replacements.js │ ├── test-url.js │ ├── test-variable-source.js │ ├── test-video-session-manager.js │ ├── test-viewer-cid-api.js │ ├── test-viewer.js │ ├── test-viewport-binding.js │ ├── test-viewport.js │ ├── test-vsync.js │ ├── test-web-components.js │ ├── test-xhr.js │ ├── test-yield.js │ ├── testdata-experiments.js │ ├── utils │ │ ├── test-array.js │ │ ├── test-base64.js │ │ ├── test-bytes.js │ │ ├── test-dom-fingerprint.js │ │ ├── test-math.js │ │ ├── test-pem.js │ │ ├── test-priority-queue.js │ │ ├── test-promise.js │ │ ├── test-rate-limit.js │ │ └── test-signals.js │ └── web-worker │ │ └── test-amp-worker.js ├── integration │ ├── test-3p-frame.js │ ├── test-3p-nameframe.js │ ├── test-amp-ad-3p.js │ ├── test-amp-ad-doubleclick.js │ ├── test-amp-bind.js │ ├── test-amp-carousel.js │ ├── test-amp-img.js │ ├── test-amp-pixel.js │ ├── test-boilerplates.js │ ├── test-configuration.js │ ├── test-errors.js │ ├── test-extensions-loading.js │ ├── test-position-observer.js │ ├── test-released.js │ ├── test-user-error-reporting.js │ ├── test-video-manager.js │ ├── test-video-players-helper.js │ ├── test-video-players.js │ └── test-visibility-states.js ├── manual │ ├── accessibility │ │ └── aria-propagation.amp.html │ ├── ad-scrolling.amp.html │ ├── amp-accordion.amp.html │ ├── amp-ad-expose-container.html │ ├── amp-ad.amp.html │ ├── amp-ad.custom.amp.html │ ├── amp-ad.yieldbot.amp.html │ ├── amp-anim.amp.html │ ├── amp-animation │ │ ├── assets │ │ │ └── clock.jpg │ │ ├── embeds │ │ │ └── scrollbound │ │ │ │ └── clock.a4a.html │ │ └── scrollbound-embeds.amp.html │ ├── amp-audio.amp.html │ ├── amp-carousel-scroll-test.amp.html │ ├── amp-carousel.amp.html │ ├── amp-fit-text.amp.html │ ├── amp-flying-carpet.amp.html │ ├── amp-gfycat.amp.html │ ├── amp-iframe-animate-container.html │ ├── amp-iframe-clicktoplay.html │ ├── amp-iframe-resize.amp.html │ ├── amp-iframe.amp.html │ ├── amp-ima-video.html │ ├── amp-image-lightbox.amp.html │ ├── amp-img-404.html │ ├── amp-img.amp.html │ ├── amp-instagram.amp.html │ ├── amp-install-serviceworker.amp.html │ ├── amp-lightbox-viewer-mixed.amp.html │ ├── amp-lightbox-viewer-optin.amp.html │ ├── amp-lightbox-viewer-optout.amp.html │ ├── amp-lightbox.amp.html │ ├── amp-list-data.json │ ├── amp-list.amp.html │ ├── amp-pinterest.amp.html │ ├── amp-pixel.amp.html │ ├── amp-selector.amp.html │ ├── amp-sidebar-toolbar.amp.html │ ├── amp-sidebar.amp.html │ ├── amp-slidescroll.amp.html │ ├── amp-soundcloud.amp.html │ ├── amp-sticky-ad-collapse.amp.html │ ├── amp-twitter.amp.html │ ├── amp-video-auto-fullscreen.amp.html │ ├── amp-video.amp.html │ ├── amp-videoplayers-autoplay.html │ ├── amp-vine.amp.html │ ├── amp-youtube.amp.html │ ├── analytics-user-error.amp.html │ ├── cache-sw.html │ ├── dont-show-dialog.json │ ├── error.amp.html │ ├── fakead3p.amp.html │ ├── gallery.amp.html │ ├── intersection.amp.html │ ├── pre-render-load.html │ ├── show-dialog.json │ ├── test-sw.html │ ├── test-sw.js │ └── unavailable-font.amp.html ├── size.csv ├── size.txt └── visual-diff │ └── visual-tests.json ├── testing ├── describes.js ├── fake-dom.js ├── iframe.js ├── local-amp-chrome-extension │ ├── 128x128.png │ ├── 16x16.png │ ├── 48x48.png │ ├── README.md │ ├── background.js │ ├── logo.svg │ ├── manifest.json │ ├── popup.html │ └── popup.js ├── screenshots │ ├── everything-iphone6.png │ ├── make-screenshot.js │ └── screenshot-tests.md ├── test-helper.js └── yield.js ├── third_party ├── babel │ ├── LICENSE │ ├── README.amp │ └── custom-babel-helpers.js ├── caja │ ├── LICENSE │ ├── README.amp │ ├── compile.sh │ └── html-sanitizer.js ├── closure-compiler │ ├── LICENSE │ ├── Messages.properties │ ├── ParserConfig.properties │ ├── README.amp │ ├── compiler-and-tests.jar │ ├── compiler.jar │ └── externs │ │ ├── intersection_observer.js │ │ ├── performance_observer.js │ │ ├── shadow_dom.js │ │ ├── streams.js │ │ └── web_animations.js ├── closure-library │ ├── LICENSE │ ├── README.amp │ ├── compile.sh │ ├── sha384-generated.js │ └── sha384.js ├── css-escape │ ├── LICENSE │ ├── README.amp │ └── css-escape.js ├── d3-geo-projection │ ├── LICENSE │ ├── README.amp │ └── d3-geo-projection.js ├── d3 │ ├── LICENSE │ ├── README.amp │ └── d3.js ├── mustache │ ├── LICENSE │ ├── README.amp │ └── mustache.js ├── optimized-svg-icons │ ├── LICENSE │ ├── README.amp │ ├── README.md │ ├── amp-social-share-svgs.css │ ├── index.html │ ├── script.js │ └── style.css ├── timeagojs │ ├── LICENSE │ ├── README.amp │ ├── timeago-locales.js │ └── timeago.js ├── vega │ ├── LICENSE │ ├── README.amp │ └── vega.js └── webcomponentsjs │ ├── LICENSE │ ├── README.amp │ └── ShadowCSS.js ├── tools ├── errortracker │ ├── README.md │ ├── app.yaml │ ├── errortracker.go │ └── index.yaml └── experiments │ ├── README.md │ ├── experiments.html │ └── experiments.js ├── validator ├── .gitignore ├── AUTHORS ├── CHANGELOG.md ├── OWNERS.yaml ├── README.md ├── build.py ├── chromeextension │ ├── README.md │ ├── _locales │ │ └── en │ │ │ └── messages.json │ ├── amp-link-128.png │ ├── amp-link-38.png │ ├── amp-validator.html │ ├── background.html │ ├── background.js │ ├── bower.json │ ├── build_extension.sh │ ├── content_script.js │ ├── icon-128.png │ ├── icon-16.png │ ├── icon-48.png │ ├── icon-64.png │ ├── invalid-128.png │ ├── invalid-38.png │ ├── manifest.json │ ├── no-amp-128.png │ ├── no-amp-38.png │ ├── package_extension.sh │ ├── polymer.html │ ├── promotional-440.png │ ├── screenshot-chrome-1.png │ ├── screenshot-chrome-2.png │ ├── screenshot-opera-1.png │ ├── screenshot-opera-2.png │ ├── valid-128.png │ └── valid-38.png ├── engine │ ├── amp4ads-parse-css.js │ ├── amp4ads-parse-css_test.js │ ├── css-selectors.js │ ├── dom-walker.js │ ├── htmlparser-interface.js │ ├── htmlparser.js │ ├── htmlparser_test.js │ ├── json-testutil.js │ ├── parse-css.js │ ├── parse-css_test.js │ ├── parse-srcset.js │ ├── parse-srcset_test.js │ ├── parse-url.js │ ├── parse-url_test.js │ ├── saxasjson.js │ ├── tokenize-css.js │ ├── validator-in-browser.js │ ├── validator-light_test.js │ ├── validator.js │ └── validator_test.js ├── gulpjs │ ├── README.md │ ├── index.js │ ├── owers.yaml │ ├── package.json │ ├── run_sample.sh │ ├── sample │ │ └── gulpfile.js │ └── test │ │ └── validate.js ├── nodejs │ ├── README.md │ ├── index.js │ ├── index.sh │ ├── index_test.js │ ├── package.json │ └── postinstall-windows.js ├── package.json ├── testdata │ ├── amp4ads_feature_tests │ │ ├── extensions.html │ │ ├── extensions.out │ │ ├── min_valid_amp4ads.html │ │ ├── min_valid_amp4ads.out │ │ ├── noscript.html │ │ ├── noscript.out │ │ ├── obsolete_tags.html │ │ ├── obsolete_tags.out │ │ ├── style-amp-custom.html │ │ └── style-amp-custom.out │ └── feature_tests │ │ ├── ads.html │ │ ├── ads.out │ │ ├── amp_gist.html │ │ ├── amp_gist.out │ │ ├── amp_identification_missing.html │ │ ├── amp_identification_missing.out │ │ ├── amp_layouts.html │ │ ├── amp_layouts.out │ │ ├── amp_meta_tags.html │ │ ├── amp_meta_tags.out │ │ ├── amp_rtc.html │ │ ├── amp_rtc.out │ │ ├── aria.html │ │ ├── aria.out │ │ ├── article-json-ld.html │ │ ├── article-json-ld.out │ │ ├── article-microdata.html │ │ ├── article-microdata.out │ │ ├── article.html │ │ ├── article.out │ │ ├── bad_viewport.html │ │ ├── bad_viewport.out │ │ ├── base_href.html │ │ ├── base_href.out │ │ ├── css_errors.html │ │ ├── css_errors.out │ │ ├── css_length.html │ │ ├── css_length.out │ │ ├── custom_element_case.html │ │ ├── custom_element_case.out │ │ ├── deprecation_warnings_and_errors.html │ │ ├── deprecation_warnings_and_errors.out │ │ ├── dog_doc_type.html │ │ ├── dog_doc_type.out │ │ ├── duplicate_attribute.html │ │ ├── duplicate_attribute.out │ │ ├── duplicate_unique_tags_and_wrong_parents.html │ │ ├── duplicate_unique_tags_and_wrong_parents.out │ │ ├── empty.html │ │ ├── empty.out │ │ ├── empty_stylesheet.html │ │ ├── empty_stylesheet.out │ │ ├── everything.html │ │ ├── everything.out │ │ ├── extensions.html │ │ ├── extensions.out │ │ ├── forms.html │ │ ├── forms.out │ │ ├── incorrect_custom_style.html │ │ ├── incorrect_custom_style.out │ │ ├── incorrect_mandatory_style.html │ │ ├── incorrect_mandatory_style.out │ │ ├── javascript_xss.html │ │ ├── javascript_xss.out │ │ ├── lang_attr.html │ │ ├── lang_attr.out │ │ ├── link_meta_values.html │ │ ├── link_meta_values.out │ │ ├── mandatory_dimensions.html │ │ ├── mandatory_dimensions.out │ │ ├── manufactured_body.html │ │ ├── manufactured_body.out │ │ ├── mask-icon.html │ │ ├── mask-icon.out │ │ ├── minimum_valid_amp.html │ │ ├── minimum_valid_amp.out │ │ ├── multiple_body_tags.html │ │ ├── multiple_body_tags.out │ │ ├── multiple_body_tags_2.html │ │ ├── multiple_body_tags_2.out │ │ ├── multiple_body_tags_3.html │ │ ├── multiple_body_tags_3.out │ │ ├── new_and_old_boilerplate_mixed.html │ │ ├── new_and_old_boilerplate_mixed.out │ │ ├── new_and_old_boilerplate_mixed2.html │ │ ├── new_and_old_boilerplate_mixed2.out │ │ ├── new_boilerplate.html │ │ ├── new_boilerplate.out │ │ ├── no_custom_js.html │ │ ├── no_custom_js.out │ │ ├── noscript.html │ │ ├── noscript.out │ │ ├── old-boilerplate.html │ │ ├── old-boilerplate.out │ │ ├── parser.html │ │ ├── parser.out │ │ ├── partial_comment.html │ │ ├── partial_comment.out │ │ ├── property_parsing.html │ │ ├── property_parsing.out │ │ ├── rdfa.html │ │ ├── rdfa.out │ │ ├── recipe-json-ld.html │ │ ├── recipe-json-ld.out │ │ ├── recipe-microdata.html │ │ ├── recipe-microdata.out │ │ ├── regexps.html │ │ ├── regexps.out │ │ ├── review-json-ld.html │ │ ├── review-json-ld.out │ │ ├── review-microdata.html │ │ ├── review-microdata.out │ │ ├── runtime_in_body.html │ │ ├── runtime_in_body.out │ │ ├── several_errors.html │ │ ├── several_errors.out │ │ ├── slash_attrs.html │ │ ├── slash_attrs.out │ │ ├── slash_attrs.reserialized │ │ ├── slot.html │ │ ├── slot.out │ │ ├── spec_example.html │ │ ├── spec_example.out │ │ ├── stylesheet_in_body.html │ │ ├── stylesheet_in_body.out │ │ ├── svg.html │ │ ├── svg.out │ │ ├── track_tag.html │ │ ├── track_tag.out │ │ ├── urls.html │ │ ├── urls.out │ │ ├── urls_in_css.html │ │ ├── urls_in_css.out │ │ ├── valid_css_at_rules_amp.html │ │ ├── valid_css_at_rules_amp.out │ │ ├── video-json-ld.html │ │ ├── video-json-ld.out │ │ ├── video-microdata.html │ │ ├── video-microdata.out │ │ ├── xlinkhref.html │ │ └── xlinkhref.out ├── validator-main.protoascii ├── validator.proto ├── validator.protoascii ├── validator_gen.py ├── validator_gen_js.py └── webui │ ├── .gitignore │ ├── @polymer │ ├── amphtml-editor │ │ └── amphtml-editor.html │ ├── ampproject-toolbar │ │ └── ampproject-toolbar.html │ ├── webui-errorlist │ │ └── webui-errorlist.html │ ├── webui-mainpage │ │ └── webui-mainpage.html │ ├── webui-statusbar │ │ └── webui-statusbar.html │ └── webui-urlform │ │ └── webui-urlform.html │ ├── README.md │ ├── amp_favicon.png │ ├── app.yaml │ ├── build.py │ ├── index.html │ ├── logo-blue.svg │ ├── package.json │ ├── serve-standalone.go │ ├── serve.go │ └── webui.js ├── viewer-api └── swipe-api.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "optional": ["utility.inlineEnvironmentVariables"], 3 | "externalHelpers": true, 4 | "whitelist": [ 5 | "es3.memberExpressionLiterals", 6 | "es3.propertyLiterals", 7 | "es5.properties.mutators", 8 | "es6.arrowFunctions", 9 | "es6.blockScoping", 10 | "es6.classes", 11 | "es6.constants", 12 | "es6.destructuring", 13 | "es6.tailCall", 14 | "es6.modules", 15 | "es6.parameters", 16 | "es6.properties.computed", 17 | "es6.properties.shorthand", 18 | "es6.templateLiterals", 19 | "es6.spread", 20 | "utility.inlineEnvironmentVariables" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please pick a meaningful title for your pull request using sentence case. 2 | 3 | Do not overuse punctuation in the title like `(chore):`. If it is helpful feel free to start with a project name, though, like `ProjectX: Implement some feature`. 4 | 5 | # Title instructions above. 6 | 7 | Enter a succinct description of what is achieved by the PR. Ideally describe why the change is being made. 8 | 9 | Bullet points like 10 | 11 | - Implements aspect X 12 | - Leaves out feature Y because of A 13 | - Improves performance by B 14 | - Improves accessibility by C 15 | 16 | really help with making this more readable. 17 | 18 | Fixes/Closes/Related-to #1 (enter issue number, except in rare cases where none exists). 19 | -------------------------------------------------------------------------------- /.github/workflows/semgrep.yml: -------------------------------------------------------------------------------- 1 | 2 | on: 3 | pull_request: {} 4 | workflow_dispatch: {} 5 | push: 6 | branches: 7 | - main 8 | - master 9 | schedule: 10 | - cron: '0 0 * * *' 11 | name: Semgrep config 12 | jobs: 13 | semgrep: 14 | name: semgrep/ci 15 | runs-on: ubuntu-20.04 16 | env: 17 | SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} 18 | SEMGREP_URL: https://cloudflare.semgrep.dev 19 | SEMGREP_APP_URL: https://cloudflare.semgrep.dev 20 | SEMGREP_VERSION_CHECK_URL: https://cloudflare.semgrep.dev/api/check-version 21 | container: 22 | image: returntocorp/semgrep 23 | steps: 24 | - uses: actions/checkout@v3 25 | - run: semgrep ci 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .g4ignore 3 | build 4 | .amp-build 5 | c 6 | /dist 7 | dist.3p 8 | dist.tools 9 | examples.min 10 | node_modules 11 | npm-debug.log 12 | .idea 13 | .tm_properties 14 | .settings 15 | .vscode 16 | typings 17 | typings.json 18 | build-system/runner/TESTS-TestSuites.xml 19 | /test/manual/amp-ad.adtech.html 20 | test/coverage 21 | -------------------------------------------------------------------------------- /3p/frame.max.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 |